При проведении документов или записи новых объектов в конфигурациях на платформе 1С:Предприятие разработчики и администраторы могут столкнуться с аварийным завершением операции. В окне сообщения выводится ошибка: Ошибка при выполнении обработчика — 'ПриУстановкеНовогоНомера' по причине: {ОбщийМодуль.ПрефиксацияОбъектовСобытия.Модуль(77)}: Поле объекта не обнаружено (Организация).
Разберем детально, почему возникает данная исключительная ситуация, к каким негативным последствиям приводит некорректное «лечение» проблемы и как правильно настроить метаданные и программный код конфигурации.
Проанализируем типовой код общего модуля подсистемы префиксации. При автонумерации документов и справочников система вызывает обработчики подписок на события, например УстановитьПрефиксИнформационнойБазыИОрганизации или УстановитьПрефиксОрганизации. Внутри вызывается служебная процедура формирования префикса:
Если УстановитьПрефиксОрганизации Тогда
ПрефиксОрганизации = ПолучитьФункциональнуюОпцию("ПрефиксыОрганизаций", Новый Структура("Организация", Источник.Организация));
Если ПрефиксОрганизации = Неопределено Тогда
ПрефиксОрганизации = "";
ИначеЕсли ТипЗнч(ПрефиксОрганизации) <> Тип("Строка") Тогда
ПрефиксОрганизации = "";
КонецЕсли;
КонецЕсли;
Параметр Источник представляет собой ссылку на записываемый объект (документ, справочник и т. д.). Процедура напрямую обращается к свойству Источник.Организация. Если у объекта, для которого генерируется номер, в структуре метаданных отсутствует реквизит шапки Организация, платформа генерирует исключение «Поле объекта не обнаружено».
Событие ПриУстановкеНовогоНомера возникает при первой записи объекта, если номер ему не был присвоен, либо при явном вызове метода УстановитьНовыйНомер(). Нередко проведение одного документа инициирует создание и проведение вспомогательного служебного документа (например, корректировки регистров или движений), не имеющего организации в реквизитах, что и приводит к сбою проведения основного документа.
Иногда встречается ошибочное решение: снять все флажки выполнения (Сервер, Клиент и др.) со сбойного общего модуля. Снятие признаков выполнения модуля действительно прекратит вызов ошибки, однако полностью разрушит логику нумерации в информационной базе:
Прежде чем вносить изменения, выясним точный тип объекта, вызывающего исключение. Для этого выполним следующие действия:
Источник.Метаданные().ПолноеИмя()
Результат покажет точное имя объекта (например, Документ.СлужебнаяКорректировка), у которого отсутствует требуемый реквизит.
В типовых конфигурациях и библиотеке стандартных подсистем (БСП) подписки на события нумерации строго разделены по назначению. Разберем по шагам, как исправить состав подписки:
ПриУстановкеНовогоНомера, обработчиком которой является ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазыИОрганизации или УстановитьПрефиксОрганизации.УстановитьПрефиксИнформационнойБазы.Если проблемный документ концептуально должен нумероваться с учетом организации предприятия, проверим структуру его реквизитов. Разберем порядок добавления:
Организация.СправочникСсылка.Организации.Если конфигурация снята с поддержки или дорабатывается, для предотвращения подобных ошибок в будущем можно модернизировать процедуру УстановитьПрефикс общего модуля, добавив предварительную проверку состава реквизитов объекта метаданных:
Если УстановитьПрефиксОрганизации Тогда
// Проверяем наличие реквизита Организация у источника
Если Источник.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
ПрефиксОрганизации = ПолучитьФункциональнуюОпцию("ПрефиксыОрганизаций", Новый Структура("Организация", Источник.Организация));
Иначе
ПрефиксОрганизации = "";
КонецЕсли;
// Если функциональная опция не вернула значение
Если ПрефиксОрганизации = Неопределено ИЛИ ТипЗнч(ПрефиксОрганизации) <> Тип("Строка") Тогда
ПрефиксОрганизации = "";
КонецЕсли;
КонецЕсли;
Такой подход защитит код от падения даже в тех случаях, когда объект без реквизита Организация случайно попадает в состав подписки префиксации.