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

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

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

Почему простого изменения макета недостаточно

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

Процесс формирования документа разделен на два этапа:

  1. Сбор данных: Программа выполняет запрос к базе данных и помещает результат в специальную структуру или таблицу значений (часто называемую ДанныеПечати).
  2. Заполнение макета: Программа берет данные из этой структуры и подставляет их в параметры макета.

Если в первом этапе (в запросе) поле СрокПоставки не было выбрано, то на втором этапе программе просто нечего подставлять в макет. Именно поэтому нам необходимо вмешаться в программный код формирования печатной формы.

Создание внешней печатной формы и ошибка параметров

Рассмотрим попытку реализации через внешнюю печатную форму (ВПФ). Часто разработчики сталкиваются с ошибкой «Недостаточно фактических параметров». Проанализируем причину ее возникновения. В современных версиях БСП процедура Печать в модуле объекта ВПФ должна иметь строго определенный набор аргументов.

Правильная сигнатура экспортной процедуры в модуле объекта должна выглядеть так:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Устанавливаем параметры печати
    ПараметрыПечати = Новый Структура;
    
    // Формируем табличный документ
    ТабличныйДокумент = СформироватьПечатнуюФормуСчетНаОплату(МассивОбъектов, ОбъектыПечати);
    
    // Выводим результат в коллекцию
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм, 
        "СчетНаОплату", 
        "Счет на оплату", 
        ТабличныйДокумент);
        
КонецПроцедуры

Если вы вызываете типовые функции из модуля менеджера документа (например, ПечатьСчетаНаОплату()), убедитесь, что передаете в них ровно столько параметров, сколько они ожидают. Ошибка часто возникает при обновлении конфигурации, когда в типовую функцию добавляется новый необязательный (или обязательный) параметр, а ваша ВПФ продолжает обращаться по-старому.

Решение проблемы «Поле объекта не обнаружено (СрокПоставки)»

Когда вы уже добавили вывод параметра в код, вы можете получить ошибку: Поле объекта не обнаружено (СрокПоставки). Это происходит в строке вида ЗначениеЗаполнено(ДанныеПечати.СрокПоставки). Это подтверждает, что в структуре данных, полученной из запроса, этого поля нет.

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

  1. Найти секцию запроса, где выбираются данные из табличной части Товары или из шапки документа ЗаказКлиента.
  2. Добавить выборку нужного поля. Если «Срок поставки» — это дополнительный реквизит, запрос усложнится необходимостью соединения с таблицей дополнительных сведений.
  3. Убедиться, что поле в запросе имеет псевдоним СрокПоставки.

Пример модификации области заполнения параметров в цикле вывода строк:


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

Использование расширений как более надежный метод

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

Мы можем использовать аннотацию &ИзменениеИКонтроль для процедуры, подготавливающей данные. Это позволит нам добавить только одну строчку в ВЫБРАТЬ запроса и одну строчку в заполнение структуры параметров, сохраняя при этом остальной типовой код в актуальном состоянии.

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

Работа с дополнительными реквизитами

Если вы добавили «Срок поставки» не в конфигураторе, а как «Дополнительный реквизит» в пользовательском режиме, обращение к нему через точку (ЗаказКлиента.СрокПоставки) в коде не сработает. Рассмотрим, как получить значение такого реквизита:


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

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

Обратите внимание на метод Заполнить(). Он очень удобен, так как позволяет сопоставить поля структуры с параметрами макета автоматически по именам. Это избавляет от необходимости прописывать каждую связь вручную.

Заключение и выводы

Подведем итог нашего анализа. Для успешного вывода нового поля в счет на оплату необходимо выполнить три условия:

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

← На главную