Как вывести договор контрагента в поле «Основание» печатной формы счета на оплату в 1С:УТ 11

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

При переходе с устаревших конфигураций (например, УТП или УТ 10.3) на современные версии, такие как 1С:Управление торговлей 11 (или ее аналоги, например, УТ 3 для Казахстана), пользователи часто сталкиваются с тем, что привычные реквизиты исчезают из печатных форм. Одной из таких проблем является отсутствие поля Основание в счете на оплату, где клиенты обычно ожидают увидеть ссылку на договор. В современных конфигурациях разработчики 1С отдают приоритет заказам, однако требования бизнеса часто диктуют необходимость вывода именно договора. Чтобы при такой миграции сохранить историю учёта, используется готовый перенос документов и остатков из УТ 10.3 в УТ 11.

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

Анализ структуры печатной формы и макета

Перед тем как приступать к написанию кода, нам необходимо подготовить «место» для вывода данных. В 1С:УТ 11 печатные формы строятся на основе макетов. Если мы хотим добавить новую строку, которой нет в типовом варианте, нам нужно убедиться, что в макете существует соответствующая область и параметры.

Разберем, что нужно сделать в первую очередь:

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

Проанализируем типичную ошибку начинающих разработчиков: попытку вставить код вывода области без проверки ее наличия в макете. Как было отмечено в обсуждении, если мы пишем Макет.ПолучитьОбласть("Основание"), а такой области в макете нет — система выдаст фатальную ошибку.

Работа с данными в модуле менеджера

В управляемых формах 1С (УТ 11, ERP, КА 2) печать документов обычно вынесена в модуль менеджера. Там находится процедура (например, СформироватьПечатныеФормыСчетовНаОплату), которая подготавливает данные для печати. Основным источником данных является структура или выборка, которую часто называют ДанныеПечати.

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

Если в вашем запросе уже выбирается ссылка на документ или сам договор, вы можете обратиться к нему следующим образом:


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

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

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

Использование отладки для поиска нужного реквизита

Проанализируем ситуацию, когда мы не знаем точно, как называется поле в ДанныеПечати. Для этого идеально подходит точка останова. Установите ее в модуле менеджера в момент заполнения параметров макета.

Посмотрим на результат, который получил автор темы в процессе отладки: ДанныеПечати представляют собой ВыборкуИзРезультатаЗапроса, где содержатся поля Ссылка (Заказ клиента) и Договор. Это означает, что данные в запросе уже есть, и нам просто нужно правильно их передать в макет.

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

Формирование красивого представления договора

Просто вывести ссылку на договор — не всегда лучшее решение, так как клиенты хотят видеть фразу «Договор №... от ...». Для этого мы можем использовать возможности формирования текста в 1С.

Рассмотрим пример кода, который формирует строковое представление основания:


ОбластьМакета = Макет.ПолучитьОбласть("Основание");

ТекстОснования = "";
Если ЗначениеЗаполнено(ДанныеПечати.Договор) Тогда
    ДоговорОбъект = ДанныеПечати.Договор;
    ТекстОснования = "Договор № " + ДоговорОбъект.Номер + " от " + Формат(ДоговорОбъект.Дата, "ДЛФ=D");
КонецЕсли;

// Если договор не заполнен, можно вывести информацию о заказе
Если ПустаяСтрока(ТекстОснования) И ЗначениеЗаполнено(ДанныеПечати.Ссылка) Тогда
    ТекстОснования = "Заказ клиента № " + ДанныеПечати.Ссылка.Номер + " от " + Формат(ДанныеПечати.Ссылка.Дата, "ДЛФ=D");
КонецЕсли;

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

В этом примере мы используем функцию Формат() с параметром ДЛФ=D, чтобы дата договора выглядела презентабельно (например, «01 января 2024 г.»).

Почему изменения могут не отображаться?

Если вы внесли правки в код и макет, но в печатной форме по-прежнему пусто, проанализируем возможные причины:

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

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

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

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

← На главную