Как программно изменить тип значения свойства в Плане видов характеристик и обновить данные в регистре?

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

При разработке в среде 1С:Предприятие часто возникает задача программного управления метаданными и данными. Одной из специфических задач является изменение типа значения (ТипЗначения) у элементов Плана видов характеристик (ПВХ). Это требует не только понимания работы с объектами метаданных, но и знания нюансов использования описателей типов и квалификаторов.

В этой статье мы подробно разберем, как правильно назначить тип «Строка» свойству ПВХ, почему возникают ошибки при несовпадении квалификаторов и как корректно обновить значения в связанном регистре сведений, чтобы не потерять данные.

Задача 1: Программное изменение типа в Плане видов характеристик

Представим ситуацию: у нас есть элемент Плана видов характеристик «Свойства объектов». Нам нужно программно установить для определенного свойства тип значения «Строка» с определенной длиной. Попытка просто присвоить Тип("Строка") не сработает, так как свойство ТипЗначения ожидает объект типа ОписаниеТипов.

Рассмотрим правильный подход с использованием конструктора ОписаниеТипов. Для того чтобы система приняла новый тип, он должен быть не просто «строкой», а строкой с конкретными параметрами (длиной, допустимыми символами), которые соответствуют настройкам самого ПВХ.

Проанализируем пример кода для установки строкового типа:


// Получаем объект свойства для редактирования
ОбъектСвойства = Выборка.Ссылка.ПолучитьОбъект();

// Определяем квалификаторы строки (длина 100, допустимая длина — переменная)
Квалификаторы = Новый КвалификаторыСтроки(100);

// Создаем новое описание типов
НовоеОписание = Новый ОписаниеТипов("Строка", , Квалификаторы);

// Назначаем тип и записываем объект
ОбъектСвойства.ТипЗначения = НовоеОписание;
ОбъектСвойства.Записать();

Разбор ошибки «Тип не является подмножеством типа значений плана видов характеристик»

Часто при выполнении приведенного выше кода возникает ошибка: «Ошибка при установке значения атрибута контекста (ТипЗначения): Тип не является подмножеством типа значений плана видов характеристик». Выясним причину этой ситуации.

В 1С План видов характеристик имеет базовое свойство «Тип значений» (задается в Конфигураторе на первой закладке). Все конкретные элементы ПВХ могут иметь типы, которые являются только подмножеством этого общего типа. Если в Конфигураторе для ПВХ в целом не выбрана «Строка» или длина строки ограничена, например, 50 символами, то попытка программно установить длину 100 приведет к ошибке.

Посмотрим, на что нужно обратить внимание:

  1. Откройте План видов характеристик в Конфигураторе и проверьте состав типов. Галочка «Строка» должна быть установлена.
  2. Проверьте длину строки в настройках состава типов ПВХ. Если там указано 50, то в коде Новый КвалификаторыСтроки(100) вызовет ошибку. Нужно указывать значение, не превышающее максимальное.
  3. Если вы используете числовой тип, аналогично используются КвалификаторыЧисла(Разрядность, ДробнаяЧасть).

Рассмотрим пример с использованием квалификаторов числа:


КвалификаторыЧ = Новый КвалификаторыЧисла(15, 2);
ОбъектСвойства.ТипЗначения = Новый ОписаниеТипов("Число", КвалификаторыЧ);
ОбъектСвойства.Записать();

Задача 2: Обновление данных в регистре сведений

После того как мы изменили тип значения в Плане видов характеристик, старые записи в регистрах сведений (например, в типовом регистре «ЗначенияСвойствОбъектов») могут перестать отображаться корректно или остаться в старом формате. Нам необходимо пройтись по записям регистра и привести их к новому типу.

Рассмотрим распространенную ошибку: попытку записать в ресурс Значение само ОписаниеТипов. Это приведет к тому, что в регистре вместо данных появится строковое представление самого объекта описания.

Правильный алгоритм действий:

  1. Создать набор записей регистра с отбором по объекту и свойству.
  2. Прочитать существующие данные.
  3. Привести старое значение к новому типу (в нашем случае — к строке).
  4. Записать набор.

Посмотрим на исправленный пример кода для работы с регистром:


Набор = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();

// Устанавливаем фильтры, чтобы не перезаписать лишнего
Набор.Отбор.Объект.Установить(Выборка.Ссылка);
Набор.Отбор.Свойство.Установить(Выборка.Свойство);

// Создаем новую запись в наборе
Запись = Набор.Добавить();
Запись.Объект = Выборка.Ссылка;
Запись.Свойство = Выборка.Свойство;

// ВАЖНО: Приводим значение к строке явно
// Если старое значение было числом или ссылкой, функция Строка() 
// создаст его текстовое представление
Запись.Значение = Строка(Выборка.Значение);

// Записываем набор, замещая старые данные
Набор.Записать(ИСТИНА);

Дополнительные нюансы работы с типами

Проанализируем ситуацию, когда свойство может иметь сложный или составной тип. Если в ПВХ разрешена «Любая ссылка», то при программной установке конкретного типа через ОписаниеТипов вы можете ограничить выбор пользователя только одним справочником.

Также следует помнить о производительности. Если ваша база содержит миллионы записей в регистре сведений, массовое изменение типа свойств и последующая перезапись регистра могут вызвать длительные блокировки. В таких случаях рекомендуем:

  1. Выполнять обработку порциями (например, по 1000 объектов).
  2. Использовать свойство ОбменДанными.Загрузка = Истина для объекта ПВХ и набора записей регистра, чтобы отключить тяжелые проверки в коде конфигурации (если это не нарушает логику данных).

Резюмируем: Для успешной смены типа значения программно, всегда синхронизируйте КвалификаторыСтроки в вашем коде с максимальными значениями, заданными в метаданных Плана видов характеристик. При обновлении регистров используйте явное приведение типов (функции Число(), Строка(), Дата() или поиск ссылки), чтобы обеспечить чистоту данных.

← На главную