Как вывести названия нескольких документов в один параметр печатной формы и настроить выборку данных в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке печатных форм часто возникает необходимость вывести данные из нескольких документов-оснований или связанных распоряжений в единый табличный документ. На практике разработчики сталкиваются со следующими типовыми задачами: формирование единой строки с названиями документов для параметра шапки, исключение вывода лишней номенклатуры из-за неверных условий в запросе и организация сквозной нумерации позиций в таблице.

Разберем по шагам, как правильно решить каждую из этих задач при формировании печатной формы в 1С.

1. Объединение названий документов в один параметр шапки

Если требуется вывести список документов в заголовок макета через запятую (например, Реализация товаров и услуг №1, Реализация товаров и услуг №2), не следует выводить область шапки в цикле несколько раз. Для этого формируется единая строка со всеми наименованиями, которая затем передается в параметр области макета.

Рассмотрим порядок действий:

  1. В ходе выборки или обхода документов заполним массив строковыми представлениями нужных документов.
  2. Склеим элементы массива в одну строку с помощью функции платформы СтрСоединить или метода библиотеки стандартных подсистем (БСП) СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок.
  3. Заполним параметр макета полученной строкой и выведем область шапки в табличный документ один раз.

Посмотрим на пример кода формирования строки из массива и вывода в параметр макета:


МассивНазваний = Новый Массив;

// Заполнение массива строками в цикле обхода документов
Пока ВыборкаДокументов.Следующий() Цикл
    МассивНазваний.Добавить(Строка(ВыборкаДокументов.Распоряжение));
КонецЦикла;

// Объединение элементов массива в единую строку через запятую
ЕдинаяСтрокаЗаголовка = СтрСоединить(МассивНазваний, ", ");

// Вывод в параметр макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.ПредставлениеСклада = ВыборкаСклад;
ОбластьШапка.Параметры.ПредставлениеРаспоряжения = ЕдинаяСтрокаЗаголовка;

ТабличныйДокумент.Вывести(ОбластьШапка);

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


ЕдинаяСтрокаЗаголовка = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивНазваний, ", ");
ОбластьШапка.Параметры.ПредставлениеРаспоряжения = ЕдинаяСтрокаЗаголовка;
ТабличныйДокумент.Вывести(ОбластьШапка);

2. Фильтрация данных в запросе и устранение дублирования номенклатуры

Выясним причину, почему в печатную форму может попадать вся номенклатура базы или дублироваться строки. Ошибка возникает, когда в запросе объединяются табличные части (например, Документ.ЗаданиеНаПеревозку.Распоряжения и Документ.РеализацияТоваровУслуг.Товары), но отсутствует условие фильтрации ГДЕ по конкретному контекстному документу.

Проанализируем правильное составление условий и установку параметров запроса. Чтобы ограничить выборку только релевантными документами, необходимо добавить условие по ссылке и передать значение через Запрос.УстановитьПараметр().

Пример корректного запроса для получения номенклатуры по текущему документу:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    |	РеализацияТоваровУслугТовары.КоличествоУпаковок КАК КоличествоУпаковок,
    |	РеализацияТоваровУслугТовары.Количество КАК Количество,
    |	ЗаданиеНаПеревозкуРаспоряжения.Распоряжение КАК Распоряжение
    |ИЗ
    |	Документ.ЗаданиеНаПеревозку.Распоряжения КАК ЗаданиеНаПеревозкуРаспоряжения
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |		ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение = РеализацияТоваровУслугТовары.Ссылка
    |ГДЕ
    |	ЗаданиеНаПеревозкуРаспоряжения.Ссылка = &СсылкаНаЗадание";

// В параметр передается конкретная ссылка на открытый документ или объект
Запрос.УстановитьПараметр("СсылкаНаЗадание", СсылкаНаОбъект);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Важно: Нельзя передавать в УстановитьПараметр менеджер объекта (например, Документы.ЗаданиеНаПеревозку). Передавать следует исключительно конкретную ссылку на документ, для которого выполняется печать (например, СсылкаНаОбъект или элемент массива МассивОбъектов[0]).

3. Организация сквозной нумерации строк

При получении данных из табличных частей нескольких разных документов поле НомерСтроки выбирается из каждого документа отдельно. В результате номера строк в общей табличной части печатной формы могут повторяться (1, 2, 1, 2, 3...).

Для создания непрерывной сквозной нумерации (1, 2, 3, 4...) достаточно завести счетчик в коде обхода выборки и выводить его в параметр строки:


НомерПоПорядку = 0;

Пока Выборка.Следующий() Цикл
    НомерПоПорядку = НомерПоПорядку + 1;
    
    ОбластьСтрока.Параметры.НомерСтроки = НомерПоПорядку;
    ОбластьСтрока.Параметры.Товар = Выборка.Номенклатура;
    ОбластьСтрока.Параметры.Количество = Выборка.Количество;
    
    ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

Использование собственных переменных-счетчиков и корректная передача параметров в запрос позволяют сформировать печатную форму с правильным заголовком, без лишних дублей и с верной нумерацией позиций.

← На главную