Как исправить ошибку сохранения расширения в 1С 8.3.12 при конфликте области действия и разделения данных?

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

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

Это нововведение привело к возникновению неприятной тупиковой ситуации (так называемого «порочного круга»), когда рабочее расширение, созданное на платформе 8.3.11 и содержащее собственные структуры данных (например, регистры сведений или накопления), отказывается сохраняться после обновления платформы. При попытке применить изменения система выдает ошибки, блокирующие любую дальнейшую работу.

В этой статье мы подробно разберем, почему возникает этот конфликт, проанализируем внутренние механизмы платформы и рассмотрим три практических способа выхода из этой ситуации: как с полным сохранением накопленных в расширении данных, так и более простые методы для тестовых сред.

Выясняем причину: почему возникает «порочный круг»?

Начиная с версии 8.3.12, платформа поддерживает разделение расширений на уровне СУБД. Свойство расширения «Область действия» может принимать два значения:

  1. Информационная база — расширение применяется глобально ко всей базе данных и доступно всем пользователям.
  2. Разделение данных — расширение работает только в рамках определенной области разделенной базы данных (актуально для облачных сервисов и модели SaaS).

Конфликт и невозможность сохранения расширения возникают из-за следующей последовательности проверок платформы:

  1. Если в вашей основной конфигурации (это часто встречается в типовых конфигурациях вроде ERP, КА, УТ или УНФ) присутствует общий реквизит разделения (например, ОбластьДанныхОсновныеДанные), у которого свойство «Разделение расширений конфигурации» установлено в значение Разделять, платформа принудительно и автоматически присваивает всем импортируемым или обновляемым расширениям область действия Разделение данных.
  2. Если ваша информационная база запущена в обычном режиме (локально или на сервере без реального использования разделения на области), при попытке применить расширение платформа выдает первую ошибку: «Нельзя установить область действия расширения конфигурации в значение РазделениеДанных в информационной базе, не использующей разделение данных».
  3. Логичным шагом разработчика является попытка вручную изменить область действия расширения на Информационная база через свойства расширения в конфигураторе. Однако здесь срабатывает вторая проверка платформы, и мы получаем следующую ошибку: «Запрещено изменение области действия расширения при изменении структуры данных этим расширением». Платформа блокирует изменение области действия, так как внутри расширения уже физически существует созданный вами объект (например, собственный РегистрСведений), который меняет структуру таблиц СУБД.

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

Способ 1. Решение без потери данных (через временное изменение основной конфигурации)

Этот метод является наиболее предпочтительным для рабочих баз данных, так как он позволяет полностью сохранить структуру таблиц вашего расширения и все накопленные в них записи. Для реализации этого способа основная конфигурация должна находиться в режиме возможности изменения (быть снятой с поддержки или находиться на поддержке с сохранением изменений).

Рассмотрим этот процесс по шагам:

  1. Откройте конфигуратор вашей информационной базы.
  2. В дереве метаданных основной конфигурации перейдите в ветку Общие -> Общие реквизиты.
  3. Найдите общий реквизит, отвечающий за разделение данных (в типовых конфигурациях 1С это чаще всего реквизит с именем ОбластьДанныхОсновныеДанные или ОбластьДанныхВспомогательныеДанные).
  4. Откройте палитру свойств этого реквизита и найдите параметр «Разделение расширений конфигурации».
  5. Временно измените его значение с Разделять на Не использовать.
  6. Обновите конфигурацию базы данных, нажав клавишу F7 (или выбрав пункт меню Конфигурация -> Обновить конфигурацию базы данных).
  7. После успешного обновления вернитесь к списку расширений (Конфигурация -> Расширения конфигурации). Выделите проблемное расширение, нажмите на нем правой кнопкой мыши и выберите пункт «Изменить область действия расширения конфигурации».
  8. Установите значение «Информационная база». Теперь платформа не будет блокировать это действие, так как в основной конфигурации временно отключено разделение расширений.
  9. Снова примените изменения в базе данных с помощью клавиши F7.
  10. Важный шаг: вернитесь к общему реквизиту разделения в основной конфигурации и восстановите его исходное свойство «Разделение расширений конфигурации», вернув его в значение Разделять. Повторно нажмите F7 для завершения процесса обновления.

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

