К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как программно узнать версию конфигурации в 1С

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

Версия конфигурации нужна разработчику и администратору в самых разных ситуациях: при выводе информации «О программе», при логировании ошибок, при проверке совместимости расширений и внешних обработок, при обмене данными между базами. Встроенный язык 1С позволяет получить её несколькими способами — от одного обращения к метаданным до штатных функций Библиотеки стандартных подсистем.

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

Получение версии через объект Метаданные

Самый прямой способ — обратиться к свойству Версия корневого объекта метаданных. Это значение задаётся в конфигураторе в свойствах конфигурации (поле «Версия») и доступно встроенному языку без дополнительных вызовов:

ВерсияКонфигурации = Метаданные.Версия;

Сообщить("Текущая версия: " + ВерсияКонфигурации);

Свойство возвращает строку в том виде, в каком её заполнил разработчик, например «3.1.27.86». Если поле версии в конфигураторе не заполнено, результатом будет пустая строка — это важно учитывать в самописных решениях, где версию часто забывают проставлять.

Код работает и на тонком, и на толстом, и на веб-клиенте, и на сервере, поскольку метаданные доступны в любом контексте исполнения. Дополнительных прав у пользователя не требуется: чтение свойств метаданных не защищено ролями.

bsl
Функция ВерсияКонфигурации() Экспорт
	Возврат Метаданные.Версия;
КонецФункции

Версия конфигурации базы данных и рабочей конфигурации

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

Программно сравнить версии напрямую через метаданные нельзя, но косвенно расхождение проверяется методом КонфигурацияИзменена() и КонфигурацияБазыДанныхИзмененаДинамически(). Если структура БД не обновлена после загрузки новой конфигурации, пользовательские сеансы продолжают работать со старой версией — это частая причина «странных» ошибок после обновления.

Получение версии в типовых конфигурациях через БСП

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

Получить сохранённую версию можно так:

ВерсияИБ = ОбновлениеИнформационнойБазы.ВерсияИБ(Метаданные.Имя);

Здесь Метаданные.Имя — имя конфигурации (например, «БухгалтерияПредприятия»). Функция вернёт версию, зафиксированную при последнем успешном обновлении. Если обновление завершилось с ошибками или отложенные обработчики ещё выполняются, сохранённая версия может отличаться от Метаданные.Версия — это признак незавершённого перехода.

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

Сравнение способов получения версии

Метаданные.Версия

Универсально, работает в любой конфигурации и любом контексте. Ограничение: возвращает пустую строку, если версия не заполнена разработчиком.

ОбновлениеИнформационнойБазы.ВерсияИБ()

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

Параметры сеанса и константы

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

Версия платформы и сборка полного отчёта о системе

Часто вместе с версией конфигурации нужна версия технологической платформы — например, при регистрации ошибки или проверке совместимости. Для этого используется объект СистемнаяИнформация:

СисИнфо = Новый СистемнаяИнформация;

ТекстОтчета = "Конфигурация: " + Метаданные.Имя + " " + Метаданные.Версия + Символы.ПС

+ "Платформа: " + СисИнфо.ВерсияПриложения + Символы.ПС

+ "Режим: " + ?(СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64, "64-бит", "32-бит");

Такой блок удобно вставлять в протокол обмена, письмо в поддержку или журнал регистрации. Обратите внимание: конструктор Новый СистемнаяИнформация возвращает данные того узла, где исполняется код. На сервере это будет версия серверной платформы, которая может отличаться от клиентской.

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

Проверка версии из внешних обработок и расширений

Внешней обработке или расширению часто нужно убедиться, что оно запущено в подходящей версии конфигурации. Типовой приём — сравнение версий по частям, потому что строковое сравнение «3.1.10.5» и «3.1.9.12» даёт неверный результат: лексикографически «10» меньше «9».

Правильный подход — разбить строку версии на числовые компоненты и сравнивать их последовательно. В БСП для этого есть функция ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Версия1, Версия2), возвращающая -1, 0 или 1:

Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Метаданные.Версия, "3.1.20.0") < 0 Тогда

