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

07.09.19

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

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

Скачать файл

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

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

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

Задача

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

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

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

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

 
 Алгоритм

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

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

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

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

См. также

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

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

21.05.2024    16750    dimanich70    81    

134

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

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

1 стартмани

18.03.2024    3801    3    John_d    11    

57

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

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

12.02.2024    13739    atdonya    23    

56

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

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

30.11.2023    5210    ke.92@mail.ru    16    

65

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

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

28.08.2023    13455    YA_418728146    7    

165

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

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

2 стартмани

22.08.2023    3257    52    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 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    18035    160    sapervodichka    112    

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