Как добавить описание и изображение номенклатуры в печатную форму счета на оплату в 1С:УНФ

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

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

Анализ структуры данных номенклатуры

Прежде всего, проанализируем, где именно хранятся нужные нам данные. В типовой конфигурации УНФ поле, которое пользователь видит на форме под заголовком «Описание», в дереве метаданных обычно соответствует реквизиту Комментарий объекта СправочникСсылка.Номенклатура. Что касается изображений, то они хранятся в подчиненном справочнике НоменклатураПрисоединенныеФайлы, а ссылка на основную картинку находится в реквизите ФайлКартинки самого элемента номенклатуры.

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

Решение 1: Вывод текстового описания через макет и запрос

Рассмотрим самый правильный с точки зрения архитектуры способ — изменение функции формирования данных для печати. В 1С:УНФ за формирование данных для счета на оплату отвечает модуль менеджера документа СчетНаОплату и функция УниверсальныйЗапросПоДаннымДокумента (названия могут незначительно отличаться в разных версиях).

Проанализируем шаги, которые необходимо выполнить:

  1. Найдем в модуле менеджера текст запроса, который собирает данные из табличной части Запасы.
  2. Добавим в текст запроса выборку поля Номенклатура.Комментарий и присвоим ему понятный псевдоним, например, ОписаниеДляПечати.
  3. В макете печатной формы добавим новый параметр или изменим существующий (например, в области строки товара).

Посмотрим на пример того, как может быть модифицирован запрос в коде:


// Фрагмент модификации запроса в модуле менеджера
ТекстЗапроса = 
"ВЫБРАТЬ
|   СчетЗапасы.Номенклатура КАК Номенклатура,
|   СчетЗапасы.Номенклатура.Комментарий КАК ОписаниеДляПечати,
|   СчетЗапасы.Количество КАК Количество,
|   ... // остальные поля";

После изменения кода необходимо зайти в макет ПФ_MXL_СчетНаОплату и в нужной ячейке указать параметр ОписаниеДляПечати. Чтобы текст не обрезался, обязательно установим в свойствах ячейки «Размещение текста» значение Переносить и включим Автовысота строки.

Решение 2: Использование штатного поля «Содержание»

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

Рассмотрим преимущества этого метода:

Решение 3: Программный вывод изображения

Вывод картинок — задача более сложная, так как изображение является объектом типа РисунокТабличногоДокумента. Если вы хотите сэкономить время, можно использовать готовое решение — Счет на оплату с картинками товара, которое уже реализует этот функционал для УНФ 3.0. Если же вы пишете код самостоятельно, проанализируем алгоритм действий:

  1. В запросе получаем ссылку на Номенклатура.ФайлКартинки.
  2. В цикле обхода выборки данных для печати получаем двоичные данные файла картинки.
  3. Создаем программно объект рисунка и помещаем его в область макета.

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


// Пример вывода картинки в область макета
Если ЗначениеЗаполнено(ВыборкаСтрок.ФайлКартинки) Тогда
    // Получаем двоичные данные файла
    ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(ВыборкаСтрок.ФайлКартинки);
    Если ДанныеФайла <> Неопределено Тогда
        КартинкаОбъект = Новый Картинка(ДанныеФайла);
        
        // Добавляем рисунок в область макета
        Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
        Рисунок.Картинка = КартинкаОбъект;
        Рисунок.РазмерКартинки = РазмерКартинки.РеальныйРазмер; // или АвтоМасштаб
        
        // Определяем границы рисунка по имеющемуся в макете именованному рисунку-шаблону
        Рисунок.Расположить(ОбластьМакета.Область("ОбластьДляКартинки"));
    КонецЕсли;
КонецЕсли;

Обратите внимание: чтобы картинка выводилась корректно для каждой строки, в самом макете рекомендуется заранее создать «пустой» объект рисунка (просто рамку), дать ему имя (например, ОбластьДляКартинки) и использовать его координаты для позиционирования динамически создаваемых изображений. Также для этих целей подойдет внешняя печатная форма счета с картинками товаров, работающая в том числе и для документов «Заказ покупателя».

Рекомендации по внедрению через расширения

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

Если же задача стоит разово или вы не хотите менять логику проведения документов, используйте Внешнюю печатную форму (ВПФ). Это отдельный файл .epf, который подключается через справочник «Дополнительные отчеты и обработки». В ВПФ вы полностью контролируете и текст запроса, и макет, и алгоритм заполнения, не затрагивая ядро системы.

Типичные ошибки при работе с макетами

Разберем основные грабли, на которые наступают разработчики:

  1. Попытка обращения к Объект.Комментарий в макете: В контексте печати нет никакого Объекта формы, есть только структура данных или выборка из запроса. Всегда проверяйте имена параметров в коде заполнения.
  2. Отсутствие проверки на пустое изображение: Если у товара нет картинки, код может выдать ошибку. Всегда используйте ЗначениеЗаполнено().
  3. Проблемы с масштабом: Большие фотографии могут «раздуть» счет до огромных размеров. Используйте свойство РазмерКартинки.Пропорционально, чтобы изображение вписывалось в отведенную ячейку.

Подводя итог, можно сказать, что наиболее гибким решением для УНФ является сочетание программного изменения запроса в модуле менеджера и использования механизмов БСП (Библиотеки стандартных подсистем) для работы с присоединенными файлами. Это позволит вам выводить профессионально оформленные счета с детализированной информацией и визуализацией товара, что значительно повышает лояльность клиентов.

← На главную