Как закрыть модальный диалог в 1С?

Клиентские приложения все чаще используются при помощи веб-клиента, что предъявляет определенные требования к коду. В этой статье я постараюсь рассказать о модальности в 1С — когда и почему следует от нее отказаться и как это сделать.

Общая информация

В начале рассмотрим общие вопросы связанные с модальными окнами в 1С.

Что не так с модальными окнами?

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

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

Когда следует отказаться от модальности?

Разумеется отказ от модальности необходим далеко не всегда.

Во-первых, режим работы интерфейса без использования модальности появился в версии технологической платформы 8.3.3.721 (от 06.09.2013) — следовательно, при использовании предыдущих версий технологической платформы, не нужно задумываться об отказе от модальности.

Режим использования модальности

Во-вторых, не все прикладные решения обязаны использовать этот режим. Отказ от модальности является критичным для приложений которые будут использоваться:

  • на iPad;
  • через веб-клиент;
  • в режиме сервиса (например, размещенные на 1cfresh.com).

Нужно отметить, что во всех типовых конфигурациях (речь о новых или не слишком старых версиях) основной режим работы интерфейса — режим без использования модальности. Об этом нужно помнить при внесении изменений в эти конфигурации.

Как все поправить?

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

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

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

Непосредственно при отказе от модальности очень поможет механизм рефакторинга о котором подробно написано в отдельной статье.

Соответствие синхронных методов асинхронным аналогам (на момент написания статьи) можно посмотреть тут.

Практические примеры

В качестве практических примеров рассмотрим основные приемы работы с блокирующими окнами.

Скорость работы как оператора, так и программиста в системе 1С предприятие 8.3 зависит от множества факторов. В данной статье будет рассмотрен способ существенного повышения скорости работы при помощи использования быстрых (или горячих) клавиш в 1С.

Горячие, или быстрые кнопки для пользователя 1С 8.3

Сочетания клавиш для документов

Кнопка по умолчанию (нажатие вместо клика мышкой) Ctrl + Enter
Выбор поля (альтернатива мыши) F4
Прямой обход полей Tab
Обратный обход полей Shift + Tab

Сочетания клавиш для справочников 1С 8.3

Новый элемент Ins
Новая группа Ctrl + F9
Изменить элемент Shift + Enter
Просмотр элемента или группы Alt + Д + Р
Копировать элемент или группу F9
Пометить элемент/Снять пометку Del
История значения F5
Найти в дереве Alt + Д + А
Перенести в другую группу Ctrl + F5
Подчиненный справочник Alt + Д + Ч

Горящие клавиши для программиста 1С

Глобальные действия

Создать новый документ Ctrl + N
Открыть существующий документ Ctrl + O
Активизировать поле поиска в командной панели Ctrl + D
Открыть «Глобальный поиск по текстам” Ctrl + Shift + F
Открыть «Результаты глобального поиска по текстам” Ctrl + Shift + H
Запустить 1С:Предприятие без отладки Ctrl + F5
Открыть окно «Конфигурация” Ctrl + Shift + С
Обновить конфигурацию БД F7
Открыть «Шаблоны текста” Ctrl + Shift + T
Открыть встроенный «Калькулятор” системы 1С Предприятие 8.2 Ctrl + F2
Открыть «Свойства” Alt + EnterCtrl + E
Открыть «Дополнительно” Shift + Alt + Enter
Открыть «Служебные сообщения” Ctrl + Alt + O
Закрыть «Служебные сообщения” Ctrl + Shift + Z
Очистить служебные сообщения Ctrl + Alt + Z
Открыть «Справку” F1
Открыть «Содержание справки” Shift + F1
Открыть «Индекс справки” Shift + Alt + F1
Открыть «Поиск по справке” Ctrl + Alt + F1
Открыть «Синтаксис-Помощник Ctrl + Shift + F1
Поиск по индексу в «Синтаксис-Помощнике” Ctrl + F1

Общие действия

Удалить Del
Добавить Ins
Сохранить активный документ Ctrl + S
Печать активного документа Ctrl + P
Печать на текущий принтер Ctrl + Shift + P
Копировать в буфер обмена Ctrl + C Ctrl + Ins
Вырезать в буфер обмена Ctrl + X Shift + Del
Вставить из буфера обмена Ctrl + V Shift + Ins
Добавить к буферу обмена Shift + Num+
Вычесть из буфера обмена Shift + Num-
Выделить все Ctrl + A
Отменить последнее действие Ctrl + Z Alt + BackSpace
Вернуть отмененное действие Ctrl + Y Shift + Alt + BackSpace
Найти Ctrl + F
Найти следующий F3
Найти следующий выделенный Ctrl + F3
Найти предыдущий Shift + F3
Найти предыдущий выделенный Ctrl + Shift + F3
Заменить Ctrl + H
Найти в дереве Ctrl + T
Следующий элемент в результатах поиска и окне сообщений F8
Предыдущий элемент в результатах поиска и окне сообщений Shift + F8
Развернуть (узел дерева, группу табличного документа, группировку модуля) Ctrl + Num+
Свернуть (узел дерева, группу табличного документа, группировку модуля) Ctrl + Num-
Развернуть (узел дерева, группу табличного документа, группировку модуля) и все подчиненные Ctrl + Alt + Num+
Свернуть (узел дерева, группу табличного документа, группировку модуля) и все подчиненные Ctrl + Alt + Num-
Развернуть (все узлы дерева, группы табличного документа, группировки модуля) Ctrl + Shift + Num+
Свернуть (все узлы дерева, группы табличного документа, группировки модуля) Ctrl + Shift + Num-
Следующая страница Ctrl + PgDn Ctrl + Alt + F
Предыдущая страница Ctrl + PgUp Ctrl + Alt + B
Включить/выключить жирность Ctrl + B
Включить/выключить курсив Ctrl + I
Включить/выключить подчеркивание Ctrl + U
Переход к предыдущей главе справки Alt + Left
Переход к следующей главе справки Alt + Right

