Как выбрать и поменять режим совместимости у расширения конфигурации

· 9 мин

Содержание

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

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

Как устроен режим совместимости у расширения конфигурации

Режим совместимости — это свойство метаданных. Оно говорит платформе: «веди себя как версия 8.3.N». Платформа может быть новее, но поведение объектов, доступность части методов и свойств метаданных подстраиваются под выбранную версию.

У расширения это свойство своё, отдельное от основной конфигурации. Оно задаётся в свойствах корня расширения, в группе «Совместимость». Значения выглядят так же, как у конфигурации: Не использовать, Версия 8.3.20, Версия 8.3.22 и так далее.

Как связаны три версии:

ЧтоГде смотретьОграничение
🖥️ Версия платформыСправка → О программеЗадаёт потолок для всех режимов
📦 Режим совместимости конфигурацииСвойства корня основной конфигурацииНе выше версии платформы
🧩 Режим совместимости расширенияСвойства корня расширенияНе выше режима конфигурации

Значение Не использовать означает «работаем по правилам текущей платформы». Для расширения это самый рискованный вариант: после обновления платформы его эффективный уровень вырастет, а у конфигурации может остаться прежний.

Режим совместимости основной конфигурации можно узнать и из кода: Метаданные.РежимСовместимости. Это удобно, если нужно проверить базу клиента без доступа к конфигуратору.

Расширения появились в платформе 8.3.6. Поэтому самый низкий режим, при котором расширение вообще имеет смысл, — 8.3.6. На практике расширения для современных типовых делают на режимах 8.3.1x–8.3.2x, потому что многие возможности расширений добавлялись позже: заимствование новых видов объектов, расширение данных, перехват методов.

Пошагово: изменить режим совместимости в расширении

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

Шаг 1. Посмотрите режим основной конфигурации

  1. Запустите базу в режиме Конфигуратор.
  2. Откройте основную конфигурацию: Конфигурация → Открыть конфигурацию.
  3. Щёлкните правой кнопкой по корню дерева и выберите Свойства.
  4. В группе «Совместимость» запишите значение поля «Режим совместимости».

Шаг 2. Откройте расширение

  1. Выберите Конфигурация → Расширения конфигурации.
  2. В списке выделите нужное расширение и нажмите Конфигурация (или дважды щёлкните по строке). Откроется отдельное дерево расширения.

Шаг 3. Поменяйте значение

  1. В дереве расширения откройте свойства корневого элемента.
  2. В группе «Совместимость» выберите новое значение режима совместимости.
  3. Если меняете в сторону повышения, сверьте: значение не превышает записанное на шаге 1.

Шаг 4. Проверьте модули и примените

  1. Выполните Конфигурация → Проверить модули в окне расширения. Компилятор покажет методы, недоступные в новом режиме.
  2. Сохраните расширение и обновите его конфигурацию базы данных (F7 в окне расширения).
  3. Проверьте применимость: в списке расширений есть команда проверки применимости к основной конфигурации. Она сразу покажет конфликт режимов.

Если расширение меняет структуру данных (добавляет реквизиты, таблицы, собственные объекты), обновление базы данных затронет таблицы. Делайте это в нерабочее время и после резервной копии: выгрузки .dt или бэкапа СУБД.

После применения перезапустите сеанс 1С:Предприятия. Уже открытые сеансы продолжают работать со старой версией расширения до перезапуска.

Где ещё виден режим

В режиме 1С:Предприятие расширения подключают через Все функции → Стандартные → Управление расширениями конфигурации. В конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) удобнее раздел Администрирование → Печатные формы, отчеты и обработки → Расширения. Режим совместимости там не правится: только загрузка готового файла .cfe, включение и отключение. Менять режим можно только в конфигураторе.

Что мешает поднять или опустить режим: ошибки и код под переделку

Смена режима — это не просто выбор из списка. Что-то может не дать расширению примениться, а часть кода придётся переписать.

Блокировки на уровне платформы

Диагностика: выберите симптом

Код, который придётся мигрировать

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

  • 🔤 Строковые функции. СтрШаблон, СтрРазделить, СтрСоединить, СтрНачинаетсяС доступны с режима 8.3.6. Ниже этого расширений нет, но в старых доработках такие места встречаются.
  • 🪟 Модальные окна. Предупреждение(), Вопрос() в модальной форме, ОткрытьФормуМодально(). Если основная конфигурация запрещает модальность, их нужно заменить на асинхронные аналоги: ПоказатьПредупреждение, ПоказатьВопрос, оповещения.
  • ⏳ Async/Await. Асинхронные функции с Асинх и Ждать есть в платформе с версии 8.3.18. В расширении с режимом ниже такой код не скомпилируется.
  • 🧱 Заимствованные объекты новых видов. Если расширение заимствует объект, вид которого появился позже выбранного режима, редактор его не даст или потребует поднять режим.

