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