Управление окнами

Закрыть активное окно, модальный диалог или приложение Alt + F4
Закрыть активное обычное окно Ctrl + F4
Закрыть активное окно (кроме обычных) Shift + Esc
Активизировать следующее обычное окно Ctrl + Tab Ctrl + F6
Активизировать предыдущее обычное окно Ctrl + Shift + Tab Ctrl + Shift + F6
Активизировать следующую секцию окна F6
Активизировать предыдущую секцию окна Shift + F6
Вызвать системное меню приложения или модального диалога Alt + Space
Вызвать системное меню окна (кроме модальных диалогов) Alt + Hyphen(-) Alt + Num-
Вызвать главное меню Alt F10
Вызвать контекстное меню Shift + F10

Переход по истории активности окон

Переместиться назад Ctrl + «-”
Переместиться вперед Ctrl + Shift + «-”
Вернуть активность обычному окну Esc

Форма

Перейти к следующему элементу формы/выполнить действие кнопки по умолчанию Enter
Выполнить действие кнопки по умолчанию Ctrl + Enter
Перейти к следующему элементу формы Tab
Вернуться к предыдущему элементу формы Shift + Tab
Активизировать командную панель, связанную с активным элементом управления/формой Alt + F10
Открыть «Список элементов управления формы” Ctrl + Shift + L
Перемещение по элементам управления, объединенным в одну группу Up, Down, Left, Right

Работа со списком и деревом

Кодирование:
Ctrl+Пробел – вызов подсказки
Ctrl+Q – вызов шаблона
Ctrl+F1 – поиск в синтакс-помощнике
Ctrl + L – удалить текущую строку
Alt+Shift+F – отформатировать код
Исследование:
F12 – ставим курсор на процедуре или функции и переходим к определению процедуры или функций.
Ctrl+(минус) – перемещает назад в модуль, из которого ушли через F12
Ctrl+T – найти в дереве конфигурации
Ctrl+F – найти объект метаданных или его реквизит в дереве метаданных.
Отладка:
F5 – начать/продолжить отладку
F9 – установить/снять точку останова
F10 – шагнуть через процедуру или функцию, на следующую строку кода
F11 – идти по порядку с заходом во все процедуры и функции.
Alt+F9 – список точек останова
Shift+F9 – вычислить выражение
Ctrl+Shift+F9 – отк./вкл. точку остан.
Ctrl+Alt+W – открыть табло
Ctrl+Alt+C – открыть стек вызовов
Закладки:
Alt+F2 – установить/снять закладку
F2 – к следующей закладке
Shift+F2 – к предыдущей закладке
Быстрый переход по Процедурам, Функциям, Условиям, Циклам:
Ctrl+ – перейти вперед
Ctlr+G – перемещения к строке кода
Окно сообщений:
Ctrl+Alt+Z – очистить.
Ctrl+Shift+Z – очистить и закрыть

Глобальные действия
Создать новый документ – Ctrl + N
Открыть существующий документ – Ctrl + O
Активизировать поле поиска в командной панели – Ctrl + D
Открыть «Глобальный поиск по текстам» – Ctrl + Shift + F
Открыть «Результаты глобального поиска по текстам» – Ctrl + Shift + H
Запустить 1С:Предприятие без отладки – Ctrl + F5
Открыть окно «Конфигурация» – Ctrl + Shift + С
Обновить конфигурацию БД – F7
Открыть «Шаблоны текста» – Ctrl + Shift + T
Открыть встроенный «Калькулятор» системы 1С:Предприятие – Ctrl + F2
Открыть «Свойства» – Alt + Enter
Открыть «Дополнительно» – Shift + Alt + Enter
Открыть «Служебные сообщения» – Ctrl + Alt + O
Закрыть «Служебные сообщения» – Ctrl + Shift + Z
Очистить служебные сообщения – Ctrl + Alt + Z
Открыть «Справку» – F1
Открыть «Содержание справки» – Shift + F1
Открыть «Индекс справки» – Shift + Alt + F1
Открыть «Поиск по справке» – Ctrl + Alt + F1
Открыть «Синтакс-Помощник – Ctrl + Shift + F1
Поиск по индексу в «Синтакс-Помощнике» – Ctrl + F1

