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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Добавление новых реквизитов в печатные формы — одна из самых частых задач, с которой сталкиваются начинающие разработчики 1С. На первый взгляд задача кажется простой, однако она требует понимания того, как взаимодействуют макеты, запросы и программный код в модуле менеджера объекта. В этой статье мы подробно рассмотрим процесс вывода кода контрагента в печатную форму, разберем типичные ошибки и выясним, как сделать это максимально эффективно с точки зрения производительности системы.

Шаг 1: Подготовка макета печатной формы

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

  1. Откроем конфигуратор и найдем нужный документ. В ветке Макеты выберем тот, который отвечает за печатную форму (например, ПФ_MXL_Накладная).
  2. В открывшемся табличном документе выберем ячейку или создадим новую, где должен отображаться код контрагента.
  3. Нажмем правую кнопку мыши на ячейке и выберем пункт Свойства.
  4. Найдем важное свойство Заполнение. По умолчанию там стоит значение Текст. Нам необходимо изменить его на Параметр. Это скажет системе, что содержимое ячейки — это переменная, которую мы заполним программно.
  5. В поле Параметр впишем понятное имя, например, КодКонтрагента.

Рассмотрим подробнее режимы заполнения. Если мы выберем Шаблон, то сможем скомбинировать текст и данные. Например, написав в ячейке Код клиента: [КодКонтрагента], мы получим на печати строку с пояснением, где текст в квадратных скобках заменится реальным кодом из базы данных.

Шаг 2: Получение данных в модуле менеджера

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

Существует два основных способа получения кода контрагента. Рассмотрим их по порядку, начиная с наиболее простого, но менее предпочтительного.

Способ А: Обращение через точку (быстрый, но неоптимальный)

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


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

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

Способ Б: Редактирование запроса (профессиональный подход)

Чтобы программа работала быстро, мы должны получить код контрагента сразу, в одном основном запросе. Для этого выполним следующие действия:

  1. Найдем в коде текст запроса. Обычно он начинается с ключевого слова ВЫБРАТЬ.
  2. Воспользуемся Конструктором запроса (правой кнопкой мыши по тексту запроса -> Конструктор запроса).
  3. В дереве таблиц найдем поле Контрагент, раскроем его через "плюс" и выберем поле Код.
  4. Присвоим полю псевдоним КодКонтрагента, чтобы не путать его с кодом самого документа.

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


Запрос.Текст = 
"ВЫБРАТЬ
|   Ссылка.Номер,
|   Ссылка.Дата,
|   Ссылка.Контрагент.Код КАК КодКонтрагента,
|   Ссылка.Контрагент КАК Контрагент
|ИЗ
|   Документ.РеализацияТоваровУслуг КАК Ссылка
|ГДЕ
|   Ссылка.Ссылка В(&МассивСсылок)";

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


РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

Метод Заполнить(Выборка) — очень удобный инструмент. Он автоматически сопоставляет имена полей запроса с именами параметров в макете и переносит значения. Именно поэтому мы дали полю в запросе псевдоним КодКонтрагента, совпадающий с именем параметра в макете.

Дополнительные рекомендации и тонкости

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


// Удаление префиксов и лидирующих нулей
ЧистыйКод = ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксИНулиОбъекта(Выборка.КодКонтрагента);
ОбластьШапка.Параметры.КодКонтрагента = ЧистыйКод;

Также стоит помнить о возможности использования Внешних печатных форм (ВПФ). Если вы работаете в типовой конфигурации (например, 1С:Бухгалтерия или 1С:УТ), крайне не рекомендуется вносить изменения напрямую в макеты конфигурации. В будущем это создаст сложности при обновлении. Гораздо правильнее создать внешнюю обработку, которая будет подключаться через механизм ДополнительныеОтчетыИОбработки. Это позволит сохранить конфигурацию на поддержке, при этом полностью решив вашу задачу.

Если данные не выводятся, проанализируем ситуацию с помощью Отладчика. Установите точку останова на строке заполнения параметров и проверьте значение переменной Выборка.КодКонтрагента. Если она пустая, возможно, у данного контрагента просто не заполнен код в справочнике или вы забыли добавить поле в текст запроса.

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

← На главную