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