Заметки о модальности и асинхронности

Что на самом деле мы получили в 8.3.Х и почему это не очень радует. Поддерживающим большие нетиповые конфигурации посвящается.
1,6 тыс. 53

Что на самом деле мы получили в 8.3.Х и почему это не очень радует. Поддерживающим большие нетиповые конфигурации посвящается.

В последних версиях, активно работающих в веб-клиенте и на мобильных приложениях, 1С начала агрессивно продвигать новый подход к модальности, к работе с модальными окнами и диалогами. На эту тему много и убедительно написано в методическом сопровождении, статьях на сайтах и в комментариях специалистов. Но не будем поддаваться, посмотрим критически на предлагаемые нам новшества. Причем рассуждать я хочу как типичный «одинэснег». Обойдусь без пересказа статей, копипаста Синтакс-помощника и раскрытия технических терминов, подразумевая, что читателю оно уже все известно.

Основные претензии:

Многое, что можно было «спрятать» в платформе и сделать своими силами, просто перевалено на плечи разработчиков 1С. С больной головы на здоровую. То ли в 1С не захотели это сделать, то ли не успели (последнее заметно по целому ряду прецедентов, когда самоочевидные вещи «подтягивали» по ходу выпуска релизов, не успев сделать сразу).

Предложена идеология, резко увеличивающая объем кода, а значит, затрудняющая работу с ним. Обещанный рефакторинг касается лишь простейших случаев, что уже честно признано.

Во-первых, сила и убедительность многих статей в том, что там очень красиво и аккуратно перемешаны совершенно разные понятия – модальность окна и асинхронность выполнения кода. Под модальностью подразумевается невозможность переключения в другие окна, пока это окно держит фокус. Под асинхронностью – ветвление логики и хода выполнения действий, превращение одной цепочки действий как последовательности команд в две и более, выполняемые параллельно, в т.ч. без взаимных привязок, согласований и вообще без внимания друг к другу (аппаратные тонкости оставим вне рассмотрения).

Во-вторых, нам печально повествуют, что всплывающие окна, как нехорошее рекламное нечто, блокируются браузерами (т.е. требуют разрешения на включение) и вообще не поддерживаются мобильными устройствами, а значит, маст дай. Более того, авторы некоторых методических статей ненавязчиво намекают, что в будущем 1С намерена полностью отказаться от модальности, что это «генеральная линия партии», и хотя нам милостиво разрешено пока жить по-старинке, но будущее уже предрешено и в нем нет места для «Предупреждение(«Hello, World»)». Пугают, стало быть.

Необходимость применения модальных окон является данностью, избежать которой полностью невозможно, причем отнюдь не по техническим, а по идеологическим соображениям. Всегда возможна ситуация, когда пользователя нельзя пускать «дальше», позволить ему продвижение в его работе, пока не будут выполнены некоторые действия. В этом смысле модальными можно называть и окна пошаговых «мастеров», где кнопка «Далее» недоступна до удовлетворения неких условий. Модальность – не в том, что окно маячит поверх остальных и не дает переключиться (оно может выглядеть как угодно), а в том, что пользователь локализован в своих действиях более узко, чем в других случаях работы с приложением. Модальность – не реализация, не внутренние глубины, недоступные пользователю хитросплетения, а поведение интерфейса. Задумаемся: разве не так себя ведут все диалоги, инициированные пользователем и ждущие от него необходимых уточнений? Именно так. И браузеры не исключение – диалог загрузки файла, или запрос на разрешение cookies, или вопрос насчет сертификата – были и остаются модальными окнами. Настроечные аспекты, вопросы всяких FlashPlayer, антиспамы, антивирусные диалоги, принтеры и работа с печатью – модальны. И замечательно себя чувствуют в интернетах. Значит, не собирается мир пока уходить от модальности.

Теперь посмотрим, что нам предлагается – свойство, управляющее блокировкой интерфейса/окна. По сути, для нашего юзверя, то же самое. Нам в плюс, что поведение более управляемое, можно задавать в коде; нам в минус, что головной боли об этом чуть больше. Но пользователю, в общем, плевать, почему он не может, открыв окно «1», щелкнуть по кнопке в окне «2». Внимание, вопрос – где же пресловутый отказ от модальности?

Всплывающие окна. Pop-up. Всякая бяка из интернета. Да-да, конечно, пусть даже браузер совсем их не понимает и не поддерживает, но как тогда 1С реализует эти «блокируемые» окна? И что мешало тихо и незаметно реализовать функцию «Вопрос» так же, как реализуется рисуемая нами форма, блокирующая весь интерфейс, по аналогичной концепции? Ничего ровным счетом. Как-то ведь фирма 1С планирует отрабатывать эту блокировку, так отрабатывали бы и модальные диалоги.

