При переносе данных из устаревших конфигураций на базе 1С:Предприятие 7.7 в современные системы на платформе 1С:Предприятие 8.3 (например, 1С:ERP Управление предприятием) часто возникает необходимость выгружать данные с помощью произвольного алгоритма. В таких сценариях формируется таблица ВыборкаДанных, которая затем обрабатывается правилами конвертации объектов (ПКО).
Разберем распространенную проблему: как корректно заполнить колонку таблицы значений на стороне 7.7, если реквизит приемника имеет тип ПеречислениеСсылка, а в исходной базе 7.7 аналогичный реквизит отсутствовал или хранился в виде периодического реквизита справочника.
Проанализируем типичную ситуацию. В источнике (1С 7.7) есть справочник с периодическими реквизитами (например, ссылки на сторонний справочник или различные история значений). В приемнике (1С:ERP) эти данные должны попадать в регистр сведений, где одно из измерений или ресурсов имеет тип ПеречислениеСсылка.ИмяПеречисления со значениями Причина150 и Причина60.
Попытка обратиться к метаданным приемника непосредственно из кода 7.7 вызовет ошибку выполнения:
// ОШИБКА! В платформе 7.7 нет объекта "Перечисления.ИмяПеречисления"
ВыборкаДанных.ВидПричины = Перечисления.ИмяПеречисления.Причина150;
Выясним причину этой ошибки: код выгрузки исполняется встроенным языком платформы «1С:Предприятие 7.7». В этой среде не существуют ссылки и структура метаданных целевой конфигурации 8.х. Платформа 7.7 не знает об объектах приемника.
Решение заключается в том, что при переносе нессылочных или отсутствующих в источнике типов данные необходимо передавать в виде простых типов (в данном случае — в виде строки). Механизм Конвертации данных 2.1 при обработке выгруженной таблицы автоматически преобразует строку в соответствие перечисления приемника, если строка совпадает с именем (идентификатором) значения перечисления в 8.х.
Рассмотрим, как правильно указать значение в коде 7.7:
ВыборкаДанных.ВидПричины = "Причина150"; // Передаем строковое имя значения перечисления
Важно: передаваемое строковое значение должно строго соответствовать Имени (идентификатору) значения перечисления в метаданных конфигурации-приемника, а не его синониму.
Посмотрим на практический пример заполнения таблицы ВыборкаДанных для правила выгрузки данных (ПВД) в 1С 7.7 с получением истории из периодического реквизита:
ВыборкаДанных = СоздатьОбъект("ТаблицаЗначений");
ВыборкаДанных.НоваяКолонка("Период", "Дата");
ВыборкаДанных.НоваяКолонка("Активность");
ВыборкаДанных.НоваяКолонка("Декларация");
ВыборкаДанных.НоваяКолонка("ВидПричины");
ВыборкаДанных.НоваяКолонка("Причина");
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Обрабатывать НеПомеченныеНаУдаление;
|СпрОтгГТД = Справочник.ОтгГТД.ТекущийЭлемент;
|Группировка СпрОтгГТД Упорядочить по СпрОтгГТД.Наименование Без групп;
|";
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат 0;
КонецЕсли;
Пока Запрос.Группировка("СпрОтгГТД") = 1 Цикл
СпрОтгГТД = СоздатьОбъект("Справочник.ОтгГТД");
СпрОтгГТД.НайтиЭлемент(Запрос.СпрОтгГТД);
// Выборка периодических значений для Причина150
Пер = СоздатьОбъект("Периодический");
Пер.ИспользоватьОбъект("Причина150", СпрОтгГТД.ТекущийЭлемент);
Пер.ВыбратьЗначения();
Пока Пер.ПолучитьЗначение() = 1 Цикл
Если Пер.Значение.Выбран() = 1 Тогда
ВыборкаДанных.НоваяСтрока();
ВыборкаДанных.Период = Пер.ДатаЗнач;
ВыборкаДанных.Причина = Пер.Значение;
ВыборкаДанных.Декларация = СпрОтгГТД.Наименование;
ВыборкаДанных.ВидПричины = "Причина150"; // Строковый идентификатор для КД
ВыборкаДанных.Активность = 1;
КонецЕсли;
КонецЦикла;
// Выборка периодических значений для Причина60
Пер = СоздатьОбъект("Периодический");
Пер.ИспользоватьОбъект("Причина60", СпрОтгГТД.ТекущийЭлемент);
Пер.ВыбратьЗначения();
Пока Пер.ПолучитьЗначение() = 1 Цикл
Если Пер.Значение.Выбран() = 1 Тогда
ВыборкаДанных.НоваяСтрока();
ВыборкаДанных.Период = Пер.ДатаЗнач;
ВыборкаДанных.Причина = Пер.Значение;
ВыборкаДанных.Декларация = СпрОтгГТД.Наименование;
ВыборкаДанных.ВидПричины = "Причина60"; // Строковый идентификатор для КД
ВыборкаДанных.Активность = 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если после внесения изменений в код реквизиты в базе-приемнике все равно остаются пустыми, разберем основные причины и порядок действий по исправлению:
V77EXP.ERT, старый алгоритм продолжит исполняться. Обязательно выгружайте свежий XML-файл правил и загружайте его в обработку выгрузки.ВидПричины в ПКС должно быть указано соответствующее правило конвертации перечисления или включен автоматический поиск по идентификатору.Причина150), необходимо в ПКС настроить таблицу сопоставления значений.Таким образом, передача строкового идентификатора в сочетании с перевыгрузкой актуальных правил обмена позволяет корректно заполнять реквизиты типа ПеречислениеСсылка при переносе данных из 1С 7.7 в 1С:ERP.