При переходе конфигурации 1С:Зарплата и управление персоналом на новый релиз (в частности, при обновлении с версии 3.1.2.94 на 3.1.2.105) на этапе фонового или интерактивного дообновления данных в режиме «1С:Предприятие» может возникнуть критическая ошибка:
Метод объекта не обнаружен (ЗаполнитьВидДоговораВКадровомУчетеСотрудников)
КадровыйУчетРасширенный.ЗаполнитьВидДоговораВКадровомУчетеСотрудников(Параметры[0])
Разберем подробнее, почему возникает данная коллизия и какими способами можно завершить обновление информационной базы с сохранением целостности данных и типовой поддержки конфигурации.
Проанализируем архитектуру процедуры обновления конфигураций, построенных на базе Библиотеки стандартных подсистем (БСП). Ошибка возникает по следующим причинам:
ЗаполнитьВидДоговораВКадровомУчетеСотрудников из общего модуля КадровыйУчетРасширенный в модуль КонтрактыДоговорыСотрудников. Однако в процедуре регистрации очереди обновлений (ПриДобавленииОбработчиковОбновления) или в таблице соответствия для накопительных релизов сохранилась старая ссылка на предыдущий модуль.UpdInfo.txt официально разрешает прямой переход с версии 3.1.2.94 на 3.1.2.105, механизм БСП накапливает список всех ранее не выполненных обработчиков данных. При пошаговой установке релизов этот обработчик мог отработать еще до переноса процедуры, но при «прыжке» через релиз система пытается вызвать старый метод в новой конфигурации, где его уже физически нет по указанному пути.&Вместо, &ИзменениеИКонтроль появились только в 8.3.10), а также проявляются платформенные сбои при добавлении расширений при определенных режимах совместимости.Рассмотрим несколько практических способов устранения данной проблемы.
Список отложенных обработчиков обновления информационной базы формируется процедурой ОбновлениеИнформационнойБазыСлужебный.СформироватьСписокОтложенныхОбработчиковОбновления() и сохраняется в специальной константе СведенияОбОбновленииИБ, имеющей тип ХранилищеЗначения.
Чтобы не снимать конфигурацию с поддержки, скорректируем данные очереди напрямую в информационной базе. Разберем алгоритм решения:
СведенияОбОбновленииИБ. Внутри хранилища содержатся коллекции: ДеревоОбработчиков и ПланОбработчиков (или список очередей).КадровыйУчетРасширенный.ЗаполнитьВидДоговораВКадровомУчетеСотрудников.КонтрактыДоговорыСотрудников.ЗаполнитьВидДоговораВКадровомУчетеСотрудников, либо выполняем процедуру вручную и меняем статус обработчика на завершенный («Выполнен»).Посмотрим на пример программного кода для внешней обработки, позволяющей выполнить перенаправление вызова:
// Извлекаем сохраненные данные обновления
ЗначениеХранилища = Константы.СведенияОбОбновленииИБ.Получить();
СтруктураОбновления = ЗначениеХранилища.Получить();
// Ищем и корректируем имя процедуры в дереве обработчиков
Если СтруктураОбновления.Свойство("ДеревоОбработчиков") Тогда
Для Каждого СтрокаДерева Из СтруктураОбновления.ДеревоОбработчиков.Строки Цикл
Для Каждого ПодчиненнаяСтрока Из СтрокаДерева.Строки Цикл
Если ПодчиненнаяСтрока.ИмяОбработчика = "КадровыйУчетРасширенный.ЗаполнитьВидДоговораВКадровомУчетеСотрудников" Тогда
ПодчиненнаяСтрока.ИмяОбработчика = "КонтрактыДоговорыСотрудников.ЗаполнитьВидДоговораВКадровомУчетеСотрудников";
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
// Фиксируем изменения в константе
Константы.СведенияОбОбновленииИБ.Установить(Новый ХранилищеЗначения(СтруктураОбновления));
Если нет возможности выполнять программную отладку константы, воспользуемся классическим методом временной модификации кода конфигурации:
dump.cf).КадровыйУчетРасширенный место, где должен быть метод, либо создаем там экспортную заглушку-перенаправитель:
Процедура ЗаполнитьВидДоговораВКадровомУчетеСотрудников(Параметры) Экспорт
КонтрактыДоговорыСотрудников.ЗаполнитьВидДоговораВКадровомУчетеСотрудников(Параметры);
КонецПроцедуры
dump.cf без объединения. Все изменения откатятся, а конфигурация вновь окажется на полной типовой поддержке без признаков модификации.Если база небольшая и есть доступ к промежуточным дистрибутивам обновлений, рекомендуется восстановить копию информационной базы до релиза 3.1.2.94 и выполнить обновление последовательно по всем опубликованным релизам цепочки (например, последовательно накатывая каждый промежуточный cfu-файл).
Важное правило: при каждом шаге обновления необходимо запускать режим «1С:Предприятие» и дожидаться полного завершения процедуры «Отложенное обновление ИБ» до перехода к следующей версии конфигурации. Это исключит наслоение устаревших обработчиков данных.
Ошибки подобного рода разработчики 1С исправляют в последующих сборках (например, в релизах 3.1.2.119 и выше). Если в организации нет жесткого требования зафиксироваться именно на релизе 3.1.2.105, оптимальным решением будет накатить следующий актуальный релиз, где вызовы модуля КадровыйУчетРасширенный уже заменены разработчиками на модуль КонтрактыДоговорыСотрудников на уровне конфигуратора.