Несколько документов на основании одного

07.09.19

Разработка - Универсальные функции

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Демонстрационная конфигурация "Управляемое приложение" с примером реализации
.dt 19,75Mb
24 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

Задача

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

 
 Демонстрация результата
Решение

Пример выполнен в демонстрационной конфигурации "Управляемое приложение" (1.0.24.0), где на основании документа Заказ создаются документы РасходТовара (представление - Продажа).  Конфигурация в демонстрационных целях немного изменена: в указанных документах реквизит Склад перенесен из шапки в табличную часть.

Доработки потребуется внести в модуль объекта и модуль формы создаваемого документа РасходТовара. Кроме того, придется добавить реквизит документа для хранения адреса во временном хранилище (тип Строка, длина 100). Назовем его АдресЕщеОдногоДокумента.

 
 Алгоритм

Код представлен ниже.

 
 Модуль объекта создаваемого документа
 
 Модуль формы создаваемого документа

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

Вступайте в нашу телеграмм-группу Инфостарт

Несколько документов на основании одного

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4090    Abysswalker    10    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7645    DeerCven    15    

61

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    52581    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7661    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67067    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9578    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. oleg-x 23 10.06.19 10:31 Сейчас в теме
(0)Вроде в разделе вопросы, а вопроса то и нет)
2. mvxyz 331 10.06.19 12:16 Сейчас в теме
(1) Это не вопрос, это ответ. В разделе "Вопросы" ссылку на статью не нашел.
3. alexruzh67 14.06.19 04:47 Сейчас в теме
Для нас актуально создание документов перемещения из документа чек ККМ.
4. mvxyz 331 14.06.19 12:34 Сейчас в теме
(3) Принцип общий. Попробуйте.
5. dadel 20 16.10.19 09:25 Сейчас в теме
Пробую по аналогии делать заполнение нескольких.
У меня пример должен создать 4 документа сгруппированных по году на основании документа планирования на 4 года вперед.
Все вроде работает, но только до открытия форм.
При открытии форм в отладчике вижу заполнение каждой сохраненным объектом, данные есть в формах, но в результате открывается только одна форма заполненная и три пустых...
Что не так пока не вкурю.
Костылем пока сделал сразу запись созданных документов и открывается только первый при этом сделал (при открытии не иду в проверку ОткрытьФормуЕщеОдногоДокументаПриНеобходимости()).
Что не так, пока не смог разобраться...
6. dadel 20 16.10.19 09:30 Сейчас в теме
И у меня заполнение документа не из самой копии происходит, как в предложенном варианте, а из регистров по ссылке на основание. Сделал в создаваемых копиях запись ссылки на основание в дополнительные свойства объекта и уже при заполнении её передаю в параметры запроса. То же самое с период - год у меня условие - так же не занимаюсь перезаполнением табчасти по нужному году, а в допсвойства объекта передаю массив с оставшимися годам в копиюоставшиеся и в копиютек только нужный период один. Далее так же по этому одному накладываю условие при заполнении.
7. avant2004 08.05.20 14:59 Сейчас в теме
Спасибо за рабочий пример. бы добавил еще одно условие в процедуру ОткрытьФормуЕщеОдногоДокументаПриНеобходимости() - "И Параметры.Ключ.Пустая()". Иначе по непонятной причине уже записанные документы при открытии вываливаются в ошибку (почему-то у них не очищается реквизит АдресЕщеОдногоДокумента).
Но есть здесь один нехороший момент. Если нужно заполнять реквизит "ДокументОснование" , то ссылкой его можно заполнить только один раз (в первом документе), т.к. для последующих документов идет работа с объектом, из которого невозможно получить ссылку.
8. kznsky 10.05.20 18:34 Сейчас в теме
Очень помогла ваша публикация в решении похожей задачи, спасибо!

Но само создание нескольких документов на основании решил по другому алгоритму. Может кому пригодится:

При создании документа на основании заказа в обработке заполнения собираю информацию о складах в массив СкладыЗаказа, так же как в вашем примере. Первый документ заполняю стандартной обработкой только, при заполнении ТЧ товары по условию, отбираю только те строки в которых СтрокаТч.Склад = СкладыЗаказа[0]

