При работе с 1С пользователи часто сталкиваются с различными ошибками, особенно после обновлений конфигураций. Одна из таких проблем возникает при синхронизации данных между "1С:Управление торговлей" (УТ) редакции 11.5 и "1С:Бухгалтерия предприятия" (БП) редакции 3.0. После очередного обновления УТ синхронизация может прерваться с сообщением об ошибке: "Ошибка выполнения обработчика. Поле объекта не обнаружено (ФизическоеЛицо)". Чаще всего это происходит при выгрузке кассовых документов (ПКО и РКО).
Давайте вместе разберемся, почему возникает эта ошибка и как ее можно исправить, не дожидаясь официального патча от разработчиков.
Анализ ситуации показывает, что проблема не в данных, которые вы ввели, и не в "кривых" документах. Корень зла кроется в изменениях, которые разработчики 1С внесли в структуру конфигурации "Управление торговлей" в одних из последних релизов (начиная примерно с 11.5.15 и выше).
Суть изменения в следующем:
ПриходныйКассовыйОрдер и РасходныйКассовыйОрдер изменился тип данных для реквизита "Кассир".ОтветственныеЛицаОрганизаций. У элемента этого справочника есть свой реквизит ФизическоеЛицо.СправочникСсылка.ФизическиеЛица. То есть теперь он ссылается напрямую на физическое лицо.Проблема в том, что правила обмена данными, которые используются при синхронизации, не всегда успевают адаптировать под такие изменения. Механизм выгрузки по-старому пытается обратиться к кассиру как к ответственному лицу и получить у него свойство .ФизическоеЛицо. Но поскольку теперь в реквизите "Кассир" находится само физическое лицо, у которого такого свойства нет, система и выдает ошибку "Поле объекта не обнаружено".
Ошибка происходит в общем модуле МенеджерОбменаЧерезУниверсальныйФормат, в процедуре, отвечающей за обработку данных пользователя при выгрузке, например, ПКО_Справочник_Пользователи_ПриОтправкеДанных.
Теперь, когда мы понимаем причину, рассмотрим варианты решения.
Если вам нужно срочно выполнить синхронизацию, а времени на полноценное исправление нет, можно воспользоваться одним из временных способов.
Способ 1: Исключить кассовые документы из обмена
Самый простой путь — временно отключить выгрузку ПКО и РКО. Это позволит синхронизировать все остальные данные. Кассовые документы придется перенести в Бухгалтерию вручную. Для этого в настройках синхронизации нужно зайти в состав отправляемых данных и снять флажки с документов "Приходный кассовый ордер" и "Расходный кассовый ордер".
Способ 2: Очистить поле "Кассир" в документах
Как показывает практика, если в проблемных документах ПКО и РКО очистить поле "Кассир" (на вкладке "Печать"), то синхронизация проходит успешно. Этот способ подойдет, если передача ФИО кассира в бухгалтерию для вас не является критически важной.
Чтобы не вносить изменения в основную конфигурацию и не усложнять себе жизнь при последующих обновлениях, правильнее всего использовать механизм расширений. Мы создадим небольшое расширение, которое скорректирует проблемную логику выгрузки.
Разберем процесс по шагам.
Запустите базу "Управление торговлей" в режиме "Конфигуратор". В меню выберите "Конфигурация" -> "Расширения конфигурации". В открывшемся окне нажмите "Добавить" (зеленый плюсик). Задайте имя расширению, например, ИсправлениеСинхронизацииУТ_БП. В качестве назначения укажите "Исправление". Снимите флажок "Безопасный режим".
В дереве конфигурации найдите ваше расширение. Нажмите на нем правой кнопкой мыши и выберите "Добавить в расширение". В открывшемся окне найдите и добавьте объект ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат.
Раскройте ваше расширение в дереве конфигурации, найдите добавленный общий модуль и дважды кликните по нему. Откроется пустое окно редактора кода. Сюда нам нужно вставить код, который "перехватит" и заменит стандартную процедуру.
Для этого мы используем директиву компиляции &Вместо. Она указывает платформе, что вместо оригинальной процедуры нужно выполнять нашу, из расширения.
Скопируйте и вставьте в открытое окно модуля следующий код:
&Вместо("ПКО_Справочник_Пользователи_ПриОтправкеДанных")
Процедура Расш_ПКО_Справочник_Пользователи_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
Если СтекВыгрузки.Количество > 1 Тогда
// Для выгрузки РКО/ПКО при синхронизации
// В ДанныеИБ может приходить как ссылка на ФизЛицо, так и ссылка на ОтветственноеЛицоОрганизаций.
// Добавляем проверку типа, чтобы код был универсальным.
ДанныеXDTO.Вставить("ФизическоеЛицо", Новый Структура("Значение, ИмяПКО",
?(ТипЗнч(ДанныеИБ) = Тип("СправочникСсылка.ФизическиеЛица"), ДанныеИБ, ДанныеИБ.ФизическоеЛицо),
"Справочник_ФизическиеЛица_Отправка"));
Возврат;
КонецЕсли;
ДанныеXDTO.КлючевыеСвойства.Вставить("ФизическоеЛицо", Новый Структура("Значение, ИмяПКО", ДанныеИБ.ФизическоеЛицо,"Справочник_ФизическиеЛица_Отправка"));
ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO, Истина);
КонецПроцедуры
Проанализируем ключевое изменение. Самая важная часть — это тернарный оператор:
?(ТипЗнч(ДанныеИБ) = Тип("СправочникСсылка.ФизическиеЛица"), ДанныеИБ, ДанныеИБ.ФизическоеЛицо)
Эта строка выполняет проверку: если в переменной ДанныеИБ (куда передается значение реквизита "Кассир") уже находится ссылка на физическое лицо, то мы используем ее напрямую. Если же там объект другого типа (например, старый формат — "Ответственное лицо"), то мы, как и раньше, пытаемся получить из него реквизит .ФизическоеЛицо. Такой подход делает код универсальным и устойчивым к будущим изменениям.
После вставки кода сохраните конфигурацию (Ctrl + S). Затем обновите конфигурацию базы данных, нажав F7 или выбрав в меню "Конфигурация" -> "Обновить конфигурацию базы данных". После завершения обновления запустите 1С в режиме "Предприятие".
После выполнения этих шагов расширение будет активно, и синхронизация кассовых документов должна проходить без ошибок. Это решение является наиболее корректным, так как оно точечно исправляет проблему, не затрагивая остальную логику и не требуя ручных манипуляций с документами.