Имя, версия и состав конфигурации 1С из кода, SQL и командной строки

· 9 мин

Содержание

Чтобы узнать конфигурацию 1С программно, прочитайте свойства глобального объекта Метаданные: Метаданные.Имя вернёт внутреннее имя (например, БухгалтерияПредприятия), Метаданные.Синоним — название для людей, Метаданные.Версия — номер релиза. Это одна строка кода, и она работает в любой базе на 8.2 и 8.3.

Остальные способы нужны, когда кода внутри базы нет. Для внешней обработки или отладки хватает встроенного языка. Для инвентаризации десятка баз без открытия каждой — командная строка 1cv8 или COM-соединение. Для разбора «почему версия в базе не та» — регистр версий подсистем и таблицы СУБД. Вручную ту же информацию показывает окно Справка → О программе, но в скрипт его не встроишь.

СпособЧто получаетеКогда выбирать
Объект МетаданныеИмя, синоним, версия, поставщик, режим совместимостиКод в обработке, расширении, модуле
Регистр ВерсииПодсистем (БСП)Версия, до которой база реально обновленаПроверка, завершилось ли обновление
РасширенияКонфигурации.Получить()Список подключённых расширенийДоработки поверх типовой
SQL к таблицам Config, ConfigSaveДаты изменений, несохранённые правкиАудит без входа в 1С
1cv8 DESIGNER /DumpConfigToFiles, COMПолное описание в XML или чтение снаружиМассовая инвентаризация баз

Свойства объекта Метаданные: имя и версия конфигурации

Глобальное свойство Метаданные возвращает объект ОбъектМетаданныхКонфигурация. Через него видна вся информация, которую разработчик заполнил в свойствах корня конфигурации.

Полезные свойства:

  • 🔹 Имя — внутреннее имя, по нему удобно ветвить код (БухгалтерияПредприятия, ЗарплатаИУправлениеПерсоналом, УправлениеТорговлей);
  • 🔹 Синоним — представление для пользователя: «Бухгалтерия предприятия, редакция 3.0»;
  • 🔹 Версия — строка вида 3.0.160.25;
  • 🔹 Поставщик — у типовых решений «Фирма “1С”»;
  • 🔹 АвторскиеПрава, КраткаяИнформация, ПодробнаяИнформация — текстовые поля из свойств;
  • 🔹 РежимСовместимости — значение перечисления, например Версия8_3_24.

Минимальный пример для внешней обработки. Код выполняется на сервере, чтобы не зависеть от вида клиента:

&НаСервереБезКонтекста
Функция СведенияОКонфигурации()

    Сведения = Новый Структура;
    Сведения.Вставить("Имя",       Метаданные.Имя);
    Сведения.Вставить("Синоним",   Метаданные.Синоним);
    Сведения.Вставить("Версия",    Метаданные.Версия);
    Сведения.Вставить("Поставщик", Метаданные.Поставщик);
    Сведения.Вставить("Совместимость", Строка(Метаданные.РежимСовместимости));

    СисИнфо = Новый СистемнаяИнформация;
    Сведения.Вставить("Платформа", СисИнфо.ВерсияПриложения);

    Возврат Сведения;

КонецФункции

&НаКлиенте
Процедура ПоказатьСведения(Команда)
    Сведения = СведенияОКонфигурации();
    Для Каждого КлючИЗначение Из Сведения Цикл
        Сообщить(КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение);
    КонецЦикла;
КонецПроцедуры

СистемнаяИнформация.ВерсияПриложения — это версия платформы (8.3.24.1548), а Метаданные.Версия — версия конфигурации. Путать их — самая частая ошибка в логах и обращениях в поддержку.

Конфигурация в памяти и конфигурация базы данных

Метаданные показывает конфигурацию, с которой запущен текущий сеанс. Если в Конфигураторе загрузили обновление, но не выполнили «Обновить конфигурацию базы данных», сеанс об этом не узнает.

Для такой проверки есть две функции глобального контекста:

  • ✅ КонфигурацияИзменена() — Истина, если основная конфигурация отличается от конфигурации базы данных;
  • ✅ КонфигурацияБазыДанныхИзмененаДинамически() — Истина, если конфигурацию базы обновили динамически, а текущий сеанс работает со старой версией. Пользователю пора перезапустить программу.

Версия информационной базы в регистре ВерсииПодсистем

Метаданные.Версия говорит, какой релиз загружен. Но это ещё не значит, что база до него обновлена. Обработчики обновления (перезаполнение регистров, перенос данных) выполняются при первом запуске после обновления и могут упасть.

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

Прочитать запросом:

УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ВерсииПодсистем.ИмяПодсистемы КАК ИмяПодсистемы,
|    ВерсииПодсистем.Версия КАК Версия
|ИЗ
|    РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.ИмяПодсистемы + " — " + Выборка.Версия);
КонецЦикла;

УстановитьПривилегированныйРежим(Ложь);

Привилегированный режим нужен, потому что у обычного пользователя прав на этот регистр обычно нет. Работает он только в серверном коде.