Общие действия
Удалить – Del
Добавить – Ins
Сохранить активный документ – Ctrl + S
Печать активного документа – Ctrl + P
Печать на текущий принтер – Ctrl + Shift + P
Копировать в буфер обмена – Ctrl + C – Ctrl + Ins
Вырезать в буфер обмена – Ctrl + X – Shift + Del
Вставить из буфера обмена – Ctrl + V – Shift + Ins
Добавить к буферу обмена – Shift + Num+
Вычесть из буфера обмена – Shift + Num-
Выделить все – Ctrl + A
Отменить последнее действие – Ctrl + Z – Alt + BackSpace
Вернуть отмененное действие – Ctrl + Y – Shift + Alt + BackSpace
Найти – Ctrl + F
Найти следующий – F3
Найти следующий выделенный – Ctrl + F3
Найти предыдущий – Shift + F3
Найти предыдущий выделенный – Ctrl + Shift + F3
Заменить – Ctrl + H
Найти в дереве – Ctrl + T
Следующий элемент в результатах поиска и окне сообщений – F8
Предыдущий элемент в результатах поиска и окне сообщений – Shift + F8
Развернуть (узел дерева, группу табличного документа, группировку модуля) – Ctrl + Num+
Свернуть (узел дерева, группу табличного документа, группировку модуля) – Ctrl + Num-
Развернуть (узел дерева, группу табличного документа, группировку модуля) и все подчиненные – Ctrl + Alt + Num+
Свернуть (узел дерева, группу табличного документа, группировку модуля) и все подчиненные – Ctrl + Alt + Num-
Развернуть (все узлы дерева, группы табличного документа, группировки модуля) – Ctrl + Shift + Num+
Свернуть (все узлы дерева, группы табличного документа, группировки модуля) – Ctrl + Shift + Num-
Следующая страница – Ctrl + PgDn – Ctrl + Alt + F
Предыдущая страница – Ctrl + PgUp – Ctrl + Alt + B
Включить/выключить жирность – Ctrl + B
Включить/выключить курсив – Ctrl + I
Включить/выключить подчеркивание – Ctrl + U
Переход к предыдущей главе справки – Alt + Left
Переход к следующей главе справки – Alt + Right

Управление окнами
Закрыть активное окно, модальный диалог или приложение – Alt + F4
Закрыть активное обычное окно – Ctrl + F4
Закрыть активное окно (кроме обычных) – Shift + Esc
Активизировать следующее обычное окно – Ctrl + Tab – Ctrl + F6
Активизировать предыдущее обычное окно – Ctrl + Shift + Tab – Ctrl + Shift + F6
Активизировать следующую секцию окна – F6
Активизировать предыдущую секцию окна – Shift + F6
Вызвать системное меню приложения или модального диалога – Alt + Space
Вызвать системное меню окна (кроме модальных диалогов) – Alt + Hyphen(-) – Alt + Num-
Вызвать главное меню – Alt – F10
Вызвать контекстное меню – Shift + F10

Переход по истории активности окон
Переместиться назад – Ctrl + «-»
Переместиться вперед – Ctrl + Shift + «-»
Вернуть активность обычному окну – Esc

Форма
Перейти к следующему элементу формы/выполнить действие кнопки по умолчанию – Enter
Выполнить действие кнопки по умолчанию – Ctrl + Enter
Перейти к следующему элементу формы – Tab
Вернуться к предыдущему элементу формы – Shift + Tab
Активизировать командную панель, связанную с активным элементом управления/формой – Alt + F10
Открыть «Список элементов управления формы» – Ctrl + Shift + L
Перемещение по элементам управления, объединенным в одну группу – Up, Down, Left, Right

Работа со списком и деревом
Открыть – F2
Обновить – Ctrl + Shift + R
Скопировать – F9
Новая группа – Ctrl + F9
Удалить строку – Shift + Del
Перемещение строки вверх – Ctrl + Shift + Up
Перемещение строки вниз – Ctrl + Shift + Down
Перенести элемент в другую группу – Ctrl + Shift + M
Перейти на уровень вниз с одновременным раскрытием группы – Ctrl + Down
Перейти на уровень вверх (к «родителю») – Ctrl + Up
Закончить редактирование – Shift + F2
Развернуть узел дерева – Num+ – Ctrl + Num+
Свернуть узел дерева – Num- – Ctrl + Num-
Развернуть узел дерева и все подчиненные – Num* – Ctrl + Alt + Num+
Свернуть узел дерева и все подчиненные – Ctrl + Alt + Num-
Развернуть все узлы дерева (выполняется в любом месте дерева) – Ctrl + Shift + Num+
Свернуть все узлы дерева (выполняется в любом месте дерева) – Ctrl + Shift + Num-
Изменение флажка – Пробел

Поле ввода
Переключить режим вставки/замены – Ins
Кнопка выбора – F4
Кнопка открытия – Ctrl + Shift + F4
Очистить поле – Shift + F4
Удалить символ слева от курсора – BackSpace
Удалить символ справа от курсора – Del
Удалить слово слева от курсора – Ctrl + BackSpace
Удалить слово справа от курсора – Ctrl + Del
Перейти в начало строки – Home
Перейти в конец строки – End

Поле картинки
Увеличить масштаб – Num+
Уменьшить масштаб – Num-
Прокрутить – Up, Down, Left, Right
Прокрутить на размер окна вверх – Page Up
Прокрутить на размер окна вниз – Page Down
Прокрутить на размер окна влево – Alt + PgUp
Прокрутить на размер окна вправо – Alt + PgDn

Редактор управляемых форм
Переключиться на закладку «Форма» – Alt + 1
Переключиться на закладку «Модуль» – Alt + 2
Переключиться на закладку «Форма» и активизировать закладку «Элементы» – Alt + 3
Переключиться на закладку «Форма» и активизировать закладку «Реквизиты» – Alt + 4
Переключиться на закладку «Форма» и активизировать закладку «Команды» – Alt + 5
Переключиться на закладку «Форма» и активизировать закладку «Командный интерфейс» – Alt + 6
Переключиться на закладку «Форма» и активизировать закладку «Параметры» – Alt + 7
Переключиться на закладку «Форма» и активизировать окно предварительного просмотра формы – Alt + 8

