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

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

При выполнении процедур обновления информационной базы в конфигурациях на платформе «1С:Предприятие» (например, «Зарплата и кадры бюджетного учреждения» или «Зарплата и управление персоналом») может возникнуть критическая ошибка исполнения модуля:

{ОбщийМодуль.ПроцедурыОбновленияИнформационнойБазы.Модуль(1226)}: Поле объекта не обнаружено (а_ДокументНазначения)

Разберем подробнее, почему возникает эта ошибка и как её правильно устранить.

Выясним причину ошибки

Проанализируем участок кода, на котором происходит сбой:


Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    УсловнаяПродолжительностьДня = Выборка.ДлительностьРабочейНедели / 5;
    
    НаборЗаписейГрафики = РегистрыСведений.ГрафикиРаботыПоВидамВремени.СоздатьНаборЗаписей();
    
    Для Каждого ЭлементОтбора Из НаборЗаписейГрафики.Отбор Цикл
        ЭлементОтбора.Установить(Выборка[ЭлементОтбора.Имя]);
    КонецЦикла; 
    
    ЗаписьГрафика = НаборЗаписейГрафики.Добавить();
    ЗаполнитьЗначенияСвойств(ЗаписьГрафика, Выборка);
    // ...
КонецЦикла;

Причиной такого поведения является особенность работы платформы 1С с наборами записей регистров сведений:

  1. При вызове метода СоздатьНаборЗаписей() коллекция Отбор автоматически заполняется элементами отбора по всем измерениям регистра сведений.
  2. Если ранее в регистр сведений (в данном случае ГрафикиРаботыПоВидамВремени) доработчик добавил нетиповое измерение (например, а_ДокументНазначения), оно автоматически становится частью отбора набора записей.
  3. Типовая процедура обновления формирует запрос с явно указанным перечнем полей. Поскольку типовой код не знает о нетиповом измерении, поле а_ДокументНазначения в выборку запроса не попадает.
  4. В цикле обхода элементов отбора платформа пытается обратиться к полю выборки по имени отбора: Выборка[ЭлементОтбора.Имя]. Так как в выборке такого поля нет, возникает ошибка «Поле объекта не обнаружено».

Варианты решения проблемы

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

Способ 1. Временное добавление поля в текст запроса обновления

Если необходимо быстро пройти процесс обновления базы без изменения структуры метаданных, найдем текст запроса в процедуре ПереЗаполнитьПроизводственныйКалендарьСУчетомПереносов (модуль ПроцедурыОбновленияИнформационнойБазы) и добавим нетиповое поле в секцию ВЫБРАТЬ:


Запрос.Текст = 
"ВЫБРАТЬ
|    ГрафикиРаботыПоВидамВремени.ГрафикРаботы,
|    ГрафикиРаботыПоВидамВремени.Месяц,
|    ГрафикиРаботыПоВидамВремени.План,
|    ГрафикиРаботыПоВидамВремени.ВидУчетаВремени,
|    ГрафикиРаботыПоВидамВремени.Дата,
|    ГрафикиРаботыПоВидамВремени.а_ДокументНазначения КАК а_ДокументНазначения,
|    ...
|ИЗ
|    РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени";

После добавления поля выборка запроса будет содержать нужную колонку, и цикл установки отбора ЭлементОтбора.Установить(...) выполнится без ошибок.

Способ 2. Добавление проверки в цикл установки отбора

Для предотвращения подобных сбоев при последующих обновлениях проанализируем код цикла и добавим проверку наличия свойства в выборке с помощью блока Попытка ... Исключение или проверки колонок:


Для Каждого ЭлементОтбора Из НаборЗаписейГрафики.Отбор Цикл
    Попытка
        ЭлементОтбора.Установить(Выборка[ЭлементОтбора.Имя]);
    Исключение
        // Поле отсутствует в выборке запроса (нетиповое измерение)
    КонецПопытки;
КонецЦикла;

Способ 3. Изменение структуры регистра сведений в Конфигураторе

Если поле а_ДокументНазначения необходимо в регистре, но оно не должно участвовать в формировании уникального ключа записи (измерений):

  1. Откроем Конфигуратор и перейдем к регистру сведений ГрафикиРаботыПоВидамВремени.
  2. Перенесем реквизит а_ДокументНазначения из ветки Измерения в ветку Реквизиты или Ресурсы.
  3. Обновим конфигурацию базы данных. Реквизиты и ресурсы не создают автоматических элементов в коллекции Отбор, что полностью исключит ошибку.

Важно: Если нетиповое измерение больше не используется, его можно удалить через Конфигуратор. Чтобы найти все места использования перед удалением, воспользуйтесь командой «Поиск ссылок на объект», после чего удалите упоминания реквизита из форм, ролей и запросов.

← На главную