При активной разработке в среде 1С:Предприятие 8 с использованием механизма расширений программисты часто сталкиваются с аппаратными и программными ограничениями совместимости. Одной из наиболее коварных ошибок является сообщение: «Режим совместимости конфигурации с 1С:Предприятием версии Версия8_3_14 не поддерживается». Она возникает внезапно, даже если физическая версия установленной платформы значительно выше (например, 8.3.16 или более поздняя), а сама конфигурация успешно открывается в Конфигураторе.
В этой статье мы подробно разберем природу возникновения данной ошибки, выясним, почему в ней "виновата" не платформа, а Библиотека стандартных подсистем (БСП), и пошагово рассмотрим три практических способа решения этой проблемы без снятия типовой конфигурации с поддержки.
Для начала проанализируем ситуацию. Многие разработчики ошибочно полагают, что это сообщение генерирует сама платформа 1С:Предприятие при попытке запустить систему. Однако платформа ведет себя гораздо лояльнее к режимам совместимости. На самом деле инициатором аварийного завершения работы программы выступает встроенная в вашу конфигурацию Библиотека стандартных подсистем (БСП). Для быстрого определения точной версии подсистем в конфигурации можно использовать внешнюю обработку для вывода информации о версиях БСП.
В составе БСП присутствует общий модуль СтандартныеПодсистемыСервер. При запуске приложения в режиме «1С:Предприятие» срабатывает стартовое событие, вызывающее процедуру ПередЗапускомПрограммы(). Внутри этой процедуры разработчики БСП реализовали жесткий контроль окружения. Алгоритм проверки выглядит следующим образом:
Метаданные.РежимСовместимости."Версия8_3_14" или "НеИспользовать").Ситуация осложняется, когда в расширение добавляются тяжелые объекты метаданных, такие как собственные Регистры накопления. Для их поддержки в расширениях платформа жестко требует, чтобы режим совместимости самого расширения (а значит, и основной конфигурации) был установлен не ниже версии 8.3.13. Если базовая конфигурация (например, старый релиз УНФ) рассчитана на работу в режиме совместимости 8.3.14, а вы пытаетесь маневрировать версиями, БСП мгновенно блокирует запуск.
Давайте разберем по шагам, как можно решить эту проблему, сохранив конфигурацию на полной поддержке поставщика.
Поскольку снимать конфигурацию с поддержки крайне нежелательно, мы можем использовать штатный механизм переопределения модулей в самом расширении. Платформа 1С позволяет заимствовать общие модули и подменять выполнение процедур с помощью аннотации &Вместо. Это позволит нам скорректировать поведение БСП "на лету".
Выполним следующие действия по шагам:
Шаг 1. Изменение режима совместимости конфигурации
В свойствах основной конфигурации установим необходимый нам режим совместимости (например, «Версия 8.3.16» или «Не использовать»). На этом этапе база в режиме «1С:Предприятие» перестанет запускаться, выдавая целевую ошибку. Это нормально, переходим к следующему шагу.
Шаг 2. Заимствование общего модуля
Откроем наше расширение в Конфигураторе. В дереве объектов основной конфигурации найдем общий модуль СтандартныеПодсистемыСервер. Кликнем по нему правой кнопкой мыши и выберем команду «Добавить в расширение». Обратите внимание, что у заимствованного модуля в расширении должны быть установлены свойства «Сервер» и «Вызов сервера» (в зависимости от исходных настроек модуля).
Шаг 3. Создание замещающей процедуры
В модуле СтандартныеПодсистемыСервер нашего расширения объявим переопределяемый метод ПередЗапускомПрограммы(). Мы воспользуемся аннотацией &Вместо. Нам потребуется полностью скопировать оригинальный код этой процедуры из основной конфигурации, но локально модифицировать блок проверки.
Посмотрим на пример реализации кода в расширении:
&Вместо("ПередЗапускомПрограммы")
Процедура Расш1_ПередЗапускомПрограммы(ПараметрыЗапуска) Экспорт
// Копируем оригинальное тело процедуры из основной конфигурации.
// Находим фрагмент кода, где анализируется режим совместимости:
// Обычно он выглядит так:
// Если Не ОбщегоНазначения.ПоддерживаетсяРежимСовместимости() Тогда ...
// Вместо вызова стандартной ошибки мы можем либо закомментировать этот блок,
// либо принудительно вернуть Истина в проверках.
// Ниже приведена схема обхода:
Отказ = Ложь;
// [Оригинальный код инициализации систем БСП]
// Наша модификация: игнорируем критическую ошибку несоответствия режимов
// Для этого мы просто пропускаем вызов исключения БСП.
КонецПроцедуры
Шаг 4. Обход контроля версии платформы
Иногда после отключения контроля режима совместимости БСП начинает выдавать следующую ошибку — несоответствие минимальной версии платформы. Чтобы решить и эту проблему, добавим в расширение общий модуль ОбщегоНазначенияПереопределяемый и переопределим метод ПриОпределенииОбщихПараметровБазовойФункциональности() с использованием аннотации &После. Внутри этой процедуры мы принудительно перепишем параметры контроля требований к платформе.
Рассмотрим пример кода:
&После("ПриОпределенииОбщихПараметровБазовойФункциональности")
Процедура Расш1_ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры) Экспорт
СистемнаяИнформация = Новый СистемнаяИнформация;
// Устанавливаем минимальные требования на уровне текущей запущенной платформы
ОбщиеПараметры.Вставить("МинимальнаяВерсияПлатформы", СистемнаяИнформация.ВерсияПриложения);
ОбщиеПараметры.Вставить("РекомендуемаяВерсияПлатформы", СистемнаяИнформация.ВерсияПриложения);
КонецПроцедуры
После применения этих изменений база успешно запустится под управлением новой платформы без каких-либо ошибок совместимости, а основная конфигурация останется на поддержке. Для проверки корректности вызовов процедур и отсутствия синтаксических ошибок в заимствованных модулях можно применить инструмент для анализа расширений и конфигураций на ошибки.
Если вы не хотите вмешиваться в код БСП и переопределять глобальные механизмы контроля, проанализируем архитектуру самого разрабатываемого расширения. Зададимся вопросом: почему нам потребовался высокий режим совместимости (не ниже 8.3.13)?
Как правило, главным триггером выступает добавление в расширение собственного Регистра накопления. Платформа физически не умеет работать со структурами таблиц накопления в расширениях на старых режимах совместимости.
Мы можем обойти это ограничение, изменив подход к хранению данных:
Да, этот подход потребует от вас написания большего объема программного кода и усложнит выборку итогов, но он гарантирует абсолютную стабильность решения и его независимость от обновлений конфигурации.
Выясним самый правильный и безопасный с точки зрения вендора путь. Если конфигурация находится на поддержке, ручная правка режима совместимости (даже через расширение) является временным решением. Рано или поздно при обновлении логика модулей БСП изменится, и заимствованные методы могут перестать компилироваться.
Поэтому наиболее рациональный шаг — обновить конфигурацию (например, УНФ) до того релиза, в котором разработчики 1С официально перевели систему на требуемый режим совместимости. При обновлении конфигурации автоматически обновится и встроенная БСП, и все проверки совместимости будут проходить в штатном режиме без ошибок. При обслуживании нескольких баз выполнять автоматическое обновление информационных баз 1С и их архивирование можно по расписанию.
Если вы вели разработку расширения на локальном компьютере с версией платформы 8.3.15 или выше, а затем пытаетесь подключить его к информационной базе, работающей в режиме совместимости 8.3.14, платформа может выдать сопутствующую ошибку:
«Действие при подключении "Предупреждать" недопустимо в режиме совместимости 8.3.14 и ниже»
Выясним причину: начиная с версии платформы 8.3.15, разработчики 1С добавили новое свойство контроля заимствованных объектов — предупреждение о расхождении структуры метаданных при подключении расширения. В свойствах заимствованных объектов по умолчанию взводится флаг контроля в состоянии «Предупреждать» (в интерфейсе конфигуратора это обозначается одиночной галочкой). Режим совместимости 8.3.14 данную технологию еще не поддерживал.
Решение этой проблемы очень простое:
После этой корректировки расширение без проблем применится на платформе с режимом совместимости 8.3.14.
Таким образом, мы детально разобрали все возможные варианты обхода данной проблемы. Выбор конкретного метода зависит от ваших задач: если необходимо быстро запустить расширение "здесь и сейчас" без изменения метаданных — используйте заимствование методов БСП (Решение 1). Если важна долгосрочная стабильность при регулярных обновлениях — пересмотрите архитектуру хранения данных в расширении (Решение 2) или обновите основную конфигурацию (Решение 3).