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

07.09.19

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

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

Скачать файлы

Наименование Файл Версия Размер
Демонстрационная конфигурация "Управляемое приложение" с примером реализации
.dt 19,75Mb
20
.dt 19,75Mb 20 Скачать

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

Задача

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

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

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

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

 
 Алгоритм

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

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

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

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

См. также

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

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

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

1 стартмани

18.03.2024    2673    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4613    atdonya    22    

45

Переоткрытие внешних обработок

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

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

30.11.2023    3961    ke.92@mail.ru    16    

61

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

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

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

28.08.2023    8833    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 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    16148    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. oleg-x 26 10.06.19 10:31 Сейчас в теме
(0)Вроде в разделе вопросы, а вопроса то и нет)
2. mvxyz 322 10.06.19 12:16 Сейчас в теме
(1) Это не вопрос, это ответ. В разделе "Вопросы" ссылку на статью не нашел.
3. alexruzh67 14.06.19 04:47 Сейчас в теме
Для нас актуально создание документов перемещения из документа чек ККМ.
4. mvxyz 322 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 Ответить
Оставьте свое сообщение