Как проверить заполненность реквизитов в источнике и отменить выгрузку в КД 2.0

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

При настройке обмена данными через «1С:Конвертация данных 2.0» часто возникает задача: нужно не просто пропустить конкретный объект, если в нем не заполнены реквизиты, а полностью остановить процесс выгрузки. Это критично, когда частичная выгрузка может привести к рассинхронизации данных в приемнике. Особенно сложной задача становится, когда проверять нужно не весь справочник целиком, а только те его элементы, которые задействованы в выгружаемых документах.

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

Метод 1. Предварительная проверка в глобальном обработчике «Перед выгрузкой данных»

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

Рассмотрим логику реализации этого метода. Нам необходимо имитировать ту же выборку документов, которая будет производиться правилами выгрузки данных (ПВД), и проверить связанную с ними номенклатуру. Проанализируем пример кода:


// Создаем запрос для проверки данных
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   Док.Номенклатура КАК Ссылка
    |ПОМЕСТИТЬ ВТ_Номенклатура
    |ИЗ
    |   Документ.РеализацияТоваровУслуг.Товары КАК Док
    |ГДЕ
    |   Док.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    |   И Док.Ссылка.Проведен = ИСТИНА;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   ВТ_Номенклатура.Ссылка КАК ПроблемнаяНоменклатура,
    |   ВТ_Номенклатура.Ссылка.Наименование КАК Наименование
    |ИЗ
    |   ВТ_Номенклатура КАК ВТ_Номенклатура
    |ГДЕ
    |   (ВТ_Номенклатура.Ссылка.КодОбмена ЕСТЬ NULL 
    |       ИЛИ ВТ_Номенклатура.Ссылка.КодОбмена = """")";

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКонца", ДатаКонца);

РезультатЗапроса = Запрос.Выполнить();

Если НЕ РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    СообщениеТекст = "Выгрузка отменена! У следующей номенклатуры не заполнен Код Обмена:" + Символы.ПС;
    Пока Выборка.Следующий() Цикл
        СообщениеТекст = СообщениеТекст + " - " + Выборка.Наименование + " (ссылка: " + Выборка.ПроблемнаяНоменклатура + ")" + Символы.ПС;
    КонецЦикла;
    
    // Выводим сообщение пользователю
    Сообщить(СообщениеТекст);
    
    // Останавливаем выгрузку
    Отказ = Истина;
КонецЕсли;

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

Метод 2. Проверка в обработчике «Перед выгрузкой» ПВД

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

В этом случае мы сначала выполняем проверочный запрос, и если находим ошибки, устанавливаем переменную Отказ = Истина. Если же всё в порядке, вызываем стандартный метод ВыгрузитьПоПравилу() для каждого объекта. Однако стоит учитывать нюанс: установка Отказ = Истина в ПВД отменяет выгрузку объектов только по этому конкретному правилу, а не всего обмена в целом.

Метод 3. Жесткая остановка через «ВызватьИсключение»

Иногда требуется прервать обмен «здесь и сейчас», независимо от того, в каком месте кода мы находимся. В КД 2.0 параметр Отказ = Истина во многих обработчиках (например, в ПКО — правилах конвертации объектов) просто пропускает текущий объект, но продолжает выгрузку остальных.

Если ваша логика требует немедленной остановки при обнаружении первой же ошибки в ПКО номенклатуры, можно использовать следующий прием в событии Перед выгрузкой для объекта Номенклатура:


Если ПустаяСтрока(Источник.КодОбмена) Тогда
    ТекстОшибки = "КРИТИЧЕСКАЯ ОШИБКА: Обнаружена номенклатура '" + Источник.Наименование + "' без кода обмена. Выгрузка прервана.";
    Сообщить(ТекстОшибки);
    ВызватьИсключение ТекстОшибки;
КонецЕсли;

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

Метод 4. Накопление ошибок и проверка в конце выгрузки

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

  1. В обработчике Перед началом конвертации создаем коллекцию: Параметры.Вставить("СписокОшибок", Новый СписокЗначений);
  2. В ПКО номенклатуры Перед выгрузкой добавляем объекты в список:
    
    Если ПустаяСтрока(Источник.КодОбмена) Тогда
        Параметры.СписокОшибок.Добавить(Источник.Ссылка, Источник.Наименование);
    КонецЕсли;
    
  3. В обработчике После выгрузки данных проверяем список:
    
    Если Параметры.СписокОшибок.Количество() > 0 Тогда
        // Здесь мы можем только сообщить пользователю, что файл содержит ошибки.
        // Сам файл к этому моменту уже будет сформирован на диске.
        Для Каждого Ошибка Из Параметры.СписокОшибок Цикл
            Сообщить("Внимание: Объект выгружен без кода обмена: " + Ошибка.Представление);
        КонецЦикла;
    КонецЕсли;
    

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

Особенности при фоновом (регламентном) обмене

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

В случае фоновой выгрузки крайне важно записывать информацию в системный журнал. Используйте ЗаписьЖурналаРегистрации, чтобы администратор мог понять, почему регламентное задание завершилось неудачей. Пример записи:


ЗаписьЖурналаРегистрации("ОбменДанными.ОшибкаВалидации",
    УровеньЖурналаРегистрации.Ошибка,
    ,
    ,
    "Выгрузка отменена: не заполнены обязательные коды обмена для номенклатуры.");

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

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

Помните, что Отказ = Истина — это ваш основной инструмент управления потоком выгрузки в КД 2.0. Правильное его применение на разных уровнях (Конвертация, ПВД, ПКО) позволяет гибко настраивать поведение системы под любые требования бизнеса.

← На главную