Как исправить зацикливание при обновлении 1С:ERP до версии 2.5.240 при заполнении измерения "ОбъектРасчетов"?

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

При обновлении конфигурации 1С:ERP до версии 2.5.240 (или схожих версий) пользователи могут столкнуться с ошибкой зацикливания процедуры обработки данных в фоновом режиме — для решения подобных проблем есть альтернативный перенос данных для обновления 1С:ERP с 2.4 на 2.5. Эта ошибка часто проявляется при выполнении процедуры, отвечающей за заполнение измерения ОбъектРасчетов, в частности, в регистре накопления РезервыПоСомнительнымДолгам. Разберем подробнее причины возникновения этой проблемы и предложим пошаговые методы ее решения.

Суть проблемы и текст ошибки:

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

Процедура "РегистрыНакопления.РезервыПоСомнительнымДолгам.ОбработатьДанныеДляПереходаНаНовуюВерсию" обработки данных завершилась с ошибкой: Произошло зацикливание процедуры обработки данных. Выполнение прервано. {ОбщийМодуль.ОбновлениеИнформационнойБазыСлужебный.Модуль(7787)}:ВызватьИсключение ТекстИсключения; {ОбщийМодуль.ОбновлениеИнформационнойБазыСлужебный.Модуль(4218)}:ПослеЗапускаПроцедурыОбработкиДанных(КонтекстОбработчика, КонтекстОбработчика.ИмяОбработчика); {(1)}:ОбновлениеИнформационнойБазыСлужебный.ЗавершитьВыполнениеОтложенногоОбработчика(Параметры[0],Параметры[1]) ...

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

Анализируем логику обновления и возможные причины зацикливания

Для понимания проблемы, рассмотрим, как работает механизм обновления данных, особенно в части, касающейся измерения ОбъектРасчетов.

Причина 1: Превышение времени выполнения фонового задания

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

Причина 2: Ошибки в данных и логике переноса ОбъектовРасчетов

Основная причина кроется в механизме перехода на новую версию, где происходит изменение и перенос данных, связанных с ОбъектамиРасчетов. В 1С:ERP 2.5.х механизм работы с этими объектами был существенно доработан, и данные из старых реквизитов (например, УдалитьОбъектРасчетов, который является временным реквизитом для переноса) должны быть корректно преобразованы в новый реквизит ОбъектРасчетов.

Мы выясним, что процедура РегистрыНакопления.РезервыПоСомнительнымДолгам.ОбработатьДанныеДляПереходаНаНовуюВерсию играет ключевую роль. Ее задача — проанализировать существующие записи регистра, где старый объект расчетов помечен к удалению, и создать или найти соответствующий новый ОбъектРасчетов. Заглянем в код этой процедуры.

Понимание логики зацикливания:

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


Если Не ЗначениеЗаполнено(СтрокаНабора.ОбъектРасчетов)
    И ЗначениеЗаполнено(СтрокаНабора.УдалитьОбъектРасчетов)
    // ... дальнейшая логика поиска или создания ОбъектРасчетов
КонецЕсли;
// ...
Параметры.ОбработкаЗавершена = Не ОбновлениеИнформационнойБазы.ЕстьДанныеДляОбработки(Параметры.Очередь, ПолноеИмяРегистра);

Если для какой-либо записи регистра условие ЗначениеЗаполнено(СтрокаНабора.УдалитьОбъектРасчетов) истинно, но процедура по каким-то причинам не может найти или создать соответствующий ОбъектРасчетов, то условие Не ЗначениеЗаполнено(СтрокаНабора.ОбъектРасчетов) будет постоянно выполняться для этой записи. В результате, процедура не сможет пометить эту запись как обработанную и будет снова и снова пытаться ее обработать при следующем проходе, что приведет к зацикливанию.

Как система пытается сопоставить ОбъектРасчетов:

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


ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбъектыРасчетов КАК ОбъектыРасчетов
   ПО ОбъектыРасчетов.Объект                = ВТРезервы.УдалитьОбъектРасчетов
      И ОбъектыРасчетов.Организация         = ВТРезервы.Организация
      И ОбъектыРасчетов.Партнер             = ВТРезервы.Партнер
      И ОбъектыРасчетов.Контрагент          = ВТРезервы.Контрагент
      И ОбъектыРасчетов.ВалютаВзаиморасчетов = ВТРезервы.Валюта

Если по каким-либо причинам (например, из-за отсутствия всех необходимых аналитик, их некорректного заполнения или специфики типов объектов) этот запрос не может найти соответствующий элемент в справочнике ОбъектыРасчетов, то новый реквизит ОбъектРасчетов останется незаполненным, и произойдет зацикливание.

Пошаговая диагностика и методы решения

