Как правильно записывать дополнительные реквизиты объекта с составным типом в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с дополнительными реквизитами в конфигурациях на базе 1С часто возникают сложности, связанные с типизацией данных и архитектурой хранения информации. Рассмотрим, как программно внести изменения в дополнительные реквизиты, если свойство имеет составной тип, например, ссылается на справочник.

Разбор причины ошибки при записи

Частая ошибка при попытке изменить значение доп. реквизита заключается в попытке присвоить строковое значение полю, которое ожидает ссылку на элемент справочника (или другой тип объекта). В типовых системах дополнительные свойства часто хранятся в табличной части ДополнительныеРеквизиты. Если вы пытаетесь записать текст «Архив» в поле, где ожидается ссылка на справочник тсЗначенияСвойствОбъектов, система не сможет корректно сохранить данные, так как типы не совпадают.

Также важно помнить, что прямое обращение по индексу (например, ДополнительныеРеквизиты[34]) является опасным методом. Порядок строк в табличной части может измениться при добавлении новых свойств пользователем в режиме 1С:Предприятие, что приведет к ошибкам в логике работы вашего кода.

Шаг 1: Получение ссылки на значение свойства

Чтобы корректно записать значение в свойство, имеющее составной тип, нам необходимо сначала получить ссылку на нужный элемент справочника. Разберем, как это сделать программно:


СпрКат = Справочники.тсЗначенияСвойствОбъектов;
ЗначКат = СпрКат.НайтиПоНаименованию("СТОП");

После того как мы нашли объект ЗначКат, мы получаем именно ту ссылку, которую ожидает система для корректной записи в реквизит.

Шаг 2: Установка значения и запись объекта

Теперь, когда у нас есть верное значение, мы можем присвоить его нужному реквизиту. Рассмотрим пример реализации такой задачи:


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

Шаг 3: Использование серверных методов (рекомендуемый подход)

Для обеспечения надежности кода и исключения зависимости от порядка строк в табличной части, рекомендуется использовать специализированные серверные функции, предоставляемые типовой конфигурацией (или реализованные вами в модуле ОбъектыСервер). Это позволяет скрыть внутреннюю структуру данных от прямого манипулирования и избежать проблем при обновлении конфигурации.


Попытка
    КодКат = "0181";
    // Используем серверный метод для инкапсуляции логики записи
    ОбъектыСервер.ЗаписатьЗначениеСвойства(ОбъектВх, КодКат, ЗначКат);
    
    Значение = "Выполнено";
Исключение
    Значение = "Ошибка";
КонецПопытки;

Основные рекомендации для разработчика:

  1. Проверяйте тип значения: Если реквизит имеет составной тип, убедитесь, что вы передаете именно ссылку на объект, а не строку.
  2. Избегайте жесткой привязки к индексам: По возможности осуществляйте поиск нужного свойства не по индексу [34], а через обход табличной части и сравнение наименования свойства или его идентификатора.
  3. Используйте отладку: Если у вас есть доступ к конфигуратору, всегда проверяйте структуру ДополнительныеРеквизиты через табло отладчика, чтобы убедиться, что вы работаете с нужным полем.
  4. Безопасность: Всегда оборачивайте операции записи в конструкцию Попытка...Исключение, чтобы в случае возникновения ошибок (например, блокировка объекта) пользователь получал корректное уведомление, а система не «зависала».

Соблюдение этих простых правил поможет вам избежать проблем с целостностью данных при работе с дополнительными свойствами объектов в любой типовой конфигурации 1С.

← На главную