Как исправить ошибку «Значение не является значением объектного типа (ДанныеОбработчика)» при обновлении 1С в клиент-серверном режиме?

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

В процессе технического сопровождения и обновления крупных программных продуктов на платформе 1С:Предприятие 8.3 специалисты часто сталкиваются со скрытыми системными сбоями. Одним из наиболее неприятных и неочевидных является сбой при переходе на новые релизы конфигураций, использующих Библиотеку стандартных подсистем (БСП). Яркий пример — обновление конфигурации «1С:Управление торговлей» (УТ) с релиза 11.4.3.172 на 11.4.5.41 (или смежные релизы, такие как 11.4.5.24, 11.4.5.32, 11.4.5.63), а также аналогичные проблемы в «1С:Зарплата и управление персоналом» (ЗУП) версии 3.1.

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

{ОбщийМодуль.ОбновлениеИнформационнойБазыСлужебный.Модуль(2696)}: Значение не является значением объектного типа (ДанныеОбработчика) СведенияОбОбновлении.ОбрабатываемыеДанные.Вставить(ОписаниеПроцедуры.ИмяОбработчика, Результат.ДанныеОбработчика);

В этой статье мы подробно проанализируем внутренние механизмы платформы, приводящие к данной ошибке, разберем причины её проявления исключительно в клиент-серверном варианте работы и рассмотрим пошаговые методы устранения этой проблемы.

---

Выясняем техническую причину сбоя

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

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


Результат = ПолучитьИзВременногоХранилища(АдресРезультата);
СведенияОбОбновлении.ОбрабатываемыеДанные.Вставить(ОписаниеПроцедуры.ИмяОбработчика, Результат.ДанныеОбработчика);

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

Причиной является критический баг конкретных релизов платформы 1С (в частности, крайне популярного в свое время релиза 8.3.13.1513). В этой версии платформы была допущена ошибка сериализации и передачи данных во временном хранилище между фоновыми заданиями и основным сеансом в клиент-серверном (SQL) режиме работы. Данные, помещенные в хранилище в рамках одного рабочего процесса сервера rphost, бесследно исчезают или не могут быть корректно десериализованы другим рабочим процессом, выполняющим родительский сеанс обновления.

---

Почему ошибка не воспроизводится в файловом режиме?

Многие специалисты замечают интересную особенность: при выгрузке информационной базы в файл .dt и последующем развертывании её на локальном компьютере в файловом варианте обновление проходит абсолютно штатно и без единой ошибки.

Давайте проанализируем ситуацию. В файловом режиме работы все вызовы, включая эмуляцию фоновых и регламентных заданий, выполняются в рамках единого адресного пространства одного клиентского процесса (или локального dbgs/thst). В такой архитектуре механизмы обращения к временному хранилищу работают без межпроцессного взаимодействия, поэтому баг с очисткой данных в памяти не проявляется. В то же время на сервере приложений 1С:Предприятие под управлением СУБД MS SQL Server или PostgreSQL задачи распределяются между пулом процессов rphost, что и провоцирует проявление платформенного дефекта.

---

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

---

Решение 1. Изменение версии платформы (Рекомендуемый способ)

Поскольку корень проблемы лежит исключительно в плоскости платформенного бага версии 8.3.13.1513, наиболее правильным и безопасным решением является обновление или откат технологической платформы 1С на стабильный релиз.

Разберем этот процесс по шагам:

  1. Откат на стабильную ветку 8.3.12: Как показывает практика реальных внедрений, переход на версию платформы 8.3.12.1685 полностью решает проблему. На этой платформе обновление конфигураций УТ 11.4 и ЗУП 3.1 проходит стабильно, а также исчезают сопутствующие ошибки (например, спонтанная «Ошибка формата потока»).
  2. Обновление на актуальную версию 8.3.14 или выше: Если ваша конфигурация требует более современных возможностей или вы не хотите откатываться назад, выполните установку стабильных сборок из веток 8.3.14, 8.3.15 или выше. В этих версиях механизм обмена данными через временное хранилище в кластере серверов был полностью переработан и исправлен.
  3. После установки новой версии платформы на сервере приложений обязательно перезапустите службу Агент сервера 1С:Предприятия.

---

Решение 2. Обходной путь через файловую базу (Для небольших баз)

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

