Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3 курс (заочка) / Методические пособия / Пособие для ответов на контрольные вопросы

.pdf
Скачиваний:
158
Добавлен:
15.02.2021
Размер:
46.69 Mб
Скачать

Занятие 26 801

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

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

Как задать вопрос пользователю в команде формы

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

В режиме «Конфигуратор»

Прежде всего, откроем палитру свойств нашей конфигурации и посмотрим на свойство Режим

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

(рис. 26.3).

Рис. 26.3. Свойство конфигурации «Режим использования модальности»

Мы видим, что это свойство стандартно установлено в значение Не использовать. Этот режим является рекомендуемым.

Это значит, что при попытке открытия модального окна в режиме 1С:Предприятие будет получена ошибка.

802 1С:Предприятие 8.3. Практическое пособие разработчика

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

Для разработки конфигураций в режиме отказа от модальности в  платформу добавлены методы, аналогичные модальным методам, но, в отличие от них, не блокирующие программный код. Эти методы уже не используют модальные окна, поэтому могут беспрепятственно использоваться при разработке веб-приложений. Эти методы имеют следующие особенности:

имена этих методов начинаются со слов Показать либо Начать,

например ПоказатьВопрос() вместо Вопрос(), НачатьПомещениеФайла() вместо ПоместитьФайл() и т. п.;

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

методы не возвращают значения, вместо этого результат выбора пользователя будет передан в процедуру модуля, описанную объ-

ектом ОписаниеОповещения.

подробнее

Соответствиемодальныхметодовихнемодальныманалогамприведено в документации «1С:Предприятие 8.3. Руководство разработчика», раздел 7.7.3 «Форма. Различные подходы к модальности. Соответствие методов».

Добавим в модуль формы документа следующий код (листинг 26.7).

Листинг 26.7. Обработчик нажатия кнопки «Подбор» с предварительным вопросом пользователю

&НаКлиенте Процедура ПодборВопрос(Команда)

Оповещение = Новый ОписаниеОповещения("ПодборЗавершение", ЭтотОбъект); ПоказатьВопрос(Оповещение, "Подобрать номенклатуру в документ?",

РежимДиалогаВопрос.ДаНет);

КонецПроцедуры

&НаКлиенте Процедура ПодборЗавершение(Результат, Параметры) Экспорт

Занятие 26 803

Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина); ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",

ПараметрыФормы, Элементы.Материалы);

КонецЕсли;

КонецПроцедуры

Поясним этот код.

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

Процедура – обработчик оповещения может располагаться в модуле управляемой формы, в общем неглобальном клиентском модуле или модуле команды. В данном случае эта процедура располагается в модуле нашей формы, на что указывает ссылка ЭтотОбъект.

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

Процедура – обработчик оповещения должна быть объявлена как экспортная, с использованием ключевого слова Экспорт. В параметре Результат содержится результат ответа пользователя. Если он положительный, то производится открытие формы выбора номенклатуры для подбора

в документ.

Чтобы не путаться, установим новый обработчик для команды Подбор. В палитре свойств этой команды в строке Действие выберем процедуру ПодборВо-

прос (рис. 26.4).

Рис. 26.4. Установка действия для команды «Подбор»

804 1С:Предприятие 8.3. Практическое пособие разработчика

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки.

Перейдем в раздел Учет материалов, откроем список приходных накладных и создадим новую приходную накладную. В командной панели списка материалов нажмем кнопку Подбор.

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

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

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

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

Реализуем вариант одиночного подбора с использованием множественного выбора. В форме документа ПриходнаяНакладная откроем палитру свойств команды Подбор и в строке Действие установим в  качестве обработчика команды процедуру Подбор.

Изменим текст обработчика команды Подбор следующим образом

(листинг 26.8).

Листинг 26.8. Обработчик нажатия кнопки «Подбор»

&НаКлиенте Процедура Подбор(Команда)

ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина); ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы,

Элементы.Материалы);

КонецПроцедуры

Занятие 26 805

Затем добавим в обработчик события ОбработкаВыбора таблицы Материалы открытие блокирующего окна с вопросом пользователю

(листинг 26.9).

Листинг 26.9. Обработчик события «ОбработкаВыбора» таблицы «Материалы» с предварительным вопросом пользователю

&НаКлиенте Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

Если ОтветПередДобавлением <> Истина Тогда СтандартнаяОбработка = Ложь; Оповещение = Новый ОписаниеОповещения(

"ДобавлениеЗавершение", ЭтотОбъект, ВыбранноеЗначение); ПоказатьВопрос(Оповещение, "Добавить номенклатуру в табличную часть?",

РежимДиалогаВопрос.ДаНет);

Иначе Для Каждого ВыбранныйЭлемент Из ВыбранноеЗначение Цикл

НоваяСтрока = Объект.Материалы.Добавить(); НоваяСтрока.Материал = ВыбранныйЭлемент;

КонецЦикла; КонецЕсли;

КонецПроцедуры

Поясним этот код.

Используя переменную ОтветПередДобавлением, мы определяем, был ли получен ответ от пользователя.

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

