Почему в УТ 11 при переносе контрагентов через Конвертацию данных не заполняется вид контрагента и значение перечисления?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При переносе данных справочника Контрагенты между конфигурациями «1С:Управление торговлей» (например, при переходе с редакции 11.0 на 11.3 или 11.4) разработчики часто сталкиваются с неочевидным поведением. В файле выгрузки XML значение реквизита ЮрФизЛицо присутствует, при загрузке ошибок не возникает, однако при открытии карточки контрагента интерактивно поле «Вид контрагента» оказывается незаполненным, а при попытке записи программа выдает ошибку проверки заполнения. Разберем архитектурные причины этой проблемы и выясним, как правильно настроить правила обмена в «Конвертации данных».

В чем архитектурная причина ошибки

Чтобы понять причину такого поведения, проанализируем внутреннее устройство справочника Контрагенты в разных версиях УТ 11:

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

Способ 1. Добавление ПКС для недостающего реквизита на стороне выгрузки

Рассмотрим основной способ решения проблемы в конфигурации «Конвертация данных 2.1». Нам необходимо обеспечить заполнение реквизита ЮридическоеФизическоеЛицо базы-приемника еще на этапе выгрузки данных из источника.

  1. Откроем правило конвертации объектов (ПКО) для справочника Контрагенты.
  2. Добавим новое правило конвертации свойства (ПКС):
    • Свойство-источник: оставляем пустым (так как в базе-источнике этого реквизита нет).
    • Свойство-приемник: выбираем ЮридическоеФизическоеЛицо.
    • Правило конвертации (ПКО): выбираем соответствующее ПКО для перечисления ЮридическоеФизическоеЛицо.
  3. В обработчике события ПередВыгрузкой для данного ПКС вычислим значение на основе реквизита ЮрФизЛицо источника:
    
    Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо
     ИЛИ Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент Тогда
        Значение = "ЮридическоеЛицо";
    Иначе
        Значение = "ФизическоеЛицо";
    КонецЕсли;
    
  4. Проверим ПКС для реквизита ЮрФизЛицо: убедимся, что для него жестко указано ПКО перечисления ЮрФизЛицо, а в таблице конвертации значений (ПКЗ) сопоставлены все элементы (включая нерезидентов и индивидуальных предпринимателей).

Способ 2. Программное заполнение реквизитов в обработчике «ПослеЗагрузки»

Разберем альтернативный вариант, когда нет возможности или желания менять правила выгрузки из источника. Мы можем заполнить недостающий реквизит непосредственно в базе-приемнике перед тем, как объект запишется в базу данных.

Для этого в ПКО справочника Контрагенты перейдем в обработчик ПослеЗагрузки и напишем следующий алгоритм без вызова метода записи объекта:


Если Не ЗначениеЗаполнено(Объект.ЮридическоеФизическоеЛицо) И ЗначениеЗаполнено(Объект.ЮрФизЛицо) Тогда
    Если Объект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо
     ИЛИ Объект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент Тогда
        Объект.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
    Иначе
        Объект.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо;
    КонецЕсли;
КонецЕсли;

В этом случае платформа модифицирует заполняемый Объект в памяти, после чего механизм конвертации данных выполнит его штатную запись в режиме обмена, не вызывая конфликтов с подписками на события.

Способ 3. Исправление уже перенесенных данных в базе-приемнике

Если справочник уже перенесен, и повторная выгрузка не планируется, устранить ошибку можно непосредственно в базе-приемнике, не открывая каждого контрагента вручную.

  1. Откроем типовую обработку «Групповое изменение реквизитов» (раздел «НСИ и администрирование» — «Обслуживание» — «Корректировка данных»).
  2. Выберем элемент для изменения: Контрагенты.
  3. Настроим отбор: ЮридическоеФизическоеЛицо — «Не заполнено».
  4. В дополнительном фильтре отберем контрагентов, у которых ЮрФизЛицо равно ЮрЛицо или ЮрЛицоНеРезидент, и массово установим реквизиту ЮридическоеФизическоеЛицо значение Юридическое лицо.
  5. Аналогично выполним операцию для физических лиц и ИП, установив значение Физическое лицо.

После синхронизации обоих реквизитов форма элемента контрагента начнет корректно определять «Вид контрагента», и карточки будут записываться в штатном режиме.

← На главную