Короче через программный интерфейс БСП:

ВерсияИБ = ОбновлениеИнформационнойБазы.ВерсияИБ(Метаданные.Имя);
Если ВерсияИБ <> Метаданные.Версия Тогда
    Сообщить("Обновление не завершено: база " + ВерсияИБ
        + ", конфигурация " + Метаданные.Версия);
КонецЕсли;

Как правильно сравнивать номера версий

Строки сравнивать нельзя: "3.0.99.1" > "3.0.150.1" даст Истина, потому что 9 больше 1 посимвольно. В БСП есть готовая функция:

Результат = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Метаданные.Версия, "3.0.150.1");
// Результат > 0 — текущая версия выше, 0 — равны, < 0 — ниже

Без БСП разбейте строку СтрРазделить(Версия, ".") и сравнивайте части как числа.

Расширения поверх конфигурации

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

&НаСервереБезКонтекста
Процедура ВывестиРасширения()
    Для Каждого Расширение Из РасширенияКонфигурации.Получить() Цикл
        Сообщить(СтрШаблон("%1 (%2), версия %3, активно: %4",
            Расширение.Имя, Расширение.Синоним,
            Расширение.Версия, Расширение.Активно));
    КонецЦикла;
КонецПроцедуры

Объекты, которые добавило расширение, попадают в общие коллекции Метаданные. Чтобы отличить их от объектов основной конфигурации, вызовите у объекта метаданных метод РасширениеКонфигурации(): для «родного» объекта он вернёт Неопределено.

Метод РасширенияКонфигурации.Получить() требует права администрирования расширений. Под обычным пользователем вызов упадёт с ошибкой прав — выполняйте его от администратора или в привилегированном режиме.

Состав конфигурации: объекты, реквизиты, формы

Структуру обходят теми же Метаданные, только через коллекции: Справочники, Документы, РегистрыСведений, РегистрыНакопления, ОбщиеМодули, Подсистемы и другие. У каждого объекта есть Имя, Синоним, метод ПолноеИмя(), а у прикладных — коллекции Реквизиты, ТабличныеЧасти, Формы, Макеты.

Пример: выгрузить в таблицу все документы с числом реквизитов и форм.

&НаСервереБезКонтекста
Функция ОписаниеДокументов()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("ПолноеИмя");
    Таблица.Колонки.Добавить("Синоним");
    Таблица.Колонки.Добавить("Реквизитов");
    Таблица.Колонки.Добавить("ТабличныхЧастей");
    Таблица.Колонки.Добавить("Форм");

    Для Каждого Документ Из Метаданные.Документы Цикл
        Строка = Таблица.Добавить();
        Строка.ПолноеИмя      = Документ.ПолноеИмя();
        Строка.Синоним        = Документ.Синоним;
        Строка.Реквизитов     = Документ.Реквизиты.Количество();
        Строка.ТабличныхЧастей = Документ.ТабличныеЧасти.Количество();
        Строка.Форм           = Документ.Формы.Количество();
    КонецЦикла;

    Таблица.Сортировать("ПолноеИмя");
    Возврат Таблица;

КонецФункции

Другие приёмы, без которых не обойтись:

  1. Найти объект по имени. Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура") вернёт объект или Неопределено. Так код проверяет, есть ли нужный справочник, прежде чем к нему обращаться.
  2. Узнать метаданные по ссылке. Ссылка.Метаданные() — у любой ссылки. Метаданные.НайтиПоТипу(ТипЗнч(Значение)) — по типу значения.
  3. Проверить, есть ли реквизит. Документ.Реквизиты.Найти("Склад") вернёт Неопределено, если реквизита нет. Полезно для обработок, которые должны работать в разных конфигурациях.
  4. Состав подсистемы. У Метаданные.Подсистемы.<Имя> есть свойства Состав (объекты) и Подсистемы (вложенные).

Текст модулей из режима 1С:Предприятие не прочитать. Объект метаданных знает, что модуль существует, но исходный код отдаёт только Конфигуратор или выгрузка в файлы.

Как связать объекты с таблицами СУБД

Функция ПолучитьСтруктуруХраненияБазыДанных() возвращает таблицу соответствия: имя объекта метаданных → имя таблицы в базе (_Reference42, _Document187) и её поля. Это мостик к следующему способу.

Структура = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Строка Из Структура Цикл
    Если СтрНайти(Строка.Метаданные, "Номенклатура") > 0 Тогда
        Сообщить(Строка.Метаданные + " → " + Строка.ИмяТаблицыХранения);
    КонецЕсли;
КонецЦикла;

Что можно узнать о конфигурации SQL-запросом

В клиент-серверной базе конфигурация хранится в служебных таблицах СУБД. Это работает для MS SQL Server и PostgreSQL. В файловой базе всё лежит в одном файле 1Cv8.1CD, и SQL к нему не применить.

