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