Редактор форм
Протестировать форму – Ctrl + R
Переместить элемент управления – Up, Down, Left, Right
Копировать элемент управления – Ctrl + (Up, Down, Left, Right)
Копировать элемент управления с инверсией выравнивания по сетке – Ctrl + Alt + (Up, Down, Left, Right)
Изменить размер элемента управления – Shift + (Up, Down, Left, Right)
Изменить размер элемента управления с инверсией выравнивания по сетке – Shift + Alt + (Up, Down, Left, Right)
Инверсия использования сетки – Alt + (Up, Down, Left, Right)
Открыть окно «Привязка границ для элемента…» – Ctrl + Shift + S
Начало редактирования – F2

Редактор табличных документов
Перейти к ячейке – Ctrl + G
Перемещение по ячейкам – Up, Down, Left, Right
Перемещение по ячейкам к следующей заполненной или пустой – Ctrl + (Up, Down, Left, Right)
Перемещение по ячейкам к следующей заполненной или пустой с выделением ячеек – Ctrl + Shift + (Up, Down, Left, Right)
Выделение ячеек – Shift + (Up, Down, Left, Right)
Выделение ячеек от текущей до начала строки – Shift + Home
Выделение ячеек от текущей до конца строки – Shift + End
Выделение строк – Alt + Shift + (Up, Down)
Выделение строк до следующей заполненной или пустой ячейки – Ctrl + Alt + Shift + (Up, Down)
Выделение колонок – Alt + Shift + (Left, Right)
Выделение колонок до следующей заполненной или пустой ячейки – Ctrl + Alt + Shift + (Left, Right)
Выделение ячеек от текущей до начала документа – Ctrl + Shift + Home
Выделение ячеек от текущей до конца документа – Ctrl + Shift + End
Прокрутить на страницу вверх – PgUp
Прокрутить на страницу вниз – PgDn
Прокрутить на страницу влево – Alt + PgUp
Прокрутить на страницу вправо – Alt + PgDn
Перейти к редактированию содержимого ячейки – Enter
Переключение режима редактирования/ввода в ячейке – F2
Перейти в начало строки – Home
Перейти в конец строки – End
Перейти в начало текста – Ctrl + Home
Перейти в конец текста – Ctrl + End
Установка имени текущей области – Ctrl + Shift + N

Редактор текстовых документов и модулей
Переключить режим вставки/замены – Ins
Перейти в начало строки – Home
Перейти в конец строки – End
Выделить до начала строки – Shift + Home
Выделить до конца строки – Shift + End
Перейти в начало текста – Ctrl + Home
Перейти в конец текста – Ctrl + End
Выделить до начала текста – Ctrl + Shift + Home
Выделить до конца текста – Ctrl + Shift + End
Прокрутить на одну строку вверх – Ctrl + Up
Прокрутить на одну строку вниз – Ctrl + Down
Перейти к началу предшествующего слова – Ctrl + Left
Перейти к началу следующего слова – Ctrl + Right
Выделить слово – Ctrl + W
Выделить предшествующее слово – Ctrl + Shift + Left
Выделить следующее слово – Ctrl + Shift + Right
Прокрутить на страницу вверх – PgUp
Прокрутить на страницу вниз – PgDn
Выделить предыдущую страницу текста – Shift + PgUp
Выделить следующую страницу текста – Shift + PgDn
Снять выделение – Esc
Перейти к строке – Ctrl + G
Удалить символ слева от курсора – BackSpace
Удалить символ справа от курсора – Del
Удалить слово слева от курсора – Ctrl + BackSpace
Удалить слово справа от курсора – Ctrl + Del
Установить/снять закладку – Alt + F2
Следующая закладка – F2
Предыдущая закладка – Shift + F2
Удалить текущую строку – Ctrl + L
Форматировать блок – Shift + Alt + F
Добавить комментарий – Ctrl + Num/
Удалить комментарий – Ctrl + Shift + Num/
Cдвинуть блок вправо – Tab
Сдвинуть блок влево – Shift + Tab
Синтаксический контроль – Ctrl + F7
Процедуры и функции модуля – Ctrl + Alt + P
Перейти к объявлению процедуры или переменной – F12
Контекстная подсказка – Ctrl + Пробел
Свернуть группу (курсор может быть в любом месте группы) – Ctrl + Num –
Развернуть группу (курсор может быть в любом месте группы) – Ctrl + Num +
Cвернуть все группы – Ctrl + Shift + Num –
Развернуть все группы – Ctrl + Shift + Num +
Обновить группировки – Ctrl+ Shift + R
Активизация шаблона – Ctrl + Q
Перейти по операторным скобкам назад – Ctrl +
Перейти по операторным скобкам назад с выделением текста – Ctrl + Shift +

Отладчик
Начать/продолжить отладку – F5
Перезапуск приложения для отладки – Ctrl + Shift + F5
Прекратить отладку – Shift + F5
Шагнуть в – F11
Шагнуть через – F10
Шагнуть из – Shift + F11
Идти до курсора – Shift + F10
Установить/снять точку останова – F9
Отключить/включить точку останова – Ctrl + Shift + F9
Список точек останова – Alt + F9
Вычислить выражение – Shift + F9
Открыть табло – Ctrl + Alt + W
Открыть стек вызовов – Ctrl + Alt + C

Редактор картинок
Переключение картинка/коллекция – Ctrl + K
Параметры картинки/коллекции – Shift + Alt + P
Отразить слева направо – Ctrl + H
Отразить сверху вниз – Ctrl + Shift + H
Выделение прямоугольником – Shift + Alt + S
Масштаб – Ctrl + M
Ластик – Ctrl + Shift + E
Заливка – Ctrl + Shift + F
Карандаш – Ctrl + Shift + I
Кисть – Ctrl + Shift + B
Линия – Ctrl + Shift + L
Кривая – Shift + Alt + С
Аэрограф – Ctrl + Shift + A
Текст – Shift + Alt + T
Увеличение масштаба – Ctrl + Num+
Уменьшение масштаба – Ctrl + Num-