После проверяю надо ли создавать новый документ и создаю его программно.Но в обработку заполнения в качестве параметра передаю не ДокОснование, а структуру в которой первый элемент - ДокОснование, второй - СкладыЗаказа, третий индекс склада в СкладыЗаказа по которому надо заполнять ТЧ товары.

Проверка необходимости создания нового документа: Если СкладыЗаказа.Количество() > ИндексСклада+1

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

Если это Тип("ДокументСсылка.Заказ"), то установить ДокОснование = ДанныеЗаполнения и ИндексСклада = 0.

Если же приходит структура, то ДокОснование = ДанныеЗаполнения.ДокОснование, ИндексСклада = ДанныеЗаполнения.ИндексСклада.

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

Таким образом получилось избежать передачи документа в XML через временное хранилище и никаких проблем с документом основания для структуры подчиненности.
Windsor77; Lapitskiy; Antipozitron; Leopro23; mvxyz; +5 Ответить
9. modi77 01.02.22 17:16 Сейчас в теме
(8) Можете выложить кусок кода, с похожей задачей мучаюсь, не могу сохранить подчиненность.
10. kznsky 07.02.22 16:50 Сейчас в теме
(9)
        Если ТипЗнч(Основание) = Тип("Структура") Тогда
		ДокОснование = Основание.ДокОснование;
		ИндексМХ = Основание.ИндексМХ;
	Иначе
		//Значит это первый документ на основании
                ДокОснование = Основание;
		ИндексМХ = 0;
	КонецЕсли;

        //Запросом получаю все места хранения из заказа
	МестаХраненияЗаказа = СвернутьМассив(РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("МестоХранения"));

       //Стандартной обработкой создаем и открываем первый документ
		ЗаказПокупателя = ДокОснование;
		МестоХранения = МестаХраненияЗаказа[ИндексМХ];
		Статус = Перечисления.СтатусОбработкиЗаявокНаСборку.Новый;
		Организация = ДокОснование.Организация;
		Контрагент = ДокОснование.Контрагент;
		
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			Если ВыборкаДетальныеЗаписи.МестоХранения = МестоХранения Тогда
				НоваяСтрока 					= Товары.Добавить();
				НоваяСтрока.Номенклатура 		= ВыборкаДетальныеЗаписи.Номенклатура;
				НоваяСтрока.ЕдиницаИзмерения 	= ВыборкаДетальныеЗаписи.ЕдиницаИзмерения;
				НоваяСтрока.Количество 			= ВыборкаДетальныеЗаписи.Количество;
				НоваяСтрока.Собрано 			= 0;
				НоваяСтрока.Расхождение 		= ВыборкаДетальныеЗаписи.Количество;	
			КонецЕсли;
		КонецЦикла;
				
		//Проверяем надо ли создавать еще документы
		ИндексМХ = ИндексМХ + 1;
		Если МестаХраненияЗаказа.Количество() > 1 И МестаХраненияЗаказа.Количество() > ИндексМХ Тогда
			
			ЕщеОднаЗаявкаНаСборку = Документы.тдЗаявкаНаСборку.СоздатьДокумент();
			ПараметрыЗаполнения = Новый Структура;
			ПараметрыЗаполнения.Вставить("ДокОснование", ДокОснование);
			ПараметрыЗаполнения.Вставить("ИндексМХ", ИндексМХ);
			ЕщеОднаЗаявкаНаСборку.Заполнить(ПараметрыЗаполнения);
			
			Форма = ЕщеОднаЗаявкаНаСборку.ПолучитьФорму("ФормаДокумента");
			Форма.Открыть();
		КонецЕсли;
Показать
Michka; user1853406; +2 Ответить
11. etorpov 26.08.24 09:28 Сейчас в теме
(10) а как у вас в обработке заполнения на сервере работают строки последние с получением и открытием формы ?
12. kznsky 26.08.24 14:55 Сейчас в теме
(11)
а как у вас в обработке заполнения на сервере работают строки последние с получением и открытием формы ?

