При обновлении конфигурации 1С:Бухгалтерия Предприятия 3.0 (например, с версии 3.0.58.41 на 3.0.59.43/45) многие пользователи сталкиваются с неприятной ситуацией: процесс обновления информационной базы доходит практически до самого конца (около 94%), после чего система долго зависает и выдает ошибку. При каждом последующем запуске программы появляется уведомление «Не завершен переход на новую версию», а попытки повторного запуска обработок отложенного обновления завершаются сбойным сообщением:
Процедура "УчетСтажаПФР.ВосстановитьОтсутствующиеИнтервалыВторичногоРегистра" обработки данных завершилась с ошибкой: Превышено допустимое количество запусков процедуры обновления. Выполнение прервано для предотвращения зацикливания механизма обработки данных.
Разберем подробно, почему возникает данная проблема, что происходить в этот момент в программе и как успешно завершить обновление базы данных.
Проанализируем техническую сторону вопроса. В современных конфигурациях 1С на базе Библиотеки Стандартных Подсистем (БСП) используется механизм отложенного обновления информационной базы. Он позволяет выполнять тяжелые процедуры обработки данных в фоновом режиме, не блокируя работу пользователей.
Чтобы избежать бесконечных циклов в случае сбоя алгоритма, в БСП встроен защитный механизм. Если при очередном запуске процедура обновления не может завершить обработку данных (не устанавливает флаг ОбработкаЗавершена = Истина) и выборка сбойных записей снова и снова возвращает непустой результат, БСП прерывает выполнение после превышения лимита попыток и генерирует исключение.
Рассмотрим код сбойной процедуры УчетСтажаПФР.ВосстановитьОтсутствующиеИнтервалыВторичногоРегистра:
Процедура ВосстановитьОтсутствующиеИнтервалыВторичногоРегистра(ПараметрыОбновления = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПериодыСтажаПФР.ФизическоеЛицо КАК ФизическоеЛицо,
| ДАТАВРЕМЯ(1, 1, 1) КАК Начало,
| ДАТАВРЕМЯ(1, 1, 1) КАК Окончание
|ПОМЕСТИТЬ ВТКлючиИзменившихсяДанных
|ИЗ
| РегистрСведений.ПараметрыПериодовСтажаПФР КАК ПериодыСтажаПФР
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПериодыСтажаПФР КАК ПериодыСтажаПФРПересекающие
| ПО ПериодыСтажаПФР.ГоловнаяОрганизация = ПериодыСтажаПФРПересекающие.ГоловнаяОрганизация
| И ПериодыСтажаПФР.ФизическоеЛицо = ПериодыСтажаПФРПересекающие.ФизическоеЛицо
| И ПериодыСтажаПФР.ТипДоговора = ПериодыСтажаПФРПересекающие.ТипДоговора
| И ПериодыСтажаПФР.Начало >= ПериодыСтажаПФРПересекающие.Начало;
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| ВТКлючиИзменившихсяДанных.ФизическоеЛицо КАК ФизическоеЛицо
|ИЗ
| ВТКлючиИзменившихсяДанных КАК ВТКлючиИзменившихсяДанных";
Запрос.УстановитьПараметр("ГражданскоПравовой", Перечисления.ТипыДоговоровСЗВ63.ГражданскоПравовой);
Запрос.УстановитьПараметр("НеВключаетсяВСтраховойСтаж", Перечисления.ВидыСтажаПФР2014.НеВключаетсяВСтраховойСтаж);
Запрос.УстановитьПараметр("МаксимальнаяДата", ЗарплатаКадрыПериодическиеРегистры.МаксимальнаяДата);
Если Запрос.Выполнить().Пустой() Тогда
ОбновлениеИнформационнойБазыЗарплатаКадрыБазовый.УстановитьПараметрОбновления(ПараметрыОбновления, "ОбработкаЗавершена", Истина);
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазыЗарплатаКадрыБазовый.УстановитьПараметрОбновления(ПараметрыОбновления, "ОбработкаЗавершена", Ложь);
ИзмеренияОтбора = Новый Массив;
ИзмеренияОтбора.Добавить("ФизическоеЛицо");
ОбновитьДанныеВторичногоРегистра(Запрос.МенеджерВременныхТаблиц, ИзмеренияОтбора, Истина);
КонецПроцедуры
Как видно из алгоритма, процедура опрашивает регистры сведений РегистрСведений.ПараметрыПериодовСтажаПФР и РегистрСведений.ПериодыСтажаПФР. Зацикливание происходит из-за некорректных или некоординированных кадровых данных в базе: например, когда в информационной базе присутствуют уволенные сотрудники, но кадровые документы приёма на работу по ним отсутствуют или проведения не имеют.
В результате запрос постоянно находит некорректные записи, функция ОбновитьДанныеВторичногоРегистра не может сформировать правильные интервалы, флаг ОбработкаЗавершена = Истина никогда не устанавливается, и механизм БСП принудительно прерывает выполнение обновления.
Рассмотрим несколько эффективных способов решения этой проблемы.
Выясним наиболее простой и официальный путь устранения ошибки. Фирма «1С» признала наличие этой ошибки в релизах 3.0.59.43 и 3.0.59.45 и выпустила официальное исправление.
Если нет возможности оперативно обновиться на более свежий релиз, проанализируем кадровые данные физических лиц и устраним логические нестыковки.
Как показывает практика, данная ошибка часто возникает при наличии «повисших» кадровых состояний у сотрудников (например, оформлен документ увольнения, но отсутствует проведенный документ Прием на работу).
Выполним следующие шаги:
Прием на работу, и Увольнение. Если документ приема отсутствует, создадим и проведем его соответствующей датой.Выясним, как устранить «битые» ссылки в регистрах сведений с помощью штатных средств платформы 1С.
1Cv8.1CD или через Администрирование — Выгрузить информационную базу).Очищать ссылки.После завершения тестирования откроем базу в режиме 1С:Предприятие и повторим запуск отложенных обработчиков обновления.
В ситуациях, когда запуск обновлений требуется завершить срочно, программист или администратор базы может принудительно изменить статус зависшей процедуры в регистрах системы.
Для этого можно воспользоваться консолью кода или специализированной внешней обработкой, выполнив сброс состояния ошибки:
НаборЗаписей = РегистрыСведений.ОбработчикиОбновления.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ИмяОбработчика.Установить("УчетСтажаПФР.ВосстановитьОтсутствующиеИнтервалыВторичногоРегистра");
НаборЗаписей.Прочитай();
Если НаборЗаписей.Количество() > 0 Тогда
Для Каждого Запись Из НаборЗаписей Цикл
Запись.Статус = Перечисления.СтатусыОбработчиковОбновления.Выполнена;
Запись.КоличествоЗапусков = 0;
КонецЦикла;
НаборЗаписей.Записать();
КонецЕсли;
Важно: Данный способ является крайним средством. Применение ручного сброса статуса без исправления исходных данных может привести к тому, что вторичный регистр стажа ПФР останется не полностью заполненным, что потребует повторного перерасчета стажа в будущем.
Рассмотренная ошибка связана с некорректным поведением алгоритма проверки кадровых интервалов в регистрах стажа ПФР при некорректных кадровых данных сотрудников. Оптимальным решением является обновление конфигурации 1С:Бухгалтерия 3.0 до версии 3.0.59.54 или выше, либо проверка и приведение в порядок кадровых документов (в частности, документов приёма на работу по уволенным сотрудникам).