При разработке расширений для типовых конфигураций, таких как 1С:Управление торговлей 11.4, программисты часто сталкиваются с задачей добавления новых полей в существующие документы. Однако простого добавления реквизита на форму недостаточно, чтобы он появился в печатной форме. В этой статье мы подробно разберем, как правильно добавить реквизит в объект через расширение, обеспечить его сохранение в базе данных и использовать в логике формирования печатной формы «Акт сверки взаимных расчетов».
Первая и самая важная деталь, которую нам необходимо проанализировать, — это место создания реквизита. В экосистеме 1С существует принципиальная разница между реквизитом формы и реквизитом самого объекта (документа или справочника).
Объект.Ссылка.НовыйРеквизит.Разберем ситуацию: если вы добавили реквизит только на форму документа в расширении, то при попытке печати процедура формирования данных просто «не увидит» это поле, так как печать всегда обращается к данным, записанным в БД. Выясним причину — для решения задачи нам нужно добавить реквизит именно в объект Документ.СверкаВзаиморасчетов в самом расширении.
Прежде чем приступать к написанию кода, проверим настройки расширения. Это критический момент, который часто упускают из виду.
Проанализируем свойства расширения в дереве конфигурации. Убедитесь, что для вашего расширения снята галочка «Используется только для изменения формы». Если этот флаг установлен, расширение не сможет добавлять новые поля в таблицы базы данных, и ваш реквизит останется «виртуальным».
Теперь добавим сам реквизит:
СверкаВзаиморасчетов и добавим его в расширение (правой кнопкой мыши — «Добавить в расширение»).ФлагДляПечати с типом Булево.В конфигурациях на базе БСП (Библиотека стандартных подсистем) печать реализована через программные интерфейсы. Когда мы нажимаем кнопку «Печать», система вызывает менеджер объекта. Рассмотрим подробнее, как данные попадают в печатную форму.
Обычно в модуле менеджера или в специализированных модулях формирования данных используется Запрос. Даже если вы добавили реквизит в объект, типовой запрос печати о нем ничего не знает. Нам нужно модифицировать этот запрос.
Для внесения изменений в логику печати рекомендуется использовать механизм &ИзменениеИКонтроль вместо полной замены метода через &Вместо. Это позволит сохранить работоспособность системы при обновлении конфигурации. Проанализируем пример расширения функции СформироватьПечатнуюФорму.
Предположим, нам нужно изменить формирование данных в акте сверки. Рассмотрим, как будет выглядеть код в расширении модуля:
&ИзменениеИКонтроль("СформироватьПечатнуюФормуАктСверки")
Функция Расш1_СформироватьПечатнуюФормуАктСверки(МассивОбъектов, ОбъектыПечати)
// #Вставка
// Здесь мы можем добавить логику подготовки данных
// #КонецВставки
// Стандартный блок подготовки запроса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеОбъекта.Ссылка КАК Ссылка,
| ДанныеОбъекта.Номер КАК Номер,
| ДанныеОбъекта.Дата КАК Дата,
// #Вставка
| ДанныеОбъекта.ФлагДляПечати КАК ФлагДляПечати,
// #КонецВставки
| ДанныеОбъекта.Организация КАК Организация
|ИЗ
| Документ.СверкаВзаиморасчетов КАК ДанныеОбъекта
|ГДЕ
| ДанныеОбъекта.Ссылка В(&МассивОбъектов)";
// ... дальнейшая логика функции
КонецФункции
Используя теги #Вставка и #КонецВставки, мы точечно добавляем наше поле ФлагДляПечати в выборку. Теперь это значение будет доступно в структуре данных при обходе результата запроса.
Когда данные из базы получены, нам нужно использовать их для управления отображением макета. Рассмотрим, как это сделать в коде формирования табличного документа.
Выясним причину, по которой данные могут не выводиться: если вы не перенесли макет в расширение, вы не сможете добавить в него новые области. Однако, если ваша задача — просто скрывать или показывать стандартные секции на основе вашего реквизита булево, переносить макет не обязательно.
Разберем пример кода, который управляет выводом секции макета:
// В цикле обхода выборки данных печати
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем область макета
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
// Проверяем наш новый реквизит из расширения
Если Выборка.ФлагДляПечати Тогда
// Если истина, заполняем параметры особым образом
ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Специальный Акт сверки";
Иначе
ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Обычный Акт сверки";
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьЗаголовок);
КонецЦикла;
Если условие все равно не срабатывает, воспользуемся советом опытных разработчиков: установим точку останова в процедуре печати. Посмотрим на пример проверки:
ДанныеПечати).Выборка.ФлагДляПечати или Объект.Ссылка.ФлагДляПечати.Если значение возвращает Undefined (Неопределено), значит, реквизит либо не добавлен в метаданные документа в расширении, либо не включен в текст запроса, который собирает данные для печати.
При работе с расширениями в УТ 11.4 всегда помните о следующих моментах:
Булево).Таким образом, мы пошагово разобрали путь от создания «виртуального» реквизита формы до полноценного использования данных из базы в печатных формах. Совмещая правильное проектирование метаданных в расширении и использование современных механизмов контроля кода, таких как &ИзменениеИКонтроль, вы обеспечите стабильную работу и легкость сопровождения вашей системы.