Как добавить новый реквизит в документ через расширение и вывести его в печатную форму в 1С:УТ 11.4

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

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

Различие между реквизитом формы и реквизитом объекта

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

  1. Реквизит формы: существует только в памяти, пока открыто окно документа. Его нельзя сохранить в базу данных напрямую, и он недоступен для запросов или других процедур, работающих с объектом по ссылке.
  2. Реквизит объекта (в расширении): добавляется непосредственно в структуру метаданных документа внутри расширения. Такое поле сохраняется в физическую таблицу базы данных и может быть получено через запрос или через точку от ссылки Объект.Ссылка.НовыйРеквизит.

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

Шаг 1. Настройка расширения и добавление реквизита в метаданные

Прежде чем приступать к написанию кода, проверим настройки расширения. Это критический момент, который часто упускают из виду.

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

Теперь добавим сам реквизит:

  1. Найдем в основной конфигурации документ СверкаВзаиморасчетов и добавим его в расширение (правой кнопкой мыши — «Добавить в расширение»).
  2. В расширении раскроем ветку документа и перейдем в раздел Реквизиты.
  3. Создадим новый реквизит, например, ФлагДляПечати с типом Булево.
  4. Теперь вынесем этот реквизит на форму документа в расширении, чтобы пользователь мог устанавливать это значение.

Шаг 2. Анализ механизма печати в УТ 11.4

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

Обычно в модуле менеджера или в специализированных модулях формирования данных используется Запрос. Даже если вы добавили реквизит в объект, типовой запрос печати о нем ничего не знает. Нам нужно модифицировать этот запрос.

Шаг 3. Использование аннотации &ИзменениеИКонтроль

Для внесения изменений в логику печати рекомендуется использовать механизм &ИзменениеИКонтроль вместо полной замены метода через &Вместо. Это позволит сохранить работоспособность системы при обновлении конфигурации. Проанализируем пример расширения функции СформироватьПечатнуюФорму.

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


&ИзменениеИКонтроль("СформироватьПечатнуюФормуАктСверки")
Функция Расш1_СформироватьПечатнуюФормуАктСверки(МассивОбъектов, ОбъектыПечати)
    // #Вставка
    // Здесь мы можем добавить логику подготовки данных
    // #КонецВставки

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

    // ... дальнейшая логика функции
КонецФункции

Используя теги #Вставка и #КонецВставки, мы точечно добавляем наше поле ФлагДляПечати в выборку. Теперь это значение будет доступно в структуре данных при обходе результата запроса.

Шаг 4. Обработка условия в макете печатной формы

Когда данные из базы получены, нам нужно использовать их для управления отображением макета. Рассмотрим, как это сделать в коде формирования табличного документа.

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

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


// В цикле обхода выборки данных печати
Выборка = Запрос.Выполнить().Выбрать();

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

Шаг 5. Отладка и проверка данных

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

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

Если значение возвращает Undefined (Неопределено), значит, реквизит либо не добавлен в метаданные документа в расширении, либо не включен в текст запроса, который собирает данные для печати.

Важные рекомендации

При работе с расширениями в УТ 11.4 всегда помните о следующих моментах:

Таким образом, мы пошагово разобрали путь от создания «виртуального» реквизита формы до полноценного использования данных из базы в печатных формах. Совмещая правильное проектирование метаданных в расширении и использование современных механизмов контроля кода, таких как &ИзменениеИКонтроль, вы обеспечите стабильную работу и легкость сопровождения вашей системы.

← На главную