При самостоятельной разработке правил обмена в конфигурации «1С:Конвертация данных 2.1» часто возникает задача ограничить перенос документов, настроив фильтрацию исключительно по проведенным объектам. Начинающие разработчики нередко сталкиваются с двумя распространенными проблемами: неверным использованием предопределенных переменных в обработчиках событий и возникновением критической ошибки вида Метод объекта не обнаружен при выполнении выгрузки.
Разберем детально, как устроена работа контекстных переменных в правилах обмена, выясним причины сбоя и рассмотрим наиболее эффективные способы отбора документов.
Одной из главных причин ошибок при написании условий в правилах конвертации объектов (ПКО) является путаница между переменными Источник и Объект. Важно понимать их назначение и область видимости:
ПередВыгрузкой): в этих процедурах выгружаемый документ доступен через переменную Источник. Попытка обратиться к переменной Объект приводит к ошибке, так как на этапе чтения исходных данных базы-приемника еще не существует.ПослеЗагрузки): здесь созданный или найденный элемент уже доступен через переменную Объект.ПередВыгрузкой передается в переменную Объект.Таким образом, для проверки признака проведения в обработчике ПКО ПередВыгрузкой правильный код выглядит следующим образом:
Если НЕ Источник.Проведен Тогда
Отказ = Истина;
КонецЕсли;
Рассмотрим несколько способов настройки правил обмена для исключения непроведенных документов, от самых быстрых и оптимизированных до программных.
Этот способ является наиболее производительным и предпочтительным, так как отбор документов накладывается на уровне запроса к СУБД. В этом случае непроведенные документы даже не считываются из базы данных, что экономит оперативную память и ускоряет выгрузку.
Проведен Равно Истина.Если выгрузка требует сложной выборки с дополнительными условиями, можно использовать произвольный алгоритм в ПВД. Для этого в обработчике ПередОбработкой формируем запрос и передаем результат в переменную ВыборкаДанных:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Проведен = ИСТИНА
| И Реализация.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
Обратите внимание: если в ПВД выбран режим Произвольный алгоритм, заполнение переменной ВыборкаДанных или явный вызов метода ВыгрузитьПоПравилу() обязательны. Если оставить режим произвольного алгоритма пустым, выгрузка по данному правилу производиться не будет.
Если требуется фильтровать документы индивидуально в правиле конвертации, используем флаг Отказ в событии ПередВыгрузкой:
Если НЕ Источник.Проведен Тогда
Отказ = Истина;
КонецЕсли;
Важный нюанс: если документ отменяется через Отказ = Истина в ПКО, но на него есть ссылки в других выгружаемых объектах (например, в связанных документах или регистрах), механизм конвертации может попытаться выгрузить его по ссылке. Чтобы избежать создания пустых документов («битых ссылок») в приемнике, в настройках ПКО рекомендуется установить флаг «Не выгружать объекты свойств источника по ссылкам» либо использовать фильтрацию на уровне ПВД.
Проанализируем ситуацию, когда добавление кода в обработчик вызывает ошибку вызова метода. Это происходит по нескольким причинам:
УниверсальныйОбменДаннымиXML (встроенной в старый релиз базы-источника), форматы генерации имен процедур обработчиков могут не совпадать. Для выгрузки следует использовать обработку, поставляемую в комплекте с текущей версией «Конвертации данных».Проведен проверяется у переменной Источник.УниверсальныйОбменДаннымиXML.epf из каталога поставки конфигурации «Конвертация данных» и выполним выгрузку с ее помощью.