При настройке обмена данными между конфигурациями 1С часто возникает ситуация, когда необходимо обеспечить строгую целостность данных. Например, при переносе документов ЗаказПокупателя важно, чтобы документ попадал в базу только в том случае, если в ней уже существует соответствующая Организация. Если организация не найдена по ключевым полям (ИНН/КПП), создавать «пустую» карточку нельзя, а загрузку самого документа следует прервать. В этой статье мы разберем, как реализовать такую логику с помощью инструментов 1С:Конвертация данных 2.0.
Прежде чем переходить к коду в документе, необходимо правильно настроить Правило Конвертации Объекта (ПКО) для самой организации. Разберем по шагам, какие настройки нам потребуются:
Организации.ИНН и КПП установим флаг Поиск. Это позволит системе искать существующий объект в приемнике по этим полям.Это критически важный момент. Если этот флаг не установлен, система при неудачном поиске создаст новый элемент справочника Организации, заполнив его данными из файла. В результате в документе всегда будет ссылка на организацию, и наша проверка на «пустоту» не сработает.
Теперь перейдем к основному объекту — документу Заказ. Нам необходимо проанализировать состояние реквизита Организация после того, как данные были прочитаны из XML-файла, но до того, как документ будет записан в информационную базу приемника.
Для этих целей идеально подходит обработчик события После загрузки в ПКО документа. Рассмотрим ситуацию: когда выполняется загрузка документа, система сначала обрабатывает все его реквизиты. Так как для организации мы установили флаг «не создавать», то в случае отсутствия совпадения по ИНН/КПП, в поле Объект.Организация запишется пустая ссылка соответствующего типа.
Проанализируем программный код, который необходимо разместить в обработчике После загрузки ПКО нашего документа. Основным инструментом здесь является параметр Отказ. Если установить ему значение Истина, загрузка текущего объекта будет прервана, и он не будет записан в базу.
Рассмотрим пример кода:
// Проверяем, заполнена ли организация в загруженном объекте
Если Объект.Организация.Пустая() Тогда
// Информируем пользователя о пропуске документа
Сообщить("Документ " + Объект.Номер + " от " + Объект.Дата + " пропущен: организация не найдена в базе-приемнике.");
// Устанавливаем флаг отказа от загрузки объекта
Отказ = Истина;
КонецЕсли;
Этот код выполняется непосредственно перед вызовом метода Записать(). Поскольку мы установили Отказ = Истина, транзакция записи для этого конкретного документа не будет выполнена, и база останется чистой от «неполноценных» данных.
Если вы загружаете тысячи документов, использование прямого метода Сообщить() может замедлить процесс и захламить окно сообщений. Выясним, как сделать логирование более профессиональным. Для этого воспользуемся глобальной структурой Параметры, которая доступна во всех обработчиках конвертации.
Сначала в обработчике Перед загрузкой данных (глобальный обработчик правил) инициализируем список для сбора ошибок:
Параметры.Вставить("СписокПропущенныхДокументов", Новый СписокЗначений);
Затем изменим код в ПКО документа в обработчике После загрузки:
Если Объект.Организация.Пустая() Тогда
ПредставлениеДока = "Документ " + Объект.Номер + " от " + Формат(Объект.Дата, "ДФ=dd.MM.yyyy");
Параметры.СписокПропущенныхДокументов.Добавить(ПредставлениеДока);
Отказ = Истина;
КонецЕсли;
И, наконец, в глобальном обработчике После загрузки данных выведем итоговый результат:
Если Параметры.СписокПропущенныхДокументов.Количество() > 0 Тогда
Сообщить("--- Сводка по пропущенным документам (не найдена организация) ---");
Для Каждого Стр Из Параметры.СписокПропущенныхДокументов Цикл
Сообщить(Стр.Значение);
КонецЦикла;
КонецЕсли;
Разберем несколько важных моментов, которые стоит учитывать при использовании данного подхода:
После загрузки у нас есть полный доступ к свойствам объекта Объект.Номер и Объект.Дата для формирования красивого сообщения об ошибке.строка или через ВходящиеДанные), проверка может отличаться от Пустая(). Всегда проверяйте, какой именно тип данных приходит в реквизит при неудачном поиске.Используя предложенную методику, мы можем гибко управлять процессом загрузки данных, обеспечивая корректность заполнения базы-приемника и предоставляя пользователю понятные отчеты о результатах синхронизации.