Как заполнить значение перечисления при перегрузке данных из 1С 7.7 в 1С:ERP через таблицу значений?

Программист 1С v7.7 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

При переносе данных из устаревших конфигураций на базе 1С:Предприятие 7.7 в современные системы на платформе 1С:Предприятие 8.3 (например, 1С:ERP Управление предприятием) часто возникает необходимость выгружать данные с помощью произвольного алгоритма. В таких сценариях формируется таблица ВыборкаДанных, которая затем обрабатывается правилами конвертации объектов (ПКО).

Разберем распространенную проблему: как корректно заполнить колонку таблицы значений на стороне 7.7, если реквизит приемника имеет тип ПеречислениеСсылка, а в исходной базе 7.7 аналогичный реквизит отсутствовал или хранился в виде периодического реквизита справочника.

Описание проблемы и особенности контекста 1С 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

Посмотрим на практический пример заполнения таблицы ВыборкаДанных для правила выгрузки данных (ПВД) в 1С 7.7 с получением истории из периодического реквизита:


ВыборкаДанных = СоздатьОбъект("ТаблицаЗначений");
ВыборкаДанных.НоваяКолонка("Период", "Дата");
ВыборкаДанных.НоваяКолонка("Активность");
ВыборкаДанных.НоваяКолонка("Декларация");
ВыборкаДанных.НоваяКолонка("ВидПричины");
ВыборкаДанных.НоваяКолонка("Причина");

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Обрабатывать НеПомеченныеНаУдаление;
|СпрОтгГТД = Справочник.ОтгГТД.ТекущийЭлемент;
|Группировка СпрОтгГТД Упорядочить по СпрОтгГТД.Наименование Без групп;
|";

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат 0;
КонецЕсли;

Пока Запрос.Группировка("СпрОтгГТД") = 1 Цикл
    СпрОтгГТД = СоздатьОбъект("Справочник.ОтгГТД");
    СпрОтгГТД.НайтиЭлемент(Запрос.СпрОтгГТД);
    
    // Выборка периодических значений для Причина150
    Пер = СоздатьОбъект("Периодический");
    Пер.ИспользоватьОбъект("Причина150", СпрОтгГТД.ТекущийЭлемент);
    Пер.ВыбратьЗначения();
    Пока Пер.ПолучитьЗначение() = 1 Цикл
        Если Пер.Значение.Выбран() = 1 Тогда
            ВыборкаДанных.НоваяСтрока();
            ВыборкаДанных.Период = Пер.ДатаЗнач;
            ВыборкаДанных.Причина = Пер.Значение;
            ВыборкаДанных.Декларация = СпрОтгГТД.Наименование;
            ВыборкаДанных.ВидПричины = "Причина150"; // Строковый идентификатор для КД
            ВыборкаДанных.Активность = 1;
        КонецЕсли;
    КонецЦикла;
    
    // Выборка периодических значений для Причина60
    Пер = СоздатьОбъект("Периодический");
    Пер.ИспользоватьОбъект("Причина60", СпрОтгГТД.ТекущийЭлемент);
    Пер.ВыбратьЗначения();
    Пока Пер.ПолучитьЗначение() = 1 Цикл
        Если Пер.Значение.Выбран() = 1 Тогда
            ВыборкаДанных.НоваяСтрока();
            ВыборкаДанных.Период = Пер.ДатаЗнач;
            ВыборкаДанных.Причина = Пер.Значение;
            ВыборкаДанных.Декларация = СпрОтгГТД.Наименование;
            ВыборкаДанных.ВидПричины = "Причина60"; // Строковый идентификатор для КД
            ВыборкаДанных.Активность = 1;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Важные нюансы при настройке и выгрузке

Если после внесения изменений в код реквизиты в базе-приемнике все равно остаются пустыми, разберем основные причины и порядок действий по исправлению:

  1. Обновление внешнего модуля выгрузки: Обработчики событий для 1С 7.7 формируются конфигуратором «Конвертации данных» в виде текста модуля или внешнего файла. Если изменить код в КД, но не выгрузить правила заново и не обновить их в обработке V77EXP.ERT, старый алгоритм продолжит исполняться. Обязательно выгружайте свежий XML-файл правил и загружайте его в обработку выгрузки.
  2. Настройка правил конвертации свойств (ПКС): Для свойства ВидПричины в ПКС должно быть указано соответствующее правило конвертации перечисления или включен автоматический поиск по идентификатору.
  3. Сопоставление значений: Если имя строки в 7.7 отличалось от имени значения перечисления в 8.х (например, в 7.7 передается строка "150", а в ERP значение называется Причина150), необходимо в ПКС настроить таблицу сопоставления значений.

Таким образом, передача строкового идентификатора в сочетании с перевыгрузкой актуальных правил обмена позволяет корректно заполнять реквизиты типа ПеречислениеСсылка при переносе данных из 1С 7.7 в 1С:ERP.

← На главную