В конфигурации 1С:Управление торговлей 10.3 (и многих других на обычных формах) работа с дополнительными характеристиками номенклатуры, такими как длина, ширина или высота, реализована через независимый непериодический регистр сведений ЗначенияСвойствОбъектов. Для разработчика часто встает задача автоматизировать заполнение этих данных из внешних обработок. Рассмотрим детально, как правильно организовать запись данных в этот регистр, разберем основные методы платформы и выберем наиболее оптимальный подход.
Использование объекта РегистрСведенийНаборЗаписей считается классическим и наиболее гибким способом. Этот метод позволяет работать как с одной записью, так и с группой записей одновременно. Основная логика работы с набором заключается в установке фильтров (отборов), после чего платформа позволяет нам манипулировать данными в рамках этого фильтра.
Проанализируем правильный алгоритм работы с набором записей:
Объект и Свойство). Важно: отборы позволяют системе понять, какую именно область данных мы собираемся перезаписать.Прочитать(), если нам нужно проверить наличие существующей записи.Записать().Рассмотрим пример кода, который корректно обновляет значение свойства:
Процедура ЗаписатьЗначениеСвойства(НоменклатураСсылка, СвойствоСсылка, ЗначениеСвойства)
// 1. Создаем набор
НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
// 2. Устанавливаем жесткий отбор по измерениям
НаборЗаписей.Отбор.Объект.Установить(НоменклатураСсылка);
НаборЗаписей.Отбор.Свойство.Установить(СвойствоСсылка);
// 3. Читаем данные из базы по этому отбору
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
// Если записи нет, создаем новую
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = НоменклатураСсылка;
НоваяЗапись.Свойство = СвойствоСсылка;
Иначе
// Если запись есть, работаем с первой (и единственной при таком отборе) строкой
НоваяЗапись = НаборЗаписей[0];
КонецЕсли;
// Устанавливаем ресурс (значение)
НоваяЗапись.Значение = ЗначениеСвойства;
// 4. Записываем наборы в базу данных
НаборЗаписей.Записать();
КонецПроцедуры
Полезный совет: Если ваша задача — всегда перезаписывать значение, не заботясь о том, что там было раньше, можно пропустить метод Прочитать(). В этом случае достаточно установить отбор, очистить набор (если он не пуст), добавить одну запись и нажать Записать(). Платформа 1С при выполнении метода Записать() автоматически удалит из базы все записи, которые соответствуют установленному отбору, и вставит те, что находятся в текущем объекте НаборЗаписей.
Для работы с одиночными записями независимых регистров платформа предоставляет более простой объект — РегистрСведенийМенеджерЗаписи. Он удобен тем, что имитирует работу с объектом справочника или документа: мы просто заполняем поля и вызываем один метод записи.
Разберем, как это выглядит в коде:
Процедура ЗаписатьСвойствоЧерезМенеджер(НоменклатураСсылка, СвойствоСсылка, ЗначениеСвойства)
Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
// Заполняем измерения
Запись.Объект = НоменклатураСсылка;
Запись.Свойство = СвойствоСсылка;
// Заполняем ресурсы
Запись.Значение = ЗначениеСвойства;
// Метод Записать(Истина) сначала пытается найти запись,
// если находит — обновляет, если нет — создает новую.
Запись.Записать(Истина);
КонецПроцедуры
Несмотря на простоту, помните, что МенеджерЗаписи работает медленнее, чем НаборЗаписей, если вам нужно обработать тысячи товаров за один раз. Это связано с тем, что менеджер записи выполняет отдельные SQL-запросы на поиск и изменение для каждой строки.
Проанализируем несколько критических моментов, которые часто упускают начинающие разработчики:
Значение обычно имеет составной тип. Если вы записываете "Длину" (число), убедитесь, что передаете именно число, а не строку. Система 1С:Предприятие 8 чувствительна к типам данных, особенно когда речь идет о Планах Видов Характеристик (ПВХ), на которых базируется этот регистр.НаборЗаписей.Записать(), не добавляя в него строк. Система увидит пустой набор и очистит запись в базе.НачатьТранзакцию() ... ЗафиксироватьТранзакцию(). Это гарантирует целостность данных: либо запишутся все три габарита, либо ни один в случае ошибки.Рассмотрим ситуацию, когда разработчики пытаются использовать НаборЗаписей.Добавить() без предварительной проверки или очистки. Если вы не установите отбор или не прочтете существующий набор, вы рискуете получить ошибку "Запись с такими ключевыми полями уже существует".
Выясним причину этой ошибки: в независимом регистре сведений не может быть двух строк с абсолютно одинаковыми измерениями (в нашем случае — одна и та же Номенклатура + одно и то же Свойство). Именно поэтому использование Отбор.Установить() является обязательным условием для корректной модификации данных.
Подводя итог, можно сказать: для простых обработок и редких правок идеально подходит МенеджерЗаписи за счет минимального количества кода. Для массовой загрузки данных из Excel или обмена с сайтом лучше использовать НаборЗаписей, так как он обеспечивает более высокую производительность и контроль над процессом записи.