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

02.03.15

Разработка - Механизмы платформы 1С

На основе простого примера показана реализация механизма ввода на основании.

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

Рассмотрим работу механизма ввода на основании на следующем примере: Организация оказывает услуги пассажирского такси. Заказы покупателей регистрируются в документе «Заказ». Заказ может быть формируется диспетчером. Документ «Заказ» содержит следующую информацию:

  1. имя клиента
  2. адрес клиента
  3. адрес откуда
  4. адрес куда
  5. время подачи
  6. желаемый класс автомобиля
  7. список желаемых опций

Имя клиента, его адрес и телефон хранятся в справочнике «Клиенты». В данном примере будет реализован ввод документа на основании справочника. С целью упрощения примера справочник будет только один - «Клиенты», вся остальная информация будет вводиться вручную.

Создание объектов конфигурации

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

Документ «Заказ»:

Реализация

В свойствах документа «Заказ» перейдем на закладку «Ввод на основании»:

Нажмем кнопку «Редактировать элемент списка» и выберем из списка справочник «Клиенты»:

Далее запустим конструктор ввода на основании нажатием на кнопку "Конструктор ввода на основании":

В открывшемся окне нужно сопоставить поля справочника с реквизитами документа заказа. Это можно сделать, нажав кнопку «Заполнить выражения» и тогда система попытается сама определить, какие поля необходимо скопировать:

Поле адреса нужно сопоставлять вручную, выбрав поле «АдресОткуда» в нижней части, а затем двойным щелчком на реквизите «Адрес» в реквизитах объекта обоснования:

По нажатию «ОК» система генерирует следующий код в модуле документа «Заказ» в процедуре ОбработкаЗаполнения:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда
		// Заполнение шапки
		АдресОткуда = ДанныеЗаполнения.Адрес;
		Клиент = ДанныеЗаполнения.Ссылка;
		Телефон = ДанныеЗаполнения.Телефон;
	КонецЕсли;
	//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры

Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании. В данном случае, если переменная ДанныеЗаполнения является ссылкой на справочник клиентов, выполняется заполнение реквизитов документа. Код обработчика можно модифицировать. Предположим, что клиенты чаще всего хотят подачу такси в течение 15-20 минут. Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда
		АдресОткуда = ДанныеЗаполнения.Адрес;
		Клиент = ДанныеЗаполнения.Ссылка;
		Телефон = ДанныеЗаполнения.Телефон;
		ВремяПодачи = ТекущаяДата() + 900; // 15 * 60 секунд
	КонецЕсли;
КонецПроцедуры

 Запустим приложение в режиме отладки и проверим, как работает ввод на основании. Добавим пару записей в справочник клиентов:

Откроем одну из них. В окне будет доступна кнопка «Создать на основании», по нажатию которой откроется список с опцией выбора «Заказ»:

При выборе «Заказ» система создает пустой документ и заполняет поля в процедуре ОбработкаЗаполнения:

Сохраним документ и убедимся, что документ был успешно создан, открыв его из спиcка документов заказа:

Теперь предположим, что у клиентов могут быть опции, которые всегда присутствуют в заказе данного клиента. Например, «Некурящий водитель». Тогда их можно задавать в справочнике клиентов и копировать в документ заказа. Расширим справочник «Клиенты» табличной частью «Опции»:

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Клиенты") Тогда
		// Заполнение шапки
		АдресОткуда = ДанныеЗаполнения.Адрес;
		Клиент = ДанныеЗаполнения.Ссылка;
		Телефон = ДанныеЗаполнения.Телефон;
		ВремяПодачи = ТекущаяДата() + 900; // 15 * 60 секунд
		
		Для Каждого ТекСтрока Из ДанныеЗаполнения.Опции Цикл
			НоваяЗапись = Опции.Добавить();
			НоваяЗапись.Опция = ТекСтрока.Опция;
			НоваяЗапись.Количество = ТекСтрока.Количество;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

 Запустим конфигурацию в режиме отладки и посмотрим, что получилось. Добавим опции клиенту:

Сохраним данные и создадим заказ на основании записи справочника:

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4420    dsdred    53    

69

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5269    YA_418728146    25    

