Почему скопированный документ в расширении выдает ошибку при проведении и как это связано с дополнительными реквизитами

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

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

Анализ проблемы: почему возникает ошибка «Поле объекта не обнаружено»

Разберем типичный сценарий: вы скопировали документ в расширение, изменили его имя (например, добавили префикс упр_), настроили формы и логику заполнения. Однако при попытке проведения система выдает ошибку: Поле объекта не обнаружено (Документ_упр_ИмяВашегоДокумента). Стек вызова указывает на общий модуль УправлениеСвойствамиСлужебный.

Проанализируем ситуацию: почему 1С обращается к подсистеме управления свойствами, если вы явно этого не просили? Выясним причину: в современных конфигурациях (ЗУП 3.1, ERP 2.5, КА) подсистема «Свойства» из состава БСП интегрирована крайне глубоко. Она использует механизм автоматического обнаружения функционала. Если в метаданных документа присутствует табличная часть с фиксированным именем ДополнительныеРеквизиты, программный код БСП автоматически классифицирует этот объект как участника механизма дополнительных реквизитов и сведений.

Рассмотрим, что происходит "под капотом": при записи документа срабатывают Подписки на события. Это внешние по отношению к вашему документу обработчики. Например, подписка ПроверитьЗначениеДополнительныхРеквизитов срабатывает для любого документа, у которого есть соответствующая структура. Внутри этой подписки вызывается поиск настроек в справочнике НаборыДополнительныхРеквизитовИСведений. Поскольку ваш новый документ имеет уникальное имя, а в справочнике для него еще нет записи, система пытается обратиться к несуществующему предопределенному элементу или ищет его по имени метаданных, что и приводит к падению.

Способ 1: Быстрое решение (удаление «магической» табличной части)

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

  1. Откроем дерево метаданных вашего документа в расширении.
  2. Найдем табличную часть ДополнительныеРеквизиты.
  3. Если данные в этой таблице вам не нужны, просто удалите ее.
  4. Если вы хотите сохранить структуру, но отключить автоматику БСП, переименуйте ее, например, в упр_ДополнительныеРеквизиты.

Как только имя табличной части перестанет совпадать с зарезервированным именем ДополнительныеРеквизиты, подписки на события БСП перестанут считать ваш документ объектом, требующим обслуживания подсистемой свойств. Это моментально устранит ошибку при проведении.

Способ 2: Полноценное внедрение подсистемы «Свойства»

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

Шаг 1. Регистрация в Определяемых типах. Чтобы подсистема понимала, что ваш документ может владеть свойствами, его необходимо добавить в расширении в следующие определяемые типы:

Шаг 2. Настройка переопределяемого модуля. Необходимо сообщить системе, что для вашего документа нужно создать набор свойств. Найдем общий модуль УправлениеСвойствамиПереопределяемый и процедуру ПриОпределенииОбъектовСДополнительнымиРеквизитами. Добавим туда наш объект:


Процедура ПриОпределенииОбъектовСДополнительнымиРеквизитами(Объекты) Экспорт
    Объекты.Добавить(Метаданные.Документы.упр_ТабельУчетаРабочегоВремени);
КонецПроцедуры

Шаг 3. Регистрация в справочнике наборов. После внесения изменений в код необходимо, чтобы в справочнике НаборыДополнительныхРеквизитовИСведений появилась соответствующая запись. Обычно это происходит автоматически при запуске процедуры обновления информационной базы. Если этого не произошло, можно вызвать процедуру программно через консоль кода или дождаться выполнения регламентного задания по обновлению параметров конфигурации.

Почему комментирование кода в модуле документа не помогает?

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

  1. Выполнение встроенных проверок платформы.
  2. Выполнение обработчиков Подписок на события (уровень конфигурации).
  3. Выполнение кода в Модуле объекта (событие ПередЗаписью, ПриЗаписи).

Поскольку подписки БСП срабатывают до того, как управление передается в модуль вашего документа, никакие Возврат; или закомментированные строки в модуле объекта не спасут от ошибки. Ошибка происходит "снаружи", в общих модулях, вызванных платформой через механизм подписок. Это подтверждает, что архитектура БСП строится на неявных связях, которые критически важно учитывать при копировании типовых объектов.

Важные замечания по копированию форм

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

Таким образом, мы выяснили, что "магия" БСП может как упрощать разработку, так и создавать неожиданные препятствия. При копировании объектов всегда обращайте внимание на состав табличных частей и их соответствие стандартам Библиотеки стандартных подсистем.

← На главную