При автоматизации учета и переносе данных из внешних файлов (например, из Microsoft Excel) часто возникает задача заполнения дополнительных реквизитов и характеристик объектов. В конфигурациях «1С:Предприятие» (включая «1С:Бухгалтерия государственного учреждения 1.0» и другие типовые решения) механизм дополнительных свойств вынесен в отдельную подсистему. Разберем по шагам, как устроена эта архитектура и как программно записать данные характеристик для справочника основных средств.
Рассмотрим, из каких объектов метаданных состоит подсистема свойств в типовых конфигурациях:
СвойстваОбъектов: содержит перечень доступных видов свойств (например, «Цвет», «Габариты», «Заводской номер»). Для каждого свойства задается допустимый тип значения (число, строка, дата или ссылка), а также реквизит НазначениеСвойства, указывающий, к какому именно справочнику или документу относится данная характеристика.ЗначенияСвойствОбъектов: используется для хранения вариантов значений тех характеристик, тип которых задан как список значений. Владельцем каждого элемента этого справочника выступает конкретный элемент из плана видов характеристик СвойстваОбъектов.ЗначенияСвойствОбъектов: непериодический регистр, в котором непосредственно сохраняются связи между конкретным объектом информационной базы и его характеристиками. Измерениями регистра являются Объект (ссылка на основное средство) и Свойство (ссылка на элемент ПВХ), а ресурсом — Значение.Проанализируем типовой процесс записи дополнительных характеристик из внешней таблицы:
ЗначенияСвойствОбъектов с отбором по владельцу (самому свойству). При отсутствии значения создаем новый элемент справочника.ЗначенияСвойствОбъектов с привязкой к конкретному объекту справочника ОсновныеСредства.Посмотрим на пример процедуры, которая выполняет поиск значения и запись характеристики для конкретного основного средства:
// Функция записи дополнительного свойства для объекта
Процедура ЗаписатьСвойствоОбъекта(СсылкаНаОС, ИмяСвойства, ЗначениеИзФайла)
// 1. Поиск вида свойства в Плане видов характеристик
СвойствоСсылка = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(ИмяСвойства);
Если Не ЗначениеЗаполнено(СвойствоСсылка) Тогда
// Свойство должно быть предварительно создано с указанием назначения
Возврат;
КонецЕсли;
// 2. Обработка значения в зависимости от типа свойства
ЗначениеДляЗаписи = Неопределено;
ТипСвойства = СвойствоСсылка.ТипЗначения;
Если ТипСвойства.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Тогда
// Поиск или создание элемента справочника значений с учетом владельца
ЗначениеСсылка = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(ЗначениеИзФайла, Истина, , СвойствоСсылка);
Если Не ЗначениеЗаполнено(ЗначениеСсылка) Тогда
НовоеЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
НовоеЗначение.Владелец = СвойствоСсылка;
НовоеЗначение.Наименование = СокрЛП(ЗначениеИзФайла);
НовоеЗначение.Записать();
ЗначениеДляЗаписи = НовоеЗначение.Ссылка;
Иначе
ЗначениеДляЗаписи = ЗначениеСсылка;
КонецЕсли;
Иначе
// Приведение примитивного типа (например, строка)
ЗначениеДляЗаписи = СокрЛП(ЗначениеИзФайла);
КонецЕсли;
// 3. Запись в регистр сведений "ЗначенияСвойствОбъектов"
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = СсылкаНаОС;
МенеджерЗаписи.Свойство = СвойствоСсылка;
МенеджерЗаписи.Значение = ЗначениеДляЗаписи;
МенеджерЗаписи.Записать(Истина);
КонецПроцедуры
Разберем нюансы, на которые необходимо обратить внимание при программном заполнении:
НазначениеСвойства (ссылка на справочник ОсновныеСредства). Если назначение не указано, добавленные характеристики не будут отображаться на соответствующей вкладке в форме элемента.ЗначенияСвойствОбъектов является подчиненным. Нельзя привязать к свойству значение, владельцем которого является другое свойство, так как это нарушит фильтрацию в интерфейсе.НачатьТранзакцию() и ЗафиксироватьТранзакцию() блоками по 500–1000 записей.Если нет необходимости писать собственный алгоритм на встроенном языке, можно воспользоваться стандартной обработкой «Загрузка данных из табличного документа». В качестве объекта назначения выбирается регистр сведений ЗначенияСвойствОбъектов, где настраиваются соответствия колонок файла измерениям Объект, Свойство и ресурсу Значение.