К статье
Практический материал

Документы и Печать · 13 мин

Как вывести дополнительный реквизит в печатную форму 1С

Пошаговая инструкция: как вывести дополнительный реквизит в печатную форму 1С через макет, расширение и внешнюю печатную форму. Примеры кода и типичные ошибки.

Дополнительные реквизиты в 1С (например, «Срок доставки», «Внутренний номер заказа», «Особые условия») не попадают в типовые печатные формы автоматически — макет печатной формы содержит только предопределённые параметры. Чтобы вывести дополнительный реквизит на печать, нужно определить, какой механизм печати используется в вашей конфигурации, и выбрать один из трёх путей: доработку макета в конфигураторе, расширение конфигурации или внешнюю печатную форму.

Выбор способа зависит от того, стоит ли конфигурация на поддержке, есть ли у вас доступ к конфигуратору и навыки программирования на встроенном языке. Внешняя печатная форма — самый безопасный вариант: она не меняет конфигурацию и не мешает обновлениям. Прямая доработка макета быстрее, но усложняет последующие обновления.

Ниже разобраны все три подхода с конкретными шагами, примером кода получения значения дополнительного реквизита и способами проверки результата. Инструкции ориентированы на конфигурации с Библиотекой стандартных подсистем (УТ 11, ERP, КА, БП 3.0), где действует подсистема «Дополнительные реквизиты и сведения».

Как устроено хранение дополнительных реквизитов и почему их нет в печати

Дополнительные реквизиты хранятся не в шапке документа, а в отдельной табличной части «ДополнительныеРеквизиты» объекта. Каждая строка содержит ссылку на свойство (элемент плана видов характеристик «ДополнительныеРеквизитыИСведения») и значение. Дополнительные сведения хранятся ещё отдельнее — в одноимённом регистре сведений, привязанном к объекту.

Типовая процедура печати формирует табличный документ из макета, заполняя параметры данными запроса к шапке и табличным частям документа. Поскольку дополнительные реквизиты в этот запрос не входят, их значения в макете отсутствуют. Поэтому задача всегда состоит из двух частей: получить значение дополнительного реквизита в коде и добавить для него область и параметр в макет.

Прежде чем что-то менять, узнайте точное имя свойства. Откройте карточку дополнительного реквизита (Администрирование → Общие настройки → Дополнительные реквизиты), посмотрите заголовок и, при необходимости, имя для разработчиков. Искать значение в коде надёжнее по ссылке на свойство, а не по строке заголовка — заголовок могут переименовать.

Определяем, какой механизм печати используется

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

Если форма подключена как внешняя (Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки), то дорабатывать нужно именно файл внешней обработки .epf, а не конфигурацию. Проверьте этот список до начала работ — частая ситуация: программист правит типовой макет, а пользователи печатают через подключённую внешнюю форму, и изменений не видят.

Маршрут решения

Как выбрать способ доработки

Конфигурация на полной поддержке и обновляется автоматическиИспользуйте внешнюю печатную форму — типовая форма останется нетронутой
Есть расширения и механизм печати позволяет переопределить процедуруСделайте расширение конфигурации с изменённой процедурой печати
Конфигурация уже снята с поддержки и активно дорабатываетсяДопустима прямая правка макета и модуля менеджера в конфигураторе
Нужен быстрый разовый вывод без программированияПроверьте, нет ли в макете свободной области и выведите значение через пользовательский макет (Изменить макет в форме печати)

Способ 1. Доработка макета и процедуры печати в конфигураторе

Откройте конфигуратор, найдите макет печатной формы (обычно в ветке документа → Макеты, например «МакетСчетаНаОплату»). Добавьте в нужную область новую ячейку, в свойстве «Заполнение» укажите «Параметр», а в качестве текста — имя параметра, например СрокДоставки. Если параметр должен выводиться внутри предложения, вставьте его в текст ячейки через квадратные скобки: [СрокДоставки].

Затем откройте процедуру формирования печатной формы в модуле менеджера. Найдите место, где заполняются параметры области (строки вида ОбластьШапка.Параметры.Заполнить(Выборка)), и добавьте получение значения дополнительного реквизита.

