Как пропустить сбойный обработчик обновления в 1С:Розница

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

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

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

Причина возникновения ошибки

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

ОбъектДокумента.ОбменДанными.Загрузка = Истина;

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

Способ 1: Использование расширений и патчей

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

  1. Перейдем в раздел Администрирование — Обслуживание.
  2. Выберем пункт Обновление программы, а затем Установленные исправления (патчи).
  3. Если база подключена к интернет-поддержке, система предложит автоматически загрузить исправления для текущего релиза.

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

Способ 2: Программное изменение статуса обработчика

Если отладка на сервере невозможна, а патч отсутствует, мы можем принудительно сообщить системе, что проблемный обработчик уже "выполнен". Информация о ходе обновления в современных конфигурациях хранится в служебной константе СведенияОбОбновленииИБ. Посмотрим на структуру этого объекта: это ХранилищеЗначения, внутри которого находится ДеревоЗначений со списком всех процедур, их статусами и временем выполнения.

Рассмотрим алгоритм действий для ручной правки этого дерева:

  1. Создадим внешнюю обработку.
  2. На форме разместим команду, которая будет извлекать дерево из константы.
  3. Найдем строку со сбойным обработчиком ОбновлениеИнформационнойБазыРТ.ЗаполнитьПлатежныеКартыВОРП.
  4. Изменим его статус на "Выполнено".
  5. Запишем дерево обратно в константу.

Разберем пример кода, который позволяет выполнить эти манипуляции:


// 1. Извлекаем дерево значений из хранилища
ДанныеКонстанты = Константы.СведенияОбОбновленииИБ.Получить();
Если ТипЗнч(ДанныеКонстанты) = Тип("ДеревоЗначений") Тогда
    ДеревоОбновления = ДанныеКонстанты;
Иначе
    // Если данные сериализованы в XML (зависит от версии БСП)
    ДеревоОбновления = ДанныеКонстанты.Получить(); 
КонецЕсли;

// 2. Ищем нужный обработчик по имени процедуры
ПараметрыПоиска = Новый Структура("ИмяПроцедуры", "ОбновлениеИнформационнойБазыРТ.ЗаполнитьПлатежныеКартыВОРП");
НайденныеСтроки = ДеревоОбновления.Строки.НайтиСтроки(ПараметрыПоиска, Истина);

Для Каждого СтрокаОбработчика Из НайденныеСтроки Цикл
    // 3. Устанавливаем статус завершения
    // В разных версиях БСП статус может быть строкой "Выполнено" или значением перечисления
    СтрокаОбработчика.Статус = "Выполнено"; 
    Сообщить("Статус обработчика успешно изменен!");
КонецЦикла;

// 4. Записываем изменения обратно в систему
Константы.СведенияОбОбновленииИБ.Установить(Новый ХранилищеЗначения(ДеревоОбновления));

Нюансы работы с деревом значений БСП

Проанализируем структуру колонок в константе СведенияОбОбновленииИБ. В зависимости от версии Библиотеки Стандартных Подсистем, колонки могут называться по-разному. Обычно это:

Посмотрим на ситуацию, если база не дает записать константу из-за того, что она "заблокирована" текущим процессом обновления. В этом случае может потребоваться запуск системы в монопольном режиме или использование параметра запуска /C ЗапуститьОбновлениеИнформационнойБазы после внесения правок.

Анализ рисков при пропуске обработчика

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

Таким образом, мы рассмотрели механизм обхода критической ошибки обновления. Использование программной правки константы СведенияОбОбновленииИБ является эффективным инструментом в руках администратора или программиста 1С, когда типовые методы исправления данных не помогают.

← На главную