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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке собственных печатных форм для конфигураций на базе 1С:Управление торговлей часто возникает задача реализации массовой печати, когда пользователь выделяет несколько строк в журнале документов и нажимает кнопку вывода на печать. Начинающие программисты нередко сталкиваются с тем, что данные из табличных частей (ТЧ) «перемешиваются» или вовсе не выводятся для части документов. Давайте разберем, почему это происходит и как это исправить.

Причина возникновения проблемы

Основная сложность заключается в том, что запрос, который вы пишете для получения данных, обычно возвращает «плоскую» таблицу. Если вы просто перебираете шапку документов в цикле, а затем пытаетесь вывести товары из результата запроса, программа не знает, какие именно строки относятся к текущему документу, а какие — к следующему. Без явного указания связи данных (фильтрации) 1С выводит все найденные записи, либо из-за ошибки в цикле обхода выборки, данные для последующих документов оказываются уже «прочитанными».

Решение 1: Фильтрация через таблицу значений (удобно для небольших объемов)

Этот способ позволяет быстро решить задачу, используя результаты уже выполненного запроса. Мы выгружаем все товары в ТаблицаЗначений, а внутри цикла по документам находим только те строки, которые соответствуют текущей ссылке.

Рассмотрим пошаговое выполнение:

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

Пример реализации:


// Получаем результат запроса
МассивРезультатовЗапроса = Запрос.ВыполнитьПакет();
ДанныеШапка = МассивРезультатовЗапроса[0].Выбрать();
тзВсеТовары = МассивРезультатовЗапроса[1].Выгрузить(); 

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

Решение 2: Использование иерархических запросов (рекомендуемый подход)

Для профессиональной разработки рекомендуется использовать возможности платформы 1С, а именно ИТОГИ ПО. Это позволяет серверу 1С сразу отдать данные в структурированном виде, где товары уже сгруппированы по документам.

Преимущества данного метода:

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

Важные советы по разработке

Чтобы ваша внешняя печатная форма работала стабильно и быстро, придерживайтесь следующих правил:

  1. Используйте БСП (Библиотеку стандартных подсистем). Типовые конфигурации (УТ, ЕРП, КА) предоставляют готовые механизмы для печати. Попытка переизобрести велосипед всегда ведет к потере времени на отладку простых ошибок.
  2. Всегда контролируйте память. Если вы работаете с очень большими данными, выгрузка всех табличных частей в ТаблицаЗначений может вызвать ошибку нехватки памяти на сервере. В таких случаях используйте обход по группировкам ИТОГИ ПО.
  3. Оптимизируйте макеты. Старайтесь получать области макета до начала цикла вывода, это ускоряет процесс формирования табличного документа.
  4. Упорядочивайте данные. Всегда указывайте УПОРЯДОЧИТЬ ПО в запросе, чтобы данные в печатной форме выводились в предсказуемом порядке, например, по дате или номеру документа.

Надеемся, что эти рекомендации помогут вам разобраться с механизмом печати в 1С и избежать типичных ошибок при работе с массивами данных!

← На главную