Ввод на основании используется в случаях, когда при создании нового объекта могут быть использованы данные уже существующего объекта. Ввод на основании может быть реализован для справочников, документов, планов видов характеристик, планов счетов, планов видов расчета и бизнес-процессов. В общем случае объект может быть создан на основании любого объекта из перечисленных выше, например, документ может быть создан на основании справочника.
Рассмотрим работу механизма ввода на основании на следующем примере: Организация оказывает услуги пассажирского такси. Заказы покупателей регистрируются в документе «Заказ». Заказ может быть формируется диспетчером. Документ «Заказ» содержит следующую информацию:
- имя клиента
- адрес клиента
- адрес откуда
- адрес куда
- время подачи
- желаемый класс автомобиля
- список желаемых опций
Имя клиента, его адрес и телефон хранятся в справочнике «Клиенты». В данном примере будет реализован ввод документа на основании справочника. С целью упрощения примера справочник будет только один - «Клиенты», вся остальная информация будет вводиться вручную.
Создание объектов конфигурации
Справочник "Клиенты":
Документ «Заказ»:
Реализация
В свойствах документа «Заказ» перейдем на закладку «Ввод на основании»:
Нажмем кнопку «Редактировать элемент списка» и выберем из списка справочник «Клиенты»:
Далее запустим конструктор ввода на основании нажатием на кнопку "Конструктор ввода на основании":
В открывшемся окне нужно сопоставить поля справочника с реквизитами документа заказа. Это можно сделать, нажав кнопку «Заполнить выражения» и тогда система попытается сама определить, какие поля необходимо скопировать:
Поле адреса нужно сопоставлять вручную, выбрав поле «АдресОткуда» в нижней части, а затем двойным щелчком на реквизите «Адрес» в реквизитах объекта обоснования:
По нажатию «ОК» система генерирует следующий код в модуле документа «Заказ» в процедуре ОбработкаЗаполнения:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда // Заполнение шапки АдресОткуда = ДанныеЗаполнения.Адрес; Клиент = ДанныеЗаполнения.Ссылка; Телефон = ДанныеЗаполнения.Телефон; КонецЕсли; //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ КонецПроцедуры
Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании. В данном случае, если переменная ДанныеЗаполнения является ссылкой на справочник клиентов, выполняется заполнение реквизитов документа. Код обработчика можно модифицировать. Предположим, что клиенты чаще всего хотят подачу такси в течение 15-20 минут. Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда АдресОткуда = ДанныеЗаполнения.Адрес; Клиент = ДанныеЗаполнения.Ссылка; Телефон = ДанныеЗаполнения.Телефон; ВремяПодачи = ТекущаяДата() + 900; // 15 * 60 секунд КонецЕсли; КонецПроцедуры
Запустим приложение в режиме отладки и проверим, как работает ввод на основании. Добавим пару записей в справочник клиентов:
Откроем одну из них. В окне будет доступна кнопка «Создать на основании», по нажатию которой откроется список с опцией выбора «Заказ»:
При выборе «Заказ» система создает пустой документ и заполняет поля в процедуре ОбработкаЗаполнения:
Сохраним документ и убедимся, что документ был успешно создан, открыв его из спиcка документов заказа:
Теперь предположим, что у клиентов могут быть опции, которые всегда присутствуют в заказе данного клиента. Например, «Некурящий водитель». Тогда их можно задавать в справочнике клиентов и копировать в документ заказа. Расширим справочник «Клиенты» табличной частью «Опции»:
Теперь необходимо модифицировать процедуру ОбработкаЗаполнения документа. Это можно было бы сделать через конструктор, но тогда процедура обработки будет перезаписана, поэтому добавим код копирования табличной части вручную:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда // Заполнение шапки АдресОткуда = ДанныеЗаполнения.Адрес; Клиент = ДанныеЗаполнения.Ссылка; Телефон = ДанныеЗаполнения.Телефон; ВремяПодачи = ТекущаяДата() + 900; // 15 * 60 секунд Для Каждого ТекСтрока Из ДанныеЗаполнения.Опции Цикл НоваяЗапись = Опции.Добавить(); НоваяЗапись.Опция = ТекСтрока.Опция; НоваяЗапись.Количество = ТекСтрока.Количество; КонецЦикла; КонецЕсли; КонецПроцедуры
Запустим конфигурацию в режиме отладки и посмотрим, что получилось. Добавим опции клиенту:
Сохраним данные и создадим заказ на основании записи справочника:
Таким образом, данные табличной части были успешно скопированы в заказ. Для этого простого примера реализацию ввода на основании можно считать законченной.