Шаг 1: Идентифицируем проблемные данные

  1. Проверьте записи регистра РезервыПоСомнительнымДолгам: Мы должны убедиться, что нет записей с пустым значением реквизита ОбъектРасчетов, но при этом заполненным УдалитьОбъектРасчетов — для исправления таких записей пригодится универсальный редактор записей регистров накопления и сведений.

    Для этого можно выполнить запрос к регистру — в этом поможет универсальная консоль запросов и редактор объектов 1С:

    
    ВЫБРАТЬ
        РезервыПоСомнительнымДолгам.Организация,
        РезервыПоСомнительнымДолгам.Партнер,
        РезервыПоСомнительнымДолгам.Контрагент,
        РезервыПоСомнительнымДолгам.Валюта,
        РезервыПоСомнительнымДолгам.ОбъектРасчетов,
        РезервыПоСомнительнымДолгам.УдалитьОбъектРасчетов
    ИЗ
        РегистрНакопления.РезервыПоСомнительнымДолгам КАК РезервыПоСомнительнымДолгам
    ГДЕ
        РезервыПоСомнительнымДолгам.ОбъектРасчетов ЕСТЬ NULL
        И РезервыПоСомнительнымДолгам.УдалитьОбъектРасчетов ЕСТЬ НЕ NULL
    

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

  2. Проверьте справочник ОбъектыРасчетов: Убедитесь, что для каждого уникального сочетания аналитик (Организация, Партнер, Контрагент, Валюта) из проблемных записей регистра существует соответствующий элемент в справочнике ОбъектыРасчетов.

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

Шаг 2: Детальный анализ логики обновления через отладчик

Если простые проверки не выявили очевидных проблем, нам потребуется более глубокий анализ:

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

  2. Перезапустите отложенное обновление: Перейдите в раздел Администрирование - Обслуживание - Результаты обновления и дополнительная обработка данных. Найдите проблемную процедуру и попробуйте ее перезапустить. Это должно активировать точку останова.

  3. Проанализируйте выполнение запроса: Особое внимание уделите моменту, когда процедура формирует запрос для поиска или создания ОбъектовРасчетов. Просмотрите параметры, передаваемые в запрос (списки типов документов, фильтры). В ходе отладки было обнаружено, что ОбъектыРасчетов заполняются только для определенных типов объектов расчетов (например, для расчетов с клиентами, но не для расчетов с покупателями, если не учтен тип "первичный документ"). Это критически важный момент.

  4. Выявите "исключенные" данные: Определите, какие конкретно записи регистра не обрабатываются корректно, и почему запрос не находит или не создает для них ОбъектРасчетов. Возможно, это связано с некорректным сопоставлением типов документов или других аналитик в условиях соединения, как было показано выше.

Шаг 3: Коррекция данных

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

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

  2. Поиск и исправление некорректных аналитик: Если проблема в том, что аналитики в регистре РезервыПоСомнительнымДолгам не соответствуют тем, по которым ищется ОбъектРасчетов, нам потребуется найти и исправить эти некорректные аналитики. Это может потребовать использования универсальной обработки по изменению реквизитов (для этого подойдёт универсальная обработка изменения реквизитов в 1С) или прямых запросов к базе данных (с крайней осторожностью и только на копии!).

  3. Учет специфических типов документов: Если, как было выявлено в обсуждении, проблема связана с тем, что обновление не учитывает определенные типы документов (например, "первичный документ" для расчетов с покупателями), нам нужно будет понять, почему эти типы исключаются из обработки. Возможно, в этих записях содержится какой-то нюанс, который мешает их сопоставлению. В таких случаях можно попробовать временно скорректировать такие записи (например, изменить тип документа на более общий, если это допустимо) для прохождения обновления, а затем вернуть исходные значения (если это безопасно). Однако, такие действия требуют максимальной осторожности и глубокого понимания бизнес-логики.

Шаг 4: Дополнительные рекомендации

  1. Актуальные патчи и обновления: Всегда проверяйте актуальность вашей версии 1С:ERP. Разработчики постоянно выпускают исправления ошибок, и возможно, для вашей проблемы уже есть готовый патч. Установите все доступные обновления и патчи перед тем, как приступать к глубокой отладке.

  2. Журнал регистрации: Внимательно изучите журнал регистрации. В нем могут содержаться более подробные сведения о том, на каком конкретном объекте или в какой момент произошел сбой или зацикливание.

  3. Контроль ссылочной целостности: В редких случаях проблемы могут быть связаны с нарушением ссылочной целостности — для их выявления и исправления поможет обработка диагностики и удаления битых ссылок в регистрах 1С. Убедитесь, что в базе нет "битых" ссылок. В некоторых случаях (очень редко и осторожно) для отладки можно временно отключить контроль ссылочной целостности для соответствующих объектов, чтобы выявить истинную причину, но это должно делаться только на тестовой копии и под полным контролем.

  4. Работа с копией базы: Всегда выполняйте все диагностические и корректирующие действия на копии рабочей информационной базы. Это позволит избежать порчи данных в рабочем контуре и безопасно экспериментировать с различными решениями.

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

← На главную