Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Радченко М.Г. 1С- Предприятие 8.3. Практическое пособие разработчика. Примеры и типовые приемы (2013).word.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
20.81 Mб
Скачать

С предварительным вопросом пользователю

&НаКлиенте

Процедура ПодборВопрос(Команда)

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

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

&НаКлиенте

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

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

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

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

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

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

Если Результат = КодВозвратаДиалога.Да Тогда

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

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

КонецЕсли;

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

Свойства: Команда

IKlli х v

Основные:

Имя

Подбор

Заголовок

Подбор

| Действие

|"1одборВ опрос Q.|

Изменяет сохраняемые, данные

. I

МатериалыКоличествоПриИзменении

Использование

М атериалыЦ енаП риИ зменении

Функи ио нал ьныеопц ии

Подбор

J

П редставление:

ПодборВопрос

Картинка

Подсказка

Подбор

Отображение

Авто

Сочетание клавиш

-

Действие

Результат содержится результат ответа пользователя. Если он положительный, то произво­дится открытие формы выбора номенклатуры для подбора в документ.

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте

Процедура Подбор(Команда)

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

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

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

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

Листинг 26.9. Обработчик события «ОбработкаВыбора» таблицы

«Материалы» с предварительным вопросом пользователю

&НаКлиенте

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

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

Оповещение = Новый ОписаниеОповещения(

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

Иначе

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

НоваяСтрока.Материал = ВыбранныйЭлемент;

КонецЦикла;

КонецЕсли;

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

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

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

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

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

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

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

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

&НаКлиенте

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

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

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

НоваяСтрока.Материал = ВыбранныйЭлемент;

КонецЦикла;

КонецЕсли;

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

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

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

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

&НаКлиенте

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

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

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

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

ПРИМЕЧАНИЕ

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

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

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

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

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

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

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

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

Откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги и добавим новый реквизит документа - ОбъектОсно­вание с типом СправочникСсылка.Клиенты.

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

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

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

Конструктор ввода на основании]])

Является основанием дл:

Выбор объекта

© тт

L пк |

0 Ш Справочники

Отмена

@ПВ Клиенты ОШ Сотрудники ОШ Номенклатура ОШ Склады

ОШ ВариангыНоменклатуры ОШ ДополнительныеСвойстваНоменклатуры ОШ Субконто

ОШ ВидыГраФиковРаботы © @ Документы

Права

Обмен данными Прочее

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

& К

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

Вводится на основании:

Основные

Подсистемы

Функциональные опции

Данные

Нумерация

Движения

П ос ледовательности

Журналы

Формы

Поле ввода

Команды

Макеты

| Документ ОказаниеУслуги

Действия -1 | <Назад ] | Далее> | | Закрыть | | Справка

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

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

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

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

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

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

В модуле документа будет сформирован текст обработчика события ОбработкаЗаполнения (листинг 26.12).

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

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

// При повторном использовании конструктора внесенные вручную изменения будут утеряны!!! Если ТипЗнч(ДанныеЗаполнения) = Тип(''СправочникСсылка.Клиенты'') Тогда // Заполнение шапки Клиент = ДанныеЗаполнения.Ссылка;

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

КонецЕсли;

//}} КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ

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

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

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

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

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

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

о I I *- -» | Клиенты

Создать ] [ Найти... ] [ Отменить поиск ]

Создать на основании т i|

Еще -

Оказание услуги

Ф. И. О.

Код

= Иванов Михаил Юрьевич

000000001

= Клиент отделения

OTD00000001

= Клиент филиала

ФЛ000000001

= Роман

000000002

= Спиридонова Галина

000000003

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

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

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

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

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

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

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

Критерий отбора

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

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

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

Получение объектов, введенных на основании

Поскольку задача получения всех объектов, введенных на основании какого-либо другого объекта, чаще всего возникает при анализе доку­ментов, мы рассмотрим применение описанной выше методики на примере получения списка документов, введенных на основании элемента справочника Клиенты.

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

Раскроем ветвь Общие и создадим новый объект конфигурации Крите­рийОтбора с именем ОказаниеУслуги.

На закладке Данные выберем тип используемого критерия - Справоч- никСсылка.Клиенты.

На закладке Состав в качестве объектов, входящих в критерий, выберем реквизит ОбъектОснование документа ОказаниеУслуги (рис. 26.8).

Рис. 26.8. Состав критерия отбора «ОказаниеУслуги»

После этого в панели навигации формы элемента справочника Клиенты в группе Перейти появится команда для открытия критерия отбора.

Создадим эту форму и на закладке Командный интерфейс установим видимость команды Оказание услуги (рис. 26.9).

XI##

Команда

Видимость | Автовидимость | Автоположе...

е Щ Панель навигации в Важное Q п П ерейти

Оказание услуги (Обьект.Сс... а См. также © ^ Командная панель а Важное

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

S Элементы Щ Командный интерфейс J~

Рис. 26.9. Команда открытия критерия отбора из формы элемента справочника «Клиенты»

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

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

В форме списка клиентов выделим клиента Роман, на основании которого мы создавали документы Оказание услуги.

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

Выполним эту команду (рис. 26.10).

Рис. 26.10. Открытие списка критерия отбора «ОказаниеУспуги» с отбором по клиенту

Мы видим в этом списке документы Оказание услуги, созданные на основании клиента Роман. К содержимому документа можно перейти, нажав соответствующую ссылку в списке документов.

( \

Контрольные вопросы

Л

V у

Что такое подбор?

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

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

Как задать вопрос пользователю в обработчике события формы? Чем модальные окна отличаются от блокирующих окон?

Что такое ввод на основании?

Как с помощью критерия отбора вывести список объектов, введенных на основании текущего объекта?

Как организовать ввод одних объектов конфигурации на осно­вании других?

[ЗАНЯТИЕ 27

Приемы разработки

форм

продолжительность