Удобный приём — временно опустить режим в копии расширения и запустить «Проверить модули». Список ошибок и есть перечень кода под миграцию.

Перед сменой режима совместимости расширения
Выполнено: 0 / 6

Как режим совместимости влияет на клиент и сервер

Код расширения исполняется там же, где код основной конфигурации: на сервере, в тонком клиенте, в веб-клиенте. Директивы &НаСервере, &НаКлиенте, &НаСервереБезКонтекста работают так же.

Режим совместимости влияет на обе стороны, но проявляется по-разному.

На сервере режим определяет, какие методы встроенного языка компилируются и как ведут себя объекты метаданных. Сюда относятся работа с запросами, записью объектов, регистрами. Ошибки несовместимости здесь всплывают при первом обращении к модулю — например, когда пользователь проводит документ.

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

Веб-клиент чувствительнее всего к синхронным вызовам. Если расширение работает в тонком клиенте, но падает в браузере, сначала ищите модальные окна и синхронную работу с файлами в клиентском коде.

Перехват методов (&Перед, &После, &Вместо, &ИзменениеИКонтроль) от режима совместимости расширения не зависит в том смысле, что точка перехвата — метод основной конфигурации. Но код внутри перехватчика компилируется по правилам режима расширения. Аннотация &ИзменениеИКонтроль доступна с более поздних версий, чем &Перед и &После; при сильном понижении режима её использование может стать недоступным.

Расширения и мобильная платформа

С мобильными устройствами 1С работает двумя способами, и для расширений это разные истории.

Мобильный клиент. Он подключается к той же базе на сервере, что и тонкий клиент. Расширения применяются на сервере, поэтому всё сказанное выше про режим совместимости действует и здесь. Клиентский код расширения выполняется на устройстве, поэтому для мобильного клиента особенно важны асинхронные вызовы: модальных окон там нет.

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

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

Что проверять в клиентском коде расширения под мобильный клиент:

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

Поддержка нескольких версий платформы и конфигурации

Самый сложный случай — одно расширение для многих баз. У одного клиента БП на свежем релизе, у другого — на релизе двухлетней давности с другим режимом совместимости.

Для какого набора баз делаете расширение?

Приёмы, которые помогают

  • 🧪 Разработка на минимальной платформе. Держите отдельную установку платформы той версии, которая есть у самого «старого» клиента. Выгружайте .cfe именно из неё: файл, сохранённый новой платформой, может не загрузиться в старую.
  • 🔀 Ветвление по версии. Код может проверить режим основной конфигурации во время работы и выбрать ветку:
Если Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
	// конфигурация работает по правилам текущей платформы
	ВыполнитьНовыйВариант();
Иначе
	ВыполнитьСовместимыйВариант();
КонецЕсли;

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

  • 📦 Два расширения вместо одного. Базовое — на низком режиме, с общей логикой. Дополнительное — на высоком, с функциями, которым нужна новая платформа. Второе ставят только тем клиентам, у кого конфигурация это позволяет.
  • 🏷️ Версия в свойствах расширения. Заполняйте свойство «Версия» и пишите в описании минимальный режим совместимости. Администратор клиента увидит требования до загрузки файла.

Когда повышать режим

Повышайте режим расширения, когда все поддерживаемые базы перешли на новый режим конфигурации и вам нужны новые возможности: Async/Await, новые методы, заимствование новых видов объектов. Повышение «на всякий случай» сужает круг баз, где расширение работает, и ничего не даёт взамен.

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

Частые вопросы

Обязательно ли режим расширения должен совпадать с режимом конфигурации?
Нет. Он должен быть не выше. Равный или более низкий режим допустим.
Что будет с расширением, если обновить типовую с повышением режима совместимости?
Расширение с прежним, более низким режимом продолжит применяться. Повышать его нужно, только если хотите использовать новые возможности.
Можно ли поменять режим совместимости расширения без конфигуратора?
Нет. В режиме 1С:Предприятие расширение можно только загрузить из файла, включить или отключить. Режим меняют в конфигураторе и выгружают новый .cfe.
Почему у расширения стоит «Не использовать» и чем это плохо?
Так бывает, если расширение создавали давно или копировали из чужой базы. После обновления платформы такой режим может оказаться выше режима конфигурации, и расширение перестанет применяться. Лучше выставить явную версию.
Влияет ли режим совместимости расширения на скорость работы?
Напрямую нет. На производительность влияют код и запросы, а не номер режима.