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