При адаптации типовых конфигураций под нужды бизнеса одной из самых частых задач является создание внешних печатных форм (ВПФ). Например, на базе стандартного «Заказа покупателя» в конфигурации «1С:Управление торговлей», редакция 10.3 нередко требуется создать форму «Счёт-договор поставки по предоплате». Основная сложность, с которой сталкиваются начинающие разработчики, — корректное изменение текста заголовка с сохранением стандартного форматирования номера и даты документа.
В этой статье мы подробно разберем, почему возникает популярная ошибка компиляции при попытке заменить заголовок «в лоб», как устроена функция формирования печатных параметров в УТ 10.3 и предложим два рабочих варианта решения этой задачи.
Выясним причину возникшей проблемы и пошагово разберем процесс её устранения.
В сообщении №7 автор темы пытается использовать следующий код в модуле своей внешней печатной формы:
ОбластьМакета.Параметры.ТекстЗаголовка = ОбщегоНазначения.СформироватьЗаголовокДокумента(Шапка, "Счёт-договор по предоплате");
При проверке кода система выдает ошибку. Это происходит по двум ключевым причинам:
Шапка собирается в одной функции и передается в другую. Во внешней печатной форме (обработке) контекст выполнения меняется. Локальной переменной Шапка в функции вывода области макета просто не существует, поэтому компилятор выдает ошибку о неопределенном идентификаторе.СсылкаНаОбъект. Именно в ней хранится ссылка на документ «Заказ покупателя», из которого была запущена печать.Рассмотрим подробнее, как работает функция формирования заголовков в УТ 10.3, чтобы правильно использовать её возможности.
В общем модуле ОбщегоНазначения конфигурации УТ 10.3 присутствует экспортная функция, отвечающая за генерацию красивой шапки документа:
Функция СформироватьЗаголовокДокумента(ДокументОбъект, НазваниеДокумента = "") Экспорт
Возврат ?(ЗначениеНеЗаполнено(НазваниеДокумента), ДокументОбъект.Метаданные().Синоним, НазваниеДокумента)
+ " № " + ПолучитьНомерНаПечать(ДокументОбъект)
+ " от " + Формат(ДокументОбъект.Дата, "ДФ='дд ММММ гггг'");
КонецФункции
Эта функция ожидает на вход первым параметром ссылку на документ (или сам объект документа), а вторым параметром — текстовую строку нового названия. Она автоматически удаляет префиксы из номера и приводит дату к стандартному печатному виду. Таким образом, нам достаточно передать туда правильную ссылку на объект и наш новый текст.
Теперь разберем два способа решения нашей задачи.
Этот способ идеально подходит, если вы хотите внести изменения с минимальным вмешательством в алгоритмы сбора данных печатной формы. Мы перехватим заполнение параметра ТекстЗаголовка непосредственно перед вызовом метода Вывести() табличного документа.
Выполним следующие шаги:
СоздатьТабличныйДокументПечатиСчетаЗаказа(Тип, ПараметрыПечати).СсылкаНаОбъект вместо несуществующей переменной Шапка.Посмотрим на пример измененного кода функции вывода:
Функция СоздатьТабличныйДокументПечатиСчетаЗаказа(Тип, ПараметрыПечати)
// ... Инициализация табличного документа и получение макета ...
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
// Заполняем параметры области стандартными данными из структуры
ОбластьМакета.Параметры.Заполнить(ПараметрыПечати);
// Перезаписываем параметр ТекстЗаголовка нужным нам значением
ОбластьМакета.Параметры.ТекстЗаголовка = ОбщегоНазначения.СформироватьЗаголовокДокумента(СсылкаНаОбъект, "Счёт-договор поставки по предоплате");
// Выводим заполненную область в итоговый табличный документ
ТабДокумент.Вывести(ОбластьМакета);
// ... Продолжение вывода остальных областей (Строка, Подвал и т.д.) ...
КонецФункции
При таком подходе в макете печатной формы параметр ТекстЗаголовка заполнится правильной строкой вида: «Счёт-договор поставки по предоплате № 00000012 от 15 мая 2024 г.».
Если проанализировать структуру печатной формы в УТ 10.3, можно заметить, что сбор данных и вывод разделены. Вся информация для печати собирается в функции ПолучитьПараметрыПечатиСчетаЗаказа(), которая возвращает структуру ПараметрыПечати. Изменение данных на этом этапе считается более изящным и правильным решением.
Разберем по шагам, как переопределить заголовок на этапе сборки параметров:
ПолучитьПараметрыПечатиСчетаЗаказа(Тип).Если Тип = "Счет" Тогда....Иначе (которая отвечает за вывод параметров Заказа покупателя) заменим стандартный текст на наш новый заголовок.Проанализируем пример реализации этого варианта:
Функция ПолучитьПараметрыПечатиСчетаЗаказа(Тип)
ПараметрыПечати = Новый Структура;
// ... Код запроса и заполнения базовых реквизитов ...
Если Тип = "Счет" Тогда
ПараметрыПечати.Вставить("ТекстЗаголовка", ОбщегоНазначения.СформироватьЗаголовокДокумента(СсылкаНаОбъект, "Счет на оплату"));
Иначе
// Заменяем стандартный "Заказ покупателя" на наш новый заголовок
ПараметрыПечати.Вставить("ТекстЗаголовка", ОбщегоНазначения.СформироватьЗаголовокДокумента(СсылкаНаОбъект, "Счёт-договор поставки по предоплате"));
КонецЕсли;
// ... Заполнение остальных параметров структуры ...
Возврат ПараметрыПечати;
КонецФункции
При использовании этого варианта функция вывода СоздатьТабличныйДокументПечатиСчетаЗаказа останется абсолютно нетронутой. Метод ОбластьМакета.Параметры.Заполнить(ПараметрыПечати) автоматически применит новое значение для параметра ТекстЗаголовка.
После внесения изменений в код внешней печатной формы обязательно выполните следующие действия:
ТекстЗаголовка, а не шаблон или простой текст.Описанные методы позволяют быстро и безболезненно кастомизировать любые печатные формы в старых редакциях конфигураций 1С, сохраняя чистоту кода и логику работы типовых механизмов платформы.