При обновлении конфигурации «Управление производственным предприятием» (УПП) до версии 1.3.173.2 многие технические специалисты столкнулись с критической остановкой процесса обновления информационной базы. Ошибка прерывает выполнение обработчиков обновления, что делает невозможным дальнейшую работу пользователей в системе. Проблема локализована в модуле менеджера регистра сведений ПараметрыАмортизацииОСБухгалтерскийУчет.
В этой статье мы подробно разберем, почему возникает эта ошибка, как продиагностировать состояние вашей базы данных и какие существуют способы решения — от простого обновления релиза до ручной очистки «битых» ссылок.
Проанализируем текст ошибки. Система сообщает: {РегистрСведений.ПараметрыАмортизацииОСБухгалтерскийУчет.МодульМенеджера(95)}: Значение не является значением объектного типа (Регистратор). Это классическая ситуация для платформы 1С, когда программный код пытается обратиться к свойству переменной, которая на самом деле является пустой (Неопределено, Null) или содержит ссылку на несуществующий объект («Объект не найден»).
В релизе 1.3.173.2 разработчики внесли изменения в механизмы учета основных средств для соответствия стандарту ФСБУ 6/2020. В процессе обновления запускается процедура, которая пересчитывает данные в регистре ПараметрыАмортизацииОСБухгалтерскийУчет. В коде модуля менеджера этого регистра происходит перебор записей, и в строке 95 (или около того) программа пытается получить данные через поле Регистратор (например, Выборка.Регистратор.Организация или Выборка.Регистратор.Дата).
Выясним ситуацию: если в регистре по какой-то причине оказалась запись с пустым регистратором или «битой» ссылкой (документ был удален напрямую без контроля ссылок), стандартный код обновления «спотыкается» об эту запись. Проблема не проявляется у всех пользователей только потому, что не во всех базах накоплены такие «мусорные» данные.
Как показывает практика и обсуждения на форумах, фирма «1С» оперативно выпустила исправление. Ошибка была признана недоработкой программного кода, который не содержал проверки на заполненность регистратора.
Рассмотрим порядок действий:
Если по какой-то причине вам жизненно необходимо остаться на релизе 1.3.173.2, нам придется привести данные регистра в порядок. Посмотрим, как найти проблемные записи с помощью запроса.
Воспользуемся консолью запросов или создадим небольшую обработку. Нам нужно найти записи в регистре ПараметрыАмортизацииОСБухгалтерскийУчет, где поле Регистратор не является валидным документом.
Проанализируем пример запроса для поиска таких записей:
ВЫБРАТЬ
ПараметрыАмортизации.ОС,
ПараметрыАмортизации.Регистратор,
ПараметрыАмортизации.Организация
ИЗ
РегистрСведений.ПараметрыАмортизацииОСБухгалтерскийУчет КАК ПараметрыАмортизации
ГДЕ
(ПараметрыАмортизации.Регистратор ЕСТЬ NULL
ИЛИ ПараметрыАмортизации.Регистратор.Номер ЕСТЬ NULL)
В этом запросе условие Регистратор.Номер ЕСТЬ NULL позволяет выявить именно те случаи, когда ссылка в поле регистратор есть, но самого объекта (документа) в базе уже не существует (ситуация «Объект не найден»).
Что делать с найденными записями? Их необходимо удалить или исправить. Если это исторические записи 10-летней давности, которые остались после некорректных чисток базы, их удаление обычно не влияет на текущий учет. Однако перед удалением обязательно создайте резервную копию базы данных.
Для автоматизированного исправления ссылочной целостности мы можем прибегнуть к стандартному инструменту платформы.
После завершения этой процедуры «битые» ссылки в регистре сведений исчезнут, и код обновления сможет корректно обработать все записи.
Этот метод подходит для опытных разработчиков и используется в крайних случаях, когда нужно «протолкнуть» обновление немедленно.
Нам необходимо временно изменить логику модуля менеджера регистра. Найдем проблемный участок кода, указанный в сообщении об ошибке (строка 95 модуля менеджера регистра ПараметрыАмортизацииОСБухгалтерскийУчет). Посмотрим, как можно модифицировать код, добавив проверку на заполненность регистратора.
Пример изменения кода (условно):
// Было:
ОрганизацияЗаписи = Выборка.Регистратор.Организация;
// Стало:
Если ЗначениеЗаполнено(Выборка.Регистратор) И Выборка.Регистратор.Ссылка <> Неопределено Тогда
ОрганизацияЗаписи = Выборка.Регистратор.Организация;
Иначе
// Либо пропускаем запись, либо берем организацию из другого поля, если оно доступно
Продолжить;
КонецЕсли;
Важно: После успешного завершения обновления информационной базы крайне рекомендуется вернуть типовой код конфигурации или сразу обновиться до версии 1.3.174.1, чтобы избежать проблем при последующих обновлениях.
Ситуация с ошибкой в УПП 1.3.173.2 — это наглядный пример того, как исторические данные и «мусор» в базе могут конфликтовать с новыми алгоритмами учета. Мы выяснили, что:
Надеемся, этот разбор помог вам успешно завершить обновление и избежать длительных простоев системы. Помните о важности регулярного резервного копирования перед любыми манипуляциями с данными или конфигурацией!