Это УТ 10.3 на обычных формах.
13. etorpov 26.08.24 15:08 Сейчас в теме
(12) понял) вопросов нет, думал уже нет нигде обычных форм
14. gamletspb 121 06.03.25 12:37 Сейчас в теме
Чтобы в подчиненных документах заполнялся реквизит ссылка "ДокументОснование" можно ссылку передавать через структуру:
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Заказ") 
		ИЛИ ТипЗнч(ДанныеЗаполнения) = Тип("ДокументОбъект.Заказ")
		ИЛИ ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Мультиподчиненность") Тогда 
		
		// Несколько документов на основании одного
		ДокументСсылка = Неопределено; 
		
		СоздатьЕщеОдинДокументПриНеобходимости(ДанныеЗаполнения, ДокументСсылка);
		
		Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Мультиподчиненность")
			И ДанныеЗаполнения.Свойство("Объект") Тогда
			
			ДанныеЗаполнения = ДанныеЗаполнения.Объект;
		
		КонецЕсли;
		
		// Штатное заполнение
                ....
Показать


	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Мультиподчиненность") Тогда
		МассивТовары = ДанныеЗаполнения.Объект.Товары.ВыгрузитьКолонку("Склад");
	Иначе	
		МассивТовары = ДанныеЗаполнения.Товары.ВыгрузитьКолонку("Склад");
	КонецЕсли; 
	
	СкладыЗаказа = СвернутьМассив(МассивТовары);    
	
	
	// Проверяем, есть ли в ТЧ основания разные склады
	Если СкладыЗаказа.Количество() > 1 Тогда
		
		Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Заказ") Тогда  
			ДокументСсылка = ДанныеЗаполнения;
			ЗаказОбъект = ДанныеЗаполнения.ПолучитьОбъект();
		ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументОбъект.Заказ") Тогда
			ЗаказОбъект = ДанныеЗаполнения; 
		ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Мультиподчиненность") Тогда
			ЗаказОбъект = ДанныеЗаполнения.Объект; 
			ДокументСсылка = ДанныеЗаполнения.ДокументСсылка;
		КонецЕсли;
		
		// Делаем две копии объекта-основания  
...

		// Вызываем обработку заполнения следующего документа.
		
		ДанныеЗаполнения = Новый Структура;
		ДанныеЗаполнения.Вставить("Объект", ЗаказКопияОставшиеся);
		ДанныеЗаполнения.Вставить("Мультиподчиненность");
		ДанныеЗаполнения.Вставить("ДокументСсылка", ДокументСсылка);
		
		//ЕщеОдинРасходТовара.Заполнить(ЗаказКопияОставшиеся);
		ЕщеОдинРасходТовара.Заполнить(ДанныеЗаполнения);
		
		ЕщеОдинРасходТовара.Дата = НачалоДня(ТекущаяДатаСеанса());
		ЕщеОдинРасходТовара.Заказ = ДокументСсылка;
		
		//Во временное хранилище могут быть помещены только сериализуемые объекты. 
		// Для ДокументОбъект сериализация не поддерживается, 
		// однако поддерживается XDTO-сериализация и XML-сериализация.
		// Поэтому сериализуем объект в XML
		ЕщеОдинРасходТовараXML = Сериализовать(ЕщеОдинРасходТовара);
		// и помещаем его во временное хранилище
		// (АдресЕщеОдногоДокумента - реквизит этого документа)
		АдресЕщеОдногоДокумента = ПоместитьВоВременноеХранилище(ЕщеОдинРасходТовараXML, Новый УникальныйИдентификатор);

		// Заменяем ДанныеЗаполнения текущего документа
		//ДанныеЗаполнения = ЗаказКопия;   
		
		ДанныеЗаполнения = Новый Структура;
		ДанныеЗаполнения.Вставить("Объект", ЗаказКопия);
		ДанныеЗаполнения.Вставить("Мультиподчиненность");
		ДанныеЗаполнения.Вставить("ДокументСсылка", ДокументСсылка);

Показать
Для отправки сообщения требуется регистрация/авторизация