Как исправить ошибку «Поле объекта не обнаружено (Статус)» при проведении счетов-фактур и синхронизации в 1С:КА 2.5

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

После обновления конфигураций «1С:Комплексная автоматизация 2» или «1С:ERP Управление предприятием» до релизов 2.5.20.80, 2.5.20.85 и смежных версий многие пользователи сталкиваются с критической ошибкой. Проблема проявляется не только при попытке выполнить синхронизацию данных с «1С:Бухгалтерией 3.0», но и при обычном перепроведении документов СчетФактураВыданный.

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

Анализ технической причины ошибки

Проанализируем текст ошибки, который выдает система. Основная проблема кроется в обработчике правил регистрации объектов. В стеке вызовов мы видим обращение к общему модулю ОбменДаннымиСобытияУТ:


{ОбщийМодуль.ОбменДаннымиСобытияУТ.Модуль(324)}:Если ДокументОснование.Статус = Перечисления.СтатусыРеализацийТоваровУслуг.КПредоплате Тогда

Разберем ситуацию подробнее. Когда в системе включена Синхронизация данных, при записи любого объекта срабатывают правила регистрации (ПРО). Эти правила определяют, должен ли объект попасть в очередную выгрузку. В новых релизах разработчики добавили проверку статуса документа-основания для счета-фактуры.

Проблема заключается в том, что в коде прописано прямое обращение к реквизиту Статус через точку от ДокументОснование. Если основанием счета-фактуры является Реализация товаров и услуг, код отрабатывает корректно. Однако, если основанием выступает Акт выполненных работ или другой документ, в метаданных которого нет реквизита Статус, система закономерно выдает исключение Поле объекта не обнаружено (Статус).

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

Способ 1. Установка официального патча от 1С

Поскольку проблема носит массовый характер и признана разработчиками 1С как программная ошибка, первым делом нам следует проверить наличие официального исправления. Рассмотрим, как это сделать:

  1. Перейдем в раздел АдминистрированиеОбслуживание.
  2. Раскроем блок Обновление программы и выберем пункт Установка обновлений и исправлений (патчей).
  3. Если база подключена к интернет-поддержке, программа предложит список доступных патчей. Нам необходимо найти исправление, в описании которого упоминается СинхронизацияДанныхЧерезУниверсальныйФормат или ошибка в ОбменДаннымиСобытияУТ. Обычно код патча начинается на EF_0018....
  4. Установим патч и перезапустим сеанс работы с базой данных.

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

Способ 2. Исправление кода через расширение (для программистов)

Если патч по каким-то причинам недоступен или вы работаете в сильно кастомизированной базе, мы можем исправить ошибку самостоятельно, создав расширение. Нам нужно модифицировать логику обращения к реквизиту Статус, сделав её более безопасной.

Разберем, как реализовать проверку наличия реквизита программно. Вместо прямого обращения мы будем использовать функцию ОбщегоНазначения.ЕстьРеквизитОбъекта. Проанализируем пример кода, который следует разместить в расширении для метода ДокументСчетФактураВыданныйПередОбработкойПРО:


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

КонецПроцедуры

Используя конструкцию ЕстьРеквизитОбъекта, мы гарантируем, что система не обратится к несуществующему полю Статус у Акта выполненных работ, и транзакция проведения завершится успешно.

Способ 3. Обновление правил регистрации объектов

Иногда ошибка кроется не в самом программном коде модулей, а во вложенных правилах регистрации, которые хранятся в XML-виде внутри базы. Выясним, как их обновить без обновления всей конфигурации:

  1. Зайдем в Настройки синхронизации данных.
  2. Выберем наше подключение к Бухгалтерии предприятия.
  3. Нажмем Параметры обмена даннымиЗагрузить правила регистрации объектов.
  4. Попробуем выбрать вариант Из конфигурации (если вы только что обновились) или загрузить актуальный файл ExchangeRegistrationRules.xml из папки SyncFiles, которая идет в составе дистрибутива обновления КА 2.5.

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

Дополнительные рекомендации

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

Подводя итог, можно сказать, что данная проблема является классическим примером «жесткого» кодинга в правилах регистрации 1С. Использование безопасных методов обращения к реквизитам через ОбщегоНазначения позволяет избежать подобных ситуаций при работе с разнородными документами-основаниями.

← На главную