Разработка механизмов обновления, контроль целостности системы и ведение логов изменений требуют точного понимания того, какая именно версия программного продукта сейчас используется. В экосистеме 1С:Предприятие существует несколько методов получения этих данных, каждый из которых возвращает информацию из разных источников.
Программисту необходимо четко различать версию файлового описания конфигурации, версию, скомпилированную в базе данных, и версию используемой платформы. Неправильный выбор метода может привести к тому, что система покажет устаревшие данные или вовсе выдаст ошибку при попытке чтения свойств.
В этой статье мы детально разберем встроенные функции языка 1С, позволяющие извлечь актуальные сведения о конфигурации. Вы узнаете, в каких ситуациях следует применять ВерсияКонфигурации(), а когда необходимо обращаться к свойствам метаданных.
Встроенные функции для получения версии
Самый распространенный способ узнать текущую версию — использование глобальной функции ВерсияКонфигурации(). Она возвращает строковое значение, содержащее номер версии, который отображается в окне "О программе".
Важно понимать, что эта функция обращается к модифицированному описанию конфигурации. Если вы только что обновили файлы конфигурации на диске, но не выполнили обновление конфигурации базы данных, функция может вернуть данные, отличные от ожидаемых.
Для получения версии самой базы данных, которая уже скомпилирована и готова к выполнению кода, используется функция ВерсияБазыДанных(). Эта информация критична при реализации механизмов автоматического обновления, где необходимо сравнить версию файла обновления с версией, уже находящейся в работе.
Синтаксис вызова предельно прост и не требует дополнительных параметров:
Сообщить("Версия конфигурации: " + ВерсияКонфигурации());
Сообщить("Версия базы данных: " + ВерсияБазыДанных());
Разница между этими двумя вызовами становится заметной в клиент-серверном варианте работы, когда конфигурация была изменена в конфигураторе, но еще не обновлена в режиме предприятия.
Используйте функцию ВерсияБазыДанных() для проверок в коде, который выполняется непосредственно в рабочем сеансе пользователя, так как она гарантирует актуальность скомпилированного кода.
Работа с объектом Метаданные
Более гибкий инструмент для работы с информацией о конфигурации предоставляет объект Метаданные. Через него можно получить не только версию, но и синоним, имя, а также другие свойства текущего проекта.
Обращение к свойствам метаданных позволяет получить доступ к данным даже в тех случаях, когда стандартные глобальные функции по каким-то причинам недоступны или возвращают некорректный результат в специфических контекстах выполнения.
Для извлечения версии необходимо обратиться к свойству Версия объекта метаданных. Это свойство доступно как на стороне сервера, так и на стороне тонкого клиента.
Версия = Метаданные.Версия;
ИмяКонфигурации = Метаданные.Имя;
Использование объекта Метаданные также позволяет проверить, является ли конфигурация основной или это конфигурация расширения. Это важно при разработке универсальных обработок, которые должны корректно работать в разных типах баз.
Особенности работы с расширениями
Если база использует механизм расширений конфигурации, свойство Метаданные.Версия вернет версию основной конфигурации. Для получения версии расширения необходимо перебирать коллекцию Расширений.
Различия между клиентом и сервером
При разработке распределенных приложений важно учитывать контекст выполнения кода. Функции получения версии могут вести себя по-разному в зависимости от того, где выполняется запрос: на рабочем месте пользователя или на сервере 1С:Предприятие.
В большинстве случаев глобальные функции возвращают идентичные значения, так как версия конфигурации едина для всей информационной базы. Однако, при использовании разделенных данных или в специфических сценариях обновления, могут возникать рассинхронизации.
Если ваш код выполняется в толстом клиенте или в режиме предприятия, убедитесь, что вы запрашиваете версию после полной инициализации сеанса. Преждевременный вызов может привести к получению пустой строки или значения по умолчанию.
- 🔍 Контекст выполнения: Всегда явно указывайте директиву
&НаКлиентеили&НаСервере, чтобы избежать неявных вызовов. - 🔄 Актуальность данных: На сервере версия всегда соответствует состоянию базы данных, на клиенте — состоянию кэша.
- ⚡ Производительность: Вызов свойств метаданных менее затратен, чем некоторые сложные запросы к регистрам сведений.
Особое внимание следует уделить сценариям, когда обновление конфигурации происходит "на лету" через механизм управляемых обновлений. В такие моменты версия на клиенте и сервере может временно различаться.
Получение версии платформы 1С
Часто вместе с версией конфигурации требуется узнать версию самой платформы 1С:Предприятие. Это необходимо для проверки совместимости функционала или ограничения работы определенных механизмов в старых версиях ПО.
Для этих целей используется глобальная функция Версия(). Она возвращает строку, содержащую номер версии платформы, например, "8.3.22.1760". Парсить эту строку приходится вручную, если требуется сравнение числовых значений.
Существует также функция Платформа(), которая возвращает тип платформы (например, "Windows" или "Linux"), что может быть полезно для кроссплатформенной разработки.
Пример получения и анализа версии платформы:
ВерсияПлатформы = Версия();
Если СтрНайти(ВерсияПлатформы, "8.3.20") > 0 Тогда
Сообщить("Используется актуальная платформа");
КонецЕсли;
Помните, что версия платформы и версия конфигурации — это два независимых параметра. Конфигурация может быть написана под одну версию платформы, но запускаться на другой, если соблюдена обратная совместимость.
⚠️ Внимание: Функция Версия() возвращает строку. Для корректного сравнения версий (например, чтобы проверить, что версия выше 8.3.20) необходимо разбивать строку на части и сравнивать числа, а не использовать строковое сравнение, так как "8.3.9" больше, чем "8.3.20" при строковом сравнении.
Анализ таблицы свойств конфигурации
Для наглядности сведем основные методы получения информации о конфигурации в единую таблицу. Это поможет быстро сориентироваться, какой инструмент выбрать для конкретной задачи.
| Метод | Возвращаемое значение | Контекст выполнения | Особенности |
|---|---|---|---|
ВерсияКонфигурации() |
Строка (версия файла) | Клиент, Сервер | Зависит от состояния обновления |
ВерсияБазыДанных() |
Строка (версия БД) | Клиент, Сервер | Наиболее надежный источник |
Метаданные.Версия |
Строка | Клиент, Сервер | Часть объекта метаданных |
Версия() |
Строка (версия платформы) | Клиент, Сервер | Относится к ПО 1С, а не базе |
Как видно из таблицы, выбор метода зависит от того, что именно вы хотите проверить: совместимость с платформой или факт успешного обновления конфигурации базы данных.
В сложных системах часто используется комбинация этих методов. Например, сначала проверяется версия платформы, и только если она подходит, выполняется запрос к метаданным для проверки версии конфигурации.
Для задач аудита и логирования всегда используйте ВерсияБазыДанных(), так как это значение гарантированно соответствует коду, который выполняется в данный момент.
Обработка ошибок и исключительных ситуаций
Хотя получение версии конфигурации является штатной операцией, в редких случаях могут возникать ошибки доступа или проблемы с целостностью метаданных. Особенно это актуально при повреждении файлов конфигурации или сбоях в работе кластера серверов.
Рекомендуется оборачивать вызовы функций получения версии в конструкцию Попытка...Исключение. Это позволит вашей обработке gracefully завершить работу или записать ошибку в лог, вместо того чтобы прерывать выполнение с критическим сообщением.
Если функция возвращает пустую строку, это явный сигнал о том, что метаданные не инициализированы корректно. В таком случае не стоит продолжать выполнение логики, зависящей от номера версии.
Попытка
ТекстВерсии = ВерсияБазыДанных();
Если ПустаяСтрока(ТекстВерсии) Тогда
ВызватьИсключение "Не удалось получить версию базы данных";
КонецЕсли;
Исключение
ЗаписьВЖурналРегистрации(ОписаниеОшибки());
КонецПопытки;
Также стоит учитывать права доступа. В некоторых конфигурациях с жесткой системой разграничения прав (РСД) доступ к свойствам метаданных может быть ограничен для определенных ролей пользователей.
⚠️ Внимание: В защищенных конфигурациях доступ к объекту Метаданные может быть ограничен. Убедитесь, что у роли пользователя есть право на чтение свойств конфигурации, иначе метод вернет Неопределено.
Использование версии для условной логики
Полученная строка версии часто используется для реализации логики, зависящей от релиза конфигурации. Это позволяет поддерживать обратную совместимость и постепенно внедрять новый функционал без поломки старых механизмов.
Для сравнения версий удобно использовать вспомогательные функции, которые преобразуют строку вида "1.0.0.5" в структуру, пригодную для математического сравнения. Прямое сравнение строк может дать ошибочный результат.
Рассмотрим пример реализации проверки минимально допустимой версии:
Функция ПроверитьВерсию(ТребуемаяВерсия)
ТекущаяВерсия = ВерсияБазыДанных();
// Логика разбора строки и сравнения чисел
Возврат Истина; // Условный результат
КонецФункции
Такой подход позволяет писать универсальный код, который автоматически адаптируется под разные версии типовых конфигураций, таких как Бухгалтерия предприятия или Управление торговлей.
- 📦 Миграция данных: Проверка версии помогает запустить нужные обработки миграции при переходе между релизами.
- 🛡️ Безопасность: Блокировка работы в устаревших версиях, содержащих известные уязвимости.
- 🔧 Отладка: Автоматическое включение расширенного логирования для конкретных версий.
Не забывайте, что жесткая привязка логики к номерам версий усложняет поддержку кода в долгосрочной перспективе. По возможности используйте флаги функциональности вместо прямых проверок номеров.
☑️ Проверка перед релизом
Часто задаваемые вопросы (FAQ)
Почему ВерсияКонфигурации() и ВерсияБазыДанных() возвращают разные значения?
Это означает, что файлы конфигурации на диске были изменены (например, загружен новый файл cf), но команда "Обновить конфигурацию базы данных" в конфигураторе еще не была выполнена или не завершена. База данных работает со старой скомпилированной версией.
Можно ли изменить версию конфигурации программно?
Нет, свойство версии доступно только для чтения. Изменение версии происходит исключительно через механизм обновления конфигурации в конфигураторе или при загрузке файла обновления.
Как получить версию основной конфигурации, если используются расширения?
Свойство Метаданные.Версия всегда возвращает версию основной конфигурации. Чтобы получить версию расширения, нужно найти нужное расширение в коллекции Метаданные.Расширения и обратиться к его свойству Версия.
Влияет ли режим совместимости на возвращаемую версию?
Нет, режим совместимости влияет на поведение языка и доступность методов, но не меняет строковое значение версии конфигурации, возвращаемое стандартными функциями.
Где хранится физический файл с номером версии в файловой базе?
В файловой базе информация о версии хранится в файле 1Cv8.1CD (основной файл данных) и в файле описания конфигурации 1Cv8.cf. Однако accessing эти файлы напрямую не рекомендуется, используйте встроенные средства языка.