Как исключить выгрузку движений старых документов при обмене данными через XML

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

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

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

Анализ механизма выгрузки движений

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

  1. Автоматический перенос через ПКО: В правилах конвертации объекта (ПКО) для конкретного типа документа устанавливается флаг Переносить движения при переносе документа по ссылке. В этом случае система автоматически генерирует правила для всех регистров, по которым двигается документ.
  2. Ручная настройка через ПКГС: В ПКО документа создаются Правила конвертации групп свойств (ПКГС). Каждая такая группа отвечает за конкретный регистр (например, Хозрасчетный, Закупки или Взаиморасчеты). Движения выгружаются как вложенные коллекции внутри узла документа в XML-файле.

Рассмотрим ситуацию, когда нам нужно отсечь движения "старых" документов, не затрагивая сами документы. Если мы просто не перенесем документ, мы потеряем историю. Если перенесем документ как непроведенный — нарушим логику базы. Наша цель — перенести объект Документ со свойством Проведен = Истина, но с пустым составом движений.

Решение проблемы через обработчик ПередВыгрузкой

Самым эффективным методом является вмешательство в процесс выгрузки на стороне базы-источника. Это позволяет не только решить задачу логически, но и значительно сократить объем формируемого XML-файла. Разберем по шагам, как это реализовать в конфигурации Конвертация данных.

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

Посмотрим на пример кода, который нужно разместить в обработчике ПередВыгрузкой группы свойств (регистра):


// Определяем дату, ранее которой движения не нужны
ДатаОтреза = '20170901000000'; 

// Источник в данном контексте — это сам документ-владелец
Если Источник.Дата < ДатаОтреза Тогда
    // Устанавливаем Отказ в Истина, чтобы коллекция движений не попала в файл
    Отказ = Истина;
КонецЕсли;

В этом коде мы обращаемся к свойству Источник.Дата. Важно понимать, что в контексте ПКГС движений Источник — это объект документа, который сейчас выгружается. Устанавливая Отказ = Истина, мы сообщаем выгрузчику, что данную группу свойств (т.е. весь набор записей конкретного регистра для этого документа) выгружать не нужно.

Почему не подходят манипуляции в базе-приемнике?

Часто программисты пытаются решить задачу на стороне загрузки, используя обработчики ПриЗагрузке или ПослеЗагрузки. Разберем, почему это менее эффективно:

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


// Попытка в обработчике ПослеЗагрузки документа
Для Каждого Движ Из Объект.Движения Цикл
    // Это не предотвратит запись набора, если он уже пришел в файле
    Движ.Записывать = (Объект.Дата >= '20170901000000');
КонецЦикла;

Этот подход не работает надежно, так как механизмы платформы 1С при загрузке через Универсальный обмен могут восстанавливать движения из файла напрямую в таблицы БД, минуя стандартную логику свойства Записывать коллекции документа.

Рекомендации по универсальности правил

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

Тогда код в ПКГС станет универсальным:


// Проверяем наличие параметра и дату документа
Если Параметры.ДатаНачалаВыгрузкиДвижений <> Неопределено 
   И Источник.Дата < Параметры.ДатаНачалаВыгрузкиДвижений Тогда
    Отказ = Истина;
КонецЕсли;

Важные нюансы после переноса

Выясним, что произойдет с документом в базе-приемнике после такой загрузки. Документ будет иметь статус Проведен = Истина, но в регистрах по нему не будет ни одной записи. Это именно то, чего мы добивались. Однако существует риск: если пользователь в приемнике откроет этот документ и нажмет "Провести", 1С пересчитает движения по алгоритмам приемника, и они появятся в базе.

Чтобы исключить такие ситуации, рекомендуем выполнить следующие действия:

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

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

← На главную