Как исправить ошибку «Поле объекта недоступно для записи (ХранилищеДвоичныхДанных)» в бюджетных отчетах 1С:ERP?

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

При использовании современных версий платформы «1С:Предприятие 8.3» (начиная с ветки 8.3.23) многие технические специалисты столкнулись с неприятной проблемой: при попытке открыть бюджетный отчет или вид бюджета в конфигурациях 1С:ERP Управление предприятием 2 или 1С:Комплексная автоматизация 2 система выдает критическую ошибку. Текст ошибки обычно выглядит так: Поле объекта недоступно для записи (ХранилищеДвоичныхДанных). Давайте детально разберем природу этого конфликта и изучим все доступные способы его устранения.

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

Проанализируем ситуацию с технической точки зрения. Проблема не в самой конфигурации как таковой, а в фундаментальном изменении архитектуры платформы. В версии 8.3.23 разработчики фирмы «1С» ввели новый объект глобального контекста — системное перечисление ХранилищеДвоичныхДанных. Это зарезервированное слово теперь используется платформой для работы с новым механизмом управления двоичными объектами.

В то же время в коде типовых решений (ERP, КА, УТ), написанных до выхода этой платформы, разработчики использовали идентификатор ХранилищеДвоичныхДанных в качестве имени локальной переменной. Согласно правилам встроенного языка 1С, локальные переменные не могут называться так же, как объекты глобального контекста. Когда программный код пытается присвоить значение переменной с таким именем, платформа «думает», что вы пытаетесь перезаписать системный объект, и блокирует это действие ошибкой «Поле объекта недоступно для записи».

Рассмотрим стек вызовов, предоставленный в сообщениях форума. Мы видим, что ошибка локализована в модуле менеджера регистра сведений КэшВспомогательныхДанныхВидаБюджета на строке 80. Именно там происходит попытка записи данных в переменную, имя которой внезапно стало «запрещенным».

Способ 1: Обновление конфигурации (рекомендуемый)

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

  1. Для 1С:ERP это ветки, начиная с 2.5.13.82 и выше.
  2. Для 1С:Комплексная автоматизация необходимо обновиться до актуальных релизов конца 2023 года.

Если вы используете версию ERP 2.5.11 или ранние сборки 2.5.12, вам необходимо либо выполнить полное обновление, либо установить официальный патч (исправление). Фирма «1С» выпускает такие исправления в формате файлов .efd, которые можно подключить через раздел «Обслуживание» — «Обновление программы» — «Исправления (патчи)».

Способ 2: Откат версии платформы

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

Установите последнюю стабильную версию 8.3.22 (например, 8.3.22.2106). В этой версии еще нет глобального объекта ХранилищеДвоичныхДанных, поэтому старый код конфигурации будет исполняться без ошибок. Однако помните, что это временная мера, так как новые релизы конфигураций со временем потребуют обязательного перехода на 8.3.23 или 8.3.24.

Способ 3: Ручное исправление программного кода

Разберем вариант для тех, кто готов внести изменения в код самостоятельно через конфигуратор. Этот способ подходит для демо-баз или баз, находящихся на поддержке с возможностью редактирования. Нам необходимо переименовать конфликтующую переменную во всем модуле.

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


// Находим фрагмент кода, где происходит работа с ХранилищеДвоичныхДанных
Если ИмяРеквизита = "ЗначениеБулево" Тогда
    Возврат ВыборкаДетальныеЗаписи.Значение;
Иначе 
    // Было:
    // ХранилищеДвоичныхДанных = ВыборкаДетальныеЗаписи.Значение; 
    // Возврат ХранилищеДвоичныхДанных.Получить;

    // Стало (заменяем имя переменной на уникальное):
    ЗначениеДвоичныеДанные = ВыборкаДетальныеЗаписи.Значение; // ХранилищеЗначения
    Возврат ЗначениеДвоичныеДанные.Получить;
КонецЕсли;

Выполним следующие шаги для полного устранения проблемы:

  1. Откройте конфигуратор и перейдите к объекту РегистрСведений.КэшВспомогательныхДанныхВидаБюджета.
  2. Откройте Модуль менеджера этого регистра.
  3. Воспользуйтесь поиском (Ctrl+F) по строке ХранилищеДвоичныхДанных.
  4. Везде, где это слово используется как переменная (например, слева от знака =), замените его на ДанныеХранилища или ЗначениеДвоичныеДанные.
  5. Обязательно проверьте, чтобы замена была произведена и в местах использования этой переменной (например, в методе .Получить()).

Важное замечание: рекомендуется выполнить глобальный поиск по всей конфигурации. Хотя основной эпицентр ошибки находится в подсистеме бюджетной отчетности, имя ХранилищеДвоичныхДанных могло использоваться и в других модулях. Если вы встретите его в коде как локальную переменную, платформа 8.3.23 неизбежно выдаст ошибку при обращении к этому участку программы.

Резюме

Мы выяснили, что корень проблемы кроется в «сражении» старого кода и новой платформы. Чтобы успешно формировать бюджетные отчеты, необходимо устранить конфликт имен. Самым стабильным решением будет переход на ERP версии 2.5.13.82 и платформу 8.3.23.1782 (или выше), где эта ошибка уже исправлена вендором на уровне исходного кода.

← На главную