В практике может возникнуть потребность выгружать объекты, данные которых, по некоторым причинам, могут быть не всегда заполнены в данный момент. Но выгружать без них объект или не имеет смысла, или не позволяет формат ED. Например, данные для выгрузки документа берутся из движений, формируемых по сложным алгоритмам и данным, которые не полностью содержатся в документе. И если в случае, когда движения формируются в процессе проведения документа, решением является запрет регистрации не проведенного документа, то как быть, если движения формируются посторонним процессом, не зависящим от проведения? Например, движения по регистру бухгалтерии хозрасчетный.
Чтобы не создавать дополнительных обработчиков на проведение по регистру бухгалтерии (а в случае, если полный объем исходных данных формируется в процессе нескольких независимых событий, для каждого из которых придется писать такой обработчик) в данной статье я предлагаю решение этой задачи средствами механизмов обмена через универсальный формат. В момент выгрузки проверить наличие всех необходимых данных и если их нет, то не только не выгружать объект, но и удалить данные о номере сообщения для регистрации этого объекта, чтобы оставить его зарегистрированным к обмену. Таким образом мы получим как бы отложенную выгрузку - объект будет числиться зарегистрированным к обмену до тех пор, пока не будет всех необходимых для этого данных, и он не будет реально выгружен.
Первым делом создадим коллекцию для объектов, которые хотим оставить зарегистрированными.
В модуле МенеджерОбменаЧерезУниверсальныйФормат в процедуре ПередКонвертацией добавляем код
Процедура ПередКонвертацией(КомпонентыОбмена) Экспорт
// Добавляем массив для объектов регистрацию которых необходимо оставить по каким либо соображениям.
КомпонентыОбмена.Вставить("ОставитьЗарегистрированными", Новый Массив);
КонецПроцедуры
Если изменения вносим через конфигурацию КД 3, то в меню выбираем "Конвертации" - "Настройка правил конвертации"
Открываем нужную конвертацию, выбираем команду "Настроить конвертацию"
Здесь на странице "Глобальные обработчики конвертации нам понадобятся два обработчика - "Перед конвертацией" и позже "После конвертации"
Вносим изменения.
Следующим шагом вносим изменения в ПОД нужного нам объекта
Производим проверку на наличие всех необходимых данных для выгрузки и в случае их отсутствия устанавливаем ИспользованиеПКО для нужного правила в Ложь, а также добавляем ссылку на объект в созданный ранее массив ОставитьЗарегистрированными
Процедура ПОД_Документ_НачисленияКредитовИДепозитов_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
Запрос = Новый Запрос("ВЫБРАТЬ
| Хозрасчетный.НомерСтроки
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор = &Ссылка");
Запрос.УстановитьПараметр("Ссылка",ДанныеИБ.Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
ИспользованиеПКО.Документ_НачисленияКредитовИДепозитов_Отправка = Ложь;
КомпонентыОбмена.ОставитьЗарегистрированными.Добавить(ДанныеИБ.Ссылка);
КонецЕсли;
КонецПроцедуры
Заключительным шагом вносим изменения в глобальный обработчик конвертации "После конвертации" (процедура модуля ПослеКонвертации)
Обходим массив ОставитьЗарегистрированными и выполняем для его элементов процедуру ЗарегистрироватьИзменения, тем самым удаляя номер сообщения для объектов, оставляя их зарегистрированными.
Процедура ПослеКонвертации(КомпонентыОбмена) Экспорт
// Сбрасываем номер отправленного сообщения у объектов для которых необходимо оставить регистрацию по каким либо соображениям.
Для Каждого ОбъектСсылка Из КомпонентыОбмена.ОставитьЗарегистрированными Цикл
ПланыОбмена.ЗарегистрироватьИзменения(КомпонентыОбмена.УзелКорреспондента, ОбъектСсылка);
ИндексЭлемента = КомпонентыОбмена.ВыгруженныеОбъекты.Найти(ОбъектСсылка);
Если Не ИндексЭлемента = Неопределено Тогда
КомпонентыОбмена.ВыгруженныеОбъекты.Удалить(ИндексЭлемента);
КонецЕсли;
ИндексЭлемента = КомпонентыОбмена.НеВыгруженныеОбъекты.Найти(ОбъектСсылка);
Если ИндексЭлемента = Неопределено Тогда
КомпонентыОбмена.НеВыгруженныеОбъекты.Добавить(ОбъектСсылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры