Как правильно перенести дополнительные реквизиты с типом «Дополнительное значение» из 1С 7.7 в 1С 8?

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

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

Понимание архитектуры хранения дополнительных реквизитов

Прежде чем приступать к написанию кода, важно уяснить фундаментальное различие. Дополнительные реквизиты в 1С 8 (на БСП) строятся на базе Плана видов характеристик (ПВХ) «ДополнительныеРеквизитыИСведения». Если реквизит имеет тип «Дополнительное значение», он не может принимать произвольную строку. Система ожидает ссылку на элемент справочника ЗначенияСвойствОбъектов.

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

Алгоритм решения задачи по шагам

Для корректного переноса данных мы должны реализовать следующий алгоритм поиска и создания значений:

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

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

Рассмотрим функционал, который позволяет найти или создать значение «на лету» при переносе данных. В этом нам поможет метод, который выполняет проверку владельца и наличие элемента в справочнике.


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

Интеграция в процесс переноса

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


&НаСервере
Функция УстановитьДопРеквизит(ОбъектСсылка, ИмяРеквизита, Значение) Экспорт
    Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
    
    Если Свойство.Пустая() Тогда
        ВызватьИсключение "Дополнительный реквизит " + ИмяРеквизита + " не найден!";
    КонецЕсли;
    
    // Поиск в табличной части
    МассивСтрок = ОбъектСсылка.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", Свойство));
    
    Если МассивСтрок.Количество() > 0 Тогда
        СтрокаТЧ = МассивСтрок[0];
    Иначе
        СтрокаТЧ = ОбъектСсылка.ДополнительныеРеквизиты.Добавить();
        СтрокаТЧ.Свойство = Свойство;
    КонецЕсли;
    
    // Проверка типа и установка значения
    Если СокрЛП(Свойство.ТипЗначения) = "Дополнительное значение" Тогда
        СтрокаТЧ.Значение = НайтиИлиСоздатьЗначениеСвойства(Свойство, Значение);
    Иначе
        СтрокаТЧ.Значение = Значение;
    КонецЕсли;
    
    Возврат Истина;
КонецФункции

Полезные рекомендации для разработчика

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

← На главную