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