Окно в 1с это
В последних версиях, активно работающих в веб-клиенте и на мобильных приложениях, 1С начала агрессивно продвигать новый подход к модальности, к работе с модальными окнами и диалогами. На эту тему много и убедительно написано в методическом сопровождении, статьях на сайтах и в комментариях специалистов. Но не будем поддаваться, посмотрим критически на предлагаемые нам новшества. Причём рассуждать я хочу как типичный «одинэснег». Обойдусь без пересказа статей, копипаста Синтакс-помощника и раскрытия технических терминов, подразумевая, что читателю оно уже всё известно.
Многое, что можно было «спрятать» в платформе и сделать своими силами, просто перевалено на плечи разработчиков 1С. С больной головы на здоровую. То ли в 1С не захотели это сделать, то ли не успели (последнее заметно по целому ряду прецедентов, когда самоочевидные вещи «подтягивали» по ходу выпуска релизов, не успев сделать сразу).
Предложена идеология, резко увеличивающая объём кода, а значит, затрудняющая работу с ним. Обещанный рефакторинг касается лишь простейших случаев, что уже честно признано.
Во-первых, сила и убедительность многих статей в том, что там очень красиво и аккуратно перемешаны совершенно разные понятия – модальность окна и асинхронность выполнения кода. Под модальностью подразумевается невозможность переключения в другие окна, пока это окно держит фокус. Под асинхронностью – ветвление логики и хода выполнения действий, превращение одной цепочки действий как последовательности команд в две и более, выполняемые параллельно, в т.ч. без взаимных привязок, согласований и вообще без внимания друг к другу (аппаратные тонкости оставим вне рассмотрения).
Во-вторых, нам печально повествуют, что всплывающие окна, как нехорошее рекламное нечто, блокируются браузерами (т.е. требуют разрешения на включение) и вообще не поддерживаются мобильными устройствами, а значит, маст дай. Более того, авторы некоторых методических статей ненавязчиво намекают, что в будущем 1С намерена полностью отказаться от модальности, что это «генеральная линия партии», и хотя нам милостиво разрешено пока жить по-старинке, но будущее уже предрешено и в нём нет места для «Предупреждение(«Hello, World»)». Пугают, стало быть.
Теперь посмотрим, что нам предлагается – свойство, управляющее блокировкой интерфейса/окна. По сути, для нашего юзверя, то же самое. Нам в плюс, что поведение более управляемое, можно задавать в коде; нам в минус, что головной боли об этом чуть больше. Но пользователю, в общем, плевать, почему он не может, открыв окно «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С и сами ещё не вполне представляют, какое решение будет эффективным, красивым и вообще «правильным» для многих случаев. И случаи эти частые, общеупотребительные, всем нам нужные. Более всего такие места статьи походят на «ну, мы сделали, а вы уж как-нибудь выкрутитесь». При том, что можно было реализовать то же самое, т.е. обойти проблемы работы в браузерах и мобильных устройствах, на уровне платформы, вообще не затрагивая уровень разработки конфигураций. Безо всякой псевдоасинхронности и ненужного умножения и усложнения кода.
Особенности использования оконной системы
В системе 1С:Предприятие существуют следующие состояния окон:
Обычное
Окно, находящееся в обычном состоянии, перемещается только в пределах рабочей области главного окна. Список открытых обычных окон доступен с помощью меню "Окна" и с помощью панели окон.
Свободное
Окно, находящееся в свободном состоянии, может располагаться в любом месте экрана. В случае если окно соединяемое, оно может объединяться с другими свободными окнами.
Прикрепленное
Окно, находящееся в прикрепленном состоянии, закрепляется на одной из сторон главного окна и перемещается по экрану вместе с ним.
Прячущееся
Окно, находящееся в прячущемся состоянии, отличается от прикрепленного тем, что принимает минимальные размеры, когда не используется.
Переключение между состояниями окна осуществляется с помощью команд оконного меню. С помощью команды "Восстановить положение окна" осуществляется возврат к исходному состоянию. Программа ограничивает возможность изменения свойств окна в зависимости от его текущего состояния:
- если окно находится в обычном состоянии, то его нельзя перевести в прячущееся и наоборот;
- если окно находится в прикрепленном или прячущемся состояния, то ему нельзя запретить соединяться.
Для некоторых типов окон изначально ограничены варианты переключения состояний. В этом случае соответствующие команды исключаются из оконного меню. Например, окно калькулятора может принимать только свободное состояние.
Расстановка окон
Объединение окон
Окна могут быть объединены двумя разными способами: "склеены" друг с другом и сложены в окно с закладками.
Объединение окон также является соединяемым окном, что позволяет собирать сложные конструкции окон. Соединение окон осуществляется с помощью перетаскивания. Во время перетаскивания инверсная рамка показывает примерное положение окна. Если окно соединяется с окном с закладками, инверсный маркер показывает, какое место займет новая закладка.
Прячущиеся окна
Когда прячущееся окно не активно, оно становится невидимым, при этом остается видимым заголовок окна, в виде кнопки на специальной панели. Эта кнопка используется для активизации прячущегося окна. Кроме того, окно становится видимым при наведении на эту кнопку курсора. Если группа окон объединена в окно с закладками и переведена в прячущееся состояние, ее заголовок представлен кнопкой особого вида - заголовки всех страниц окна с закладками свернуты, полностью виден только заголовок активной страницы. Это сделано для дополнительной экономии места.
Получение нескольких представлений (разделение) одного окна
В случае если содержимое окна существенно больше его реальных размеров, бывает удобно использовать несколько его представлений, показывающих разные части. Для некоторых типов окон реализована такая возможность. У этих окон доступны команды из меню "Окна" - "Новое окно", "Горизонтально разделить окно" и "Вертикально разделить окно".
Команда "Новое окно" открывает дополнительное представление в отдельном окне.
Команды "Горизонтально разделить окно" и "Вертикально разделить окно" делят окно между двумя представлениями
Максимизация окон
Оконная система 1С:Предприятия предлагает собственную схему максимизации обычных окон, которая заменяет собой стандартную для Windows приложений схему. В конфигураторе эти схемы объединены. Главным различием схем максимизации является то, что максимизация одного окна не влечет за собой максимизацию всех обычных окон.
Отдельные советы (знаете ли Вы, что. )
Если нужно перетащить соединяемое окно так, чтобы оно лежало рядом с другим, но не соединялось с ним, во время перетаскивания удерживайте клавишу Ctrl.
В режиме конфигуратора можно соединять обычные окна, для этого, во время перетаскивания удерживайте клавишу Shift.
Можно совершить быстрый переход из свободного состояния окна в прикрепленное или обратно, для этого дважды щелкните мышью по заголовку окна.
Расстановку обычных окон удобно производить с помощью диалога "Окна", который вызывается из меню "Окна". В этом диалоге собраны вызовы основных операций с окнами, есть возможность их упорядочивания и соединения.
Оконная система, используемая в 1С:Предприятии 8.0, ориентирована на обеспечение высокой эргономичности при работе с прикладными решениями и содержит специальные возможности, не поддерживаемые классической Windows-моделью. Окна, используемые в прикладных решениях, могут иметь несколько разных состояний, которые определяют поведение этих окон:
Пользователь может изменять состояние окна в соответствии со своими предпочтениями и восстанавливать исходное положение окна, определенное в системе.
Обычные окна
Окно, находящееся в обычном состоянии может перемещаться только в пределах главного окна прикладного решения. Например, окно списка справочника Контрагенты может перемещаться только в пределах главного окна:
Свободные окна
Окно, находящееся в свободном состоянии, может располагаться в любом месте экрана. Например, окно элемента справочника Контрагенты может перемещаться по всему экрану:
Прикрепленные окна
Окно, находящееся в прикрепленном состоянии, может закрепляться на одной из сторон главного окна прикладного решения и перемещается по экрану вместе с ним. Например, окно списка справочника Контрагенты прикреплено к левой стороне главного окна:
Прячущиеся окна
Окно, находящееся в прячущемся состоянии, тоже может закрепляться на одной из сторон главного окна, но вдобавок, принимает минимальные размеры, когда не используется. Например, окно списка справочника Контрагенты минимизировано на левой стороне главного окна:
"Склеенные" окна
Окна могут быть "склеены" друг с другом, при этом они объединяются в одно окно, в котором располагаются горизонтально или вертикально. Например, окна списка справочника и элемента справочника Контрагенты "склеены":
Сложенные окна с закладками
Окна могут быть сложены в одно окно с закладками. Выбирая ту или иную закладку можно активизировать нужное окно. Например, окна списка справочника и элемента справочника Контрагенты сложены с закладками, которые расположены внизу окна:
Максимизация окон
Оконная система 1С:Предприятия предлагает собственную схему максимизации обычных окон, которая заменяет собой стандартную для Windows-приложений схему. Теперь максимизация одного окна не влечет за собой максимизацию всех обычных окон. Например, окно списка справочника Контрагенты максимизировано, в то время как окно элемента справочника Контрагенты имеет обычные размеры:
Способы отображения окна
Платформа 1С:Предприяитя поддерживает возможность программного управления способом отображения открываемых окон. Новые окна могут быть отображены одним из трех способов:
- максимизированное;
- нормальное;
- минимизированное.
Наряду с этим существует возможность программно запретить изменять способ отображения окна. В этом случае кнопки изменения состояния окна будут недоступны для пользователя.
Режим рабочего стола
Оконная система 1С:Предприятия поддерживает специальный режим отображения окна - режим рабочего стола. В этом режиме открытое окно занимает все свободное пространство главного окна приложения, не имеет заголовка окна и не отображается в списке открытых окон:
При открытии такого окна в модальном режиме оно занимает все пространство экрана, перекрывая панели 1С:Предприятия и панели Windows.
Такой режим может быть использован для создания специализированных рабочих мест (например, рабочего места кассира).
Диалоговые окна, к которым мы вполне привыкли при работе со всевозможными системами и, в частности, в 1С, могут появляться при выполнении разнообразных действий, требуют от пользователя ввода каких-либо данных, например, определенного значения, выбора файла, ответа на вопрос, или просто выдают предупреждение. Они также называются модальными.
Без ответа на запрос такого окна продолжать работу в программе невозможно. Окно блокирует интерфейс, перекрывает работу других окон, и при этом исполнение кодов программы тоже застопорится на том месте, где произошел вызов диалога – программа ждет завершения действия с ним.
Как устранить ошибку в 1С: «Использование модальных окон в данном режиме запрещено»
Такая ошибка начала появляться после перехода 1С на новый интерфейс платформы 1С 8.3 – «Такси». Это связано с тем, что в ней разработчиками была включена работа с окнами, но без режима модальности.
Рис.1 Предупреждение
Откроем информационную базу в режиме «Конфигуратор» и посмотрим свойства нашей конфигурации, нажав правой кнопкой мышки и выбрав команду «Свойства». Прокрутив линейку ниже, мы видим раздел «Совместимость», где находится интересующий нас параметр режима и перечислены варианты – «Использовать/Использовать с предупреждением/Не использовать».
Рис.2 Выбор режима
После этого необходимо сохранить и обновить изменения в конфигурации. Ошибка, о которой мы говорим, появляется, когда стоит отметка о том, чтобы не использовать режим модальности. Такая возможность появилась, начиная с платформы 8.3.3.721, вышедшей в сентябре 2013 года. То есть, пользователям, работающим на более старых версиях платформы, нет необходимости в отказе от модальности. В других версиях, чтобы окно с ошибкой не появлялось, можно установить просто – «Использовать».
Отказ от модальности
Разработчики программы 1С, а также компании, оказывающие услуги франчайзи 1С, поддерживая общемировые тенденции, стараются приблизить интерфейс программ к веб-образцам и привести его к единому стандарту, давая тем самым возможность пользователям работать в одном окне с привычном «внешником».
То есть нововведение избавляет нас от необходимости допнастройки браузера, стабилизирует веб-клиент и повышает его производительность. Также, поскольку теперь нет необходимости открывать всплывающие окна, любую конфигурацию с такими изменениями можно использовать на любом устройстве.
Концепция пользовательского интерфейса системы 1С:Предприятие 8 ориентирована на комфортную эффективную работу и соответствует современным тенденциям.
Основное окно
При запуске системы в режиме 1С:Предприятие открывается основное окно программы.
Функции, необходимые для удобной навигации по прикладному решению, реализованы в главной панели и в нескольких вспомогательных панелях: в панели разделов и в панели функций текущего раздела. Разработчик прикладного решения может задать некоторый стандартный состав и расположение этих панелей в соответствии с назначением и особенностями приложения.
Конструирование рабочего пространства
Пользователь может самостоятельно конструировать своё рабочее пространство, располагая панели в разных областях экрана.
Можно создать минималистичное рабочее место, оставив на экране лишь главную панель. При этом все функции навигации по прикладному решению будут доступны с её помощью.
Можно разместить на экране сразу несколько панелей, обеспечив себе разнообразные и быстрые возможности перехода к различным частям прикладного решения.
Начальная страница
Начальная страница — это стандартный раздел программы, содержащий часто используемые документы, отчеты, справочники и т. п. Это своеобразный «помощник» пользователя. Каждый рабочий день начинается с «общения» с ним. Начальная страница вводит пользователя в курс дел, отвечает на его вопросы — подробнее.
Панель разделов
Панель разделов — это наиболее крупное разделение функциональности прикладного решения. Она расположена в верхней части основного окна и соответствует верхнему уровню подсистем, добавленных в конфигурацию. С ее помощью осуществляется переход к другим разделам программы. Подробнее…
Раздел
При активизации раздела вся функциональность соответствующей подсистемы, включая вложенные подсистемы, представляется пользователю в виде команд в панели функций текущего раздела. Подробнее…
Команды
Команды — это действия, которые может выполнить пользователь. Программа может содержать разнообразные команды. Часть из них, стандартные команды, предоставляется самой платформой. Другая часть создается разработчиком прикладного решения. Подробнее…
Панель функций текущего раздела
Панель функций текущего раздела содержит самые востребованные и часто используемые команды, позволяющие просматривать информацию в списках, быстро создавать новые объекты, выполнять типовые обработки или строить популярные отчеты — подробнее.
Главная панель
Главная панель предназначена для быстрого доступа к основным функциям прикладного решения: меню функций, глобальному поиску, центру оповещений, истории, избранному, к текущему пользователю и главному меню — подробнее.
Меню функций
Меню функций предоставляет удобный доступ ко всем командам прикладного решения. Перемещаясь по разделам можно видеть на экране все команды раздела и выполнять поиск по ним. Подробнее…
Глобальный поиск
Избранное
Любой раздел, список, объект базы данных, отчет или обработку, а также команду можно добавить в избранное, чтобы потом быстро вернуться к ней, при необходимости — подробнее.
История
История содержит все действия пользователя, связанные с добавлением, изменением данных, или просто с открытием форм элементов справочников, документов и т. д. Она позволяет быстро перейти к тем объектам, которые пользователь недавно изменял или открывал — подробнее.
Центр оповещений
В центре оповещений отображаются важные оповещения, на которые пользователь еще не отреагировал — не закрыл или не выполнил связанное с оповещением действие. Оповещения располагаются в порядке их появления, самые новые сверху. О том, что есть новые важные оповещения, сигнализирует колокольчик на зеленом фоне. Таким образом, даже если пользователь отходил от компьютера, он не пропустит важные оповещения — подробнее.
Текущий пользователь
Гиперссылка с именем текущего пользователя открывает окно, в котором можно завершить работу, отменив при этом аутентификацию, если она выполнялась с помощью OpenID.
Кроме этого, если прикладное решение подключено к системе взаимодействия, в этом окне отображается аватар пользователя, телефон, адрес электронной почты и статус, которые можно изменить в этом же окне.
Главное меню
Главное меню содержит набор команд, относящихся к прикладному решению в целом и не зависящих от прикладной специфики конфигурации.
Например, команды пользовательской настройки интерфейса и команды установки параметров системы в целом — подробнее.
Вспомогательные окна
При вызове некоторых команд ввода новых и редактирования существующих объектов, а также при открытии некоторых отчетов и обработок открываются вспомогательные окна приложения.
Меню формы
Каждая форма имеет собственное меню, которое позволяет сохранять и печатать файлы, вносить правки в текстовые и табличные документы, а также управлять открытыми окнами — подробнее.
Ссылки на данные
На любой раздел, список, объект базы данных, отчет или обработку можно получить ссылку в виде строки текста. Такую ссылку можно, например, передать коллеге, чтобы тот мог быстро перейти к этим же данным и внести изменения. Подробнее…
Панель открытых
Панель открытых предназначена для частого переключения между открытыми формами. Каждой открытой форме соответствует отдельная закладка. Подробнее…
Информационная панель
В нижней части основного окна приложения может существовать информационная панель. Она предназначена для отображения показателей производительности и индикации того, что включён режим имитации задержек при вызовах сервера. Подробнее…
Поддержка корпоративного стиля
Платформа 1С:Предприятия содержит ряд инструментов, позволяющих подстроить внешний вид прикладного решения под корпоративные требования заказчика, под тот стиль, который используется в большинстве его программных продуктов — подробнее.
Читайте также: