Информационные системы / Курсовая_6_семестр / Учебники / Радченко М.Г. 1С- Предприятие 8.3. Практическое пособие разработчика. Примеры и типовые приемы (2013) (1)
которая должна быть выполнена тогда, когда пользователь закроет это окно. Именно с этой процедуры и продолжится выполнение программного кода.
Суть этих изменений проще всего увидеть на следующем примере. Этот пример немного надуман и вряд ли представляет большую практическую ценность. Но он нужен для того, чтобы легче понять второй, уже достаточно практический пример.
Как задать вопрос пользователю в команде формы
Предположим, прежде чем выполнять подбор номенклатуры в табличную часть приходной накладной, нам нужно задать вопрос пользователю о необходимости подбора.
В режиме «Конфигуратор»
Прежде всего, откроем палитру свойств нашей конфигурации и посмотрим на свойство Режим
Рис. 26.3. Свойство конфигурации «Режим использования модальности»
Мы видим, что это свойство стандартно установлено в значение Не использовать . Этот режим является рекомендуемым.
Это значит, что при попытке открытия модального окна в режиме 1С:Предприятие будет получена ошибка.
802 1С:Предприятие 8.3. Практическое пособие разработчика
Чтобы этого избежать, зададим вопрос пользователю в обработчике команды Подбор , но будем использовать не модальный метод Вопрос() , а его немодальный аналог ПоказатьВопрос() .
Для разработки конфигураций в режиме отказа от модальности в платформу добавлены методы, аналогичные модальным методам, но, в отличие от них, не блокирующие программный код. Эти методы уже не используют модальные окна, поэтому могут беспрепятственно использоваться при разработке веб-приложений. Эти методы имеют следующие особенности:
имена этих методов начинаются со слов Показать либо Начать ,
например ПоказатьВопрос() вместо Вопрос() , НачатьПомещениеФайла() вместо ПоместитьФайл() и т. п.;
первым параметром в эти методы передается объект ОписаниеОповещения , указывающий на процедуру модуля, которая будет выполнена после того, как пользователь сделает выбор в блокирующем окне;
методы не возвращают значения, вместо этого результат выбора пользователя будет передан в процедуру модуля, описанную объ-
Соответствиемодальныхметодовихнемодальныманалогамприведено в документации «1С:Предприятие 8.3. Руководство разработчика», раздел 7.7.3 «Форма. Различные подходы к модальности. Соответствие методов».
Добавим в модуль формы документа следующий код (листинг 26.7).
Листинг 26.7. Обработчик нажатия кнопки «Подбор» с предварительным вопросом пользователю
&НаКлиенте Процедура ПодборВопрос(Команда)
Оповещение = Новый ОписаниеОповещения(«ПодборЗавершение», ЭтотОбъект); ПоказатьВопрос(Оповещение, «Подобрать номенклатуру в документ?»,
&НаКлиенте Процедура ПодборЗавершение(Результат, Параметры) Экспорт
Занятие 26 80 3
Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыФормы = Новый Структура(«МножественныйВыбор», Истина); ОткрытьФорму(«Справочник.Номенклатура.ФормаВыбора»,
Поясним этот код.
В процедуре ПодборВопрос() сначала создается объект ОписаниеОповещения , в конструкторе которого первым параметром указывается имя процедуры – обработчика оповещения, которая будет выполнена после получения ответа пользователя. А во втором параметре указывается, в каком модуле расположена эта процедура.
Процедура – обработчик оповещения может располагаться в модуле управляемой формы, в общем неглобальном клиентском модуле или модуле команды. В данном случае эта процедура располагается в модуле нашей формы, на что указывает ссылка ЭтотОбъект .
После этого с помощью немодального метода ПоказатьВопрос() отображается окно с вопросом пользователю. В этот метод передается объект ОписаниеОповещения , указывающий на процедуру модуля ( ПодборЗавершение ), которая будет выполнена после того, как пользователь сделает выбор в блокирующем окне.
Процедура – обработчик оповещения должна быть объявлена как экспортная, с использованием ключевого слова Экспорт . В параметре Результат содержится результат ответа пользователя. Если он положительный, то производится открытие формы выбора номенклатуры для подбора
Чтобы не путаться, установим новый обработчик для команды Подбор . В палитре свойств этой команды в строке Действие выберем процедуру ПодборВо-
Рис. 26.4. Установка действия для команды «Подбор»
804 1С:Предприятие 8.3. Практическое пособие разработчика
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки.
Перейдем в раздел Учет материалов , откроем список приходных накладных и создадим новую приходную накладную. В командной панели списка материалов нажмем кнопку Подбор .
Перед тем как выполнять подбор, всплывает блокирующее окно с вопросом пользователю о необходимости подбора. Это окно блокирует интерфейс, но не останавливает выполнение прикладного решения. Подбор номенклатуры в документ выполняется только в случае положительного ответа пользователя.
Как задать вопрос пользователю в обработчике события
Рассмотрим теперь более сложный пример, когда вопрос пользователю требуется задать в обработчике события. Например, перед добавлением номенклатуры в табличную часть приходной накладной нужно спросить, добавлять ли выбранные элементы номенклатуры в документ. Причем подтверждение о добавлении номенклатуры в документ у пользователя нужно спрашивать только один раз.
Конечно, этот пример (как и предыдущий) вряд ли понадобится при разработке реальной конфигурации, но в целом оба примера хорошо демонстрируют общий подход отказа от использования модальных окон, описанный выше в теоретической части этого раздела.
Реализуем вариант одиночного подбора с использованием множественного выбора. В форме документа ПриходнаяНакладная откроем палитру свойств команды Подбор и в строке Действие установим в качестве обработчика команды процедуру Подбор .
Изменим текст обработчика команды Подбор следующим образом
Листинг 26.8. Обработчик нажатия кнопки «Подбор»
&НаКлиенте Процедура Подбор(Команда)
ПараметрыФормы = Новый Структура(«МножественныйВыбор», Истина); ОткрытьФорму(«Справочник.Номенклатура.ФормаВыбора», ПараметрыФормы,
Занятие 26 80 5
Затем добавим в обработчик события ОбработкаВыбора таблицы Материалы открытие блокирующего окна с вопросом пользователю
Листинг 26.9. Обработчик события «ОбработкаВыбора» таблицы «Материалы» с предварительным вопросом пользователю
&НаКлиенте Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ОтветПередДобавлением <> Истина Тогда СтандартнаяОбработка = Ложь; Оповещение = Новый ОписаниеОповещения(
«ДобавлениеЗавершение», ЭтотОбъект, ВыбранноеЗначение); ПоказатьВопрос(Оповещение, «Добавить номенклатуру в табличную часть?»,
Иначе Для Каждого ВыбранныйЭлемент Из ВыбранноеЗначение Цикл
НоваяСтрока = Объект.Материалы.Добавить(); НоваяСтрока.Материал = ВыбранныйЭлемент;
Поясним этот код.
Используя переменную ОтветПередДобавлением , мы определяем, был ли получен ответ от пользователя.
Если нет, то отменяем стандартную обработку для события ОбработкаВыбора и показываем блокирующее окно с вопросом пользователю. Если ответ от пользователя уже был получен, то список номенклатуры добавляется в табличную часть без вопросов.
Если значение переменной ОтветПередДобавлением не истинно, то сначала создается объект ОписаниеОповещения , в конструкторе которого первым параметром указывается имя процедуры – обработчика оповещения, которая будет выполнена после получения ответа пользователя. Во втором параметре указывается, в каком модуле расположена эта процедура (в нашем случае – в модуле формы). А в третьем параметре в качестве дополнительного параметра передается массив выбранных значений номенклатуры ( Выбран-
После этого с помощью немодального метода ПоказатьВопрос() отображается окно с вопросом пользователю. В этот метод
806 1С:Предприятие 8.3. Практическое пособие разработчика
передается объект ОписаниеОповещения , указывающий на экспортную процедуру модуля ( ДобавлениеЗавершение ), которая будет выполнена после того, как пользователь сделает выбор в блокирующем окне.
В этой процедуре в параметре СписокНоменклатуры содержится массив выбранных значений номенклатуры. В параметре Результат содержится результат ответа пользователя. В случае положительного ответа пользователя значение переменной ОтветПередДобавлением становится истинным, и затем выполняется добавление выбранных элементов номенклатуры в табличную часть документа
Листинг 26.10. Процедура – обработчик оповещения «ДобавлениеЗавершение()»
&НаКлиенте Процедура ДобавлениеЗавершение(Результат, СписокНоменклатуры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда ОтветПередДобавлением = Истина;
Для Каждого ВыбранныйЭлемент Из СписокНоменклатуры Цикл НоваяСтрока = Объект.Материалы.Добавить(); НоваяСтрока.Материал = ВыбранныйЭлемент;
Причем если пользователь уже подтвердил, что он хочет добавить номенклатуру в документ, то больше это вопрос не задается, так как значение переменной ОтветПередДобавлением становится истинным.
Остается только объявить эту переменную в самом начале модуля формы (листинг 26.11).
Листинг 26.11. Объявление переменной в модуле формы
&НаКлиенте Перем ОтветПередДобавлением;
Занятие 26 80 7
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки.
Результат выполнения примера будет таким же, как и в предыдущем случае, за исключением того, что вопрос пользователю будет задан после выбора номенклатуры, а не до этого. А также подтверждение о добавлении номенклатуры в документ требуется только один раз.
Проверить код конфигурации на предмет отсутствия модальных методов можно с помощью команды конфигуратора Конфигурация Проверка конфигурации. В окне параметров проверки нужно устано-
вить флажок Поиск использования модальности .
Ввод на основании
Механизм ввода на основании может быть использован для ввода новых объектов различного типа (документы, справочники, планы видов характеристик и т. д.). Мы рассмотрим этот механизм на примере ввода новых документов как наиболее распространенном.
Для каждого объекта конфигурации Документ можно разрешить его ввод на основании других объектов базы данных и возможность являться основанием для других объектов.
Действия по заполнению реквизитов при вводе на основании должны быть описаны в модуле объекта Документ , в обработчике события
Это можно сделать вручную или с использованием конструктора ввода на основании, который позволяет визуальными средствами конструировать текст обработчика.
Рассмотрим пример, когда документ ОказаниеУслуги будет вводиться на основании элемента справочника Клиенты .
808 1С:Предприятие 8.3. Практическое пособие разработчика
Команда ввода на основании
В режиме «Конфигуратор»
Откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги и добавим новый реквизит документа – ОбъектОсно-
вание с типом СправочникСсылка.Клиенты .
Создание такого реквизита не является обязательной частью механизма ввода на основании и понадобится нам только для того, чтобы впоследствии построить цепочку зависимых документов.
Перейдем на закладку Ввод на основании и определим состав документов, на основании которых может вводиться документ ОказаниеУслуги и основанием для которых он может являться.
Нажмем кнопку Редактировать элемент списка над списком Вводится на основании и выберем справочник Клиенты (рис. 26.5).
Рис. 26.5. Определение состава объектов, на основании которых вводится документ
Затем вызовем конструктор ввода на основании и зададим значения реквизитов документа, создаваемого на основании. Для этого воспользуемся кнопкой Заполнить выражения (рис. 26.6).
Занятие 26 80 9
Рис. 26.6. Заполнение значений реквизитов документа, создаваемого на основании
Обратите внимание, что для заполнения реквизита ОбъектОснование конструктор предложил использовать значение ДанныеЗаполнения.Ссылка . В данном случае такая запись будет избыточной, поскольку в качестве основания будет передана ссылка на элемент справочника.
Однако в общем случае событие ОбработкаЗаполнения возникает при создании нового объекта на основании некоторого переданного значения. Совсем не обязательно, что это значение будет иметь тип ссылки.
Согласимся со всем, что предложил конструктор, и нажмем OK .
В модуле документа будет сформирован текст обработчика события
ОбработкаЗаполнения (листинг 26.12).
Листинг 26.12. Обработчик события «ОбработкаЗаполнения»
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //<<__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора внесенные вручную изменения будут утеряны.
Если ТипЗнч(ДанныеЗаполнения) = Тип(«СправочникСсылка.Клиенты») Тогда
Клиент = ДанныеЗаполнения.Ссылка; ОбъектОснование = ДанныеЗаполнения.Ссылка;
810 1С:Предприятие 8.3. Практическое пособие разработчика
Как видите, для каждого типа объекта-основания формируется своя ветка условия Если… , в которой происходит заполнение реквизитов нового документа.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и проверим работу ввода на основании.
Откроем список клиентов. Обратите внимание, что в командной панели формы списка справочника Клиенты появилась команда
Создать на основании .
Выделив нужного клиента и выполнив команду Создать на основании
Оказание услуги , создадим новый документ Оказание услуги , где в качестве клиента будет выбран выделенный в списке справочника клиент (рис. 26.7).
Рис. 26.7. Создание документа «Оказание услуги» на основании клиента
Введите самостоятельно еще несколько документов на основании какого-либо клиента.
Объекты, введенные на основании
Наряду с тем, что платформа содержит механизмы, позволяющие создавать одни объекты на основании других, каких-либо специальных механизмов для анализа цепочек связанных объектов в платформе нет.
Как задать вопрос пользователю в обработчике события формы
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
- Как немодально вывести диалог вопроса с заголовком и нужными кнопками
- Как немодально вывести предупреждение пользователю
- Как немодально открыть значение для интерактивной работы с ним
- Как немодально ввести дату от пользователя
- Как немодально ввести значение определенного типа от пользователя
- Как немодально ввести строку от пользователя
- Как немодально ввести число определенного типа от пользователя
- Как модально вывести диалог вопроса с заголовком и нужными кнопками
- Как модально обработать прерывание операции от пользователя (нажатие Break)
- Как модально вывести предупреждение пользователю
- Как модально открыть значение для интерактивной работы с ним
- Как очистить служеб. сообщения и вывести предупреждающий сигнал
- Как указать статус сообщения при выводе
- Как модально ввести дату от пользователя
- Как модально ввести значение определенного типа от пользователя
- Как модально ввести строку от пользователя
- Как модально ввести число определенного типа от пользователя
- Скачать и выполнить эти примеры на компьютере
Работа с Диалогами в языке 1С 8.3, 8.2 (в примерах
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Как в УФ перед записью вызвать вопрос?
Т.е. нужно перед записью проверить соответствие реквизитов определенной схеме и задать вопрос. Если пользователь подтвердит, то записать, если не подтвердит — то прервать запись.
Как это сделать в новой парадигме модальности? Блокировать интерфейс не получится, имхо.
(3) Странный вопрос, куда передать 🙂
1. Ты находишь ошибки
2. Задаешь вопрос, и пользователь принимает решение.
3. Если пользователь не принял решение, или у тебя жестко "Только без ошибок". То пишешь Отказ = Истина в процедуре "ПередЗаписью", которая должна размещаться в форме записываемого "Объета".
4. . а сам как думаешь, что дальше.
&НаКлиенте
Перем ОтветПередЗакрытием;
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Если ОтветПередЗакрытием <> Истина Тогда
Отказ = Истина;
Оповещение = Новый ОписаниеОповещения(
"ПередЗакрытиемЗавершение",
ЭтотОбъект);
ПоказатьВопрос(Оповещение, “Закрыть?”, РежимДиалогаВопрос.ДаНет);
КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ОтветПередЗакрытием = Истина;
Закрыть();
КонецЕсли;
КонецПроцедуры
Как задать вопрос пользователю в обработчике события формы
ПередЗаписью (BeforeWrite)
Синтаксис:
ПередЗаписью(<Отказ>, <ПараметрыЗаписи>)
Параметры:
2 комментария:
Сейчас столкнулся с такой задачей, решение в голову пришло такое же. Но есть одна проблема: мы не можем отследить нажал пользователь кнопку "Провести и закрыть" или просто "Провести". Можно, конечно, не закрывать, но у пользователей сразу возникнет большое количество вопросов: "Почему я нажал "Закрыть", но ничего не закрылось".