Невинно пострадала процедура «Предупреждение». Полный аналог команды alert, которая отнюдь не является всплывающим окном, она, тем не менее, попала под запрет. Хорошо хоть, описание оповещения необязательное. Мне могут возразить, что в планах 1С есть вывод туда форматированной строки и вообще неизвестно, может, это тоже маленькая отдельная формочка, а не alert. Но тогда см.выше, что мешает ей быть такой формочкой с блокировкой интерфейса, не делая мне головной боли? И что мешает для вывода форматированной строки применить «ПоказатьОповещениеПользователя» (к которой тоже есть претензия именно ввиду ее совершеннейшей немодальности – помигало и исчезло, а юзверь мог и не заметить)?

Тем более ни при чем действия с выпадающим списком, в режиме списка и меню. Если 1С оставила такую штуку, как подменю любой вложенности, и в природе существуют поля ввода с выпадающими списками, то причем тут борьба с модальностью? Где в подменю и выпадающем списке модальность? Нигде, чистая произвольная навигация по предоставленным данным в рамках интерфейса. Есть ли разница между «ВыбратьИзМеню» и статичным подменю? Никакой. Тогда почему надо заставлять всех делать «ПоказатьВыборИзМеню» и перелопачивать ради этого и код, и логику?

Ладно, нам объяснили, что «ВыбратьЭлемент» это теперь очень плохо. Но тогда почему остались диалоговые методы различных объектов? Почему никто не посягнул на «ДиалогВыбораФайла.Выбрать»? Модальность же неимоверная! А это далеко не единственный пример. Почему не отказались от мини-диалогов, возникающих при нажатии на «педальку» поля ввода - например, от календаря или калькулятора, от выбора типа значения? Они ведь интерфейсно ровно то же, что выбор из списка или меню. Загадка!

Вернемся к асинхронности исполнения. «Тупой одинэснег» внимательно читает методические статьи и видит, что теперь после вызова «Показать…» исполнение кода продолжается, а отдельная ветка уходит на обработку действий согласно описанию оповещения. Супер, можно разделить поток исполнения! Можно выполнить действие «а», в то время как «немодальное» окно будет пройдено пользователем и согласно ему выполнится действие «б». Асинхрон!

Не тут-то было. Простейшая проверка показывает, что асинхронность, заявленная идеологически, на практике отсутствует. Достаточно поставить бесконечный цикл после вызова «Показать…» и – здравствуй, перезапуск приложения. Асинхронностью я бы это не назвал ни в коем случае. Нижеприведенное также привело к зависанию:

Процедура НекаяКоманда(Команда)
    опоп=Новый ОписаниеОповещения("ЗавершениеНекойКоманды",ЭтотОбъект,);
    ПоказатьПредупреждение(опоп,"Hell, world!");
    Пока НекийКлюч Цикл
        ОбработкаПрерыванияПользователя();
    КонецЦикла;
КонецПроцедуры

Процедура ЗавершениеНекойКоманды(Параметр1)
    НекийКлюч=Ложь;
КонецПроцедуры

Более того, авторы статей аккуратно намекают, что после вызова «немодальных» диалогов вообще лучше бы прекратить исполнение кода и вообще выйти из процедуры/функции, т.е. ставить такой вызов последней строкой кода. На красивых картинках нам показывают, как переключается туда-сюда-обратно ход процесса, как передается управление, как надо работать со вложенными процедурами и т.д. Но вдумайтесь – где здесь асинхрон? Перед нами просто более запутанное, но все такое же последовательное, плоское и однопоточное выполнение кода! Пресловутая «асинхронность» не чисто программная, а программно-интерфейсная силами платформы. Здесь нет ожидания успешности или неуспешности, нет их перехвата. Есть приостановка выполнения нашего кода на период «висения» некоего окна. И где разница с тем, что было до сих пор? Почему мы лишены возможности продолжить там же, в той же процедуре? Почему нам, на худой конец, не дали меток наподобие Goto, и обязательно теперь прыгать в другую процедуру? Напомню, второго потока по сути нет и не подразумевается!

Да и зачем нам в интерфейсах асинхронность вместо main flow? Ладно, тяжелые серверные действия, уходящие фоновыми заданиями в настоящие асинхроны, но на клиенте (а описание оповещения живет только на клиенте) таких задач пока нет и особо не предвидится. Подчеркну – именно применительно к взаимодействию с интерфейсом, а не к работе с данными, т.к. платформа отрисовывает и показывает все за нас. Приведите мне пример, позволяющий убедить главбуха, отчего теперь код пишется втрое дольше!

