Как исправить ошибку «Метод объекта не обнаружен (ЗаполнитьВидДоговораВКадровомУчетеСотрудников)» при обновлении 1С:ЗУП?

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

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

Метод объекта не обнаружен (ЗаполнитьВидДоговораВКадровомУчетеСотрудников)
КадровыйУчетРасширенный.ЗаполнитьВидДоговораВКадровомУчетеСотрудников(Параметры[0])

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

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

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

  1. Рефакторинг кода в типовом решении: Разработчики конфигурации переместили метод ЗаполнитьВидДоговораВКадровомУчетеСотрудников из общего модуля КадровыйУчетРасширенный в модуль КонтрактыДоговорыСотрудников. Однако в процедуре регистрации очереди обновлений (ПриДобавленииОбработчиковОбновления) или в таблице соответствия для накопительных релизов сохранилась старая ссылка на предыдущий модуль.
  2. Переход через промежуточные релизы: Несмотря на то что файл манифеста обновления UpdInfo.txt официально разрешает прямой переход с версии 3.1.2.94 на 3.1.2.105, механизм БСП накапливает список всех ранее не выполненных обработчиков данных. При пошаговой установке релизов этот обработчик мог отработать еще до переноса процедуры, но при «прыжке» через релиз система пытается вызвать старый метод в новой конфигурации, где его уже физически нет по указанному пути.
  3. Ограничения платформы 1С:Предприятие 8.3.9: Попытка оперативно перехватить вызов общего модуля через механизм расширений конфигурации не срабатывает. В платформе ветки 8.3.9 отсутствуют аннотации перехвата методов (&Вместо, &ИзменениеИКонтроль появились только в 8.3.10), а также проявляются платформенные сбои при добавлении расширений при определенных режимах совместимости.

Рассмотрим несколько практических способов устранения данной проблемы.

Способ 1. Корректировка очереди обработчиков через режим отладки или внешнюю обработку

Список отложенных обработчиков обновления информационной базы формируется процедурой ОбновлениеИнформационнойБазыСлужебный.СформироватьСписокОтложенныхОбработчиковОбновления() и сохраняется в специальной константе СведенияОбОбновленииИБ, имеющей тип ХранилищеЗначения.

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

  1. Открываем базу в режиме отладки или создаем внешнюю обработку (запускаемую с административными правами без безопасного режима).
  2. Считываем структуру из константы СведенияОбОбновленииИБ. Внутри хранилища содержатся коллекции: ДеревоОбработчиков и ПланОбработчиков (или список очередей).
  3. Находим строку проблемного обработчика, содержащую вызов КадровыйУчетРасширенный.ЗаполнитьВидДоговораВКадровомУчетеСотрудников.
  4. Заменяем имя общего модуля на актуальное: КонтрактыДоговорыСотрудников.ЗаполнитьВидДоговораВКадровомУчетеСотрудников, либо выполняем процедуру вручную и меняем статус обработчика на завершенный («Выполнен»).
  5. Перезаписываем константу обновленными данными и повторно запускаем процедуру обновления через меню «Администрирование» — «Поддержка и обслуживание» — «Отложенное обновление ИБ».

Посмотрим на пример программного кода для внешней обработки, позволяющей выполнить перенаправление вызова:


// Извлекаем сохраненные данные обновления
ЗначениеХранилища = Константы.СведенияОбОбновленииИБ.Получить();
СтруктураОбновления = ЗначениеХранилища.Получить();

// Ищем и корректируем имя процедуры в дереве обработчиков
Если СтруктураОбновления.Свойство("ДеревоОбработчиков") Тогда
    Для Каждого СтрокаДерева Из СтруктураОбновления.ДеревоОбработчиков.Строки Цикл
        Для Каждого ПодчиненнаяСтрока Из СтрокаДерева.Строки Цикл
            Если ПодчиненнаяСтрока.ИмяОбработчика = "КадровыйУчетРасширенный.ЗаполнитьВидДоговораВКадровомУчетеСотрудников" Тогда
                ПодчиненнаяСтрока.ИмяОбработчика = "КонтрактыДоговорыСотрудников.ЗаполнитьВидДоговораВКадровомУчетеСотрудников";
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецЕсли;

// Фиксируем изменения в константе
Константы.СведенияОбОбновленииИБ.Установить(Новый ХранилищеЗначения(СтруктураОбновления));

Способ 2. Временное снятие с поддержки с возвратом типового файла конфигурации

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

  1. Выгружаем текущую конфигурацию в файл (меню «Конфигурация» — «Сохранить конфигурацию в файл...», сохраняем файл dump.cf).
  2. Включаем возможность изменения конфигурации через «Конфигурация» — «Поддержка» — «Настройка поддержки».
  3. Находим в модуле КадровыйУчетРасширенный место, где должен быть метод, либо создаем там экспортную заглушку-перенаправитель:
    
    Процедура ЗаполнитьВидДоговораВКадровомУчетеСотрудников(Параметры) Экспорт
        КонтрактыДоговорыСотрудников.ЗаполнитьВидДоговораВКадровомУчетеСотрудников(Параметры);
    КонецПроцедуры
    
  4. Обновляем конфигурацию базы данных (клавиша F7) и запускаем «1С:Предприятие». Дожидаемся успешного завершения всех регламентных и отложенных процедур обновления.
  5. Возвращаем исходный статус конфигурации поставщика: через «Конфигурация» — «Загрузить конфигурацию из файла...» выбираем ранее сохраненный dump.cf без объединения. Все изменения откатятся, а конфигурация вновь окажется на полной типовой поддержке без признаков модификации.

Способ 3. Последовательное обновление через цепочку релизов

Если база небольшая и есть доступ к промежуточным дистрибутивам обновлений, рекомендуется восстановить копию информационной базы до релиза 3.1.2.94 и выполнить обновление последовательно по всем опубликованным релизам цепочки (например, последовательно накатывая каждый промежуточный cfu-файл).

Важное правило: при каждом шаге обновления необходимо запускать режим «1С:Предприятие» и дожидаться полного завершения процедуры «Отложенное обновление ИБ» до перехода к следующей версии конфигурации. Это исключит наслоение устаревших обработчиков данных.

Способ 4. Переход на более свежий релиз конфигурации

Ошибки подобного рода разработчики 1С исправляют в последующих сборках (например, в релизах 3.1.2.119 и выше). Если в организации нет жесткого требования зафиксироваться именно на релизе 3.1.2.105, оптимальным решением будет накатить следующий актуальный релиз, где вызовы модуля КадровыйУчетРасширенный уже заменены разработчиками на модуль КонтрактыДоговорыСотрудников на уровне конфигуратора.

← На главную