В процессе доработки печатных форм в 1С:Предприятии часто возникают ситуации, когда данные для шапки документа зависят от результатов вычислений, проведенных в табличной части. Стандартная логика работы процедур печати предполагает вывод областей Макет по порядку: сначала Шапка, затем строки таблицы, затем Подвал. Однако, если нам нужно вывести количество строк в шапку документа, мы сталкиваемся с проблемой: на момент заполнения шапки данные о количестве еще не получены. Рассмотрим, как решить эту задачу.
Разберем ситуацию: процедура ЗаполнитьРеквизитыШапкиУПД вызывается раньше, чем происходит итерация по строкам товаров в процедуре ЗаполнитьТабличныйДокументУПД. В конфигурациях на платформе 1С:Предприятие 8.3, работающих с БСП (Библиотекой стандартных подсистем), механизм печати строго следует очередности вывода в ТабличныйДокумент. Если мы попытаемся обратиться к количеству строк до их подсчета, мы получим либо пустой результат, либо ошибку доступа к полю объекта.
Чтобы успешно передать значение переменной КоличествоСтрок из процедуры обработки табличной части в процедуру заполнения шапки, воспользуемся следующей стратегией:
ЗаполнитьРеквизитыШапкиУПД на то место в коде, где значение количества строк уже известно.Структура, которая затем будет использована для заполнения параметров области макета Шапка.Рассмотрим, как это выглядит в коде. Сначала мы выполняем расчет количества в основной процедуре формирования табличного документа:
// Сначала получаем выборку данных табличной части
СтрокаТовары = ВыборкаПоДокументам.Выбрать();
// Считаем количество строк
КоличествоСтрок = СтрокаТовары.Количество();
// Создаем структуру для передачи параметров
ПараметрыДляШапки = Новый Структура;
ПараметрыДляШапки.Вставить("КоличествоСтрок", КоличествоСтрок);
// Теперь вызываем заполнение шапки, передавая наши данные
ЗаполнитьРеквизитыШапкиУПД(ДанныеПечати, СведенияОбОрганизации, ВыборкаКонтрагентов, Макет, ТабличныйДокумент, ПараметрыДляШапки);
Далее, внутри процедуры ЗаполнитьРеквизитыШапкиУПД мы принимаем эту структуру и используем её для заполнения параметров ОбластьМакета:
Процедура ЗаполнитьРеквизитыШапкиУПД(ДанныеПечати, СведенияОПоставщике, ДанныеКонтрагентов, Макет, ТабличныйДокумент, ПараметрыДляШапки)
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
// Заполняем параметры, переданные извне
ОбластьМакета.Параметры.Заполнить(ПараметрыДляШапки);
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецПроцедуры
При выполнении данной задачи учитывайте следующие моменты:
Расширения конфигурации, чтобы переопределить методы ЗаполнитьТабличныйДокументУПД и внедрить туда расчет количества строк.Количество() выборки может дать неверный результат. Всегда проверяйте, что именно вы считаете: количество строк в базе данных или количество строк, реально выведенных на печать.В процессе работы не забывайте использовать отладчик платформы 1С:Предприятие. Установка точки останова на моменте расчета КоличествоСтрок позволит вам убедиться, что переменная заполнена корректным числом до того, как будет сформирован ТабличныйДокумент. Если после изменений вы видите, что данные в шапке не изменились, проверьте соответствие имен параметров в макете MXL ключам структуры, которую вы вставляете в Параметры области.