Как запретить создание и изменение старых документов при переносе данных в 1С:Конвертации данных 2.1

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

При настройке обмена данными или разовом переносе из 1С 7.7 в 1С 8.х часто возникает задача: ограничить перенос документов определенным периодом. Казалось бы, достаточно просто не выгружать старые документы, установив фильтр по дате. Однако на практике всё сложнее. Старые документы могут фигурировать в качестве аналитики (ссылок) в новых документах. Если мы просто исключим их из выгрузки, в новых документах в базе-приемнике мы получим пустые ссылки или "Объект не найден".

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

Почему стандартный Отказ в обработчике При загрузке не всегда эффективен?

Проанализируем типичную ошибку начинающих разработчиков. Часто пытаются прописать условие в обработчике При загрузке на стороне приемника:


Если Объект.Дата < ДатаНачала Тогда
    Отказ = Истина;
КонецЕсли;

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

Шаг 1: Настройка на стороне источника (Перед выгрузкой)

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

Разберем пример кода для ПКО документов в обработчике Перед выгрузкой:


// Код для 1С 7.7
Если Источник.ДатаДок < ДатаНачала Тогда
    // Устанавливаем флаг, который запрещает создание нового объекта в приемнике
    НеСоздаватьЕслиНеНайден = 1;
КонецЕсли;

Здесь НеСоздаватьЕслиНеНайден — это специальный служебный параметр. Если установить его в значение 1 (или Истина), то при загрузке система выполнит поиск объекта по уникальному идентификатору или полям поиска. Если объект будет найден — он обновится. Если не найден — новый документ создан не будет, а ссылка в объекте-владельце останется пустой или будет проигнорирована. Это именно то, что нам нужно для старых документов, которых нет в новой базе.

Шаг 2: Настройка на стороне приемника (При загрузке)

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

Пропишем следующую логику:


// Код для 1С 8.х
Если Объект.Дата < ДатаНачала Тогда
    Если ОбъектНайден Тогда
        // Запрещаем замещение (обновление) свойств существующего объекта
        НеЗамещатьОбъект = Истина;
    КонецЕсли;
КонецЕсли;

Параметр НеЗамещатьОбъект гарантирует, что если поиск в базе прошел успешно, то загружаемые данные не будут "накатываться" поверх существующих. При этом сам объект будет найден, и ссылка на него будет возвращена в вызывающий код. Таким образом, ссылочная целостность будет соблюдена.

Вариант с использованием полей поиска

Посмотрим на ситуацию шире. Иногда более надежным методом является управление процессом в обработчике Поля поиска. Этот обработчик выполняется в приемнике в момент сопоставления данных. В нем нам доступны флаги ПрекратитьПоиск и ОбъектНайден.

Рассмотрим алгоритм:

  1. Система ищет объект по внутреннему идентификатору (GUID).
  2. Если не находит, переходит к поиску по полям (например, по Номеру и Дате), вызывая обработчик Поля поиска.
  3. Если в этом обработчике мы определим, что документ относится к старому периоду, мы можем программно прервать процесс создания.

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


Если НомерВариантаПоиска > 0 Тогда // Поиск по GUID не удался
    ДатаОбъекта = СвойстваПоиска["Дата"];
    Если ДатаОбъекта < Параметры.ДатаНачала Тогда
        // Сообщаем системе, что искать дальше не нужно и создавать новый тоже не надо
        ПрекратитьПоиск = Истина;
        ОбъектНайден = Ложь;
    КонецЕсли;
КонецЕсли;

Важно помнить: чтобы этот код сработал на запрет создания, в самой настройке ПКО должна стоять галочка "Не создавать новый объект, если он не найден", либо должен быть установлен флаг НеСоздаватьЕслиНеНайден при выгрузке, как мы разобрали выше.

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

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

Проанализируем преимущества использования параметров:

В 1С 7.7 обращение к параметру будет выглядеть как Параметры.ДатаНачала, аналогично и в 1С 8.х. Не забудьте добавить этот параметр на соответствующей вкладке в конфигурации "Конвертация данных".

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

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

  1. В ПКО -> Перед выгрузкой (Источник): Устанавливаем НеСоздаватьЕслиНеНайден = 1 для старых объектов. Это предотвратит появление новых "лишних" документов в приемнике.
  2. В ПКО -> При загрузке (Приемник): Устанавливаем НеЗамещатьОбъект = Истина, если ОбъектНайден = Истина. Это защитит уже существующие документы в приемнике от случайного изменения данных из источника.

Этот подход является наиболее стабильным и проверенным при миграции данных между различными версиями платформ 1С.

← На главную