Как перенести реквизит составного типа из конфигурации УТ 10.3 в УТ 11 с помощью "Конвертации данных"?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При переносе данных между различными конфигурациями 1С, например, из УТ 10.3 в УТ 11, мы часто сталкиваемся с необходимостью адаптировать структуру данных. Одной из таких задач является конвертация реквизитов составного типа, когда в источнике реквизит может хранить ссылки на несколько различных справочников или документов, а в приемнике он ожидается как ссылка на конкретный тип или имеет другую логику определения. Давайте разберем, как эффективно решить эту проблему, используя функционал "1С: Конвертации данных".

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

Представим ситуацию: в конфигурации-источнике (например, УТ 10.3) у нас есть документ "Заказ покупателя" с реквизитом Склад. Этот реквизит имеет составной тип и может ссылаться на различные виды складов, такие как "Склады" или "Ордерные склады". В то же время, в конфигурации-приемнике (УТ 11) реквизит Склад в аналогичном документе ожидается как ссылка на один конкретный справочник — "Справочник.Склады". Стандартные механизмы "Конвертации данных" не всегда могут автоматически определить, какое именно правило конвертации объектов (ПКО) применить в таких случаях, что приводит к ошибкам или некорректному переносу данных.

Основная сложность заключается в том, что система конвертации должна динамически выбрать правильное ПКО в зависимости от фактического типа значения реквизита в исходной базе. Мы рассмотрим, как это сделать, используя обработчик события "Перед выгрузкой" для правила конвертации свойства (ПКС).

Динамическое определение правила конвертации объектов (ПКО) через обработчик "Перед выгрузкой"

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

  1. Открытие Правила Конвертации Свойств (ПКС):

    Для начала, откроем наше Правило Конвертации Свойств (ПКС), которое отвечает за перенос проблемного реквизита. Например, это ПКС для реквизита Склад в документе "ЗаказПокупателя".

  2. Использование обработчика "Перед выгрузкой":

    В ПКС найдем закладку "Обработчики" и выберем событие "Перед выгрузкой". Здесь мы напишем код, который будет выполняться непосредственно перед попыткой конвертации значения данного свойства.

  3. Анализ типа исходного значения и установка ИмяПКО:

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

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

    
    // Проверяем тип склада в документе УТ 10.3
    Если ТипЗнч(Источник.Склад) = Тип("СправочникСсылка.Склады") Тогда
        // Если это обычный склад, используем соответствующее ПКО, например, "Склады"
        ИмяПКО = "Склады"; 
    ИначеЕсли ТипЗнч(Источник.Склад) = Тип("СправочникСсылка.СкладыОрдерные") Тогда
        // Если это ордерный склад, используем другое ПКО, например, "СкладыОрдерные"
        ИмяПКО = "СкладыОрдерные";
    Иначе
        // Если тип не определен или не требует переноса, отказываемся от выгрузки данного свойства
        Отказ = Истина;
        // Можно добавить сообщение для журнала выгрузки, чтобы отслеживать такие ситуации
        Сообщить("Не удалось определить тип склада для документа: " + Источник.Ссылка);
    КонецЕсли;
    

    В этом примере:

    • Источник.Склад – это ссылка на значение реквизита Склад текущего объекта-источника (документа, справочника).
    • Тип("СправочникСсылка.Склады") – это получение объекта типа для сравнения.
    • ИмяПКО = "Склады" – мы указываем системе, что для конвертации этого значения необходимо использовать ПКО с именем "Склады". Важно, чтобы такое ПКО было заранее создано и настроено в правилах конвертации.
    • Отказ = Истина – позволяет пропустить конвертацию данного свойства, если его тип не удалось определить или он не требует переноса.
  4. Доступ к данным реквизитов табличных частей:

    Если проблемный реквизит находится в табличной части, например, в табличной части "Товары" документа есть реквизит "Размещение", то для доступа к нему следует использовать не Источник, а ОбъектКоллекции. Переменная ОбъектКоллекции в контексте обработки табличной части ссылается на текущую строку этой табличной части.

    Пример кода для реквизита табличной части:

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

    Таким образом, для реквизитов шапки документа (или элементов справочника) используем Источник.ИмяРеквизита, а для реквизитов табличной части — ОбъектКоллекции.ИмяРеквизита.

  5. Очистка полей "Источник" и "Правило" в ПКС:

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

    Мы можем просто не указывать их вовсе, полагаясь на наш код, или явно удалить, если они были прописаны ранее.

Расширенный пример использования обработчика "Перед выгрузкой" для выбора типа документа

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

Рассмотрим пример кода, который был предложен в обсуждении, демонстрирующий выбор ПКО на основе типа ссылки на документ:


// Предположим, что Источник.ДокументПродажи - это реквизит составного типа,
// который может ссылаться на разные виды документов продажи в УТ 10.3
// В УТ 11 мы хотим перенести их в "АктВыполненныхРабот" или "РеализацияТоваровУслуг"

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

// В данном контексте, "ОбъектКоллекции" используется,
// если "ДокументПродажи" является реквизитом табличной части.
// Если это реквизит шапки, то использовали бы "Источник.ДокументПродажи".

Здесь важно понимать, что Тип("ДокументСсылка.АктОбОказанииПроизводственныхУслуг") должен соответствовать фактическому типу документа в базе-источнике, а ИмяПКО = "АктВыполненныхРабот" ссылается на ПКО, которое преобразует этот тип документа из источника в соответствующий документ приемника.

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

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

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

Этот метод менее гибок, так как требует явного перечисления всех возможных типов и создания отдельного ПКС для каждого из них. Он становится неудобным, если логика выбора правила более сложная, чем простая проверка типа, или если количество возможных типов велико.

Обработка ситуаций, когда тип не определен или требует особого внимания

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

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

Подведем итоги

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

Всегда помните о необходимости тщательно тестировать правила конвертации на тестовой базе данных перед применением их на реальных данных.

← На главную