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

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

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

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

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

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

Шаг 1. Настройка свойства "Не создавать если не найден"

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

  1. Откроем правила обмена в конфигурации «Конвертация данных».
  2. Найдем ПКО загружаемого документа и перейдем к списку ПКС.
  3. Для свойства ФизЛицо установим флаг «Не создавать если не найден».

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

Шаг 2. Отмена записи документа при отсутствии справочника

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

Рассмотрим пример кода для проверки шапки документа:


Если Не ЗначениеЗаполнено(Объект.ФизЛицо) Тогда
    Сообщить("Документ " + Объект + " не перенесен, так как физическое лицо не найдено в базе!");
    Отказ = Истина;
КонецЕсли;

Если физическое лицо указывается в табличной части документа (например, в документе начисления или выплаты зарплаты), проверим строки табличной части:


Для Каждого СтрокаТЧ Из Объект.Зарплата Добавить
    Если Не ЗначениеЗаполнено(СтрокаТЧ.ФизЛицо) Тогда
        Сообщить("Документ " + Объект + " не загружен: в табличной части найден несопоставленный сотрудник.");
        Отказ = Истина;
        Прервать;
    КонецЕсли;
КонецЦикла;

Шаг 3. Передача наименования физического лица для информативного сообщения

В предыдущем примере при отсутствии физического лица реквизит содержит пустую ссылку, поэтому обратиться к его наименованию через Объект.ФизЛицо.Наименование в базе-приемнике не удастся. Чтобы выдать пользователю понятное сообщение с конкретным ФИО ненайденного сотрудника, задействуем механизм передачи параметров.

Выясним, как передать строковое представление объекта из источника в приемник с помощью структуры ПараметрыОбъекта.

Вариант 1. Через код в обработчике источника
В ПКО документа на стороне источника (в событии ПередВыгрузкой или ПриВыгрузке) передадим текстовое представление сотрудника:

ПараметрыОбъекта.Вставить("ИмяФизЛицаИсточник", Строка(Источник.ФизЛицо));

В базе-приемнике в обработчике ПослеЗагрузкиОбъекта прочитаем этот параметр и выведем его в предупреждении:


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

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

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

← На главную