Как перенести документы с движениями в 1С:Конвертации данных 2.1, передавая ссылки вместо полных объектов, при переходе с УТ 11.4 на УТ 11.5?

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

При работе с системой 1С:Предприятие и инструментом «Конвертация данных 2.1» (КД 2.1) часто возникает задача переноса документов из одной конфигурации в другую, например, из УТ 11.4 в УТ 11.5. В процессе этого переноса, особенно при работе с движениями регистров накопления, может обнаружиться нежелательное поведение: вместо того чтобы передавать ссылки на существующие объекты (такие как документы-основания, элементы справочников, связанные документы), система начинает выгружать их полные копии. Это приводит к значительному увеличению размера файла обмена, замедлению процессов выгрузки и загрузки, а также к возможному дублированию данных или ошибочному созданию объектов в целевой базе, особенно если речь идет о старых периодах.

Рассмотрим подробнее, как мы можем контролировать этот процесс и заставить КД 2.1 передавать именно ссылки, а не полные объекты, в движениях регистров накопления, сохраняя при этом целостность данных и оптимизируя производительность обмена.

Основное решение: Управление выгрузкой объектов на уровне ПКС

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

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

    Поясним эти параметры:

  4. Важное уточнение по применению: Крайне важно применять эти параметры к ПКС, которые управляют выгрузкой свойств (реквизитов) внутри элементов движений регистра, а не к Правилам Конвертации Объектов (ПКО) самих наборов движений или ПКО документа в целом. Если вы ошибочно примените эти настройки к ПКО всего документа, то сам документ не будет создан в базе-приемнике, что явно не соответствует нашей цели. Мы хотим создать документ, но его движения должны ссылаться на уже существующие или созданные ранее объекты, а не тянуть за собой их полные копии.
  5. Результат применения: При правильной настройке, при выгрузке одного документа, в файл обмена попадет узел, представляющий этот документ. Все его свойства, для которых мы применили указанные параметры в ПКС, будут представлены как вложенные узлы, содержащие только ссылки на объекты (с полями поиска). Таким образом, эти объекты не будут выгружены как отдельные полные узлы-объекты, и в базу-приемник не попадут лишние документы и справочники.
  6. Создание новых документов: Важный вопрос, который часто возникает: будут ли создаваться новые документы при такой настройке? Да, будут. Наша задача состоит в том, чтобы сам документ-основание (например, "Реализация товаров и услуг") выгружался полностью и создавался в приемнике. Однако, объекты, на которые ссылаются его движения (например, "Договор контрагента", "Организация"), должны передаваться ссылками, если они уже существуют в базе-приемнике или будут созданы по другим правилам. Документ-основание будет выгружен по своему ПКО целиком, а вот его свойства и свойства его движений – уже согласно правилам в соответствующих ПКС.
  7. Порядок выгрузки свойств: В ситуациях, когда один и тот же объект может выгружаться "только по ссылке" из нескольких мест, и при этом один из них является подчиненным по отношению к другому (например, "Договор контрагента" подчинен "Контрагенту"), мы рекомендуем изменять порядок выгрузки свойств. Свойство-владелец должно выгружаться раньше подчиненного свойства. Это поможет избежать потенциальных ошибок, связанных с невозможностью найти владельца для подчиненного объекта при загрузке.

Оптимизация размера файла выгрузки и производительности

