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