bsl
Функция ЗначениеДопРеквизита(ОбъектСсылка, СвойствоСсылка)
    Для Каждого Строка Из ОбъектСсылка.ДополнительныеРеквизиты Цикл
        Если Строка.Свойство = СвойствоСсылка Тогда
            Возврат Строка.Значение;
        КонецЕсли;
    КонецЦикла;
    Возврат "";
КонецФункции

// В процедуре печати:
СвойствоСрок = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Срок доставки");
ОбластьШапка.Параметры.СрокДоставки = ЗначениеДопРеквизита(СсылкаНаДокумент, СвойствоСрок);

После сохранения конфигурации и обновления базы данных сформируйте печатную форму документа, у которого реквизит заполнен. Если параметр пустой — проверьте, что ищете свойство по тому же наименованию, что указано в справочнике дополнительных реквизитов, и что реквизит действительно заполнен у конкретного документа, а не у связанного объекта (например, контрагента).

Способ 2. Внешняя печатная форма

Внешняя печатная форма — это файл .epf, который подключается через «Дополнительные отчеты и обработки» и подменяет или дополняет типовую кнопку печати. Конфигурация при этом не изменяется, обновления проходят штатно, а при проблемах форму можно просто отключить из списка.

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

Подключение внешней печатной формы
  1. 1
    Создайте внешнюю обработку с функцией СведенияОВнешнейОбработке и процедурой Печать
  2. 2
    Скопируйте типовой макет и добавьте параметр для дополнительного реквизита
  3. 3
    В процедуре Печать получите значение реквизита из табличной части ДополнительныеРеквизиты и присвойте параметру
  4. 4
    Сохраните .epf и подключите: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки
  5. 5
    Укажите размещение (для каких документов показывать) и при необходимости отключите типовую команду
  6. 6
    Откройте документ с заполненным реквизитом и сформируйте печатную форму

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) должна заполнить коллекцию печатных форм табличными документами. Внутри используется тот же приём получения значения реквизита, что и в первом способе. Если конфигурация работает в модели сервиса или с безопасным режимом, убедитесь, что обработке разрешён запуск — иначе команда появится, но форма не сформируется.

Способ 3. Расширение конфигурации

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

Практическая сложность: при обновлении конфигурации типовая процедура печати может измениться, и расширение начнёт формировать устаревшую форму. Поэтому после каждого обновления проверяйте расширение на совместимость — конфигуратор показывает такие проблемы при проверке применимости расширения. Для простых случаев (вывести один-два реквизита) внешняя печатная форма обычно надёжнее и дешевле в сопровождении.

Сравнение способов

Прямая доработка в конфигураторе

Быстро и прямолинейно, но усложняет обновления и требует снятия с поддержки

Внешняя печатная форма

Не меняет конфигурацию, легко отключается; минус — отдельный файл и копия макета, которую нужно синхронизировать с типовым

Расширение конфигурации

Сохраняет типовую команду печати, но требует проверки совместимости после каждого обновления

Пользовательский макет (Изменить макет)

Подходит только если значение уже доступно в параметрах макета; новый дополнительный реквизит так не вывести без кода

Вывод дополнительного сведения и реквизита связанного объекта

Дополнительные сведения (в отличие от реквизитов) хранятся в регистре сведений «ДополнительныеСведения» и читаются запросом по отбору «Объект» и «Свойство». В коде печати это выглядит как запрос к регистру с параметром-ссылкой на документ и ссылкой на свойство.

Если нужно вывести реквизит не самого документа, а связанного объекта — например, дополнительный реквизит договора или контрагента, — сначала получите ссылку на связанный объект из шапки документа, а затем ищите значение в его табличной части «ДополнительныеРеквизиты». Учитывайте, что у разных видов объектов наборы дополнительных реквизитов свои: реквизит с одинаковым названием у договора и у документа — это два разных элемента плана видов характеристик.

Проверка результата и типичные ошибки

