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