Палитра свойств
Сохранить свойства – Enter
Восстановить значения свойства – Esc
Раскрыть категорию свойств – Num+
Закрыть категорию свойств – Num-
Перейти в начало палитры – Home
Перейти в конец палитры – End
Перейти к предыдущему свойству – Up
Перейти к следующему свойству – Down
Прокрутить на страницу вверх – PgUp
Прокрутить на страницу вниз – PgDn
Перейти к предыдущей категории – Ctrl + PgUp
Перейти к следующей категории – Ctrl + PgDn

Редактор карты маршрута
Перейти на следующий элемент карты – Tab
Перейти на предыдущий элемент карты – Shift + Tab
Уменьшить ширину элемента карты – Shift + (Left)
Увеличить ширину элемента карты – Shift + (Right)
Уменьшить высоту элемента карты – Shift + (Up)
Увеличить высоту элемента карты – Shift + (Down)
Перемещение выделенного варианта вверх (только при выделенном варианте в – Ctrl + (Up)
элементе «Выбор варианта»)
Перемещение выделенного варианта вниз (только при выделенном варианте в – Ctrl + (Down)
элементе «Выбор варианта»)
Поиск – Ctrl + F
Найти следующий – F3
Найти предыдущий – Shift + F3
Замена – Ctrl + H

Конфигурация
Открыть конфигурацию – Alt + К + Enter
Поиск во всех текстах – Alt + К + Т
Объединение конфигураций – Alt + К + О
Загрузить измененную конфигурацию – Alt + K + З
Конвертирование данных – Alt + К + Е

Администрирование
Пользователи – Alt + А + П
Сохранить данные – Alt + А + Х
Восстановить данные – Alt + А + В
Выгрузить данные – Alt + А + Ы
Загрузить данные – Alt + А + Г
Настройка журнала регистрации – Alt + А + Н
Распределенная ИБ – Alt + А + Р
Управление – Alt + А + Р + У
Автообмен – Alt + А + Р + А

Действия
Открыть в отладчике – Alt + Д + Т
Синтаксический контроль запросов – Alt + Д + К
Синтаксический контроль – Alt + Д + И
Процедуры и функции модуля – Alt + Д + Р

Работа с закладками
Предыдущая закладка – Shift + F2
Закладка – Alt + F2
Следующая закладка – F2

Работа с блоком
Форматировать – Ctrl + Shift +F
Сдвинуть вправо – Tab
Сдвинуть влево – Shift + Tab
Добавить комментарий – Ctrl + Num /
Удалить комментарий – Ctrl + Shift + Num /

Окна
Закрыть окно – Ctrl + F4
Следующее окно – Ctrl + Shift + F6
Предыдущее окно – Ctrl + F6
Каскадом – Alt + О + К
Закрыть окно сообщений – Ctrl + Shift + z
Следующая страница – Ctrl + Alt + F
Предыдущая страница – Ctrl + Alt + B
Разделить окно – Alt + О + Р

Поиск и замена
Заменить – Ctrl + Shift + F3
Искать – Ctrl + F3
Повторить поиск – F3
Искать назад – Alt + F3
Искать вперед – Shift + F3
Переход к строке – Ctrl + Shift + L

Сервис
Калькулятор – Ctrl + F2
Синтаксис помощник – Alt + С + С
Настройка шаблонов – Alt + С + Н
Временная блокировка – Alt + С + В
Запуск предприятия – F11
Запуск отладчика – F12

Помощь
Помощь – F1
Содержание – Shift + F1
Поиск в Синтакс-Помощнике – Ctrl + F1
О программе – Alt + П + О

Общие
Свойства – Alt + Enter
Выход – Alt + F4

1. Выбор одного значения из списка в режиме использования модальности

Необходимо включить режим использования модальности, если он отключен;

Воспользуемся методом ВыбратьИзСписка ()

&НаКлиенте Процедура ВыбратьЗнакЗодиака(Команда) ЗнакиЗодиака = Новый СписокЗначений; ЗнакиЗодиака.Добавить(«Весы»); ЗнакиЗодиака.Добавить(«Телец»); ЗнакиЗодиака.Добавить(«Скорпион»); ВыбранноеЗначение = ВыбратьИзСписка(ЗнакиЗодиака); Если ВыбранноеЗначение <> Неопределено Тогда Сообщить(ВыбранноеЗначение.Значение); КонецЕсли; КонецПроцедуры

Метод ВыбратьИзМеню () работает по аналогии с методом ВыбратьИзСписка ();

Выбор одного значения из списка без использования модальности

Метод: ПоказатьВыборЭлемента ()

&НаКлиенте Процедура ВыбратьЗнакЗодиака(Команда) ЗнакиЗодиака = Новый СписокЗначений; ЗнакиЗодиака.Добавить(«Весы»); ЗнакиЗодиака.Добавить(«Телец»); ЗнакиЗодиака.Добавить(«Скорпион»); ОповещениеПослеВыбораЭлемента = Новый ОписаниеОповещения( «СообщитьРезультат», ЭтотОбъект); ЗнакиЗодиака.ПоказатьВыборЭлемента( ОповещениеПослеВыбораЭлемента, «Выберите Ваш знак зодиака»); КонецПроцедуры &НаКлиенте Процедура СообщитьРезультат(Элемент, Параметры) Экспорт Если Элемент <> Неопределено Тогда Сообщить(Элемент.Значение); КонецЕсли; КонецПроцедуры

