При обновлении старых версий конфигураций 1С, таких как 1С:Розница, специалисты часто сталкиваются с ситуацией, когда процесс обновления информационной базы "зависает" на определенном этапе. Одной из наиболее распространенных ошибок является сбой в процедурах, работающих с данными за прошлые периоды. В частности, обработчик Заполнение суммы по платежным картам в отчетах о розничных продажах может вызывать фатальную ошибку, блокирующую дальнейшую работу системы.
Разберем ситуацию, когда возникает ошибка "Значение не является значением объектного типа (ОбменДанными)". Выясним причину ее появления и проанализируем пошаговый алгоритм решения проблемы через редактирование служебных данных Библиотеки Стандартных Подсистем (БСП).
Проанализируем техническую сторону сбоя. Ошибка Значение не является значением объектного типа (ОбменДанными) в процедуре ЗаполнитьПлатежныеКартыВОРП чаще всего указывает на то, что программный код пытается обратиться к свойству ОбменДанными у переменной, которая не содержит объект документа. В коде это выглядит примерно так:
ОбъектДокумента.ОбменДанными.Загрузка = Истина;
Если в базе данных существует "битая" ссылка, некорректно удаленный объект или запись в регистре без самого документа-основания, метод получения объекта возвращает Неопределено. Попытка обращения к свойству неопределенного значения приводит к аварийному завершению работы обработчика. Поскольку обновление информационной базы происходит в транзакции или в рамках жестко заданного цикла, этот сбой не позволяет системе двигаться дальше.
Прежде чем переходить к "хирургическому" вмешательству в базу данных, рассмотрим штатные возможности. Для многих типовых конфигураций 1С выпускает так называемые патчи (исправления). Рассмотрим, как проверить их наличие:
Часто в списке доступных патчей можно найти исправления именно для процедур обновления ИБ. Установка такого расширения может автоматически исправить ошибку в коде обработчика, и он завершится успешно при повторном запуске.
Если отладка на сервере невозможна, а патч отсутствует, мы можем принудительно сообщить системе, что проблемный обработчик уже "выполнен". Информация о ходе обновления в современных конфигурациях хранится в служебной константе СведенияОбОбновленииИБ. Посмотрим на структуру этого объекта: это ХранилищеЗначения, внутри которого находится ДеревоЗначений со списком всех процедур, их статусами и временем выполнения.
Рассмотрим алгоритм действий для ручной правки этого дерева:
ОбновлениеИнформационнойБазыРТ.ЗаполнитьПлатежныеКартыВОРП.Разберем пример кода, который позволяет выполнить эти манипуляции:
// 1. Извлекаем дерево значений из хранилища
ДанныеКонстанты = Константы.СведенияОбОбновленииИБ.Получить();
Если ТипЗнч(ДанныеКонстанты) = Тип("ДеревоЗначений") Тогда
ДеревоОбновления = ДанныеКонстанты;
Иначе
// Если данные сериализованы в XML (зависит от версии БСП)
ДеревоОбновления = ДанныеКонстанты.Получить();
КонецЕсли;
// 2. Ищем нужный обработчик по имени процедуры
ПараметрыПоиска = Новый Структура("ИмяПроцедуры", "ОбновлениеИнформационнойБазыРТ.ЗаполнитьПлатежныеКартыВОРП");
НайденныеСтроки = ДеревоОбновления.Строки.НайтиСтроки(ПараметрыПоиска, Истина);
Для Каждого СтрокаОбработчика Из НайденныеСтроки Цикл
// 3. Устанавливаем статус завершения
// В разных версиях БСП статус может быть строкой "Выполнено" или значением перечисления
СтрокаОбработчика.Статус = "Выполнено";
Сообщить("Статус обработчика успешно изменен!");
КонецЦикла;
// 4. Записываем изменения обратно в систему
Константы.СведенияОбОбновленииИБ.Установить(Новый ХранилищеЗначения(ДеревоОбновления));
Проанализируем структуру колонок в константе СведенияОбОбновленииИБ. В зависимости от версии Библиотеки Стандартных Подсистем, колонки могут называться по-разному. Обычно это:
Посмотрим на ситуацию, если база не дает записать константу из-за того, что она "заблокирована" текущим процессом обновления. В этом случае может потребоваться запуск системы в монопольном режиме или использование параметра запуска /C ЗапуститьОбновлениеИнформационнойБазы после внесения правок.
Выясним, насколько опасно просто "пропустить" заполнение данных. Конкретный обработчик ЗаполнитьПлатежныеКартыВОРП отвечает за перенос информации об эквайринговых операциях в новые структуры данных. Если вы пропустите его:
Таким образом, мы рассмотрели механизм обхода критической ошибки обновления. Использование программной правки константы СведенияОбОбновленииИБ является эффективным инструментом в руках администратора или программиста 1С, когда типовые методы исправления данных не помогают.