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