
1C-DevGuide83
.pdf
Занятие 26 801
которая должна быть выполнена тогда, когда пользователь закроет это окно. Именно с этой процедуры и продолжится выполнение программного кода.
Суть этих изменений проще всего увидеть на следующем примере. Этот пример немного надуман и вряд ли представляет большую практическую ценность. Но он нужен для того, чтобы легче понять второй, уже достаточно практический пример.
Как задать вопрос пользователю в команде формы
Предположим, прежде чем выполнять подбор номенклатуры в табличную часть приходной накладной, нам нужно задать вопрос пользователю о необходимости подбора.
В режиме «Конфигуратор»
Прежде всего, откроем палитру свойств нашей конфигурации и посмотрим на свойство Режим
использования модальности
(рис. 26.3).
Рис. 26.3. Свойство конфигурации «Режим использования модальности»
Мы видим, что это свойство стандартно установлено в значение Не использовать. Этот режим является рекомендуемым.
Это значит, что при попытке открытия модального окна в режиме 1С:Предприятие будет получена ошибка.

802 1С:Предприятие 8.3. Практическое пособие разработчика
Чтобы этого избежать, зададим вопрос пользователю в обработчике команды Подбор, но будем использовать не модальный метод Вопрос(), а его немодальный аналог ПоказатьВопрос().
Для разработки конфигураций в режиме отказа от модальности в платформу добавлены методы, аналогичные модальным методам, но, в отличие от них, не блокирующие программный код. Эти методы уже не используют модальные окна, поэтому могут беспрепятственно использоваться при разработке веб-приложений. Эти методы имеют следующие особенности:
имена этих методов начинаются со слов Показать либо Начать,
например ПоказатьВопрос() вместо Вопрос(), НачатьПомещениеФайла() вместо ПоместитьФайл() и т. п.;
первым параметром в эти методы передается объект ОписаниеОповещения, указывающий на процедуру модуля, которая будет выполнена после того, как пользователь сделает выбор в блокирующем окне;
методы не возвращают значения, вместо этого результат выбора пользователя будет передан в процедуру модуля, описанную объ-
ектом ОписаниеОповещения.
подробнее
Соответствиемодальныхметодовихнемодальныманалогамприведено в документации «1С:Предприятие 8.3. Руководство разработчика», раздел 7.7.3 «Форма. Различные подходы к модальности. Соответствие методов».
Добавим в модуль формы документа следующий код (листинг 26.7).
Листинг 26.7. Обработчик нажатия кнопки «Подбор» с предварительным вопросом пользователю
&НаКлиенте Процедура ПодборВопрос(Команда)
Оповещение = Новый ОписаниеОповещения("ПодборЗавершение", ЭтотОбъект); ПоказатьВопрос(Оповещение, "Подобрать номенклатуру в документ?",
РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте Процедура ПодборЗавершение(Результат, Параметры) Экспорт


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

Занятие 26 805
Затем добавим в обработчик события ОбработкаВыбора таблицы Материалы открытие блокирующего окна с вопросом пользователю
(листинг 26.9).
Листинг 26.9. Обработчик события «ОбработкаВыбора» таблицы «Материалы» с предварительным вопросом пользователю
&НаКлиенте Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ОтветПередДобавлением <> Истина Тогда СтандартнаяОбработка = Ложь; Оповещение = Новый ОписаниеОповещения(
"ДобавлениеЗавершение", ЭтотОбъект, ВыбранноеЗначение); ПоказатьВопрос(Оповещение, "Добавить номенклатуру в табличную часть?",
РежимДиалогаВопрос.ДаНет);
Иначе Для Каждого ВыбранныйЭлемент Из ВыбранноеЗначение Цикл
НоваяСтрока = Объект.Материалы.Добавить(); НоваяСтрока.Материал = ВыбранныйЭлемент;
КонецЦикла; КонецЕсли;
КонецПроцедуры
Поясним этот код.
Используя переменную ОтветПередДобавлением, мы определяем, был ли получен ответ от пользователя.
Если нет, то отменяем стандартную обработку для события ОбработкаВыбора и показываем блокирующее окно с вопросом пользователю. Если ответ от пользователя уже был получен, то список номенклатуры добавляется в табличную часть без вопросов.
Если значение переменной ОтветПередДобавлением не истинно, то сначала создается объект ОписаниеОповещения, в конструкторе которого первым параметром указывается имя процедуры – обработчика оповещения, которая будет выполнена после получения ответа пользователя. Во втором параметре указывается, в каком модуле расположена эта процедура (в нашем случае – в модуле формы). А в третьем параметре в качестве дополнительного параметра передается массив выбранных значений номенклатуры (Выбран-
ноеЗначение).
После этого с помощью немодального метода ПоказатьВопрос() отображается окно с вопросом пользователю. В этот метод


Занятие 26 807
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки.
Результат выполнения примера будет таким же, как и в предыдущем случае, за исключением того, что вопрос пользователю будет задан после выбора номенклатуры, а не до этого. А также подтверждение о добавлении номенклатуры в документ требуется только один раз.
ПРИМЕЧАНИЕ
Проверить код конфигурации на предмет отсутствия модальных методов можно с помощью команды конфигуратора Конфигурация Проверка конфигурации... В окне параметров проверки нужно устано-
вить флажок Поиск использования модальности.
Ввод на основании
Механизм ввода на основании может быть использован для ввода новых объектов различного типа (документы, справочники, планы видов характеристик и т. д.). Мы рассмотрим этот механизм на примере ввода новых документов как наиболее распространенном.
Для каждого объекта конфигурации Документ можно разрешить его ввод на основании других объектов базы данных и возможность являться основанием для других объектов.
Действия по заполнению реквизитов при вводе на основании должны быть описаны в модуле объекта Документ, в обработчике события
ОбработкаЗаполнения.
Это можно сделать вручную или с использованием конструктора ввода на основании, который позволяет визуальными средствами конструировать текст обработчика.
Рассмотрим пример, когда документ ОказаниеУслуги будет вводиться на основании элемента справочника Клиенты.


Занятие 26 809
Рис. 26.6. Заполнение значений реквизитов документа, создаваемого на основании
Обратите внимание, что для заполнения реквизита ОбъектОснование конструктор предложил использовать значение ДанныеЗаполнения.Ссылка. В данном случае такая запись будет избыточной, поскольку в качестве основания будет передана ссылка на элемент справочника.
Однако в общем случае событие ОбработкаЗаполнения возникает при создании нового объекта на основании некоторого переданного значения. Совсем не обязательно, что это значение будет иметь тип ссылки.
Согласимся со всем, что предложил конструктор, и нажмем OK.
В модуле документа будет сформирован текст обработчика события
ОбработкаЗаполнения (листинг 26.12).
Листинг 26.12. Обработчик события «ОбработкаЗаполнения»
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
//Данный фрагмент построен конструктором.
//При повторном использовании конструктора внесенные вручную изменения будут утеряны!!!
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда
//Заполнение шапки
Клиент = ДанныеЗаполнения.Ссылка; ОбъектОснование = ДанныеЗаполнения.Ссылка;
КонецЕсли; //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры

810 1С:Предприятие 8.3. Практическое пособие разработчика
Как видите, для каждого типа объекта-основания формируется своя ветка условия Если…, в которой происходит заполнение реквизитов нового документа.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и проверим работу ввода на основании.
Откроем список клиентов. Обратите внимание, что в командной панели формы списка справочника Клиенты появилась команда
Создать на основании.
Выделив нужного клиента и выполнив команду Создать на основании
Оказание услуги, создадим новый документ Оказание услуги, где в качестве клиента будет выбран выделенный в списке справочника клиент (рис. 26.7).
Рис. 26.7. Создание документа «Оказание услуги» на основании клиента
Введите самостоятельно еще несколько документов на основании какого-либо клиента.
Объекты, введенные на основании
Наряду с тем, что платформа содержит механизмы, позволяющие создавать одни объекты на основании других, каких-либо специальных механизмов для анализа цепочек связанных объектов в платформе нет.