Как исправить ошибку «Поле объекта недоступно для записи (ЦветаПалитры)» при обновлении 1С:УНФ?

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

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

Поле объекта недоступно для записи (ЦветаПалитры) {ОбщийМодуль.ОбновлениеИнформационнойБазыРМК.Модуль(741)}:ЦветаПалитры = Новый Структура;

При этом стандартные средства восстановления, такие как утилита проверки целостности chdbfl, встроенное тестирование и исправление или автоматическая установка патчей, не приводят к положительному результату. Проанализируем природу этой неполадки и подробно рассмотрим способы её решения.

Выясним причину возникновения ошибки

Для понимания корня проблемы обратим внимание на среду выполнения. Ошибка проявляется в том случае, когда запуск обновления базы данных выполняется под управлением платформы 1С:Предприятие версии 8.5 (например, 8.5.1).

В ветке платформы 8.5 разработчики существенно переработали механизмы оформления интерфейса и ввели в глобальный контекст встроенного языка системный набор значений ЦветаПалитры, доступный исключительно для чтения. Он предназначен для хранения предопределенных цветов оформления.

В прикладном коде общего модуля ОбновлениеИнформационнойБазыРМК в методе ЗаполнитьЦветаПалитрыПоУмолчанию переменная ЦветаПалитры не была явно задекларирована как локальная. Компилятор встроенного языка платформы 8.5 пытается записать создаваемый объект Новый Структура непосредственно в системную коллекцию платформы, что и вызывает исключение. В платформе ветки 8.3 этот системный идентификатор отсутствует, поэтому присваивание отрабатывает корректно.

Способ 1. Выполнение обновления на платформе 8.3 (рекомендуемый)

Разберем по шагам наиболее быстрый и надежный вариант обхода коллизии, не требующий модификации исходного программного кода конфигурации.

  1. Завершим все активные сеансы пользователей и закроем конфигуратор на платформе 8.5.
  2. Обязательно создадим резервную копию информационной базы данных перед дальнейшими манипуляциями.
  3. Установим и запустим информационную базу под актуальной версией платформы ветки 8.3 (рекомендуется использовать стабильный релиз 8.3.27, например 8.3.27.2074).
  4. Откроем базу в режиме «1С:Предприятие» под учетной записью с административными правами и дождемся завершения всех монопольных и фоновых обработчиков обновления. Убедимся, что процедура ОбновлениеИнформационнойБазыРМК.ЗаполнитьЦветаПалитрыПоУмолчанию успешно выполнена.
  5. После того как статус обновления перейдет в состояние «Обновление успешно завершено», закроем сеанс.
  6. Снова переключим запуск базы на платформу ветки 8.5. Так как обработчик палитры РМК вызывается однократно при переходе на конкретную версию конфигурации, дальнейшая штатная работа будет продолжена без ошибок.

Способ 2. Исправление процедуры через расширение конфигурации

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

  1. Откроем конфигуратор и создадим новое расширение конфигурации с назначением «Адаптация» или «Исправление».
  2. Добавим в расширение общий модуль ОбновлениеИнформационнойБазыРМК.
  3. В модуле расширения создадим метод-перехватчик с аннотацией &Вместо для процедуры ЗаполнитьЦветаПалитрыПоУмолчанию.
  4. Объявим переменную явным образом с помощью директивы Перем, чтобы компилятор 1С экранировал системное свойство глобального контекста.

Посмотрим на пример переопределения метода:


&Вместо("ЗаполнитьЦветаПалитрыПоУмолчанию")
Процедура Расш1_ЗаполнитьЦветаПалитрыПоУмолчанию()
    
    // Явно объявляем локальную переменную для предотвращения коллизии
    Перем ЦветаПалитры;
    
    ЦветаПалитры = Новый Структура;
    // Далее следует типовой код заполнения структуры цветов палитры РМК
    
КонецПроцедуры

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

Способ 3. Прямая правка модуля конфигурации

Рассмотрим вариант для баз, которые уже сняты с полной поддержки (находятся в режиме редактирования с сохранением поддержки).

  1. Перейдем в конфигураторе к общему модулю ОбновлениеИнформационнойБазыРМК.
  2. Найдем процедуру ЗаполнитьЦветаПалитрыПоУмолчанию и перейдем к строке инициализации палитры.
  3. В самом начале тела процедуры добавим строку с явным объявлением: Перем ЦветаПалитры; либо переименуем переменную по всему тексту процедуры (например, на ПалитраЦветов).
  4. Обновим конфигурацию базы данных (по нажатию F7) и запустим процесс обновления данных в пользовательском режиме.
← На главную