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