Способ 2. Пересоздание расширения (если потеря данных в расширении не критична)

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

Проанализируем этот алгоритм:

  1. Откройте конфигуратор и перейдите в список расширений.
  2. Выделите ваше расширение и сохраните его структуру в файл на диске. Для этого выберите пункт меню Конфигурация -> Сохранить конфигурацию расширения в файл... и укажите имя файла с расширением .cfe.
  3. Внимание! Следующий шаг удалит все данные объектов этого расширения из СУБД! Удалите проблемное расширение из списка в конфигураторе.
  4. Нажмите кнопку Добавить для создания нового, абсолютно пустого расширения. Задайте ему имя и необходимые префиксы.
  5. Пока новое расширение полностью пустое (в нем нет заимствованных объектов и собственных регистров), выделите его в списке, нажмите правую кнопку мыши и выберите команду «Изменить область действия расширения конфигурации».
  6. Установите значение «Информационная база». Платформа успешно выполнит эту операцию, так как структура СУБД в данный момент не затрагивается.
  7. Теперь откройте конфигурацию этого нового расширения и загрузите в него ранее сохраненный файл. Для этого выберите пункт меню Конфигурация -> Загрузить конфигурацию из файла... и укажите сохраненный ранее файл .cfe.
  8. Обновите конфигурацию базы данных (клавиша F7). Платформа применит изменения, создаст физические таблицы для вашего регистра, сохранив при этом правильную область действия расширения.

Способ 3. Выравнивание режимов совместимости

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

Проанализируем ситуацию совместимости:

Для исправления этой ситуации проверьте свойства совместимости в палитре свойств обоих объектов и приведите их к единому знаменателю. После выравнивания режимов совместимости попробуйте повторно выполнить шаги из Способа 1.

Полезные советы для разработчиков расширений

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

Во-первых, перед проведением любых обновлений платформы (особенно при переходе между минорными версиями, например с 8.3.11 на 8.3.12/8.3.13) обязательно делайте резервную копию базы данных (файл .dt или средствами СУБД MS SQL/PostgreSQL). Во-вторых, вы можете программно контролировать состояние ваших расширений и их свойства. Например, с помощью следующего кода можно быстро получить список активных расширений в режиме предприятия и проанализировать их параметры:


УстановленныеРасширения = РасширенияКонфигурации.Получить();
Для Каждого Расширение Из УстановленныеРасширения Цикл
    ЗаписьЖурналаРегистрации("ПроверкаРасширений",
        УровеньЖурналаРегистрации.Информация,
        ,
        ,
        "Расширение: " + Расширение.Имя + " | Активно: " + Расширение.Активно);
КонецЦикла;

Если перед удалением расширения по Способу 2 вам крайне важно сохранить хотя бы текстовую часть данных из вашего регистра, вы можете временно выгрузить их в JSON или XML с помощью несложной обработки:


Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("C:\temp\register_backup.json");
Выборка = РегистрыСведений.МойРегистрРасширения.Выбрать();
Пока Выборка.Следующий() Цикл
    // Сериализуем данные в файл для последующего восстановления
    Данные = Новый Структура("Код, Наименование, Значение");
    ЗаполнитьЗначенияСвойств(Данные, Выборка);
    ЗаписатьJSON(Запись, Данные);
КонецЦикла;
Запись.Закрыть();

Используя предложенные методики, вы сможете легко преодолеть «порочный круг» ограничений платформы 1С 8.3.12+ и успешно продолжить разработку и поддержку ваших конфигураций без потери важных бизнес-данных.

← На главную