Как в 1С:Конвертация данных 2.0 отменить загрузку документа, если не найдена организация

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

При настройке обмена данными между конфигурациями 1С часто возникает ситуация, когда необходимо обеспечить строгую целостность данных. Например, при переносе документов ЗаказПокупателя важно, чтобы документ попадал в базу только в том случае, если в ней уже существует соответствующая Организация. Если организация не найдена по ключевым полям (ИНН/КПП), создавать «пустую» карточку нельзя, а загрузку самого документа следует прервать. В этой статье мы разберем, как реализовать такую логику с помощью инструментов 1С:Конвертация данных 2.0.

Шаг 1. Настройка поиска организации в ПКО

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

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

Это критически важный момент. Если этот флаг не установлен, система при неудачном поиске создаст новый элемент справочника Организации, заполнив его данными из файла. В результате в документе всегда будет ссылка на организацию, и наша проверка на «пустоту» не сработает.

Шаг 2. Анализ результата поиска в ПКО документа

Теперь перейдем к основному объекту — документу Заказ. Нам необходимо проанализировать состояние реквизита Организация после того, как данные были прочитаны из XML-файла, но до того, как документ будет записан в информационную базу приемника.

Для этих целей идеально подходит обработчик события После загрузки в ПКО документа. Рассмотрим ситуацию: когда выполняется загрузка документа, система сначала обрабатывает все его реквизиты. Так как для организации мы установили флаг «не создавать», то в случае отсутствия совпадения по ИНН/КПП, в поле Объект.Организация запишется пустая ссылка соответствующего типа.

Шаг 3. Реализация логики отмены в обработчике «После загрузки»

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

Рассмотрим пример кода:


// Проверяем, заполнена ли организация в загруженном объекте
Если Объект.Организация.Пустая() Тогда
    
    // Информируем пользователя о пропуске документа
    Сообщить("Документ " + Объект.Номер + " от " + Объект.Дата + " пропущен: организация не найдена в базе-приемнике.");
    
    // Устанавливаем флаг отказа от загрузки объекта
    Отказ = Истина;
    
КонецЕсли;

Этот код выполняется непосредственно перед вызовом метода Записать(). Поскольку мы установили Отказ = Истина, транзакция записи для этого конкретного документа не будет выполнена, и база останется чистой от «неполноценных» данных.

Шаг 4. Оптимизация вывода сообщений

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

Сначала в обработчике Перед загрузкой данных (глобальный обработчик правил) инициализируем список для сбора ошибок:

Параметры.Вставить("СписокПропущенныхДокументов", Новый СписокЗначений);

Затем изменим код в ПКО документа в обработчике После загрузки:


Если Объект.Организация.Пустая() Тогда
    ПредставлениеДока = "Документ " + Объект.Номер + " от " + Формат(Объект.Дата, "ДФ=dd.MM.yyyy");
    Параметры.СписокПропущенныхДокументов.Добавить(ПредставлениеДока);
    Отказ = Истина;
КонецЕсли;

И, наконец, в глобальном обработчике После загрузки данных выведем итоговый результат:


Если Параметры.СписокПропущенныхДокументов.Количество() > 0 Тогда
    Сообщить("--- Сводка по пропущенным документам (не найдена организация) ---");
    Для Каждого Стр Из Параметры.СписокПропущенныхДокументов Цикл
        Сообщить(Стр.Значение);
    КонецЦикла;
КонецЕсли;

Важные нюансы и возможные проблемы

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

Используя предложенную методику, мы можем гибко управлять процессом загрузки данных, обеспечивая корректность заполнения базы-приемника и предоставляя пользователю понятные отчеты о результатах синхронизации.

← На главную