Выбор нескольких значений из списка в режиме использования модальности

Метод: ОтметитьЭлементы

&НаКлиенте Процедура ВыбратьЗнакЗодиака(Команда) ЗнакиЗодиака = Новый СписокЗначений; ЗнакиЗодиака.Добавить(«Весы»); ЗнакиЗодиака.Добавить(«Телец»); ЗнакиЗодиака.Добавить(«Скорпион»); ВыбранноеЗначение = ЗнакиЗодиака.ОтметитьЭлементы(«Выберите знаки зодиака»); Для каждого ЗнакЗодиака Из ЗнакиЗодиака Цикл Если ЗнакЗодиака.Пометка Тогда Сообщить(ЗнакЗодиака); КонецЕсли; КонецЦикла; КонецПроцедуры

Выбор нескольких значений из списка без использования модальности

Метод: ПоказатьОтметкуЭлементов ()

&НаКлиенте Процедура ВыбратьЗнакЗодиака(Команда) ЗнакиЗодиака = Новый СписокЗначений; ЗнакиЗодиака.Добавить(«Весы»); ЗнакиЗодиака.Добавить(«Телец»); ЗнакиЗодиака.Добавить(«Скорпион»); ОповещениеПослеВыбора = Новый ОписаниеОповещения( «СообщитьРезультат», ЭтотОбъект); ЗнакиЗодиака.ПоказатьОтметкуЭлементов( ОповещениеПослеВыбора, «Выберите знаки зодиака»); КонецПроцедуры &НаКлиенте Процедура СообщитьРезультат(Элементы, Параметры) Экспорт Если Элементы <> Неопределено Тогда Для Каждого ЗнакЗодиака Из Элементы Цикл Если ЗнакЗодиака.Пометка Тогда Сообщить(ЗнакЗодиака.Значение); КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры

Вступление

Для чего вообще стоит отказываться от модальности и, например, Вопрос заменять на ПоказатьВопрос? Всё дело в том, что больше года назад 1С-ники объявили «войну» модальным окнам. Исключение составляют только те, у кого самописная конфигурация, работа с которой не будет вестись на IPad, в режиме сервиса или с помощью веб-клиента. А если у вас обычная Бухгалтерия 3.0 и вы не собираетесь бухгалтеру давать доступ к базе через IPad, всё равно вам придётся заменить все модальные методы на немодальные, т.к. рано или поздно «Режим использования модальности» станет «Не использовать»!

Что же думает по предлагаемому вопросу специалисты фирмы 1С? Для начала можно посмотреть на тему «Вопрос в обработчике формы ПередЗакрытием»:

Особенность диалога с пользователем в этом (и многих других) обработчиках заключается в том, что в зависимости от реакции пользователя принимается решение: продолжать дальнейшие действия, или отказаться от них. Для этого используется параметр процедуры Отказ. При одном ответе пользователя мы отказываемся от продолжения (Отказ = Истина). При другом ответе пользователя — продолжаем дальнейшие действия.

В данном случае сложность заключается в том, что ответ пользователя мы узнаем уже после того, как выйдем из контекста этого обработчика. В процедуре, обрабатывающей оповещение. А параметр Отказ нужно установить именно в этом обработчике.

Поэтому мы действуем в два приёма:

В первый раз безусловно отменяем дальнейшие действия (Отказ = Истина) и выводим вопрос пользователю;

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

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

В первый проход её значение равно Ложь, и это значит, что нужно отказаться от закрытия и задать вопрос. Во второй проход её значение равно Истина, и это значит, что вопрос задавать не надо:

&НаКлиенте Перем ВыполняетсяЗакрытие; &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) Если Не ВыполняетсяЗакрытие Тогда Отказ=Истина; ПоказатьВопрос(Новый ОписаниеОповещения(«ПередЗакрытиемЗавершение», ЭтотОбъект), «Закрывать форму?», РежимДиалогаВопрос.ДаНет); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПередЗакрытиемЗавершение(РезультатВопроса, ПараметрыЗаписи) Экспорт Если РезультатВопроса = КодВозвратаДиалога.Да Тогда ВыполняетсяЗакрытие = Истина; Закрыть(); КонецЕсли; КонецПроцедуры ВыполняетсяЗакрытие = Ложь;

Этот пример схож с нашей темой и очень часто на него ссылаются в теме «ПоказатьВопрос в обработчике формы ПередЗаписью»:

В обработчике события формы ПередЗаписью также может возникнуть потребность задать вопрос. Как и в предыдущем примере. Однако здесь вопрос так просто не решается. Отличие заключается в следующем.

В предыдущем примере, оказываясь в обработчике ПередЗакрытием, мы однозначно знали действие, которое должно быть выполнено. Это закрытие формы. Поэтому в обработке оповещения мы смело писали Закрыть().

Но в обработчике ПередЗаписью мы такой однозначной информации не имеем. В этом обработчике мы можем оказаться по двум причинам: если пользователь нажал Записать, или если он нажал Записать и закрыть. То есть дальнейший сценарий действий нам неизвестен. Определить его стандартными способами, находясь внутри этого обработчика, мы не можем.

Поэтому тут можно предложить три варианта, но все они, к сожалению, обладают недостатками:

* Изменить логику прикладного решения так, чтобы не было диалога с пользователем в этом обработчике. Это не всегда возможно;

* В обработке оповещения с помощью собственной блокирующей формы задавать пользователю развернутый вопрос, предполагающий точное описание дальнейших действий: Отказаться?, Только записать?, Записать и закрыть? Это может выглядеть не очень красиво, ведь пользователь уже нажал «Записать и закрыть», а его опять об этом спрашивают;