Если значение переменной ОтветПередДобавлением не истинно, то сначала создается объект ОписаниеОповещения, в конструкторе которого первым параметром указывается имя процедуры – обработчика оповещения, которая будет выполнена после получения ответа пользователя. Во втором параметре указывается, в каком модуле расположена эта процедура (в нашем случае – в модуле формы). А  в  третьем параметре в качестве дополнительного параметра передается массив выбранных значений номенклатуры (Выбран-

ноеЗначение).

После этого с помощью немодального метода ПоказатьВопрос() отображается окно с вопросом пользователю. В этот метод

806 1С:Предприятие 8.3. Практическое пособие разработчика

передается объект ОписаниеОповещения, указывающий на экспортную процедуру модуля (ДобавлениеЗавершение), которая будет выполнена после того, как пользователь сделает выбор в блокирующем окне.

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

(листинг 26.10).

Листинг 26.10. Процедура – обработчик оповещения «ДобавлениеЗавершение()»

&НаКлиенте Процедура ДобавлениеЗавершение(Результат, СписокНоменклатуры) Экспорт

Если Результат = КодВозвратаДиалога.Да Тогда ОтветПередДобавлением = Истина;

Для Каждого ВыбранныйЭлемент Из СписокНоменклатуры Цикл НоваяСтрока = Объект.Материалы.Добавить(); НоваяСтрока.Материал = ВыбранныйЭлемент;

КонецЦикла;

КонецЕсли;

КонецПроцедуры

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

Остается только объявить эту переменную в самом начале модуля формы (листинг 26.11).

Листинг 26.11. Объявление переменной в модуле формы

&НаКлиенте Перем ОтветПередДобавлением;

Занятие 26 807

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки.

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

ПРИМЕЧАНИЕ

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

вить флажок Поиск использования модальности.

Ввод на основании

Механизм ввода на основании может быть использован для ввода новых объектов различного типа (документы, справочники, планы видов характеристик и т. д.). Мы рассмотрим этот механизм на примере ввода новых документов как наиболее распространенном.

Для каждого объекта конфигурации Документ можно разрешить его ввод на основании других объектов базы данных и возможность являться основанием для других объектов.

Действия по заполнению реквизитов при вводе на основании должны быть описаны в модуле объекта Документ, в обработчике события

ОбработкаЗаполнения.

Это можно сделать вручную или с использованием конструктора ввода на основании, который позволяет визуальными средствами конструировать текст обработчика.

Рассмотрим пример, когда документ ОказаниеУслуги будет вводиться на основании элемента справочника Клиенты.

808 1С:Предприятие 8.3. Практическое пособие разработчика

Команда ввода на основании

В режиме «Конфигуратор»

Откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги и добавим новый реквизит документа – ОбъектОсно-

вание с типом СправочникСсылка.Клиенты.

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

Перейдем на закладку Ввод на основании и определим состав документов, на основании которых может вводиться документ ОказаниеУслуги и основанием для которых он может являться.

Нажмем кнопку Редактировать элемент списка над списком Вводится на основании и выберем справочник Клиенты (рис. 26.5).

Рис. 26.5. Определение состава объектов, на основании которых вводится документ

Затем вызовем конструктор ввода на основании и зададим значения реквизитов документа, создаваемого на основании. Для этого воспользуемся кнопкой Заполнить выражения (рис. 26.6).

Занятие 26 809

Рис. 26.6. Заполнение значений реквизитов документа, создаваемого на основании

Обратите внимание, что для заполнения реквизита ОбъектОснование конструктор предложил использовать значение ДанныеЗаполнения.Ссылка. В данном случае такая запись будет избыточной, поскольку в качестве основания будет передана ссылка на элемент справочника.

Однако в общем случае событие ОбработкаЗаполнения возникает при создании нового объекта на основании некоторого переданного значения. Совсем не обязательно, что это значение будет иметь тип ссылки.

Согласимся со всем, что предложил конструктор, и нажмем OK.

В модуле документа будет сформирован текст обработчика события

ОбработкаЗаполнения (листинг 26.12).

Листинг 26.12. Обработчик события «ОбработкаЗаполнения»

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ

//Данный фрагмент построен конструктором.

//При повторном использовании конструктора внесенные вручную изменения будут утеряны!!!

Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда

//Заполнение шапки

Клиент = ДанныеЗаполнения.Ссылка; ОбъектОснование = ДанныеЗаполнения.Ссылка;

КонецЕсли; //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ

КонецПроцедуры

810 1С:Предприятие 8.3. Практическое пособие разработчика

Как видите, для каждого типа объекта-основания формируется своя ветка условия Если…, в которой происходит заполнение реквизитов нового документа.

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и проверим работу ввода на основании.

Откроем список клиентов. Обратите внимание, что в командной панели формы списка справочника Клиенты появилась команда

Создать на основании.

Выделив нужного клиента и выполнив команду Создать на основании

Оказание услуги, создадим новый документ Оказание услуги, где в  качестве клиента будет выбран выделенный в списке справочника клиент (рис. 26.7).

Рис. 26.7. Создание документа «Оказание услуги» на основании клиента

Введите самостоятельно еще несколько документов на основании какого-либо клиента.

Объекты, введенные на основании

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