Как сообщить пользователю о не найденном контрагенте при загрузке обмена в КД 2.1?

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

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

Выбор правильного обработчика событий

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

Поэтому самым надежным и правильным местом для нашей проверки является обработчик «Поля поиска». Именно здесь мы можем вмешаться в процесс до того, как система примет решение о создании или пропуске объекта.

Реализация проверки в обработчике «Поля поиска»

В обработчике «Поля поиска» нам доступна специальная переменная СвойстваПоиска. Это структура, содержащая значения, переданные из базы-источника (ИНН, КПП, Наименование и т.д.). Рассмотрим подробнее, как переопределить стандартный поиск своим.

Для проверки наличия объекта напишем запрос к справочнику прямо в обработчике:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    Контрагенты.Ссылка
               |ИЗ
               |    Справочник.Контрагенты КАК Контрагенты
               |ГДЕ
               |    Контрагенты.ИНН = &ИНН";

Запрос.УстановитьПараметр("ИНН", СвойстваПоиска["ИНН"]);
РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() Тогда
    // Объект не найден, выводим сообщение
КонецЕсли;

Контроль вариантов поиска

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

Чтобы избежать спама сообщениями, используем переменную НомерВариантаПоиска. Вывод предупреждения следует делать только на последнем этапе. Например, если у нас настроено два варианта поиска, код будет выглядеть так:


Если НомерВариантаПоиска = 2 Тогда
    Если РезультатЗапроса.Пустой() Тогда
        // Формируем сообщение только на последнем шаге
    КонецЕсли;
КонецЕсли;

Как правильно выводить сообщение пользователю?

В обсуждениях часто советуют использовать стандартный метод Сообщить(). Однако, проанализируем условия выполнения обмена. Если загрузка файла запускается вручную через обработку «Универсальный обмен данными», метод сработает корректно. Но если обмен выполняется регламентным заданием в фоне, через COM-соединение или веб-сервис, то Сообщить() уйдет «в никуда».

Чтобы информация гарантированно сохранилась в истории обмена, используем внутреннюю процедуру КД 2.1 СообщитьОбОшибке() или штатный метод платформы ЗаписьЖурналаРегистрации().


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

Обратите внимание на переменную ПрекратитьПоиск. Установив ее в Истина, мы даем команду механизмам конвертации прекратить дальнейшие бесполезные попытки стандартного поиска этого объекта.

Альтернативный подход: проверка на стороне документа

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

Так как в правиле конвертации справочника стоит настройка «Не создавать», то в загруженном документе реквизит «Контрагент» останется пустым. Мы можем перенести нашу логику оповещения в ПКО самого Документа, в обработчик ПослеЗагрузки.

  1. Дожидаемся загрузки документа.
  2. Проверяем заполненность критически важного реквизита.
  3. Если он пуст — выводим информативное сообщение.

Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
    ТекстСообщения = "В загруженном документе № " + Объект.Номер + 
                     " от " + Объект.Дата + 
                     " не заполнен контрагент, так как он не был найден в базе-приемнике.";
    СообщитьОбОшибке(ТекстСообщения);
КонецЕсли;

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

← На главную