Помимо прямого управления передачей объектов по ссылке, существуют дополнительные методы, позволяющие существенно оптимизировать размер файла выгрузки и скорость обмена данными.

  1. Компактность файла данных: Стандартный механизм универсальной обработки обмена данными (V8Exchan.epf) разработан таким образом, чтобы предотвращать повторную выгрузку одного и того же объекта. Каждый уникальный объект выгружается в файл данных только один раз. Это по умолчанию делает файл более компактным. Однако, если мы настроим выгрузку большого количества данных по ссылкам, общий объем данных для поиска может незначительно увеличиться, но это все равно лучше, чем выгрузка полных объектов.
  2. Использование режима "Выбирать данные для выгрузки одним запросом": Если в вашем правиле конвертации отсутствует перенос табличных частей и движений (что в нашем случае не так, мы переносим движения, но управляем их содержимым), а также в событиях перед выгрузкой нет прямых обращений к выгружаемому объекту, то настоятельно рекомендуется использовать режим "Выбирать данные для выгрузки одним запросом" в правиле выгрузки данных. Этот режим позволяет системе получить все необходимые данные одного типа за один запрос к базе данных, что значительно быстрее, чем выполнение отдельных запросов для каждого выгружаемого объекта. В нашем сценарии с движениями этот режим может быть менее применим напрямую, но его принцип важен для общего понимания оптимизации.
  3. Разбиение документов с большим количеством строк: При работе с документами, которые содержат очень большое количество строк в табличных частях или в таблицах движений (например, более 5000 строк), может возникнуть ошибка "Недостаточно памяти" в процессе выгрузки. В таких критических случаях мы рекомендуем рассмотреть возможность программного или логического разделения исходных документов на несколько более мелких с меньшим количеством строк. Это позволит избежать перегрузки памяти и обеспечит стабильную выгрузку.
  4. Признак "Выгружать элементы группы через промежуточный файл": Для Правил Конвертации Группы Свойств (ПКГС) табличных частей, которые потенциально могут содержать очень большое количество строк (например, табличные части движений документов), установите признак "Выгружать элементы группы через промежуточный файл" на закладке "Дополнительно". Активация этой опции принуждает систему выгружать данные табличной части во временный файл, а не сразу в оперативную память, что снижает нагрузку на ОЗУ и предотвращает ошибки нехватки памяти при работе с объемными данными.
  5. Признак "Не запоминать выгруженные объекты": Для ПКО тех объектов, которые выгружаются по ссылке из свойств табличной части (например, элементы справочника "Номенклатура", на которые ссылаются строки движений), можно установить признак "Не запоминать выгруженные объекты". Использование этого признака может в некоторых случаях увеличить общее время выгрузки, поскольку система не будет кэшировать информацию о уже выгруженных ссылках, но он может быть полезен, когда требуется особый контроль над выгрузкой ссылочных объектов, особенно если они часто меняются или их уникальность не так критична для кэширования.

Дополнительные моменты и отладка

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

  1. Тщательная проверка правил и отладка: Если параметры ВыгрузитьОбъект = Ложь; ВыгрузитьТолькоСсылку = Истина; не дают желаемого эффекта, мы рекомендуем тщательно проверить все правила конвертации. Возможно, правила не были корректно обновлены, или же объект-основание выгружается другим способом, например, напрямую из кода с использованием функции ВыгрузитьПоПравилу. Использование отладчика непосредственно в процессе выгрузки данных через КД 2.1 является одним из самых эффективных методов для понимания точного потока данных и выявления момента, когда происходит нежелательная выгрузка полного объекта. Мы можем установить точки останова в обработчиках событий ПКО и ПКС, чтобы проследить выполнение кода.
  2. Передача параметров между правилами: В КД 2.1 существует мощный механизм для передачи данных между различными Правилами Выгрузки Данных (ПВД), Правилами Конвертации Объектов (ПКО) и Правилами Конвертации Свойств (ПКС). Для этого используются параметры ИсходящиеДанные и ВходящиеДанные. Параметры, которые мы редактируем в диалоге при выгрузке, также могут быть переданы в файл обмена, и к их значению можно обратиться как при загрузке, так и при выгрузке данных. Это позволяет нам создавать более гибкие и управляемые правила обмена, например, динамически определять, выгружать ли объект полностью или только ссылку, основываясь на каких-либо условиях.
  3. Контроль отказа от выгрузки: Если нам необходимо полностью отказаться от выгрузки текущего объекта по определенным условиям (например, если он уже существует в приемнике или не соответствует определенным критериям), мы можем использовать переменную Отказ = Истина; в обработчике "Перед выгрузкой" соответствующего Правила Выгрузки Данных (ПВД). Это позволит нам прервать выгрузку объекта до того, как он попадет в файл обмена.
  4. 
    // Пример в обработчике "Перед выгрузкой" ПВД
    // ОбъектДанных - текущий выгружаемый объект
    Если ОбъектДанных.ПометкаУдаления ИЛИ (НЕ ЗначениеЗаполнено(ОбъектДанных.Контрагент)) Тогда
        Отказ = Истина;
    КонецЕсли;
    
  5. Оптимизация проведения документов после загрузки: При загрузке документов, которые должны быть проведены в целевой базе, мы можем оптимизировать этот процесс. Если объект был изменен в обработчике "После загрузки" (например, были установлены какие-либо реквизиты или заполнены табличные части), система выполнит его повторную запись. Чтобы избежать этой лишней записи, которая может замедлить процесс, особенно при большом объеме документов, мы можем установить параметр Объект.Модифицирован = Ложь; после всех необходимых изменений в обработчике. Это даст системе понять, что объект не нуждается в дополнительной записи, если все его реквизиты и движения уже были успешно записаны при первой загрузке.
  6. 
    // Пример в обработчике "После загрузки" ПКО документа
    // Объект - загруженный объект документа
    Объект.Комментарий = "Загружено из УТ 11.4";
    // ... другие изменения объекта ...
    
    // После всех изменений, если не требуется повторная запись
    Объект.Модифицирован = Ложь; 
    

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

← На главную