При выполнении обновления конфигурации 1С:Розница (в частности, при переходе с релиза 2.2.6.33 на 2.2.7.23 и смежные версии) администраторы и пользователи часто сталкиваются с ситуацией, когда при запуске программы в обычном режиме появляется окно «Не завершен переход на новую версию». В списке результатов обновления фоновые процедуры зависают со статусом «Выполняется», а в техническом логе фиксируется следующее исключение:
Не удалось обработать запись регистра "УдалитьПротоколОбменаЕГАИС"... по причине {РегистрСведений.УдалитьПротоколОбменаЕГАИС.МодульМенеджера(107)}: Ошибка при вызове метода контекста (Добавить) ХешированиеДанныхОбъект.Добавить(ТекстСообщенияXML); по причине: Несоответствие типов (Параметр номер '1')
Рассмотрим подробно причины возникновения этой нештатной ситуации и разберем практические способы её устранения.
Проанализируем техническую сторону проблемы. В объекте платформы ХешированиеДанных метод Добавить() принимает аргументы строго определенных типов: Строка, ДвоичныеДанные или Поток. Если в устаревшей записи регистра текст XML-сообщения оказался незаполненным (содержит значение Null или Неопределено), платформа выбрасывает исключение «Несоответствие типов».
Такая ситуация возникает из-за некорректного формирования логов при обрывах связи с ЕГАИС в старых версиях программы, а также отсутствия в обработчике обновления конфигурации проверки значения на пустоту перед вычислением хеш-суммы.
Рассмотрим наиболее простой и быстрый алгоритм решения задачи, не требующий снятия конфигурации с поддержки.
УдалитьПротоколОбменаЕГАИС.(не используется) Протокол обмена с ЕГАИС (через окно «Все функции» или «Функции для специалиста»).После удаления битых записей все регламентные операции успешно завершаются, и статус меняется на «Все процедуры обновления выполнены успешно».
Если битых записей много и искать их вручную через журнал регистрации долго, выполним программную очистку через внешнюю обработку. Проанализируем пример кода для поиска и удаления коррелирующих записей с незаполненным текстом XML:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Протокол.ИдентификаторСессии КАК ИдентификаторСессии
|ИЗ
| РегистрСведений.УдалитьПротоколОбменаЕГАИС КАК Протокол
|ГДЕ
| Протокол.ТекстСообщенияXML ЕСТЬ NULL
| ИЛИ Протокол.ТекстСообщенияXML = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыСведений.УдалитьПротоколОбменаЕГАИС.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ИдентификаторСессии.Установить(Выборка.ИдентификаторСессии);
НаборЗаписей.Записать();
КонецЦикла;
Если удаление исторических данных недопустимо, переопределим поведение модуля с помощью расширения конфигурации. Добавим проверку типа переменной перед вызовом метода ХешированиеДанных.
Посмотрим на пример доработки модуля менеджера регистра:
&Вместо("РассчитатьХешСообщения")
Процедура Расш_РассчитатьХешСообщения(ТекстСообщенияXML, ХешСумма)
Если ЗначениеЗаполнено(ТекстСообщенияXML) И ТипЗнч(ТекстСообщенияXML) = Тип("Строка") Тогда
ХешированиеДанныхОбъект = Новый ХешированиеДанных(ХешФункция.MD5);
ХешированиеДанныхОбъект.Добавить(ТекстСообщенияXML);
ХешСумма = ХешированиеДанныхОбъект.ХешСумма;
Иначе
ХешСумма = "";
КонецЕсли;
КонецПроцедуры
Данный сбой является известной ошибкой релиза 2.2.7.23. Фирмой «1С» была выпущена доработка в последующих релизах (начиная с 2.2.7.29). Если процедура обновления еще не была запущена на рабочей базе, рекомендуется пропустить проблемный релиз и выполнять обновление сразу на актуальную версию конфигурации.