Как исправить ошибку «Не завершен переход на новую версию» при обновлении 1С:Розница?

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

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

Не удалось обработать запись регистра "УдалитьПротоколОбменаЕГАИС"... по причине {РегистрСведений.УдалитьПротоколОбменаЕГАИС.МодульМенеджера(107)}: Ошибка при вызове метода контекста (Добавить) ХешированиеДанныхОбъект.Добавить(ТекстСообщенияXML); по причине: Несоответствие типов (Параметр номер '1')

Рассмотрим подробно причины возникновения этой нештатной ситуации и разберем практические способы её устранения.

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

Проанализируем техническую сторону проблемы. В объекте платформы ХешированиеДанных метод Добавить() принимает аргументы строго определенных типов: Строка, ДвоичныеДанные или Поток. Если в устаревшей записи регистра текст XML-сообщения оказался незаполненным (содержит значение Null или Неопределено), платформа выбрасывает исключение «Несоответствие типов».

Такая ситуация возникает из-за некорректного формирования логов при обрывах связи с ЕГАИС в старых версиях программы, а также отсутствия в обработчике обновления конфигурации проверки значения на пустоту перед вычислением хеш-суммы.

Способ 1. Ручное удаление проблемных записей регистра

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

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

После удаления битых записей все регламентные операции успешно завершаются, и статус меняется на «Все процедуры обновления выполнены успешно».

Способ 2. Автоматическая программная очистка регистра

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Протокол.ИдентификаторСессии КАК ИдентификаторСессии
    |ИЗ
    |	РегистрСведений.УдалитьПротоколОбменаЕГАИС КАК Протокол
    |ГДЕ
    |	Протокол.ТекстСообщенияXML ЕСТЬ NULL
    |	ИЛИ Протокол.ТекстСообщенияXML = ИСТИНА";

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

Пока Выборка.Следующий() Цикл
    НаборЗаписей = РегистрыСведений.УдалитьПротоколОбменаЕГАИС.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ИдентификаторСессии.Установить(Выборка.ИдентификаторСессии);
    НаборЗаписей.Записать();
КонецЦикла;

Способ 3. Исправление алгоритма через расширение конфигурации

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

Посмотрим на пример доработки модуля менеджера регистра:


&Вместо("РассчитатьХешСообщения")
Процедура Расш_РассчитатьХешСообщения(ТекстСообщенияXML, ХешСумма)
    Если ЗначениеЗаполнено(ТекстСообщенияXML) И ТипЗнч(ТекстСообщенияXML) = Тип("Строка") Тогда
        ХешированиеДанныхОбъект = Новый ХешированиеДанных(ХешФункция.MD5);
        ХешированиеДанныхОбъект.Добавить(ТекстСообщенияXML);
        ХешСумма = ХешированиеДанныхОбъект.ХешСумма;
    Иначе
        ХешСумма = "";
    КонецЕсли;
КонецПроцедуры

Способ 4. Обновление на исправленный релиз

Данный сбой является известной ошибкой релиза 2.2.7.23. Фирмой «1С» была выпущена доработка в последующих релизах (начиная с 2.2.7.29). Если процедура обновления еще не была запущена на рабочей базе, рекомендуется пропустить проблемный релиз и выполнять обновление сразу на актуальную версию конфигурации.

← На главную