* Не использовать стандартные команды формы Записать, «Записать и закрыть». Вместо них создать собственные команды, в которых и выполнять необходимые алгоритмы. Создание собственных команд потребует дополнительных трудозатрат.

Задача сложная, поэтому разработчики при задании вопроса ПередЗаписью, в первую очередь рекомендуют отказаться от этой идеи…

Дальше предлагают задать вопрос с множеством вариантов: «Отказаться, Только записать, Записать и закрыть». Помимо описанного минуса (пользователь и так уже заранее выбрать вариант, а его тут ещё раз спрашивают) есть ещё: в ПередЗаписью программа могла попасть и из «Отмена проведения». Т.е. надо добавлять ещё кнопку? Мне кажется этот вариант некрасивым.

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

Пример использования ПоказатьВопрос в обработчике формы ПередЗаписью

1. Сначала нам нужно убрать стандартную команду «Провести и закрыть» из формы и создать свою команду и кнопку.

1.А. Если у вас уже кнопка «Провести и закрыть» не типовая – вам повезло, можете смело приступать к п. 2.

1.Б. Стандартная команда убирается через Свойства формы – Состав команд – Снимаем ненужную команду. Как добавлять команду и кнопку на форму, я не буду описывать, только напомню, что кнопку «Провести и закрыть» необходимо сделать кнопкой по умолчанию.

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

Для начала в обработчике формы «ПриОткрытии» необходимо убрать стандартную кнопку «ПровестиИЗакрыть».

Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь;

Замечание: у пользователя с большими ограничениями к документу в платформе 8.3.7 вообще не появляется кнопка «Провести и закрыть». Поэтому для платформы 8.3.7 корректней писать код:

Если Элементы.Найти(«ФормаПровестиИЗакрыть»)<>Неопределено Тогда Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь; КонецЕсли;

Дальше добавляем команду и кнопку в обработчике формы «ПриСозданииНаСервере»::

НоваяКоманда1 = ЭтаФорма.Команды.Добавить(«ПровестиИЗакрыть2»); НоваяКоманда1.Действие = «ПровестиИЗакрыть»; НовыйЭлемент = Элементы.Добавить(«ФормаПровестиИЗакрыть2» , Тип(«КнопкаФормы»), Элементы.ФормаКоманднаяПанель); НовыйЭлемент.Заголовок = «Провести и закрыть»; НовыйЭлемент.ИмяКоманды = НоваяКоманда1.Имя; НовыйЭлемент.КнопкаПоУмолчанию = Истина; Элементы.Переместить(НовыйЭлемент,НовыйЭлемент.Родитель,Элементы.ГруппаКнопкиКоманднойПанели);

Соответственно в этом коде заложены типовые наименования для ФормаДокументаОбщая документа «Поступление (акты, накладные)» (например Элементы.ГруппаКнопкиКоманднойПанели), которые в каждом конкретном случае необходимо будет менять на свои.

2. Дальше нам нужно в процедуру на новую кнопку «Провести и закрыть» написать код:

&НаКлиенте Процедура ПровестиИЗакрыть(Команда) ПараметрыЗаписи = Новый Структура(); ПараметрыЗаписи.Вставить(«РежимЗаписи», ПредопределенноеЗначение(«РежимЗаписиДокумента.Проведение»)); ПараметрыЗаписи.Вставить(«Закрыть», Истина); Если Записать(ПараметрыЗаписи) Тогда Закрыть(); КонецЕсли; КонецПроцедуры

Как я писал выше, мы будем обмениваться информацией между нашими процедурами через ПараметрыЗаписи. В ПередЗаписью мы не знаем, нажали мы «Записать», «Провести» или «Провести и закрыть», для этого в параметрах мы передаём параметр Закрыть. Если в параметрах записи есть этот параметр, значит надо закрыть форму после успешной записи.

3. Допустим, нам надо задавать вопрос не всегда, а только когда документ проведён. Теперь мы в процедуру «ПередЗаписью» добавляем (если эта процедура не существовала – создаём) новый код:

Если Не ПараметрыЗаписи.Свойство(«ВопросЗадан») И Объект.Проведен Тогда Отказ = Истина; Оповещение = Новый ОписаниеОповещения(«ПоказатьВопросЗавершение», ЭтаФорма, ПараметрыЗаписи); ТекстВопроса = «Данный документ уже проведён. Вы действительно хотите перепровести или отменить проведение документа?»; ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 20, КодВозвратаДиалога.Нет,, КодВозвратаДиалога.Нет); КонецЕсли;

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

После метода ПоказатьВопрос можно ещё написать «Возврат», если у вас есть ещё какой-то код в процедуре «ПередЗаписью», выполняемый после вопроса.

4. Создаём процедуру «ПоказатьВопросЗавершение», в которую программа будет входить, когда пользователь ответит на вопрос (или произошёл таймаут).

&НаКлиенте Процедура ПоказатьВопросЗавершение(Результат, ПараметрыЗаписи) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыЗаписи.Вставить(«ВопросЗадан», Истина); Если Записать(ПараметрыЗаписи) И ПараметрыЗаписи.Свойство(«Закрыть») Тогда Закрыть(); КонецЕсли; КонецЕсли; КонецПроцедуры

В этой процедуре мы и используем переданное ранее свойство «Закрыть». Если свойства нет, значит, закрывать не надо.

