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