Как перенести значение из регистра сведений в реквизит справочника в «Конвертации данных 2.0»

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

При настройке обмена данными между конфигурациями 1С часто возникает ситуация, когда структура хранения информации в базе-источнике и базе-приемнике не совпадает. Классический пример — хранение инвентарных номеров основных средств (ОС). В конфигурациях вроде Бухгалтерия предприятия 2.0 инвентарный номер хранится в периодическом регистре сведений, в то время как в других системах (например, УАТ) он может быть обычным реквизитом справочника ОсновныеСредства. Рассмотрим подробно, как реализовать такой перенос программными средствами «Конвертации данных 2.0» (КД 2.0).

Метод 1. Использование структуры ВходящиеДанные

Это наиболее правильный и производительный метод, особенно если вам нужно выгрузить сразу несколько дополнительных значений, хранящихся вне объекта-источника. Идея заключается в том, чтобы собрать все нужные данные один раз в правиле конвертации объекта (ПКО) и передать их в правила конвертации свойств (ПКС).

Шаг 1. Настройка ПКО (Перед выгрузкой)

Проанализируем ситуацию: нам нужно получить актуальный инвентарный номер из регистра. Для этого в обработчике Перед выгрузкой правила ПКО для справочника ОС мы прописываем код создания структуры ВходящиеДанные. Разберем пример кода:


// Создаем структуру для передачи дополнительных данных в ПКС
ВходящиеДанные = Новый Структура;

// Формируем запрос к регистру сведений (на примере БП 2.0)
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ИнвентарныеНомера.ИнвентарныйНомер КАК Номер
    |ИЗ
    |	РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(&ДатаВыгрузки, ОсновноеСредство = &ОС) КАК ИнвентарныеНомера";

Запрос.УстановитьПараметр("ДатаВыгрузки", ТекущаяДата()); // или ДатаНачала из параметров
Запрос.УстановитьПараметр("ОС", Источник);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    ВходящиеДанные.Вставить("ИнвентарныйНомер", Выборка.Номер);
Иначе
    ВходящиеДанные.Вставить("ИнвентарныйНомер", "");
КонецЕсли;

Шаг 2. Настройка ПКС

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

Метод 2. Прямое получение значения в обработчике ПКС

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

Рассмотрим пример кода для ПКС:


// Прямой поиск в регистре сведений источника
Отбор = Новый Структура("ОсновноеСредство", Источник);
Ресурс = РегистрыСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(ТекущаяДата(), Отбор);

Если Ресурс.Количество() > 0 Тогда
    Значение = Ресурс[0].ИнвентарныйНомер;
Иначе
    Значение = "";
КонецЕсли;

Важно: Этот метод менее эффективен при выгрузке больших массивов данных, так как для каждого элемента справочника будет выполняться отдельный запрос к базе данных. Однако для небольших справочников он вполне допустим.

Почему данные могут не загружаться в приемник?

Часто пользователи сталкиваются с тем, что в XML-файле выгрузки данные присутствуют (тэг заполнен), но после загрузки поле в справочнике остается пустым. Разберем основные причины:

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

Оптимизация и нюансы работы с БП 2.0

Проанализируем специфику работы с конфигурацией Бухгалтерия предприятия 2.0. Инвентарные номера хранятся в регистре ПервоначальныеСведенияОСБухгалтерскийУчет. Этот регистр является периодическим, поэтому использование метода СрезПоследних критически важно.

Если мы выполняем перенос в специализированные решения (например, УАТ), стоит учитывать, что там инвентарный номер может быть частью логики уникальности. В таких случаях, если вы используете ВходящиеДанные, старайтесь заполнять их в ПКО Перед выгрузкой, чтобы иметь возможность использовать это значение в правилах поиска (обработчик Поля поиска в ПКО).

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

← На главную