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

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

В процессе доработки печатных форм в 1С:Предприятии часто возникают ситуации, когда данные для шапки документа зависят от результатов вычислений, проведенных в табличной части. Стандартная логика работы процедур печати предполагает вывод областей Макет по порядку: сначала Шапка, затем строки таблицы, затем Подвал. Однако, если нам нужно вывести количество строк в шапку документа, мы сталкиваемся с проблемой: на момент заполнения шапки данные о количестве еще не получены. Рассмотрим, как решить эту задачу.

Анализ причин проблемы

Разберем ситуацию: процедура ЗаполнитьРеквизитыШапкиУПД вызывается раньше, чем происходит итерация по строкам товаров в процедуре ЗаполнитьТабличныйДокументУПД. В конфигурациях на платформе 1С:Предприятие 8.3, работающих с БСП (Библиотекой стандартных подсистем), механизм печати строго следует очередности вывода в ТабличныйДокумент. Если мы попытаемся обратиться к количеству строк до их подсчета, мы получим либо пустой результат, либо ошибку доступа к полю объекта.

Пошаговое решение задачи

Чтобы успешно передать значение переменной КоличествоСтрок из процедуры обработки табличной части в процедуру заполнения шапки, воспользуемся следующей стратегией:

  1. Определение момента расчета: Нам необходимо сначала рассчитать количество строк в табличной части. Это делается путем обхода результата запроса.
  2. Изменение последовательности вывода: Мы должны перенести вызов процедуры ЗаполнитьРеквизитыШапкиУПД на то место в коде, где значение количества строк уже известно.
  3. Использование параметров структуры: Передадим рассчитанное значение в Структура, которая затем будет использована для заполнения параметров области макета Шапка.

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

Рассмотрим, как это выглядит в коде. Сначала мы выполняем расчет количества в основной процедуре формирования табличного документа:


// Сначала получаем выборку данных табличной части
СтрокаТовары = ВыборкаПоДокументам.Выбрать();
// Считаем количество строк
КоличествоСтрок = СтрокаТовары.Количество();

// Создаем структуру для передачи параметров
ПараметрыДляШапки = Новый Структура;
ПараметрыДляШапки.Вставить("КоличествоСтрок", КоличествоСтрок);

// Теперь вызываем заполнение шапки, передавая наши данные
ЗаполнитьРеквизитыШапкиУПД(ДанныеПечати, СведенияОбОрганизации, ВыборкаКонтрагентов, Макет, ТабличныйДокумент, ПараметрыДляШапки);

Далее, внутри процедуры ЗаполнитьРеквизитыШапкиУПД мы принимаем эту структуру и используем её для заполнения параметров ОбластьМакета:


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

Важные замечания

При выполнении данной задачи учитывайте следующие моменты:

В процессе работы не забывайте использовать отладчик платформы 1С:Предприятие. Установка точки останова на моменте расчета КоличествоСтрок позволит вам убедиться, что переменная заполнена корректным числом до того, как будет сформирован ТабличныйДокумент. Если после изменений вы видите, что данные в шапке не изменились, проверьте соответствие имен параметров в макете MXL ключам структуры, которую вы вставляете в Параметры области.

← На главную