Как программно добавить или изменить значения в регистре сведений Значения свойств объектов

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

В конфигурации 1С:Управление торговлей 10.3 (и многих других на обычных формах) работа с дополнительными характеристиками номенклатуры, такими как длина, ширина или высота, реализована через независимый непериодический регистр сведений ЗначенияСвойствОбъектов. Для разработчика часто встает задача автоматизировать заполнение этих данных из внешних обработок. Рассмотрим детально, как правильно организовать запись данных в этот регистр, разберем основные методы платформы и выберем наиболее оптимальный подход.

Метод 1: Использование Набора Записей (НаборЗаписей)

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

Проанализируем правильный алгоритм работы с набором записей:

  1. Создаем объект набора записей для конкретного регистра.
  2. Устанавливаем отборы по измерениям (в нашем случае это Объект и Свойство). Важно: отборы позволяют системе понять, какую именно область данных мы собираемся перезаписать.
  3. Вызываем метод Прочитать(), если нам нужно проверить наличие существующей записи.
  4. Добавляем новую строку в набор или модифицируем существующую.
  5. Вызываем метод Записать().

Рассмотрим пример кода, который корректно обновляет значение свойства:


Процедура ЗаписатьЗначениеСвойства(НоменклатураСсылка, СвойствоСсылка, ЗначениеСвойства)
    // 1. Создаем набор
    НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
    
    // 2. Устанавливаем жесткий отбор по измерениям
    НаборЗаписей.Отбор.Объект.Установить(НоменклатураСсылка);
    НаборЗаписей.Отбор.Свойство.Установить(СвойствоСсылка);
    
    // 3. Читаем данные из базы по этому отбору
    НаборЗаписей.Прочитать();
    
    Если НаборЗаписей.Количество() = 0 Тогда
        // Если записи нет, создаем новую
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Объект   = НоменклатураСсылка;
        НоваяЗапись.Свойство = СвойствоСсылка;
    Иначе
        // Если запись есть, работаем с первой (и единственной при таком отборе) строкой
        НоваяЗапись = НаборЗаписей[0];
    КонецЕсли;
    
    // Устанавливаем ресурс (значение)
    НоваяЗапись.Значение = ЗначениеСвойства;
    
    // 4. Записываем наборы в базу данных
    НаборЗаписей.Записать();
КонецПроцедуры

Полезный совет: Если ваша задача — всегда перезаписывать значение, не заботясь о том, что там было раньше, можно пропустить метод Прочитать(). В этом случае достаточно установить отбор, очистить набор (если он не пуст), добавить одну запись и нажать Записать(). Платформа 1С при выполнении метода Записать() автоматически удалит из базы все записи, которые соответствуют установленному отбору, и вставит те, что находятся в текущем объекте НаборЗаписей.

Метод 2: Использование Менеджера Записи (МенеджерЗаписи)

Для работы с одиночными записями независимых регистров платформа предоставляет более простой объект — РегистрСведенийМенеджерЗаписи. Он удобен тем, что имитирует работу с объектом справочника или документа: мы просто заполняем поля и вызываем один метод записи.

Разберем, как это выглядит в коде:


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

Несмотря на простоту, помните, что МенеджерЗаписи работает медленнее, чем НаборЗаписей, если вам нужно обработать тысячи товаров за один раз. Это связано с тем, что менеджер записи выполняет отдельные SQL-запросы на поиск и изменение для каждой строки.

Важные нюансы при работе с регистром ЗначенияСвойствОбъектов

Проанализируем несколько критических моментов, которые часто упускают начинающие разработчики:

  1. Типизация значений: В данном регистре ресурс Значение обычно имеет составной тип. Если вы записываете "Длину" (число), убедитесь, что передаете именно число, а не строку. Система 1С:Предприятие 8 чувствительна к типам данных, особенно когда речь идет о Планах Видов Характеристик (ПВХ), на которых базируется этот регистр.
  2. Очистка значений: Если вам нужно программно удалить значение свойства, самым эффективным способом будет использование пустого набора записей. Установите отбор по объекту и свойству и просто вызовите НаборЗаписей.Записать(), не добавляя в него строк. Система увидит пустой набор и очистит запись в базе.
  3. Транзакции: Если вы обновляете сразу несколько параметров (например, габариты: длину, ширину и высоту), рекомендуется объединять эти действия в одну транзакцию с помощью конструкции НачатьТранзакцию() ... ЗафиксироватьТранзакцию(). Это гарантирует целостность данных: либо запишутся все три габарита, либо ни один в случае ошибки.

Типичные ошибки при кодинге

Рассмотрим ситуацию, когда разработчики пытаются использовать НаборЗаписей.Добавить() без предварительной проверки или очистки. Если вы не установите отбор или не прочтете существующий набор, вы рискуете получить ошибку "Запись с такими ключевыми полями уже существует".

Выясним причину этой ошибки: в независимом регистре сведений не может быть двух строк с абсолютно одинаковыми измерениями (в нашем случае — одна и та же Номенклатура + одно и то же Свойство). Именно поэтому использование Отбор.Установить() является обязательным условием для корректной модификации данных.

Подводя итог, можно сказать: для простых обработок и редких правок идеально подходит МенеджерЗаписи за счет минимального количества кода. Для массовой загрузки данных из Excel или обмена с сайтом лучше использовать НаборЗаписей, так как он обеспечивает более высокую производительность и контроль над процессом записи.

← На главную