При разработке печатных форм часто возникает необходимость вывести данные из нескольких документов-оснований или связанных распоряжений в единый табличный документ. На практике разработчики сталкиваются со следующими типовыми задачами: формирование единой строки с названиями документов для параметра шапки, исключение вывода лишней номенклатуры из-за неверных условий в запросе и организация сквозной нумерации позиций в таблице.
Разберем по шагам, как правильно решить каждую из этих задач при формировании печатной формы в 1С.
Если требуется вывести список документов в заголовок макета через запятую (например, Реализация товаров и услуг №1, Реализация товаров и услуг №2), не следует выводить область шапки в цикле несколько раз. Для этого формируется единая строка со всеми наименованиями, которая затем передается в параметр области макета.
Рассмотрим порядок действий:
СтрСоединить или метода библиотеки стандартных подсистем (БСП) СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок.Посмотрим на пример кода формирования строки из массива и вывода в параметр макета:
МассивНазваний = Новый Массив;
// Заполнение массива строками в цикле обхода документов
Пока ВыборкаДокументов.Следующий() Цикл
МассивНазваний.Добавить(Строка(ВыборкаДокументов.Распоряжение));
КонецЦикла;
// Объединение элементов массива в единую строку через запятую
ЕдинаяСтрокаЗаголовка = СтрСоединить(МассивНазваний, ", ");
// Вывод в параметр макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.ПредставлениеСклада = ВыборкаСклад;
ОбластьШапка.Параметры.ПредставлениеРаспоряжения = ЕдинаяСтрокаЗаголовка;
ТабличныйДокумент.Вывести(ОбластьШапка);
При использовании БСП аналогичный результат достигается вызовом функции:
ЕдинаяСтрокаЗаголовка = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивНазваний, ", ");
ОбластьШапка.Параметры.ПредставлениеРаспоряжения = ЕдинаяСтрокаЗаголовка;
ТабличныйДокумент.Вывести(ОбластьШапка);
Выясним причину, почему в печатную форму может попадать вся номенклатура базы или дублироваться строки. Ошибка возникает, когда в запросе объединяются табличные части (например, Документ.ЗаданиеНаПеревозку.Распоряжения и Документ.РеализацияТоваровУслуг.Товары), но отсутствует условие фильтрации ГДЕ по конкретному контекстному документу.
Проанализируем правильное составление условий и установку параметров запроса. Чтобы ограничить выборку только релевантными документами, необходимо добавить условие по ссылке и передать значение через Запрос.УстановитьПараметр().
Пример корректного запроса для получения номенклатуры по текущему документу:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
| РеализацияТоваровУслугТовары.КоличествоУпаковок КАК КоличествоУпаковок,
| РеализацияТоваровУслугТовары.Количество КАК Количество,
| ЗаданиеНаПеревозкуРаспоряжения.Распоряжение КАК Распоряжение
|ИЗ
| Документ.ЗаданиеНаПеревозку.Распоряжения КАК ЗаданиеНаПеревозкуРаспоряжения
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение = РеализацияТоваровУслугТовары.Ссылка
|ГДЕ
| ЗаданиеНаПеревозкуРаспоряжения.Ссылка = &СсылкаНаЗадание";
// В параметр передается конкретная ссылка на открытый документ или объект
Запрос.УстановитьПараметр("СсылкаНаЗадание", СсылкаНаОбъект);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Важно: Нельзя передавать в УстановитьПараметр менеджер объекта (например, Документы.ЗаданиеНаПеревозку). Передавать следует исключительно конкретную ссылку на документ, для которого выполняется печать (например, СсылкаНаОбъект или элемент массива МассивОбъектов[0]).
При получении данных из табличных частей нескольких разных документов поле НомерСтроки выбирается из каждого документа отдельно. В результате номера строк в общей табличной части печатной формы могут повторяться (1, 2, 1, 2, 3...).
Для создания непрерывной сквозной нумерации (1, 2, 3, 4...) достаточно завести счетчик в коде обхода выборки и выводить его в параметр строки:
НомерПоПорядку = 0;
Пока Выборка.Следующий() Цикл
НомерПоПорядку = НомерПоПорядку + 1;
ОбластьСтрока.Параметры.НомерСтроки = НомерПоПорядку;
ОбластьСтрока.Параметры.Товар = Выборка.Номенклатура;
ОбластьСтрока.Параметры.Количество = Выборка.Количество;
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Использование собственных переменных-счетчиков и корректная передача параметров в запрос позволяют сформировать печатную форму с правильным заголовком, без лишних дублей и с верной нумерацией позиций.