5. Теперь нам надо обработать нажатие «крестика» пользователем. Для этого нам нужна обработчик формы «ПередЗакрытием». Если его нет, то его можно создать на форме «ручками» или программно в обработчике «ПриСозданииНаСервере»:

ЭтаФорма.УстановитьДействие(«ПередЗакрытием»,»ПередЗакрытием»);

Далее добавляем код в ПередЗакрытием и создаём ещё одну процедуру:

&НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) Если Модифицированность Тогда Отказ = Истина; ТекстВопроса = НСтр(«ru = ‘Данные были изменены. Сохранить изменения?'»); Оповещение = Новый ОписаниеОповещения(«ВопросПередЗакрытиемЗавершение», ЭтотОбъект); ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВопросПередЗакрытиемЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыЗаписи = Новый Структура(); ПараметрыЗаписи.Вставить(«Закрыть», Истина); Если Записать(ПараметрыЗаписи) Тогда Закрыть(); КонецЕсли; ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда Модифицированность = Ложь; Закрыть(); КонецЕсли; КонецПроцедуры

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

Вопрос против ПоказатьВопрос

А как бы мы решили задачу, если бы можно было использовать модальные вызовы? А очень просто, мы бы написали в процедуре «ПередЗаписью» следующий код:

Если Объект.Проведен Тогда ТекстВопроса = «Данный документ уже проведён. Вы действительно хотите перепровести или отменить проведение документа?»; Ответ = Вопрос(ТекстВопроса,РежимДиалогаВопрос.ДаНет,20,КодВозвратаДиалога.Нет,,КодВозвратаДиалога.Нет); Если Не Ответ=КодВозвратаДиалога.Да Тогда Отказ = Истина; Возврат; КонецЕсли; КонецЕсли;

И всё! Никаких «заморочек» типа «А что пользователь нажал: Провести или ПровестиИЗакрыть?». И ещё надо будет отработать нажатие крестика в «ПередЗакрытием».

Изначально похожий код я реализовывал у себя в Бухгалтерии предприятия 3.0. Задача заключалась в следующем: при определённом наборе условий (это не одно условие Объект.Проведен, как указано в примере в данной публикации) из ФормаДокументаОбщая документа ПоступлениеТоваровУслуг спрашивать дополнительно подтверждения его действий. Ниже перечислены нюансы, которые мне не пришлось обходить, т.к. не подпадали под задачу.

В обработчик формы «ПередЗаписью» программа не заходит, если: 1) пользователь нажал на кнопку «Пометить на удаление / снять пометку»; 2) если пользователь нажал на не проведённом документе кнопку «ДТ/КТ». И это не всё: если вы на форме документа создали всё, как я написал, и пользователь из формы списка перепроведёт документ – то никаких вопросов программа ему не задаст. Необходимо все интересующие вас кнопки на форме списка заменять на свои и отслеживать действия пользователя. Ещё у документа может быть не одна форма документа, а несколько (например, документ ПоступлениеТоваровУслуг в БП 3.0, где 3 формы: общая, товары и услуги). В каждой форме документа надо написать много кода…

В связи с кучей нюансов остаётся актуальным первый совет от 1С (который сначала, без подробного вникания в задачу, может вызвать улыбку): «Изменить логику прикладного решения так, чтобы не было диалога с пользователем в этом обработчике».

В 1С:Предприятии доступна работа с модальными окнами. Данный режим позволяет блокировать работу с другими окнами пока не будет закрыто модальное окно. Этот механизм необходим когда для продолжения работы обязательно требуется ввести какие либо данные. Для открытия форм в модальном режиме существует специальный метод Форма.ОткрытьМодально() или глобальный метод ОткрытьФормуМодально(). Данные методы доступны в обычном и управляемом приложениях.

Управление режимом модальности

В новых версиях платформы добавилось новое свойство конфигурации «Режим использования модальности». Это свойство может быть установлено: Не использовать, Использовать с предупреждением, Использовать. С помощью данного глобального свойства устанавливается режим использования модальных окон во всей конфигурации.

Проблемы при открытии модальных форм на веб-клиенте

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

Имитация модальной формы методом ОткрытьФорму()

Для решения данных проблем в платформе был разработан новый механизм открытия модальных окон. Если в конфигурации стоит запрет на использование модальных окон, то нельзя использовать методы модального открытия окон. Однако, есть возможность сделать окно модальным с помощью метода ОткрытьФорму(). В этом методе появились новые параметры «РежимОткрытияОкна» и «ОписаниеОповещенияОЗакрытии».
Парметр «РежимОткрытияОкна» — позволяет установить блокировку всех открытых окон 1С:Предприятия, кроме открываемого.
Параметр «ОписаниеОповещенияОЗакрытии» — позволяет определить процедуру вызываемую при закрытии формы.
Таким образом можно добиться модальности при открытии формы. В браузере такая псевдомодальная форма отрисовывается внутри родительского окна, тем самым не создавая всплывающие окна.
&НаКлиенте
Процедура КомандаВыполнить(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения(«ОбработкаЗакрытия», ЭтаФорма);
ОткрытьФорму(«ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма1»,,,,,,
ОповещениеОЗакрытии,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаЗакрытия(Результат, ДопПараметры) Экспорт
Сообщить(«Форма закрыта»);
КонецПроцедуры

Открытие модальной формы по умолчанию

В управляемых формах, свойство «РежимОткрытияОкна» также доступно в палитре свойств. Это свойство может иметь одно из следующих значений: Независимый, блокировать окно владельца, Блокировать весь интерфейс. Если установить данное свойство, то при открытии формы «РежимОткрытияОкна» устанавливать не нужно.

Add a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *