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

07.09.19

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Демонстрационная конфигурация "Управляемое приложение" с примером реализации
.dt 19,75Mb
23
23 Скачать (1 SM) Купить за 1 850 руб.

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

Задача

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

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

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

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

 
 Алгоритм

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

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

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

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

См. также

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

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

21.05.2024    28071    dimanich70    83    

151

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

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

1 стартмани

18.03.2024    4742    5    John_d    11    

57

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

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

12.02.2024    29887    atdonya    25    

59

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    6333    ke.92@mail.ru    17    

65

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

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

28.08.2023    17481    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4586    76    progmaster    11    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    19512    186    sapervodichka    112    

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

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

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

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

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

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

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

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

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

Таким образом получилось избежать передачи документа в XML через временное хранилище и никаких проблем с документом основания для структуры подчиненности.
Lapitskiy; Antipozitron; user974746; mvxyz; +4 Ответить
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 111 06.03.25 12:37 Сейчас в теме
Чтобы в подчиненных документах заполнялся реквизит ссылка "ДокументОснование" можно ссылку передавать через структуру:
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Заказ") 
		ИЛИ ТипЗнч(ДанныеЗаполнения) = Тип("ДокументОбъект.Заказ")
		ИЛИ ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Мультиподчиненность") Тогда 
		
		// Несколько документов на основании одного
		ДокументСсылка = Неопределено; 
		
		СоздатьЕщеОдинДокументПриНеобходимости(ДанныеЗаполнения, ДокументСсылка);
		
		Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Мультиподчиненность")
			И ДанныеЗаполнения.Свойство("Объект") Тогда
			
			ДанныеЗаполнения = ДанныеЗаполнения.Объект;
		
		КонецЕсли;
		
		// Штатное заполнение
                ....
Показать


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

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

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

Показать
Оставьте свое сообщение