Как вывести комментарий из табличной части документа на печатную форму в 1С:УТ 11?

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

В процессе кастомизации типовых решений на базе 1С:Предприятие 8.3, таких как УТ 11.4, ERP 2 или КА 2, часто возникает необходимость вывести дополнительные данные из табличных частей документов в стандартные печатные формы. Например, добавить специфический комментарий к каждой строке товара в счете на оплату. Рассмотрим подробно, как это сделать, и разберем причины возникновения популярных ошибок.

Анализ механизма формирования данных для печати

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

Проанализируем ситуацию: в модуле менеджера объекта (например, документа Заказ клиента) существует специальная функция, отвечающая за подготовку данных. Для "Счета на оплату" это обычно функция ПолучитьДанныеДляПечатнойФормыСчетаНаОплату. Именно в ней скрыт текст запроса, который формирует временные таблицы с товарами и услугами.

Шаг 1. Модификация запроса в модуле менеджера

Выясним причину отсутствия поля. Нам необходимо найти функцию формирования данных в модуле менеджера документа. Рассмотрим примерный алгоритм действий:

  1. Откроем конфигуратор и найдем документ ЗаказКлиента.
  2. Перейдем в Модуль менеджера.
  3. Найдем функцию ПолучитьДанныеДляПечатнойФормыСчетаНаОплату.

Внутри этой функции инициализируется объект Запрос. Нам нужно найти ту часть текста запроса, где выбираются данные из табличной части Товары. Проанализируем пример внесения изменений в текст запроса:


// Находим место формирования текста запроса
ТекстЗапроса = 
"ВЫБРАТЬ
|	ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
|	ЗаказКлиентаТовары.Количество КАК Количество,
|	ЗаказКлиентаТовары.Цена КАК Цена,
|	ЗаказКлиентаТовары.Сумма КАК Сумма,
|	ЗаказКлиентаТовары.Дополнение КАК Дополнение // Добавляем наше поле
|ИЗ
|	Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
|ГДЕ
|	ЗаказКлиентаТовары.Ссылка В(&МассивОбъектов)";

Важный момент: Если документ предполагает наличие услуг, не забудьте добавить это же поле в секцию объединения запроса, которая выбирает данные из табличной части Услуги, иначе при печати заказа с услугами программа снова выдаст ошибку.

Шаг 2. Вывод данных в макет печатной формы

После того как данные получены запросом и помещены в РезультатПоТабличнойЧасти, мы можем обращаться к ним в цикле обхода строк. Рассмотрим, как правильно дополнить код вывода в табличный документ. Допустим, мы хотим выводить комментарий отдельной строкой под каждым товаром.

Сначала убедимся, что в макете создана область с именем Комментарий, и внутри этой области размещен параметр с именем Комментарий.


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

Разберем нюансы работы с параметрами

При работе с макетами важно помнить о типизации. В объекте ОбластьМакета.Параметры доступны только те имена, которые физически созданы в ячейках макета с типом "Параметр". Если вы написали код, но в макете параметр называется иначе (например, просто Текст), система выдаст ошибку при попытке присвоения значения.

Также стоит обратить внимание на метод поиска строк. В типовом коде часто используется следующая конструкция:


СтруктураПоиска = Новый Структура("Ссылка", ДанныеПечати.Ссылка);
ТаблицаТовары = Товары.НайтиСтроки(СтруктураПоиска);

Здесь Товары — это таблица значений, полученная методом РезультатПоТабличнойЧасти.Выгрузить(). Метод НайтиСтроки возвращает массив строк, относящихся к конкретному документу. Проходя по этому массиву, мы имеем доступ ко всем колонкам, которые были в исходном запросе, включая наше новое поле Дополнение.

Работа с внешними печатными формами (ВПФ)

Если вы разрабатываете Внешнюю печатную форму, а не правите типовую конфигурацию, помните: внешняя обработка полностью автономна. Вы должны скопировать функцию ПолучитьДанныеДляПечатнойФормыСчетаНаОплату в модуль объекта вашей обработки и вносить изменения именно там. Исправления в модуле менеджера основной конфигурации никак не повлияют на работу внешней печатной формы.

Рассмотрим структуру типовой ВПФ. В ней основной точкой входа является процедура Печать, которая вызывает функции формирования данных. Проанализируем ситуацию, когда данные для печати собираются в одну общую структуру ДанныеДляПечати. Эта структура обычно содержит свойства РезультатПоШапке и РезультатПоТабличнойЧасти. Обе эти переменные являются результатами запросов (РезультатЗапроса), и именно текст этого запроса — ключ к решению задачи.

Рекомендации по оптимизации

Для повышения читаемости и стабильности кода рекомендуется:

Таким образом, мы выяснили, что для успешного вывода комментария необходимо синхронизировать три элемента: Запрос (добавление поля в выборку), Код обработки (передача значения в параметры области) и Макет (создание области и параметра).

← На главную