Дочитавшие до этого места могут возразить, что, мол, интернеты-веяния времени, и вообще новомодные геопозиционирования и прочая. Насчет интернета и веяний времени я комментировать не буду, т.к. версия встроенного в платформу браузера ниже всякой критики, свойство parentWindow не советовали к применению прям даже в СП, а уж какая мешанина вышла из его свойств/методов и свойств/методов Dociment в итоговом «Документ» я вообще молчу. Прогресс беспредельный, ага.

Что касается настоящей «интернетности». Да, хорошо, что объект «ОписаниеОповещения» уже напоминает известную в JavaScript возможность перекинуть процедуру как параметр и выполнить где-то в другом месте. Да, теперь мы можем вызвать процедуру из некоей формы, находясь в совсем другом месте, имея лишь оповещение, а значит, имея саму эту УФ, нужный контекст и тд. Но вот достучаться до команды так пока не получается – известно, что модуль общей команды это «черный ящик», и находящийся там код программно вызвать нельзя.

А главное, что нет настоящих Promise, хорошо известных в JS. Следующим логичным шагом было бы сделать нечто вроде: 

ОбъектИлиМенеджер.ПроцедураИлиМетод(Параметры).ЕслиУспешно Тогда
    ДействияПриУспешности(Параметры);
ЕслиНеуспешно Тогда
    ДействияПриНеуспешности(Параметры);
ЕслиУспешностьНеясна Тогда
    ДействияПриНеясности(Параметры);
Конец

об1=Новый Обещание(ОписаниеОповщения1,ОписаниеОповещения2);

Но пока "обещаний" нам не обещают.

Логичной представляется также возможность динамического создания подписок на события любого характера (listeners), ну и наконец, господа из 1С, может быть, сделают перехват и обработку нажатия пользовательского прерывания, хотя бы исключительно на клиенте.

Итак, мы пока что имеем однопоточное, не-асинхронное (просто запутанное) выполнение кода, и якобы немодальные диалоги, чье поведение ничем не отличается от модальных, а в ряде случаев вообще не модально по определению. Просто прибавилось хлопот.

В заключение отмечу, что 1С сама не очень соблюдает собственные рекомендации. Так, в http://its.1c.ru/docs/v8nonmodal/ сказано, цитирую, «Другой сценарий, который является крайне нежелательным - это немодальный диалог в обработчике ПередЗавершениемРаботыСистемы. Во-первых потому, что в условиях веб-клиента браузеры очень негативно относятся к показу каких-либо сообщений при закрытии приложений и блокируют их. Во-вторых потому, что наличие такого диалога не позволит реализовать некоторые сценарии работы.». Вспомним, как себя ведет БП 3.0 при закрытии? То-то же.

В ряде мест этой замечательной статьи откровенно признано, что 1С и сами еще не вполне представляют, какое решение будет эффективным, красивым и вообще «правильным» для многих случаев. И случаи эти частые, общеупотребительные, всем нам нужные. Более всего такие места статьи походят на «ну, мы сделали, а вы уж как-нибудь выкрутитесь». При том, что можно было реализовать то же самое, т.е. обойти проблемы работы в браузерах и мобильных устройствах, на уровне платформы, вообще не затрагивая уровень разработки конфигураций. Безо всякой псевдоасинхронности и ненужного умножения и усложнения кода.

Комментарии

1
  • НатальяС
    В 8-8.2 слишком легко было, бухгалтеры сами себе писали обработки и печатные формы, меньше денег программистам шло. Надо запутать, 8.3 придумали управляемую.

В 2023 году дефицит федерального бюджета составил почти 3,23 трлн рублей

Минфин засекретил часть расходов федерального бюджета, за 2023 год они составили 32,35 трлн рублей. Тогда как на доходы пришлось 29,12 трлн.

Курсы повышения
квалификации

20
Официальное удостоверение с занесением в госреестр Рособрнадзора

Совокупные долги банкротов выросли в 2 раза

За 2023 год суд признал порядка 7,3 тысяч компаний несостоятельными. Их задолженность достигла 3,98 трлн рублей.

Общество

На что обратить внимание при покупке загородного дома, дачи или участка

Федеральная нотариальная палата (ФНП) разъяснила, на что обратить внимание при покупке дачи или земельного участка.

Лучшие спикеры, новый каждый день

У Wildberries появились брендированные грузовики

Автомобили с фирменными логотипами будут доставлять заказы со складов и сортировочных центров до ПВЗ.

Новые штрафы для бизнеса, банки против маркетплейсов и директор с лапками. Что обсуждали сегодня бухгалтеры. 😺«Ночной бухгалтер» № 1667

Бизнес больше не может звонить и отправлять рассылки по смс и e-mail без предварительного согласия абонента. Банкам не нравится, что маркетплейсы проводят платежи через собственную структуру. Компания ищет сотрудника с лапками, который будет создавать уют, контролировать запасы вкусняшек и обниматься. А также другие новости дня для бухгалтера.

