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