Приветствуем, коллеги! Сегодня мы детально разберем крайне интересную и практическую задачу, с которой часто сталкиваются разработчики при доработке типовых конфигураций 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 и отказывается запускаться при его изменении. Давайте найдем выход из этой ситуации.
Прежде всего, крайне не рекомендуется полностью отключать режим совместимости (ставить "Не использовать"). Когда мы отключаем совместимость, платформа начинает применять все новые оптимизации, строгие правила и механизмы актуальной версии (включая работу СУБД, блокировки данных, сериализацию во временные хранилища и поведение динамических списков). Для старых версий БСП, рассчитанных на работу в режиме совместимости 8.3.12, это может обернуться непредсказуемыми сбоями в самых неожиданных местах.
Выполним правильную настройку конфигурации по шагам:
Прежде чем перейти к программному обходу ограничений БСП, важно понимать, как платформа 1С обрабатывает добавление новых значений на уровне СУБД. Это убережет нас от потери данных в будущем.
Когда мы добавляем новое значение в заимствованное перечисление, платформа выполняет реальную реструктуризацию таблиц СУБД при обновлении конфигурации базы данных. Новое значение перечисления физически записывается в базу под уникальным внутренним идентификатором (UUID).
В связи с этим возникает серьезный риск. Проанализируем гипотетическую ситуацию: ваше расширение по какой-то причине было временно отключено, удалено или сбоит при запуске. Что произойдет с данными? Новые значения, которые пользователи уже успели выбрать и записать в документах или справочниках, не сотрутся физически из таблиц СУБД. Однако в интерфейсе программы вместо понятного названия значения вы увидите системную строку: <Объект из отключенного расширения конфигурации>.
Более того, любые запросы и программный код конфигурации, проверяющие это значение перечисления, перестанут корректно отрабатывать, что неизбежно приведет к сбоям при проведении документов. Как только расширение будет снова успешно подключено, работоспособность и корректное отображение значений восстановятся в полном объеме.
Теперь решим проблему с БСП, которая блокирует запуск системы из-за изменения режима совместимости на 8.3.14. Поскольку проверка зашита непосредственно в код встроенного языка самой Библиотеки Стандартных Подсистем, мы можем элегантно обойти ее с помощью нашего расширения. Рассмотрим два основных способа решения этой проблемы.
Это самый мягкий и безопасный способ, позволяющий подменить минимальные требования БСП к платформе «на лету» во время инициализации системы.
Выполним следующие действия:
ОбщегоНазначенияПереопределяемый.&После для изменения параметров базовой функциональности системы.
&После("ПриОпределенииОбщихПараметровБазовойФункциональности")
Процедура ИмяВашегоПрефикса_ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры) Экспорт
СистемнаяИнформация = Новый СистемнаяИнформация;
// Динамически подменяем минимальные и рекомендуемые требования БСП
// на версию фактически запущенной платформы 1С:Предприятие
ОбщиеПараметры.Вставить("МинимальнаяВерсияПлатформы", СистемнаяИнформация.ВерсияПриложения);
ОбщиеПараметры.Вставить("РекомендуемаяВерсияПлатформы", СистемнаяИнформация.ВерсияПриложения);
КонецПроцедуры
Этот способ заставит БСП думать, что текущая версия платформы и установленный режим совместимости полностью соответствуют ожиданиям системы, и запуск конфигурации пройдет без генерации исключений.
В некоторых старых или специфических редакциях БСП проверка режима совместимости реализована через прямое обращение к метаданным в общем модуле СтандартныеПодсистемыСервер. Если предыдущий способ не помог, мы можем напрямую нейтрализовать проверяющую процедуру.
Выполним следующие шаги:
СтандартныеПодсистемыСервер процедуру, отвечающую за валидацию режима совместимости (например, она может называться ПроверитьРежимСовместимостиРекомендуемому или аналогично в зависимости от версии БСП).&Вместо, "заглушив" ее выполнение простым возвратом:
&Вместо("ПроверитьРежимСовместимостиРекомендуемому")
Процедура ИмяВашегоПрефикса_ПроверитьРежимСовместимостиРекомендуемому() Экспорт
// Полностью нейтрализуем встроенную проверку совместимости БСП,
// чтобы предотвратить аварийное завершение работы программы при запуске
Возврат;
КонецПроцедуры
Таким образом, мы исключаем выполнение кода валидации, и программа продолжает работу в штатном режиме, используя все преимущества расширения перечислений.
Мы успешно разобрались, как расширять заимствованные перечисления собственными значениями. Подведем итог нашим действиям:
<Объект из отключенного расширения...>, пока расширение не будет активировано вновь.ОбщегоНазначенияПереопределяемый или временно отключайте проверки совместимости БСП в модуле СтандартныеПодсистемыСервер через механизм &Вместо.Используйте эти приемы аккуратно, тестируйте изменения на копиях баз данных, и ваши расширения будут работать стабильно и надежно!