Иллюстрация: создана при помощи ИИ playground.com / Елена Балаклицкая
Банки

Данные об иностранных поставщиках платежных услуг станут закрытыми

Центробанк закроет доступ к перечню иностранных поставщиков платежных услуг до конца 2024 года.

Опытом делятся эксперты-практики, без воды
Бесплатно с Социальные пособия

Новый порядок назначения пособия по уходу за ребенком в 2024 году. Мини-курс

Как назначается пособие по уходу за ребенком по новым правилам в 2024 году, какие документы нужно предоставить, рассказываем в мини-курсе и приводим форму уведомления о прекращение права сотрудника на получение ежемесячного пособия.

Новый порядок назначения пособия по уходу за ребенком в 2024 году. Мини-курс
Бесплатно с КоАП РФ

Новые штрафы в КоАП: за «холодные» звонки могут наказать на миллион, как избежать наказания

17 апреля 2024 года вступили в силу поправки в КоАП. Рассказываем, при каких условиях могут оштрафовать за обзвоны, письма и рассылку смс  и как не попасть под санкции.

Новые штрафы в КоАП: за «холодные» звонки могут наказать на миллион, как избежать наказания

Новостной дайджест: правила переводов с Сбербанке, новые меры поддержки МСБ, план Минэкономразвития, изменения в налогах, форум «Создай НАШЕ»

Самое интересное и важное за день в новостном дайджесте.

Банки

RBI: Европейский центральный банк потребует быстрее свернуть бизнес в РФ

Raiffeisen Bank International ждет требования от ЕЦБ ускорить процесс сокращения бизнеса в России.

Импорт

Вводится режим «параллельного импорта» для зарубежных патентов

Импорт параллельного характера позволяет ввозить в РФ иностранные товары без получения на это согласия от производителя. Такой импорт считается параллельным, так как он осуществляется независимо от официальных каналов через дистрибьюторов.

Иллюстрация: Вера Ревина/Клерк.ру

Доверительные отношения между ИП и его бухгалтером обошлись предпринимателю в 20,6 млн рублей ущерба

Бухгалтер из Краснодарского края предстанет перед судом по обвинению в неправомерном обороте средств платежей и мошенничестве.

105
Миникурсы, текстовые и видеоинструкции для бухгалтеров

Что такое системное мышление и как руководителю научиться использовать его на практике

Мы живем в мире систем. Рабочий коллектив, проектная группа, спортивная команда, семья, зрители в театре, пользователи приложения — мы всегда находимся во взаимодействии с другими людьми и организациями или участвуем в процессах, а значит ведем системную деятельность. И этой деятельностью важно научиться управлять, чтобы достигать своих целей.

Иллюстрация: Вера Ревина/Клерк.ру

⚡️ Итоги дня: «Яндекс» будет продавать товары для взрослых, Китай урезал поставки, а россияне стали чаще пить растворимый кофе и есть лапшу быстрого приготовления

Подготовили обзор главных событий дня. Все самое интересное, что писали и обсуждали в сети, в одной подборке.

1
66

Авито ищет бухгалтеров и специалистов по финансам

Разбирайте горячие вакансии от крупной компании. Авито нужен специалист казначейства, бухгалтер и старший бухгалтер!

Отпуска

Как уйти в отпуск в 2024 году: как написать и подать заявление и рассчитать отпускные

Каждый работник имеет право на отпуск. Рассказываем, какие отпуска бывают, как написать заявление на каждый из них, как оплачивается период отдыха и когда работодатель может отказать в его предоставлении.

Иллюстрация: Вера Ревина/Клерк.ру

Госдума защитит трудовые права работников маркетплейсов

Работодатели скрывают трудовые отношения с сотрудниками маркетплейсов под договорами с самозанятыми. Из-за этого работники не получают отпускных и больничных.

54

🔥 Безлимитных консультаций больше не будет! Успейте купить подписку «Клерк.Премиум» с безлимитными консультациями

Воспользуйтесь шансом купить подписку с безлимитными консультациями экспертов «Клерка» до 22 апреля, чтобы задавать вопросы без ограничений.

В начале 2025 года РЖД запустят новое мобильное суперприложение

Замгендиректора РЖД Евгений Чаркин на конференции Data Fusion заявил, что «Российские железные дороги» (РЖД) планируют запустить новое мобильное суперприложение (SuperApp) в начале 2025 года.

Интересные материалы

☝️Готовы к сдачи отчетности за I квартал? Напоминаем, как правильно заполнить форму 6-НДФЛ

До 25 апреля нужно сдать 6-НДФЛ за I квартал 2024 года. Бланк расчета и правила его заполнения изменились, рассказываем, как заполнить отчет, чтобы сдать все с первого раза — без проблем и штрафов.

Иллюстрация: Вера Ревина / Клерк.ру