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