62

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6380    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18458    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12069    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8795    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6271    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15945    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. necropunk 9 02.03.15 15:47 Сейчас в теме
Как-то слишком уж просто. А как бы вы сделали на управляемых формах, к примеру, создание на основании группы документов/элементов справочника? Допустим, каждой строке табличной части документа соответствует один элемент справочника и нужно сформировать 10 элементов и открыть формы незаписанных элементов...
3. karpik666 3760 03.03.15 03:46 Сейчас в теме
(1) necropunk, у вас тоже какой то странный пример. Но даже он решается программным образом, я бы повесил обработчик перед записью на проверку. Ну а вообще что из этого получится, откроется куча немодальных окон и как в таком разобраться? А если будет не 10 позиций а 50 и начнется хаос
4. slazzy 42 03.03.15 09:34 Сейчас в теме
(3) karpik666, нет ну теоретически это решается довольно легко, через каскад вызываемых асинхронных процедур.
Вызываем первую процедуру, и в дополнительные параметры передаем список элементов, которые ещё надо создать, при закрытии первой формы создаем один элемент и удаляем его из списка, ну и так по кругу ))
правда необходимость подобного действа очень сомнительна.
6. karpik666 3760 03.03.15 12:16 Сейчас в теме
(4) slazzy, а тут немного непонятно, первый доп параметр, содержащий список элементов, будет передаваться первой форме элемента из документа основания, а затем? Оставшийся список элементов передается из формы нового элемента или документа основания? Если документа основания, то планируется я так понимаю повесить это все на обработчик оповещения?
7. slazzy 42 03.03.15 12:29 Сейчас в теме
(6) karpik666, Этот параметр будет передаваться через ОписаниеОповещения в доп параметрах, либо он может вообще не передаваться, а храниться в глобальной переменной.

Я просто предложил элементарный способ решения Вашей задачи :) хотя сама задача мне кажется крайне редкоиспользуемой. Вот примерно как-то так


Процедура СоздатьСледующийОбъект(МассивОбъектов) Экспорт
	Если НЕ МассивОбъектов.Количество() Тогда
		Возврат;
	КонецЕсли;
	СоздаваемыйОбъект = МассивОбъектов [ 0 ] ;
	МассивОбъектов.Удалить( 0 );
	ПараметрыОткрытия = Новый Структура("ЗначенияЗаполнения",СоздаваемыйОбъект);
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеСоздатьСледующийОбъект",ЭтотОбъект,МассивОбъектов);
	ОткрытьФорму("ИмяФормы",ПараметрыОткрытия,,,,,ОписаниеОповещения);
КонецПроцедуры

Процедура ЗавершениеСоздатьСледующийОбъект(РезультатЗакрытия, МассивОбъектов) Экспорт
	
	Если МассивОбъектов.Количество() Тогда
		СоздатьСледующийОбъект(МассивОбъектов);
	КонецЕсли;
	
КонецПроцедуры
Показать
anna110297; KUAvanesov; +2 Ответить
5. perepechayev 26 03.03.15 10:38 Сейчас в теме
(1) necropunk, спасибо, я постараюсь развить тему. Вопрос в том, как сделать видным "лес из-за деревьев" при таком усложнении.
2. makas 44 02.03.15 16:06 Сейчас в теме
Плюсую за Карлсона, который живет на крыше + :-)
8. AleksSF 222 04.03.15 14:08 Сейчас в теме
Скоро начнем писать статьи как создать справочник и в нем 1 реквизит. Неужели книжек мало, чтобы такой элементарщиной забивать полезный сайт.
Видимо пора уже модераторам фильтровать поток писательства.
v_moskalyk; +1 Ответить
9. aatm 27.01.17 09:59 Сейчас в теме
Не описан механизм связи отмены проведения, пометки на удаления документа-источника и документа введенного на основании.
12. AlexeyK1 14 16.03.22 11:14 Сейчас в теме
(9)
так же не упоминаются какие "права" и разрешения необходимы в системе для ввода на основании , а то с полными правами неинтересно
14. T_Cold 11.10.22 16:31 Сейчас в теме
(9) Статья о платформенном механизме ввода на основании. Не совсем понятно о чем вы. В общем случае никаких дополнительных контролей нет.
10. derevenge 10.11.17 13:22 Сейчас в теме
Если на основании уже введен документ, но пользователь собирается ввести еще один. Как открыть форму уже введенного документа при нажатии кнопки ввести на основании?
11. MegasXXX 2 11.03.19 17:01 Сейчас в теме
(10) Очевидно, найти Ссылку, получить форму и открыть.
13. 1C_tradeomsk 105 06.06.22 15:42 Сейчас в теме
Мелко. А где - как прописать в стандартной конфигурации ввод на основании другого документа. Процедуры заполнения вы напишите, а вот в интерфейсе где?
programmer_87; +1 Ответить
Оставьте свое сообщение