Как задать вопрос пользователю в обработчике события формы
Перейти к содержимому

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

  • автор:

Информационные системы / Курсовая_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 комментария:

Сейчас столкнулся с такой задачей, решение в голову пришло такое же. Но есть одна проблема: мы не можем отследить нажал пользователь кнопку "Провести и закрыть" или просто "Провести". Можно, конечно, не закрывать, но у пользователей сразу возникнет большое количество вопросов: "Почему я нажал "Закрыть", но ничего не закрылось".

Добавить комментарий

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