После доработки проверьте печать минимум в трёх ситуациях: документ с заполненным реквизитом, документ с пустым реквизитом (в ячейке не должно быть мусора или служебного текста) и печать из списка документов сразу для нескольких объектов, если такая возможность предусмотрена. Также проверьте форму у пользователя с ограниченными правами — недостаток прав на чтение дополнительных реквизитов может приводить к пустым значениям только у части сотрудников.

Контрольные точки

Как проверить результат

Значение в печатной форме
Норма

Совпадает со значением реквизита в карточке документа

Тревожный признак

Пусто при заполненном реквизите — неверно найдено свойство или реквизит у другого объекта

Документ без значения реквизита
Норма

Ячейка пустая или содержит осмысленный дефолт

Тревожный признак

Выводится служебный текст или код не обрабатывает пустое значение

Групповая печать
Норма

У каждого документа своё значение

Тревожный признак

Во всех формах значение первого документа — значение вычисляется вне цикла

Обновление конфигурации
Норма

После обновления форма работает как раньше

Тревожный признак

Доработка затёрта типовым обновлением — не была использована внешняя форма или расширение

Типичные ошибки
01
Поиск свойства по наименованию без проверки результата — после переименования реквизита печать молча выводит пустоту
02
Получение значения вне цикла по документам — при групповой печати у всех форм одно и то же значение
03
Правка типового макета, когда пользователи печатают через подключённую внешнюю форму — изменений никто не видит
04
Путаница между дополнительными реквизитами и дополнительными сведениями — значение ищется не в том хранилище
05
Вывод значения типа «Дата» или «Булево» без форматирования — в форме появляется значение в нечитаемом виде

Для значений нестроковых типов применяйте функцию Формат() или приведение к строке: даты без формата выводятся со временем, булево — как «Да/Нет» или «Истина/Ложь» в зависимости от контекста. Если реквизит ссылочного типа (например, ссылка на сотрудника), в печать обычно выводят представление — простого присвоения параметру достаточно, но при необходимости можно вывести конкретное поле связанного объекта.

FAQ

Можно ли вывести дополнительный реквизит без программирования?

Частично. Кнопка «Изменить макет» в форме печати позволяет редактировать макет, но только с теми параметрами, которые уже передаёт типовая процедура. Новый дополнительный реквизит в этот список не входит, поэтому без доработки кода его не вывести — потребуется внешняя печатная форма, расширение или правка конфигурации.

Почему в печатной форме пусто, хотя реквизит заполнен?

Чаще всего свойство не найдено: поиск по наименованию не сработал из-за лишнего пробела, переименования или потому, что реквизит заведён для другого вида объектов. Вторая причина — значение заполнено у связанного объекта (контрагента, договора), а читается оно из документа. Проверьте в отладчике, что возвращает поиск свойства и цикл по табличной части.

Чем дополнительный реквизит отличается от дополнительного сведения?

Реквизит виден на форме объекта и хранится в его табличной части «ДополнительныеРеквизиты». Сведение открывается отдельной командой и хранится в регистре сведений «ДополнительныеСведения». Для печати реквизит читается прямо из объекта, а сведение — запросом к регистру по отбору «Объект» и «Свойство».

Пропадёт ли доработка после обновления конфигурации?

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

Как вывести реквизит в табличную часть печатной формы, а не в шапку?

Логика та же, но значение должно относиться к строке табличной части — например, дополнительный реквизит номенклатуры. Внутри цикла по строкам товаров получайте значение из табличной части «ДополнительныеРеквизиты» элемента справочника «Номенклатура» и присваивайте параметру области строки до её вывода в табличный документ.

Нужны ли особые права для чтения дополнительных реквизитов при печати?

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

Итог

Что важно запомнить

Дополнительный реквизит выводится в печать двумя действиями: чтением значения из табличной части «ДополнительныеРеквизиты» по ссылке на свойство и добавлением параметра в макет. Предпочтительные способы — внешняя печатная форма или расширение, чтобы не мешать обновлениям. Обязательно проверяйте печать с пустым значением, при групповой печати и под пользователем с ограниченными правами.