ТаблицаЧто в ней
ConfigКонфигурация базы данных, по которой работают пользователи
ConfigSaveОсновная конфигурация, сохранённая в Конфигураторе, но ещё не применённая к базе
ParamsПараметры информационной базы
DBSchemaОписание структуры хранения

Содержимое лежит в поле BinaryData в сжатом виде. Имя и версию простым SELECT не достать — нужна распаковка сторонними утилитами. Но служебные поля читаются сразу, и для аудита этого часто хватает:

-- Когда последний раз менялась конфигурация базы данных
SELECT MAX(Modified) AS last_change FROM Config;

-- Есть ли правки, не применённые к базе
SELECT COUNT(*) AS pending_files FROM ConfigSave;

Непустая ConfigSave означает: кто-то изменил конфигурацию в Конфигураторе и не нажал «Обновить конфигурацию базы данных».

Только чтение. Фирма 1С не поддерживает прямую работу с таблицами СУБД, любая запись в Config или ConfigSave может сделать базу незапускаемой. Запросы выполняйте под учётной записью с правами только на чтение.

Командная строка, 1C:EDT и COM-соединение

Когда баз много, открывать каждую не хочется. Три внешних способа.

Выгрузка конфигурации в XML через 1cv8

Пакетный режим Конфигуратора выгружает конфигурацию в файлы. В корне выгрузки лежит Configuration.xml, где в свойствах записаны Name, Synonym, Vendor и Version.

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER ^
  /S"srv1c\buh" /N"Администратор" /P"пароль" ^
  /DumpConfigToFiles "D:\dump\buh" ^
  /Out "D:\dump\buh.log" /DisableStartupDialogs

Для файловой базы вместо /S укажите /F"D:\Bases\Buh". Если нужен один файл, а не XML, есть ключ /DumpCfg "D:\dump\buh.cf".

💡 Выгрузка XML крупной типовой занимает несколько минут и сотни мегабайт. Для массовой проверки версий быстрее COM-соединение.

Чтение через COM из Python или PowerShell

COM-соединение запускает сеанс 1С без интерфейса и даёт доступ к тем же Метаданные (в англоязычной нотации — Metadata). Нужна зарегистрированная comcntr.dll той же разрядности, что и скрипт.

import win32com.client

connector = win32com.client.Dispatch("V83.COMConnector")
conn = connector.Connect('Srvr="srv1c";Ref="buh";Usr="Администратор";Pwd="пароль";')

print(conn.Metadata.Name, conn.Metadata.Version)

Для файловой базы строка соединения — File="D:\Bases\Buh";Usr=.... Пароль в скрипте храните вне кода — в переменной окружения или хранилище секретов.

1C:EDT и ibcmd

В 1C:EDT конфигурацию импортируют из информационной базы в проект. Свойства корня — имя, версия, поставщик — видны в редакторе конфигурации, а состав объектов — в навигаторе. Это удобно для сравнения двух версий, а не для быстрого ответа «какая версия».

Утилита ibcmd в новых релизах 8.3 работает с базой без Конфигуратора, в том числе выгружает конфигурацию. Набор команд меняется от релиза к релизу — точный синтаксис смотрите в справке ibcmd help вашей версии платформы.

Различия платформ 8.2 и 8.3

Ядро подхода одинаковое: объект Метаданные с теми же свойствами есть в обеих версиях. Различаются детали.

Возможность8.28.3
Метаданные.Имя, Версия, СинонимЕстьЕсть
СистемнаяИнформация.ВерсияПриложенияЕстьЕсть
Расширения, РасширенияКонфигурации.Получить()НетС 8.3.6
Свойство РежимСовместимостиНетЕсть
Выгрузка в XML /DumpConfigToFilesНетЕсть
COM-объектV82.COMConnectorV83.COMConnector
ibcmdНетВ новых релизах

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

Код с &НаСервере и &НаКлиенте — для управляемых форм. В обычных формах 8.2 те же свойства Метаданные читаются напрямую в модуле формы.

Типичные ошибки при программном определении конфигурации

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

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

Можно ли узнать конфигурацию, не входя в базу?
Да. Для клиент-серверной базы — по таблицам СУБД или выгрузкой через пакетный Конфигуратор. Без учётной записи пользователя 1С выгрузка и COM-соединение не сработают.
Чем Имя отличается от Синонима?
Имя — идентификатор для кода, без пробелов, одинаковый во всех редакциях. Синоним — название для пользователя, может меняться и зависит от языка интерфейса.
Почему у доработанной типовой версия как у типовой?
Версию в свойствах конфигурации меняет разработчик вручную. Многие при доработке её не трогают, поэтому номер совпадает с исходным релизом.
Как понять, что конфигурация снята с поддержки?
Из режима 1С:Предприятие это не определить. Смотрите в Конфигураторе: Конфигурация → Поддержка → Настройка поддержки.
Как определить конфигурацию во внешней обработке перед запуском?
Проверьте Метаданные.Имя в начале обработки и прервите работу с понятным сообщением, если база не та. Так обработка для ЗУП не испортит данные в бухгалтерии.