Представим, что циклом мы обходим некую таблицу значений, на основании данных которой программно формируем целый пакет документов – например, заявок на расходование денежных средств. В данном случае, нам не подойдёт классический способ использования реквизита ДокументОснование, т.к. набор создаваемых документов не имеет никакого головного объекта.
Вот некоторые способы решения задачи:
1. Связь через общий реквизит (например, пакет или идентификатор)
Можно добавить в каждый документ реквизит, который будет идентифицировать этот пакет документов. Например, это может быть уникальный идентификатор (UUID), создаваемый для каждого пакета при генерации документов. Все документы в пакете будут иметь одно и то же значение этого реквизита, что позволит связать их между собой.
Пошагово:
1. В каждом документе добавьте реквизит типа “Строка” (или другой подходящий тип), который будет хранить идентификатор пакета.
2. При программном создании документов создайте уникальный идентификатор и присвойте его каждому документу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Создаем уникальный идентификатор пакета ИдентификаторПакета = Новый УникальныйИдентификатор(); // Создаем документы в цикле Для Ном = 1 По 5 Цикл // Создаем новый документ ЗаявкаНаРасходованиеДенежныхСредств Док = Документы.ЗаявкаНаРасходованиеДенежныхСредств.СоздатьДокумент(); Док.Дата = ТекущаяДата(); // Присваиваем уникальный идентификатор пакета Док.ИдентификаторПакета = ИдентификаторПакета; // Заполняем другие данные документа... // Записываем документ Док.Записать(); КонецЦикла; |
В этом примере создается уникальный идентификатор “ИдентификаторПакета” с использованием типа “УникальныйИдентификатор”, который присваивается каждому создаваемому документу. Позже можно легко найти все документы, относящиеся к одному пакету, по этому идентификатору.
2. Использование регистра сведений для хранения связей
Другой подход — использовать регистр сведений для хранения связей между документами в пакете. Это позволит более гибко управлять связями и выполнять выборки документов, связанных с определённым пакетом.
Пошагово:
1. Создайте регистр сведений с полями, например:
– “ДокументСсылка” (ссылка на документ, участвующий в пакете).
– “ИдентификаторПакета” (идентификатор пакета).
2. При создании документов в цикле записывайте связи в регистр сведений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// Создаем уникальный идентификатор пакета ИдентификаторПакета = Новый УникальныйИдентификатор(); // Создаем документы в цикле Для Ном = 1 По 5 Цикл // Создаем новый документ ЗаявкаНаРасходованиеДенежныхСредств Док = Документы.ЗаявкаНаРасходованиеДенежныхСредств.СоздатьДокумент(); Док.Дата = ТекущаяДата(); // Записываем документ Док.Записать(); // Записываем связь документа с пакетом в регистр сведений НаборЗаписей = РегистрыСведений.СвязиДокументов.СоздатьНаборЗаписей(); ЗаписьРегистра = НаборЗаписей.Добавить(); ЗаписьРегистра.ДокументСсылка = Док.Ссылка; ЗаписьРегистра.ИдентификаторПакета = ИдентификаторПакета; // Записываем изменения в регистр НаборЗаписей.Записать(); КонецЦикла; |
Этот подход позволяет хранить связи документов отдельно в регистре сведений. Впоследствии можно быстро получать все документы, связанные с определённым пакетом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СвязиДокументов.ДокументСсылка |ИЗ | РегистрСведений.СвязиДокументов КАК СвязиДокументов |ГДЕ | СвязиДокументов.ИдентификаторПакета = &ИдентификаторПакета"; Запрос.УстановитьПараметр("ИдентификаторПакета", ИдентификаторПакета); // Выполняем запрос Результат = Запрос.Выполнить(); |
Оба этих подхода помогут вам легко управлять пакетами документов и поддерживать связи между ними для последующего анализа или обработки.
Ниже готовый пример, задачей которого является отображение на форме документа “Заявка на расходование денежных средств” списка связанных документов на отдельной странице:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
//добавим новую страницу на форму НовыйЭлемент = Элементы.Добавить("СтраницаСвязи",Тип("ГруппаФормы"),Элементы.ГруппаСтраницы); НовыйЭлемент.Вид = ВидГруппыФормы.Страница; НовыйЭлемент.Заголовок = "Связи"; //получим значение УИД из доп. сведений документа, который заполняется при создании самого документа УИДСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "УникальныйИдентификатор_f28953a6b0b647efaaf66265232aaea7"); УИД = УправлениеСвойствами.ЗначениеСвойства(Объект.Ссылка, УИДСвойство); //формируем запрос Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | псПакетыЗаявок.УникальныйИдентификатор КАК УникальныйИдентификатор, | псПакетыЗаявок.ЗаявкаНаРасходованиеДС КАК ЗаявкаНаРасходованиеДС, | псПакетыЗаявок.ЗаявкаНаРасходованиеДС.СуммаДокумента КАК ЗНРДССуммаДокумента, | псПакетыЗаявок.ЗаявкаНаРасходованиеДС.Валюта КАК ЗНРДСВалюта |ИЗ | РегистрСведений.псПакетыЗаявок КАК псПакетыЗаявок |ГДЕ | псПакетыЗаявок.УникальныйИдентификатор = &УникальныйИдентификатор"; Запрос.УстановитьПараметр("УникальныйИдентификатор", УИД); ТЗ = Запрос.Выполнить().Выгрузить(); //описываем таблицу значений на форме МассивТипаВыбора = Новый Массив; МассивТипаВыбора.Добавить(Тип("ТаблицаЗначений")); ОписаниеТипаВыбора = Новый ОписаниеТипов(МассивТипаВыбора); МассивРеквизитов = Новый Массив; МассивРеквизитов.Добавить(Новый РеквизитФормы("ТаблицаЗаявок", ОписаниеТипаВыбора, "", "Таблица заявок")); //добавляем колонки Для Каждого Колонка Из ТЗ.Колонки Цикл МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаЗаявок")); КонецЦикла; //добавляем созданный реквизит на форму документа ИзменитьРеквизиты(МассивРеквизитов); //программно создаем поле "таблица формы" и колонки, и связываем его с реквизитом нЭлем = Элементы.Добавить("ТаблицаЗаявокПоле", Тип("ТаблицаФормы"), ЭтотОбъект); нЭлем.ПутьКДанным = "ТаблицаЗаявок"; нЭлем.Отображение = ОтображениеТаблицы.Список; нЭлем = ЭтаФорма.Элементы.Добавить("ЗаявкаНаРасходованиеДС", Тип("ПолеФормы"), Элементы.ТаблицаЗаявокПоле); нЭлем.Вид = ВидПоляФормы.ПолеВвода; нЭлем.ПутьКДанным = "ТаблицаЗаявок.ЗаявкаНаРасходованиеДС"; нЭлем.Заголовок = "Заявка на расходование ДС"; нЭлем = ЭтаФорма.Элементы.Добавить("ЗНРДССуммаДокумента", Тип("ПолеФормы"), Элементы.ТаблицаЗаявокПоле); нЭлем.Вид = ВидПоляФормы.ПолеВвода; нЭлем.ПутьКДанным = "ТаблицаЗаявок.ЗНРДССуммаДокумента"; нЭлем.Заголовок = "Сумма документа"; нЭлем = ЭтаФорма.Элементы.Добавить("ЗНРДСВалюта", Тип("ПолеФормы"), Элементы.ТаблицаЗаявокПоле); нЭлем.Вид = ВидПоляФормы.ПолеВвода; нЭлем.ПутьКДанным = "ТаблицаЗаявок.ЗНРДСВалюта"; нЭлем.Заголовок = "Валюта документа"; нЭлем = ЭтаФорма.Элементы.Добавить("УникальныйИдентификатор", Тип("ПолеФормы"), Элементы.ТаблицаЗаявокПоле); нЭлем.Вид = ВидПоляФормы.ПолеВвода; нЭлем.ПутьКДанным = "ТаблицаЗаявок.УникальныйИдентификатор"; нЭлем.Заголовок = "Уникальный идентификатор"; //загружаем данные из результата запроса в реквизит ЗначениеВРеквизитФормы(ТЗ, "ТаблицаЗаявок"); //перемещаем элемент в нужное место на форме Элементы.Переместить(Элементы.ТаблицаЗаявокПоле, Элементы.СтраницаСвязи); |