Как исправить ошибку «Поле объекта не обнаружено (Организация)» при установке нового номера в 1С

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

При проведении документов или записи новых объектов в конфигурациях на платформе 1С:Предприятие разработчики и администраторы могут столкнуться с аварийным завершением операции. В окне сообщения выводится ошибка: Ошибка при выполнении обработчика — 'ПриУстановкеНовогоНомера' по причине: {ОбщийМодуль.ПрефиксацияОбъектовСобытия.Модуль(77)}: Поле объекта не обнаружено (Организация).

Разберем детально, почему возникает данная исключительная ситуация, к каким негативным последствиям приводит некорректное «лечение» проблемы и как правильно настроить метаданные и программный код конфигурации.

Анализ механизма возникновения ошибки

Проанализируем типовой код общего модуля подсистемы префиксации. При автонумерации документов и справочников система вызывает обработчики подписок на события, например УстановитьПрефиксИнформационнойБазыИОрганизации или УстановитьПрефиксОрганизации. Внутри вызывается служебная процедура формирования префикса:


Если УстановитьПрефиксОрганизации Тогда
    
    ПрефиксОрганизации = ПолучитьФункциональнуюОпцию("ПрефиксыОрганизаций", Новый Структура("Организация", Источник.Организация));
    
    Если ПрефиксОрганизации = Неопределено Тогда
        ПрефиксОрганизации = "";
    ИначеЕсли ТипЗнч(ПрефиксОрганизации) <> Тип("Строка") Тогда
        ПрефиксОрганизации = "";
    КонецЕсли;
    
КонецЕсли;

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

Событие ПриУстановкеНовогоНомера возникает при первой записи объекта, если номер ему не был присвоен, либо при явном вызове метода УстановитьНовыйНомер(). Нередко проведение одного документа инициирует создание и проведение вспомогательного служебного документа (например, корректировки регистров или движений), не имеющего организации в реквизитах, что и приводит к сбою проведения основного документа.

Почему нельзя просто отключить общий модуль

Иногда встречается ошибочное решение: снять все флажки выполнения (Сервер, Клиент и др.) со сбойного общего модуля. Снятие признаков выполнения модуля действительно прекратит вызов ошибки, однако полностью разрушит логику нумерации в информационной базе:

  1. Документы и справочники перестанут получать префиксы организаций, что приведет к дублированию номеров при ведении многофирменного учета.
  2. Перестанет назначаться префикс информационной базы, что сделает невозможным корректный обмен данными в распределенных информационных базах (РИБ) из-за коллизий номеров.

Способ 1. Поиск виновного объекта через отладчик

Прежде чем вносить изменения, выясним точный тип объекта, вызывающего исключение. Для этого выполним следующие действия:

  1. Откроем информационную базу в режиме Конфигуратор.
  2. В главном меню перейдем в пункт Отладка и выберем Остановка по ошибке. Установим флаг Останавливаться по ошибке.
  3. Запустим сеанс «1С:Предприятие» в режиме отладки и повторим действие, вызывающее сбой проведения документа.
  4. В момент прерывания выполнения на строке с ошибкой откроем окно Табло и вычислим выражение:

Источник.Метаданные().ПолноеИмя()

Результат покажет точное имя объекта (например, Документ.СлужебнаяКорректировка), у которого отсутствует требуемый реквизит.

Способ 2. Корректировка состава подписки на события (Рекомендуемый способ)

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

  1. В дереве метаданных конфигурации развернем ветку Общие -> Подписки на события.
  2. Найдем подписку, назначенную на событие ПриУстановкеНовогоНомера, обработчиком которой является ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазыИОрганизации или УстановитьПрефиксОрганизации.
  3. Откроем свойство Источник данной подписки.
  4. Найдем проблемный объект метаданных и снимем с него флаг включения в подписку.
  5. Если данному документу требуется префикс только информационной базы (без учета организации), включим его в состав параллельной подписки, вызывающей процедуру УстановитьПрефиксИнформационнойБазы.

Способ 3. Добавление реквизита в метаданные объекта

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

  1. В дереве метаданных найдем проблемный документ.
  2. В ветке Реквизиты создадим новый реквизит с именем Организация.
  3. Установим тип данных СправочникСсылка.Организации.
  4. Разместим реквизит на форме документа и убедимся, что он заполняется при создании новых документов.

Способ 4. Безопасная проверка реквизита в программном коде

Если конфигурация снята с поддержки или дорабатывается, для предотвращения подобных ошибок в будущем можно модернизировать процедуру УстановитьПрефикс общего модуля, добавив предварительную проверку состава реквизитов объекта метаданных:


Если УстановитьПрефиксОрганизации Тогда
    
    // Проверяем наличие реквизита Организация у источника
    Если Источник.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
        ПрефиксОрганизации = ПолучитьФункциональнуюОпцию("ПрефиксыОрганизаций", Новый Структура("Организация", Источник.Организация));
    Иначе
        ПрефиксОрганизации = "";
    КонецЕсли;
    
    // Если функциональная опция не вернула значение
    Если ПрефиксОрганизации = Неопределено ИЛИ ТипЗнч(ПрефиксОрганизации) <> Тип("Строка") Тогда
        ПрефиксОрганизации = "";
    КонецЕсли;
    
КонецЕсли;

Такой подход защитит код от падения даже в тех случаях, когда объект без реквизита Организация случайно попадает в состав подписки префиксации.

← На главную