Рассмотрим этот алгоритм подробнее:

  1. Выполните резервное копирование текущей клиент-серверной базы данных.
  2. Выгрузите информационную базу в файл данных (администрирование -> Выгрузить информационную базу в .dt).
  3. Создайте пустую файловую базу на локальном диске вашего компьютера или быстром SSD-накопителе сервера.
  4. Загрузите ранее выгруженный файл .dt в созданную файловую базу.
  5. Запустите режим конфигуратора и выполните обновление до целевого релиза конфигурации (в нашем случае с УТ 11.4.3.172 до 11.4.5.41). При первом запуске в режиме «1С:Предприятие» подтвердите легальность получения обновлений и дождитесь полного завершения всех отложенных обработчиков обновления.
  6. После успешного завершения всех процедур снова зайдите в конфигуратор файловой базы и выгрузите её в новый файл .dt.
  7. Загрузите этот файл обратно в вашу рабочую клиент-серверную базу SQL.

Важное примечание: Этот метод не подходит для баз данных объемом более 20–30 гигабайт, так как процесс выгрузки и загрузки .dt может занимать от 6 до 10 часов, что неприемлемо в условиях жесткого регламента обслуживания.

---

Решение 3. Пропуск «проблемных» релизов при обновлении

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

Например, вместо цепочки обновлений:

11.4.3.172 -> 11.4.5.24 -> 11.4.5.41 -> 11.4.5.63

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

---

Решение 4. Обход ошибки в коде конфигурации (Для разработчиков)

Если вы ограничены жесткими рамками администрирования (например, запрещено менять версию платформы на сервере компании, а база слишком велика для файлового режима), проблему можно решить точечным изменением программного кода БСП.

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

Разберем этот процесс по шагам:

  1. Откройте конфигуратор вашей базы данных, перейдите в меню «Конфигурация» -> «Поддержка» -> «Настройка поддержки» и включите возможность изменения конфигурации.
  2. Найдите общий модуль ОбновлениеИнформационнойБазыСлужебный.
  3. Перейдите к строке, содержащей следующий код:
    
    СведенияОбОбновлении.ОбрабатываемыеДанные.Вставить(ОписаниеПроцедуры.ИмяОбработчика, Результат.ДанныеОбработчика);
    
  4. Замените эту строку безопасной конструкцией, которая проверяет значение переменной Результат на равенство Неопределено перед обращением к свойствам объекта:
    
    Если Результат <> Неопределено Тогда
        СведенияОбОбновлении.ОбрабатываемыеДанные.Вставить(ОписаниеПроцедуры.ИмяОбработчика, Результат.ДанныеОбработчика);
    Иначе
        // Логируем пропущенный обработчик или записываем пустое значение
        ЗаписьЖурналаРегистрации("ОбновлениеИБ.Предупреждение",
            УровеньЖурналаРегистрации.Предупреждение,,,
            "Не удалось получить данные обработчика для: " + ОписаниеПроцедуры.ИмяОбработчика);
    КонецЕсли;
    
  5. Сохраните изменения в конфигурации базы данных (клавиша F7) и запустите процесс обновления.

Этот временный код позволит платформе пропустить сбойный шаг, успешно завершить обновление структуры метаданных и открыть базу для пользователей. После этого вы сможете вернуть исходный код поставщика, а «потерянные» отложенные обработчики запустить вручную через встроенную обработку «Результаты обновления программы» (раздел «Администрирование» -> «Обслуживание» -> «Обновление программы»).

---

Решение 5. Очистка серверного кэша и сброс константы обновления

Иногда даже после смены платформы база продолжает выдавать ту же ошибку. Это происходит из-за того, что некорректные («битые») данные уже записались в системную константу СведенияОбОбновлении, а старый кэш конфигурации остался в памяти сервера приложений.

В такой ситуации выполните следующие действия:

  1. Остановите службу сервера 1С:Предприятие.
  2. Перейдите в каталог временных файлов сервера (по умолчанию это путь вида C:\Program Files\1cv8\srvinfo\reg_1541\...) и полностью очистите папки серверного кэша (каталоги с длинными буквенно-цифровыми именами вроде snccntry).
  3. Запустите службу сервера заново.
  4. Если база по-прежнему выдает ошибку при входе, воспользуйтесь внешней обработкой для очистки константы обновления. Код для очистки в консоли кода выглядит следующим образом:
    
    Константы.СведенияОбОбновленииИнформационнойБазы.Установить(Новый ХранилищеЗначения(Неопределено));
    
    После очистки константы система заново инициирует проверку и заполнение структуры обработчиков «с чистого листа», что позволит избежать повторного падения по старым «следам» ошибки.

---

Резюме

Мы проанализировали системную ошибку обновления, возникающую из-за нестабильной работы платформы 1С версии 8.3.13.1513 с временным хранилищем в клиент-серверном режиме СУБД. При планировании обновлений конфигураций УТ 11 и ЗУП 3 всегда закладывайте время на предварительное тестирование процесса на тестовых копиях баз данных и своевременно обновляйте технологическую платформу 1С до рекомендованных стабильных версий.

← На главную