При выполнении миграции данных или свертки информационной базы часто возникает специфическая задача: необходимо перенести документы за длительный период, сохранив их статус Проведен в базе-приемнике, но при этом исключить перенос самих движений (записей в регистрах) для документов, дата которых меньше определенного порога. Это критично, когда остатки на дату начала учета уже занесены отдельными операциями, и повторное проведение или наличие старых движений может привести к "раздуванию" итогов или неоправданному увеличению размера базы-приемника.
В рамках этой статьи мы разберем, как с помощью конфигурации Конвертация данных 2.1 гибко управлять выгрузкой наборов записей регистров, связанных с документами.
Для начала проанализируем, как именно движения попадают в файл обмена. В типовых правилах, созданных в Конвертации данных, перенос движений обычно настраивается одним из двух способов:
Хозрасчетный, Закупки или Взаиморасчеты). Движения выгружаются как вложенные коллекции внутри узла документа в XML-файле.Рассмотрим ситуацию, когда нам нужно отсечь движения "старых" документов, не затрагивая сами документы. Если мы просто не перенесем документ, мы потеряем историю. Если перенесем документ как непроведенный — нарушим логику базы. Наша цель — перенести объект Документ со свойством Проведен = Истина, но с пустым составом движений.
Самым эффективным методом является вмешательство в процесс выгрузки на стороне базы-источника. Это позволяет не только решить задачу логически, но и значительно сократить объем формируемого XML-файла. Разберем по шагам, как это реализовать в конфигурации Конвертация данных.
Перейдем в настройки ПКО нужного документа и найдем список Правил конвертации групп свойств (ПКГС). Здесь мы увидим перечень регистров. Для каждого регистра, движения по которому мы хотим ограничить, необходимо прописать условие в событии ПередВыгрузкой.
Посмотрим на пример кода, который нужно разместить в обработчике ПередВыгрузкой группы свойств (регистра):
// Определяем дату, ранее которой движения не нужны
ДатаОтреза = '20170901000000';
// Источник в данном контексте — это сам документ-владелец
Если Источник.Дата < ДатаОтреза Тогда
// Устанавливаем Отказ в Истина, чтобы коллекция движений не попала в файл
Отказ = Истина;
КонецЕсли;
В этом коде мы обращаемся к свойству Источник.Дата. Важно понимать, что в контексте ПКГС движений Источник — это объект документа, который сейчас выгружается. Устанавливая Отказ = Истина, мы сообщаем выгрузчику, что данную группу свойств (т.е. весь набор записей конкретного регистра для этого документа) выгружать не нужно.
Часто программисты пытаются решить задачу на стороне загрузки, используя обработчики ПриЗагрузке или ПослеЗагрузки. Разберем, почему это менее эффективно:
Объект.Движения в обработчике ПослеЗагрузки может не сработать, так как стандартная обработка загрузки может записывать наборы записей независимо от объекта документа.Проанализируем пример неудачного кода в приемнике, который часто пытаются использовать:
// Попытка в обработчике ПослеЗагрузки документа
Для Каждого Движ Из Объект.Движения Цикл
// Это не предотвратит запись набора, если он уже пришел в файле
Движ.Записывать = (Объект.Дата >= '20170901000000');
КонецЦикла;
Этот подход не работает надежно, так как механизмы платформы 1С при загрузке через Универсальный обмен могут восстанавливать движения из файла напрямую в таблицы БД, минуя стандартную логику свойства Записывать коллекции документа.
Чтобы не "зашивать" дату жестко в код (так называемый "хардкод"), проанализируем более профессиональный подход. В Конвертации данных можно создать Параметр (например, ДатаНачалаВыгрузкиДвижений). Это позволит пользователю устанавливать нужную дату прямо в интерфейсе обработки выгрузки.
Тогда код в ПКГС станет универсальным:
// Проверяем наличие параметра и дату документа
Если Параметры.ДатаНачалаВыгрузкиДвижений <> Неопределено
И Источник.Дата < Параметры.ДатаНачалаВыгрузкиДвижений Тогда
Отказ = Истина;
КонецЕсли;
Выясним, что произойдет с документом в базе-приемнике после такой загрузки. Документ будет иметь статус Проведен = Истина, но в регистрах по нему не будет ни одной записи. Это именно то, чего мы добивались. Однако существует риск: если пользователь в приемнике откроет этот документ и нажмет "Провести", 1С пересчитает движения по алгоритмам приемника, и они появятся в базе.
Чтобы исключить такие ситуации, рекомендуем выполнить следующие действия:
ПослеЗагрузки, который будет устанавливать для старых документов признак РучнаяКорректировка = Истина (если это поддерживается конфигурацией) или записывать информацию в дополнительные свойства, чтобы блокировать проведение программно.Таким образом, мы рассмотрели наиболее надежный и производительный способ решения задачи через обработчик ПередВыгрузкой в правилах конвертации групп свойств. Этот метод гарантирует чистоту данных в приемнике и высокую скорость выполнения обмена.