Как исправить ошибку «Значение не является значением объектного типа (Получить)» при входе в 1С:ЗУП?

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

При запуске информационной базы 1С:Зарплата и Управление Персоналом (или других конфигураций на базе Библиотеки стандартных подсистем) пользователи могут столкнуться с аварийным завершением работы. В окне ошибки выводится сообщение следующего вида: {ОбщийМодуль.ОбновлениеИнформационнойБазыСлужебныйПовтИсп.Модуль(51)}: Значение не является значением объектного типа (Получить), а проблемная строка выглядит так: Параметры = Константы[ИмяКонстанты].Получить().Получить();.

Разберем детально, почему возникает данный сбой и какими способами можно восстановить работоспособность информационной базы.

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

Проанализируем программный код, вызвавший исключение. Конструкция вида Константы[ИмяКонстанты].Получить().Получить() использует так называемое двойное разыменование:

  1. Первый вызов метода Получить() обращается к объекту метаданных КонстантаМенеджер и считывает текущее значение из базы данных. Для служебных констант БСП этим значением является объект типа ХранилищеЗначения.
  2. Второй вызов метода Получить() применяется уже непосредственно к объекту ХранилищеЗначения, чтобы извлечь из него упакованные данные (как правило, структуру параметров работы программы).

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

Выделим основные причины, почему константа оказывается пустой:

  1. Пропуск промежуточных релизов: обновление конфигурации было выполнено через несколько версий сразу, в результате чего пропустились промежуточные обработчики обновления, создающие и заполняющие системные константы.
  2. Некорректный способ обновления: объединение конфигураций выполнялось через меню «Сравнить и объединить с конфигурацией из файла» вместо штатного обновления через поддержку.
  3. Ошибки в релизах БСП: в коде некоторых версий разработчики не предусмотрели явную проверку на Неопределено перед чтением хранилища.
  4. Повреждение кэша метаданных: платформа обращается к некорректным закэшированным структурам данных.

Способ 1. Программная инициализация служебных констант

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

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


ИмяКонстанты = "ПараметрыРаботыПрограммы";
Константы[ИмяКонстанты].Установить(Новый ХранилищеЗначения(Новый Структура));

// При необходимости повторим для остальных системных констант
ИмяКонстантыБФ = "ПараметрыБазовойФункциональности";
Если Метаданные.Константы.Найти(ИмяКонстантыБФ) <> Неопределено Тогда
    Константы[ИмяКонстантыБФ].Установить(Новый ХранилищеЗначения(Новый Структура));
КонецЕсли;

Запустить внешнюю обработку в аварийной базе можно через командную строку с ключом /Execute <ПутьКФайлуОбработки>.

Способ 2. Доработка служебного общего модуля

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

Посмотрим на исправленный вариант функции ПараметрыРаботыПрограммы:


Функция ПараметрыРаботыПрограммы(ИмяКонстанты) Экспорт
    
    УстановитьПривилегированныйРежим(Истина);
    
    Хранилище = Константы[ИмяКонстанты].Получить();
    Если Хранилище = Неопределено Тогда
        Параметры = Новый Структура;
        Константы[ИмяКонстанты].Установить(Новый ХранилищеЗначения(Параметры));
    Иначе
        Параметры = Хранилище.Получить();
        Если ТипЗнч(Параметры) <> Тип("Структура") Тогда
            Параметры = Новый Структура;
            Константы[ИмяКонстанты].Установить(Новый ХранилищеЗначения(Параметры));
        КонецЕсли;
    КонецЕсли;
    
    Возврат Новый ФиксированнаяСтруктура(Параметры);
    
КонецФункции

Такая конструкция гарантирует, что даже при полностью пустом значении константы в базе метод не упадет, а создаст новую пустую структуру и корректно вернет ФиксированнаяСтруктура.

Способ 3. Очистка кэша и тестирование базы данных

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

  1. Очистка временных файлов платформы: удалим содержимое каталогов кэша %LocalAppData%\1C\1cv8 и %AppData%\1C\1cv8.
  2. Тестирование и исправление: откроем базу в режиме «Конфигуратор», перейдем в меню «Администрирование — Тестирование и исправление...», выберем пункт «Проверка логической целостности» и в переключателях при наличии ссылочных ошибок укажем вариант «Создавать объекты». Это действие приводит структуру пустых полей таблиц к значениям по умолчанию.

Способ 4. Корректное повторное обновление

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

← На главную