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