Имя, версия и состав конфигурации 1С из кода, SQL и командной строки
Содержание
Чтобы узнать конфигурацию 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С:Предприятие не прочитать. Объект метаданных знает, что модуль существует, но исходный код отдаёт только Конфигуратор или выгрузка в файлы.
Как связать объекты с таблицами СУБД
Функция ПолучитьСтруктуруХраненияБазыДанных() возвращает таблицу соответствия: имя объекта метаданных → имя таблицы в базе (_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.2 | 8.3 |
|---|---|---|
Метаданные.Имя, Версия, Синоним | Есть | Есть |
СистемнаяИнформация.ВерсияПриложения | Есть | Есть |
Расширения, РасширенияКонфигурации.Получить() | Нет | С 8.3.6 |
Свойство РежимСовместимости | Нет | Есть |
Выгрузка в XML /DumpConfigToFiles | Нет | Есть |
| COM-объект | V82.COMConnector | V83.COMConnector |
ibcmd | Нет | В новых релизах |
Для внешней обработки, которая должна запускаться и на старых базах, не обращайтесь к РасширенияКонфигурации напрямую: на 8.2 модуль не скомпилируется. Обращение можно обернуть в Выполнить() внутри Попытка, а лучше выпустить две версии обработки.
Код с &НаСервере и &НаКлиенте — для управляемых форм. В обычных формах 8.2 те же свойства Метаданные читаются напрямую в модуле формы.
Типичные ошибки при программном определении конфигурации
Частые вопросы
Можно ли узнать конфигурацию, не входя в базу?
Чем Имя отличается от Синонима?
Почему у доработанной типовой версия как у типовой?
Как понять, что конфигурация снята с поддержки?
Конфигурация → Поддержка → Настройка поддержки.