Как добавить собственные значения в заимствованное перечисление в 1С и обойти ошибки совместимости платформы и БСП?

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

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

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

Выясняем причину ошибки: почему 1С ругается на режим совместимости?

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

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

Многие разработчики совершают типичную ошибку: они просто отключают режим совместимости, выставляя значение "Не использовать" в конфигурации и в расширении. На первый взгляд, это решает проблему в конфигураторе, но при запуске в режиме "1С:Предприятие" нас встречает новая критическая ошибка, генерируемая БСП:

Режим совместимости конфигурации с 1С:Предприятием версии 8.3.15 не поддерживается. Для запуска установите в конфигурации режим совместимости "Не использовать" при разработке на версии 8.3.12 (или "Версия 8.3.12" при разработке на более старших версиях). {ОбщийМодуль.СтандартныеПодсистемыСервер.Модуль(2621)}...

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

Шаг 1. Правильная настройка режимов совместимости

Прежде всего, крайне не рекомендуется полностью отключать режим совместимости (ставить "Не использовать"). Когда мы отключаем совместимость, платформа начинает применять все новые оптимизации, строгие правила и механизмы актуальной версии (включая работу СУБД, блокировки данных, сериализацию во временные хранилища и поведение динамических списков). Для старых версий БСП, рассчитанных на работу в режиме совместимости 8.3.12, это может обернуться непредсказуемыми сбоями в самых неожиданных местах.

Выполним правильную настройку конфигурации по шагам:

  1. Откроем свойства основной конфигурации в конфигураторе.
  2. Найдем свойство Режим совместимости и аккуратно поднимем его до значения "Версия 8.3.14" (это минимально необходимая версия для поддержки расширения перечислений).
  3. Откроем свойства нашего расширения конфигурации.
  4. Убедимся, что свойство Режим совместимости расширения конфигурации также установлено в значение "Версия 8.3.14" (или "Использовать режим совместимости конфигурации"). Обратите внимание на деталь: важно менять именно свойство режима совместимости самого расширения в палитре его свойств, а не путать его с аналогичными настройками в других местах.

Как расширение перечислений устроено в базе данных и какие есть риски?

Прежде чем перейти к программному обходу ограничений БСП, важно понимать, как платформа 1С обрабатывает добавление новых значений на уровне СУБД. Это убережет нас от потери данных в будущем.

Когда мы добавляем новое значение в заимствованное перечисление, платформа выполняет реальную реструктуризацию таблиц СУБД при обновлении конфигурации базы данных. Новое значение перечисления физически записывается в базу под уникальным внутренним идентификатором (UUID).

В связи с этим возникает серьезный риск. Проанализируем гипотетическую ситуацию: ваше расширение по какой-то причине было временно отключено, удалено или сбоит при запуске. Что произойдет с данными? Новые значения, которые пользователи уже успели выбрать и записать в документах или справочниках, не сотрутся физически из таблиц СУБД. Однако в интерфейсе программы вместо понятного названия значения вы увидите системную строку: <Объект из отключенного расширения конфигурации>.

Более того, любые запросы и программный код конфигурации, проверяющие это значение перечисления, перестанут корректно отрабатывать, что неизбежно приведет к сбоям при проведении документов. Как только расширение будет снова успешно подключено, работоспособность и корректное отображение значений восстановятся в полном объеме.

Шаг 2. Программный обход проверки совместимости БСП при запуске

Теперь решим проблему с БСП, которая блокирует запуск системы из-за изменения режима совместимости на 8.3.14. Поскольку проверка зашита непосредственно в код встроенного языка самой Библиотеки Стандартных Подсистем, мы можем элегантно обойти ее с помощью нашего расширения. Рассмотрим два основных способа решения этой проблемы.

Способ А. Динамическое переопределение параметров запуска в БСП

Это самый мягкий и безопасный способ, позволяющий подменить минимальные требования БСП к платформе «на лету» во время инициализации системы.

Выполним следующие действия:

  1. Заимствуем в наше расширение общий модуль ОбщегоНазначенияПереопределяемый.
  2. Добавим в заимствованный модуль процедуру-перехватчик с аннотацией &После для изменения параметров базовой функциональности системы.
  3. Напишем код, который заменяет жестко прописанные требования к платформе на версию фактически запущенного приложения:

&После("ПриОпределенииОбщихПараметровБазовойФункциональности")
Процедура ИмяВашегоПрефикса_ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры) Экспорт
    
    СистемнаяИнформация = Новый СистемнаяИнформация;
    
    // Динамически подменяем минимальные и рекомендуемые требования БСП 
    // на версию фактически запущенной платформы 1С:Предприятие
    ОбщиеПараметры.Вставить("МинимальнаяВерсияПлатформы", СистемнаяИнформация.ВерсияПриложения);
    ОбщиеПараметры.Вставить("РекомендуемаяВерсияПлатформы", СистемнаяИнформация.ВерсияПриложения);
    
КонецПроцедуры

Этот способ заставит БСП думать, что текущая версия платформы и установленный режим совместимости полностью соответствуют ожиданиям системы, и запуск конфигурации пройдет без генерации исключений.

Способ Б. Создание заглушки для процедуры проверки БСП

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

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

  1. Найдем в общем модуле СтандартныеПодсистемыСервер процедуру, отвечающую за валидацию режима совместимости (например, она может называться ПроверитьРежимСовместимостиРекомендуемому или аналогично в зависимости от версии БСП).
  2. Добавим этот общий модуль в наше расширение конфигурации.
  3. Переопределим вызывающую исключение процедуру с помощью директивы &Вместо, "заглушив" ее выполнение простым возвратом:

&Вместо("ПроверитьРежимСовместимостиРекомендуемому")
Процедура ИмяВашегоПрефикса_ПроверитьРежимСовместимостиРекомендуемому() Экспорт
    
    // Полностью нейтрализуем встроенную проверку совместимости БСП, 
    // чтобы предотвратить аварийное завершение работы программы при запуске
    Возврат;
    
КонецПроцедуры

Таким образом, мы исключаем выполнение кода валидации, и программа продолжает работу в штатном режиме, используя все преимущества расширения перечислений.

Резюме и рекомендации

Мы успешно разобрались, как расширять заимствованные перечисления собственными значениями. Подведем итог нашим действиям:

Используйте эти приемы аккуратно, тестируйте изменения на копиях баз данных, и ваши расширения будут работать стабильно и надежно!

← На главную