В практике разработчика и администратора 1С часто возникает задача добавить на форму документа или справочника новое поле для ввода данных. Ситуация осложняется, когда конфигурация находится на поддержке, а использование расширений ограничено версией платформы или политикой обновлений. В данной статье мы рассмотрим, как реализовать вывод поля «Причина списания» в документе Требование-накладная, используя возможности Библиотеки стандартных подсистем (БСП), которые уже интегрированы в 1С:Бухгалтерия предприятия 3.0.
Прежде всего, проанализируем фундаментальное различие между двумя механизмами хранения свойств в БСП. Это критически важно для решения задачи автора:
Для нашей задачи — вывода поля «Причина списания» прямо на форму — выберем механизм дополнительных реквизитов.
Многие разработчики начинают искать программные способы решения, забывая, что БСП предоставляет мощный конструктор в пользовательском интерфейсе. Посмотрим, как это настроить:
Требование-накладная. Обратим внимание: иногда названия в списке могут отличаться от имен метаданных (например, вместо «Требование-накладная» может быть «Расход материалов»).После записи этого реквизита система автоматически добавит его на форму всех документов данного типа. Он появится в специальной группе (обычно внизу формы или на отдельной вкладке «Дополнительно»).
Иногда при попытке добавить реквизит пользователь не обнаруживает нужный документ в справочнике НаборыДополнительныхРеквизитовИСведений. Выясним причину этого поведения:
Если объект отсутствует в списке, это означает, что он не включен в состав типов Плана видов характеристик ДополнительныеРеквизитыИСведений. В типовой «1С:Бухгалтерия 3.0» документ Требование-накладная (или РасходМатериалов в новых редакциях) обычно уже включен в этот механизм. Если же вы работаете с кастомным объектом, его необходимо добавить в ПВХ и создать для него запись в справочнике наборов свойств.
Если автоматическое размещение реквизита вас не устраивает и вы хотите программно управлять его положением, разберем по шагам, как БСП выводит эти данные. Система динамически создает реквизиты формы в момент открытия.
Имя динамического реквизита формы обычно формируется следующим образом:
ДополнительныйРеквизитЗначение_<ID_свойства_без_тире>
Где ID_свойства — это уникальный идентификатор ссылки из ПВХ ДополнительныеРеквизитыИСведений.
Чтобы программно найти путь к данным этого реквизита, посмотрим на пример кода, который можно использовать в расширении или при доработке формы:
// В процедуре ПриСозданииНаСервере
Для Каждого РеквизитФормы Из ЭтотОбъект.ПолучитьРеквизиты() Цикл
Если СтрНайти(РеквизитФормы.Имя, "ДополнительныйРеквизитЗначение_") > 0 Тогда
// Мы нашли динамический реквизит, созданный БСП
// Теперь можем создать элемент формы и привязать его
НовыйЭлемент = Элементы.Добавить("ПолеПричинаСписания", Тип("ПолеФормы"), ГруппаНаФорме);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект." + РеквизитФормы.Имя;
КонецЕсли;
КонецЦикла;
Важный нюанс: в современных версиях БСП данные дополнительных реквизитов часто выносятся не в корень Объект, а в специальную коллекцию на форме. Проанализируем структуру: если на форме есть реквизит СвойстваУправления, то пути к данным будут храниться именно там.
Вместо того чтобы вручную вычислять ПутьКДанным, рассмотрим подробнее более элегантный способ управления размещением. БСП ищет на форме контейнеры с определенными именами.
Если вы добавите на форму (даже через расширение) пустую группу с именем ГруппаДополнительныеРеквизиты, программные механизмы БСП при вызове процедуры УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект) автоматически поместят все созданные поля именно в эту группу. Это позволяет визуально «перетащить» дополнительные реквизиты в нужное место формы, не меняя логику их создания.
Если вы реализуете поддержку дополнительных реквизитов в собственном объекте, выясним, какие методы необходимо вызвать. В модуле формы документа должны присутствовать следующие вызовы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Стандартное заполнение и инициализация свойств
УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Обновление значений свойств при перечитывании объекта
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Сохранение значений свойств из формы в таблицу объекта
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры
Метод УправлениеСвойствами.ПриСозданииНаСервере выполняет всю «магию»: анализирует настройки наборов свойств в пользовательском режиме, создает программные реквизиты формы, привязывает их к табличной части ДополнительныеРеквизиты и размещает элементы управления в интерфейсе.
Для решения задачи автора в «1С:Бухгалтерия 3.0» выполним следующие действия:
ГруппаДополнительныеРеквизиты (через расширение или в конфигураторе), и система сама «притянет» туда новое поле.ПутьКДанным для элемента, так как БСП генерирует имена реквизитов динамически на основании внутренних идентификаторов (GUID), которые могут измениться при переносе настроек между базами.Такой подход гарантирует сохранность доработок при обновлениях конфигурации и минимизирует количество кода, который необходимо поддерживать.