При переходе конфигурации 1С:Управление нашей фирмой с релиза 3.0.9 на ветку 3.0.10 пользователи часто сталкиваются с аварийным завершением регламентных процедур обновления информационной базы. В окне ошибки отображается стек вызовов, указывающий на сбой в процедуре заполнения палитры по умолчанию:
Поле объекта недоступно для записи (ЦветаПалитры) {ОбщийМодуль.ОбновлениеИнформационнойБазыРМК.Модуль(741)}:ЦветаПалитры = Новый Структура;
При этом стандартные средства восстановления, такие как утилита проверки целостности chdbfl, встроенное тестирование и исправление или автоматическая установка патчей, не приводят к положительному результату. Проанализируем природу этой неполадки и подробно рассмотрим способы её решения.
Для понимания корня проблемы обратим внимание на среду выполнения. Ошибка проявляется в том случае, когда запуск обновления базы данных выполняется под управлением платформы 1С:Предприятие версии 8.5 (например, 8.5.1).
В ветке платформы 8.5 разработчики существенно переработали механизмы оформления интерфейса и ввели в глобальный контекст встроенного языка системный набор значений ЦветаПалитры, доступный исключительно для чтения. Он предназначен для хранения предопределенных цветов оформления.
В прикладном коде общего модуля ОбновлениеИнформационнойБазыРМК в методе ЗаполнитьЦветаПалитрыПоУмолчанию переменная ЦветаПалитры не была явно задекларирована как локальная. Компилятор встроенного языка платформы 8.5 пытается записать создаваемый объект Новый Структура непосредственно в системную коллекцию платформы, что и вызывает исключение. В платформе ветки 8.3 этот системный идентификатор отсутствует, поэтому присваивание отрабатывает корректно.
Разберем по шагам наиболее быстрый и надежный вариант обхода коллизии, не требующий модификации исходного программного кода конфигурации.
8.3.27.2074).ОбновлениеИнформационнойБазыРМК.ЗаполнитьЦветаПалитрыПоУмолчанию успешно выполнена.Если перевод сервера или клиента на ветку 8.3 невозможен или технологически затруднен, устраним конфликт имен локальной переменной программно. Рассмотрим, как переопределить проблемный метод без снятия конфигурации с типовой поддержки.
ОбновлениеИнформационнойБазыРМК.&Вместо для процедуры ЗаполнитьЦветаПалитрыПоУмолчанию.Перем, чтобы компилятор 1С экранировал системное свойство глобального контекста.Посмотрим на пример переопределения метода:
&Вместо("ЗаполнитьЦветаПалитрыПоУмолчанию")
Процедура Расш1_ЗаполнитьЦветаПалитрыПоУмолчанию()
// Явно объявляем локальную переменную для предотвращения коллизии
Перем ЦветаПалитры;
ЦветаПалитры = Новый Структура;
// Далее следует типовой код заполнения структуры цветов палитры РМК
КонецПроцедуры
После применения расширения запустим сеанс «1С:Предприятие» на платформе 8.5 и выполним обновление данных. Когда обработчики успешно отработают, временное расширение можно деактивировать или удалить из информационной базы.
Рассмотрим вариант для баз, которые уже сняты с полной поддержки (находятся в режиме редактирования с сохранением поддержки).
ОбновлениеИнформационнойБазыРМК.ЗаполнитьЦветаПалитрыПоУмолчанию и перейдем к строке инициализации палитры.Перем ЦветаПалитры; либо переименуем переменную по всему тексту процедуры (например, на ПалитраЦветов).