ВызватьИсключение "Обработка требует версию конфигурации не ниже 3.1.20.0";

КонецЕсли;

В расширениях дополнительно доступны собственные метаданные расширения: Метаданные внутри расширения относится к основной конфигурации, а данные самого расширения получают через ПолучитьРасширенияКонфигурации() (в английском синтаксисе — GetConfigurationExtensions()) с фильтром по имени. У объекта расширения есть свойство Версия.

Типичные ошибки
01
Сравнение версий как строк: условие "3.1.9" > "3.1.10" даёт ложный результат. Сравнивайте по числовым компонентам или через СравнитьВерсии.
02
Ожидание значения в самописной конфигурации, где поле «Версия» не заполнено, — функция вернёт пустую строку без ошибки.
03
Получение версии платформы на сервере и вывод её пользователю как клиентской — при разных релизах сервера и клиента данные вводят в заблуждение.
04
Использование Метаданные.Версия для контроля обновления данных вместо ВерсияИБ — версия метаданных меняется сразу, а данные могут быть ещё не обработаны.

Где ещё хранится версия и как проверить результат

Помимо метаданных и БСП, версия фигурирует в нескольких местах, полезных для перекрёстной проверки. В конфигураторе она видна в свойствах корня дерева конфигурации. В режиме предприятия типовые решения показывают её в разделе «Администрирование — Обслуживание — Результаты обновления» и в окне «О программе». В файле поставки (1Cv8.cfu) и манифесте обновления версия указана в явном виде.

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

Контрольные точки

Как проверить результат

Сравнение Метаданные.Версия с окном «О программе»
Норма

Значения совпадают

Тревожный признак

Различаются — возможно, конфигурация БД не обновлена

Сравнение с ВерсияИБ (БСП)
Норма

Версии равны, отложенные обработчики завершены

Тревожный признак

ВерсияИБ ниже — обновление данных не завершено

Пустота строки версии
Норма

Строка вида X.Y.Z.W

Тревожный признак

Пустая строка — версия не задана в свойствах конфигурации

Ограничения и безопасная работа

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

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

Итог

Что важно запомнить

Версия конфигурации читается через Метаданные.Версия в любом контексте. В типовых решениях фактическую версию обновлённых данных показывает ОбновлениеИнформационнойБазы.ВерсияИБ(). Версии сравнивайте по числовым компонентам, а версию платформы получайте через объект СистемнаяИнформация.

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

Почему Метаданные.Версия возвращает пустую строку?

Поле «Версия» в свойствах конфигурации не заполнено разработчиком. Откройте конфигуратор, вызовите свойства корня дерева конфигурации и задайте версию, после чего обновите конфигурацию базы данных.

Как узнать версию конфигурации без входа в базу?

Штатными средствами встроенного языка — никак, требуется сеанс. Альтернативы: посмотреть версию в файле поставки, в выгрузке конфигурации в файлы XML или в журнале обновлений, если он ведётся.

Чем отличается версия конфигурации от версии платформы?

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

Можно ли получить версию расширения конфигурации?

Да. Метод ПолучитьРасширенияКонфигурации() возвращает массив расширений, у каждого есть свойства Имя и Версия. Отфильтруйте по имени нужного расширения и прочитайте его версию.

Почему после обновления код показывает старую версию?

Скорее всего, выполнено обновление конфигурации разработчика, но не конфигурации базы данных, либо сеанс запущен до обновления. Завершите обновление конфигурации БД в конфигураторе, перезапустите сеанс и проверьте завершение отложенных обработчиков.

Как сравнить две версии программно?

Используйте функцию БСП ОбщегоНазначенияКлиентСервер.СравнитьВерсии() или разбейте строки по точкам и сравнивайте компоненты как числа. Прямое строковое сравнение даёт ошибки на номерах с разным количеством цифр.