Как вывести поле «Комментарий» во внешней печатной форме УПД для 1С:Бухгалтерия 3.0

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

При работе с внешними печатными формами (ВПФ) в среде 1С:Предприятие 8.3 разработчики и продвинутые пользователи часто сталкиваются с задачей вывода дополнительных данных, которые отсутствуют в стандартном макете. Одной из самых популярных задач является вывод текста из поля «Комментарий» документа-основания в подвал Универсального передаточного документа (УПД). Несмотря на кажущуюся простоту, попытка прямого обращения к реквизиту часто приводит к ошибке Поле объекта не обнаружено (Комментарий). Разберем подробно, почему это происходит и как правильно доработать форму.

Выясняем причину ошибки обращения к полю

Проанализируем ситуацию: когда мы работаем внутри модуля внешней обработки, контекст выполнения отличается от модуля самого документа. Ошибка возникает из-за того, что объект ЭтотОбъект в данном случае — это сама внешняя обработка, у которой нет реквизита Комментарий. Также переменная ДанныеШапки, к которой часто пытаются обратиться новички, может быть недоступна в конкретной области кода или не содержать нужного поля, если оно не было заранее включено в запрос на выборку данных.

Для начала проведем простую диагностику, чтобы убедиться, что проблема именно в получении данных, а не в макете. Попробуем передать в параметр макета обычную строку:


ОбластьМакета = Макет.ПолучитьОбласть("ПодвалНакладной");
ОбластьМакета.Параметры.Комментарий = "Тестовая строка";
ТабДокумент.Вывести(ОбластьМакета);

Если после этого в печатной форме в нужном месте появилось слово "Тестовая строка", значит, параметр в макете создан верно, и нам остается только правильно адресовать обращение к данным документа.

Настройка макета печатной формы

Прежде чем писать код, необходимо подготовить сам макет. Рассмотрим шаги по настройке ячейки:

  1. Откроем макет внешней печатной формы в Конфигураторе.
  2. Найдем область ПодвалНакладной.
  3. В нужной ячейке впишем текст Комментарий.
  4. В свойствах этой ячейки в поле «Заполнение» выберем значение «Параметр».
  5. Важный момент: Чтобы длинный комментарий не обрезался, установим свойство «Размещение» в значение «Переносить» и убедимся, что для строки макета включена «Автовысота».

Реализация получения данных в коде модуля

В типовых конфигурациях, таких как Бухгалтерия предприятия 3.0, данные для УПД собираются в сложную структуру или таблицу значений. Рассмотрим фрагмент кода, который обычно отвечает за вывод подвала:


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

    ТабДокумент.Вывести(ОбластьМакета);
КонецЦикла;

Проанализируем, почему мы используем путь ВыборкаУПД.ДанныеШапки.Ссылка.Комментарий. В структуре печати УПД переменная ВыборкаУПД содержит в себе подобъект ДанныеШапки, в котором хранится Ссылка на исходный документ (Реализацию или Счет-фактуру). Обращаясь через .Ссылка, мы заставляем систему считать значение реквизита Комментарий непосредственно из базы данных.

Особенности УПД: Реализация или Счет-фактура?

УПД является универсальным документом, и он может печататься как на основании Реализации товаров и услуг, так и на основании Счета-фактуры выданного. Выясним важный нюанс: если вы ведете учет комментариев в Реализации, а печать происходит из Счета-фактуры, то Ссылка.Комментарий может вернуть пустую строку или комментарий именно Счета-фактуры.

Для гарантированного получения комментария из документа реализации, если мы находимся в контексте Счета-фактуры, следует использовать следующий подход:


Если ТипЗнч(ВыборкаУПД.Ссылка) = Тип("ДокументСсылка.СчетФактураВыданный") Тогда
    // Если есть документ-основание (Реализация)
    Если ВыборкаУПД.Ссылка.ДокументОснование.Количество() > 0 Тогда
        ОбластьМакета.Параметры.Комментарий = ВыборкаУПД.Ссылка.ДокументОснование[0].Комментарий;
    Иначе
        ОбластьМакета.Параметры.Комментарий = ВыборкаУПД.Ссылка.Комментарий;
    КонецЕсли;
Иначе
    ОбластьМакета.Параметры.Комментарий = ВыборкаУПД.Ссылка.Комментарий;
КонецЕсли;

Оптимизация: добавление поля в запрос

Рассмотрим профессиональный подход. Обращение через точку (Ссылка.Комментарий) в цикле печати большого количества документов может замедлить работу системы, так как на каждый документ будет выполняться отдельный SQL-запрос. Чтобы этого избежать, рекомендуется найти в модуле текст запроса (обычно функция ПодготовитьДанныеДляПечати или похожая) и добавить поле Комментарий прямо в текст SELECT.

Посмотрим на пример изменения текста запроса:


ТекстЗапроса = 
"ВЫБРАТЬ
|   ДокументОснование.Ссылка КАК Ссылка,
|   ДокументОснование.Номер КАК Номер,
|   ДокументОснование.Дата КАК Дата,
|   ДокументОснование.Комментарий КАК Комментарий, // Добавляем наше поле
|   ...
|ИЗ
|   Документ.РеализацияТоваровУслуг КАК ДокументОснование";

После добавления поля в запрос, оно автоматически попадет в структуру ДанныеШапки, и вы сможете выводить его максимально просто и быстро:

ОбластьМакета.Параметры.Комментарий = ВыборкаУПД.ДанныеШапки.Комментарий;

Подведем итоги

Мы проанализировали путь от возникновения ошибки до корректной реализации вывода данных. Главное правило при работе с 1С 8.3 — четко понимать, к какому объекту вы обращаетесь. В отличие от версии 7.7, здесь строгая типизация и иерархическая структура данных. Использование ВыборкаУПД.ДанныеШапки.Ссылка.Комментарий является самым быстрым способом решения задачи для обычного пользователя, в то время как модификация запроса — наиболее правильным с точки зрения производительности системы.

← На главную