Как программно загрузить дополнительные характеристики основных средств в 1С

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

При автоматизации учета и переносе данных из внешних файлов (например, из Microsoft Excel) часто возникает задача заполнения дополнительных реквизитов и характеристик объектов. В конфигурациях «1С:Предприятие» (включая «1С:Бухгалтерия государственного учреждения 1.0» и другие типовые решения) механизм дополнительных свойств вынесен в отдельную подсистему. Разберем по шагам, как устроена эта архитектура и как программно записать данные характеристик для справочника основных средств.

Архитектура хранения дополнительных свойств и характеристик

Рассмотрим, из каких объектов метаданных состоит подсистема свойств в типовых конфигурациях:

  1. План видов характеристик СвойстваОбъектов: содержит перечень доступных видов свойств (например, «Цвет», «Габариты», «Заводской номер»). Для каждого свойства задается допустимый тип значения (число, строка, дата или ссылка), а также реквизит НазначениеСвойства, указывающий, к какому именно справочнику или документу относится данная характеристика.
  2. Справочник ЗначенияСвойствОбъектов: используется для хранения вариантов значений тех характеристик, тип которых задан как список значений. Владельцем каждого элемента этого справочника выступает конкретный элемент из плана видов характеристик СвойстваОбъектов.
  3. Регистр сведений ЗначенияСвойствОбъектов: непериодический регистр, в котором непосредственно сохраняются связи между конкретным объектом информационной базы и его характеристиками. Измерениями регистра являются Объект (ссылка на основное средство) и Свойство (ссылка на элемент ПВХ), а ресурсом — Значение.

Пошаговый алгоритм программной загрузки

Проанализируем типовой процесс записи дополнительных характеристик из внешней таблицы:

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

Пример программного кода

Посмотрим на пример процедуры, которая выполняет поиск значения и запись характеристики для конкретного основного средства:


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

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

    // 2. Обработка значения в зависимости от типа свойства
    ЗначениеДляЗаписи = Неопределено;
    ТипСвойства = СвойствоСсылка.ТипЗначения;

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

    // 3. Запись в регистр сведений "ЗначенияСвойствОбъектов"
    МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Объект   = СсылкаНаОС;
    МенеджерЗаписи.Свойство = СвойствоСсылка;
    МенеджерЗаписи.Значение = ЗначениеДляЗаписи;
    МенеджерЗаписи.Записать(Истина);

КонецПроцедуры

Важные особенности и контроль целостности данных

Разберем нюансы, на которые необходимо обратить внимание при программном заполнении:

  1. Указание назначения свойства: в элементе плана видов характеристик обязательно должен быть заполнен реквизит НазначениеСвойства (ссылка на справочник ОсновныеСредства). Если назначение не указано, добавленные характеристики не будут отображаться на соответствующей вкладке в форме элемента.
  2. Контроль владельца у значений: справочник ЗначенияСвойствОбъектов является подчиненным. Нельзя привязать к свойству значение, владельцем которого является другое свойство, так как это нарушит фильтрацию в интерфейсе.
  3. Оптимизация при пакетной загрузке: если выполняется массовая загрузка большого объема данных, используйте транзакции с помощью методов НачатьТранзакцию() и ЗафиксироватьТранзакцию() блоками по 500–1000 записей.

Альтернативный вариант: типовая обработка загрузки

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

← На главную