Как исправить ошибку "Поле объекта не обнаружено (ФизическоеЛицо)" при синхронизации ПКО и РКО из УТ 11 в Бухгалтерию?

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

При работе с 1С пользователи часто сталкиваются с различными ошибками, особенно после обновлений конфигураций. Одна из таких проблем возникает при синхронизации данных между "1С:Управление торговлей" (УТ) редакции 11.5 и "1С:Бухгалтерия предприятия" (БП) редакции 3.0. После очередного обновления УТ синхронизация может прерваться с сообщением об ошибке: "Ошибка выполнения обработчика. Поле объекта не обнаружено (ФизическоеЛицо)". Чаще всего это происходит при выгрузке кассовых документов (ПКО и РКО).

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

Выясняем причину ошибки

Анализ ситуации показывает, что проблема не в данных, которые вы ввели, и не в "кривых" документах. Корень зла кроется в изменениях, которые разработчики 1С внесли в структуру конфигурации "Управление торговлей" в одних из последних релизов (начиная примерно с 11.5.15 и выше).

Суть изменения в следующем:

  1. В документах ПриходныйКассовыйОрдер и РасходныйКассовыйОрдер изменился тип данных для реквизита "Кассир".
  2. Раньше этот реквизит ссылался на справочник ОтветственныеЛицаОрганизаций. У элемента этого справочника есть свой реквизит ФизическоеЛицо.
  3. В новых версиях тип реквизита "Кассир" изменили на СправочникСсылка.ФизическиеЛица. То есть теперь он ссылается напрямую на физическое лицо.

Проблема в том, что правила обмена данными, которые используются при синхронизации, не всегда успевают адаптировать под такие изменения. Механизм выгрузки по-старому пытается обратиться к кассиру как к ответственному лицу и получить у него свойство .ФизическоеЛицо. Но поскольку теперь в реквизите "Кассир" находится само физическое лицо, у которого такого свойства нет, система и выдает ошибку "Поле объекта не обнаружено".

Ошибка происходит в общем модуле МенеджерОбменаЧерезУниверсальныйФормат, в процедуре, отвечающей за обработку данных пользователя при выгрузке, например, ПКО_Справочник_Пользователи_ПриОтправкеДанных.

Теперь, когда мы понимаем причину, рассмотрим варианты решения.

Временные (обходные) решения

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

Способ 1: Исключить кассовые документы из обмена

Самый простой путь — временно отключить выгрузку ПКО и РКО. Это позволит синхронизировать все остальные данные. Кассовые документы придется перенести в Бухгалтерию вручную. Для этого в настройках синхронизации нужно зайти в состав отправляемых данных и снять флажки с документов "Приходный кассовый ордер" и "Расходный кассовый ордер".

Способ 2: Очистить поле "Кассир" в документах

Как показывает практика, если в проблемных документах ПКО и РКО очистить поле "Кассир" (на вкладке "Печать"), то синхронизация проходит успешно. Этот способ подойдет, если передача ФИО кассира в бухгалтерию для вас не является критически важной.

Рекомендуемое решение: Исправление логики обмена через расширение

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

Разберем процесс по шагам.

  1. Создание расширения

    Запустите базу "Управление торговлей" в режиме "Конфигуратор". В меню выберите "Конфигурация" -> "Расширения конфигурации". В открывшемся окне нажмите "Добавить" (зеленый плюсик). Задайте имя расширению, например, ИсправлениеСинхронизацииУТ_БП. В качестве назначения укажите "Исправление". Снимите флажок "Безопасный режим".

  2. Добавление общего модуля в расширение

    В дереве конфигурации найдите ваше расширение. Нажмите на нем правой кнопкой мыши и выберите "Добавить в расширение". В открывшемся окне найдите и добавьте объект ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат.

  3. Переопределение проблемной процедуры

    Раскройте ваше расширение в дереве конфигурации, найдите добавленный общий модуль и дважды кликните по нему. Откроется пустое окно редактора кода. Сюда нам нужно вставить код, который "перехватит" и заменит стандартную процедуру.

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

  4. Вставка исправленного кода

    Скопируйте и вставьте в открытое окно модуля следующий код:

    
    &Вместо("ПКО_Справочник_Пользователи_ПриОтправкеДанных")
    Процедура Расш_ПКО_Справочник_Пользователи_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
    
    	Если СтекВыгрузки.Количество > 1 Тогда
    		// Для выгрузки РКО/ПКО при синхронизации
    		// В ДанныеИБ может приходить как ссылка на ФизЛицо, так и ссылка на ОтветственноеЛицоОрганизаций.
    		// Добавляем проверку типа, чтобы код был универсальным.
    		ДанныеXDTO.Вставить("ФизическоеЛицо", Новый Структура("Значение, ИмяПКО", 
    			?(ТипЗнч(ДанныеИБ) = Тип("СправочникСсылка.ФизическиеЛица"), ДанныеИБ, ДанныеИБ.ФизическоеЛицо),
    			"Справочник_ФизическиеЛица_Отправка"));
    		Возврат;
    	КонецЕсли;
    
    	ДанныеXDTO.КлючевыеСвойства.Вставить("ФизическоеЛицо", Новый Структура("Значение, ИмяПКО", ДанныеИБ.ФизическоеЛицо,"Справочник_ФизическиеЛица_Отправка"));
    	ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO, Истина);
    
    КонецПроцедуры
    

    Проанализируем ключевое изменение. Самая важная часть — это тернарный оператор:

    ?(ТипЗнч(ДанныеИБ) = Тип("СправочникСсылка.ФизическиеЛица"), ДанныеИБ, ДанныеИБ.ФизическоеЛицо)

    Эта строка выполняет проверку: если в переменной ДанныеИБ (куда передается значение реквизита "Кассир") уже находится ссылка на физическое лицо, то мы используем ее напрямую. Если же там объект другого типа (например, старый формат — "Ответственное лицо"), то мы, как и раньше, пытаемся получить из него реквизит .ФизическоеЛицо. Такой подход делает код универсальным и устойчивым к будущим изменениям.

  5. Применение изменений

    После вставки кода сохраните конфигурацию (Ctrl + S). Затем обновите конфигурацию базы данных, нажав F7 или выбрав в меню "Конфигурация" -> "Обновить конфигурацию базы данных". После завершения обновления запустите 1С в режиме "Предприятие".

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

← На главную