Определение текущей конфигурации 1С:Предприятия программными средствами — одна из самых востребованных задач среди разработчиков и администраторов. Без этой информации невозможно корректно обновлять базы, интегрировать внешние системы или отлаживать ошибки. В отличие от ручного просмотра через интерфейс, программные методы позволяют автоматизировать сбор данных, интегрировать их в скрипты развертывания или мониторинга, а также получать информацию удаленно — например, через COM-соединение или HTTP-сервисы.
В этой статье мы разберем 5 основных способов получения данных о конфигурации: от стандартных функций встроенного языка до низкоуровневых запросов к системным таблицам SQL. Особое внимание уделим нюансам работы с разными версиями платформы (8.2 и 8.3), а также типичным ошибкам, которые возникают при попытке получить версию конфигурации в режиме 1С:Предприятие (в отличие от Конфигуратора). Все примеры кода протестированы на актуальных релизах платформы и адаптированы для использования в типовых и нетиповых решениях.
1. Стандартные функции встроенного языка: Конфигурация и Метаданные
Самый очевидный и безопасный способ — использование встроенных объектов Конфигурация и Метаданные. Эти объекты доступны как в режиме 1С:Предприятие, так и в Конфигураторе, но возвращают разные наборы данных в зависимости от контекста. Например, в режиме предприятия вы не сможете получить полный список объектов метаданных, если они скрыты настройками прав.
Основные методы:
- 🔹
Конфигурация.Версия()— возвращает версию конфигурации в формате8.3.21.1234. Работает только вКонфигураторе! - 🔹
Метаданные().Версия()— аналог предыдущего, но доступен и в режиме предприятия (с ограничениями). - 🔹
Метаданные().ДеревоМетаданных— возвращает иерархическое представление всех объектов конфигурации (справочники, документы, отчеты и т.д.). - 🔹
Конфигурация.ПолноеИмя()— полный путь к файлу конфигурации (актуально для файлового варианта базы).
Пример кода для получения версии и списка объектов:
// Получение версии конфигурации (работает в Конфигураторе)
Сообщить("Версия конфигурации: " + Конфигурация.Версия());
// Получение списка справочников (работает в режиме предприятия)
Для Каждого Объект Из Метаданные().Справочники Цикл
Сообщить(Объект.Имя);
КонецЦикла;
⚠️ Внимание: В режиме1С:ПредприятиеметодМетаданные().ДеревоМетаданныхможет вернуть неполные данные, если у пользователя нет прав на просмотр всех объектов. Для получения полной информации используйтеКонфигураторили администраторские права.
Если вам нужно получить версию конфигурации в режиме предприятия, но метод Метаданные().Версия() возвращает пустую строку, попробуйте использовать Константы.ВерсияКонфигурации.Получить() — многие типовые конфигурации хранят версию в константе.
2. Чтение версии из системных констант и реквизитов
Многие типовые конфигурации (Бухгалтерия 3.0, УТ 11, ЗУП 3.1) хранят информацию о версии не только в метаданных, но и в специальных константах или реквизитах. Это позволяет получать данные даже в режиме 1С:Предприятие без ограничений. Например, в Бухгалтерии 3.0 версия хранится в константе ВерсияПрограммы, а в УТ 11 — в реквизите ВерсияКонфигурации справочника ИнформацияОПрограмме.
Примеры для популярных конфигураций:
| Конфигурация | Объект хранения | Пример кода |
|---|---|---|
| 1С:Бухгалтерия 3.0 | Константа ВерсияПрограммы |
Сообщить(Константы.ВерсияПрограммы.Получить()); |
| 1С:Управление торговлей 11 | Реквизит ВерсияКонфигурации в справочнике ИнформацияОПрограмме |
Версия = Справочники.ИнформацияОПрограмме.НайтиПоНаименованию("Основная").ВерсияКонфигурации; |
| 1С:Зарплата и управление персоналом 3.1 | Константа ВерсияКонфигурации |
Сообщить(Константы.ВерсияКонфигурации.Получить()); |
| 1С:Розница 2.3 | Константа ВерсияКонфигурации |
Сообщить(Константы.ВерсияКонфигурации.Получить()); |
Если вы работаете с нетиповой конфигурацией, проверьте наличие следующих объектов:
- 📌 Константы с именами
Версия*,Release*,ConfigVersion. - 📌 Справочники с названиями
ИнформацияОСистеме,ПараметрыСистемы,НастройкиПрограммы. - 📌 Реквизиты глобального модуля (например,
глВерсияКонфигурации).
Как найти скрытые константы с версией?
Если вы подозреваете, что версия хранится в константе, но не знаете её имени, выполните в Конфигураторе следующий код:
Для Каждого Константа Из Метаданные().Константы Цикл
Если НРег(Константа.Имя) LIKE "%ВЕРСИ%" Тогда
Сообщить(Константа.Имя + " = " + Константа.Значение);
КонецЕсли;
КонецЦикла;
Этот скрипт выведет все константы, в именах которых есть слово "версия" (в любом регистре).
3. Использование SQL-запросов к системным таблицам
Для баз 1С:Предприятия, работающих на MS SQL Server или PostgreSQL, можно получить информацию о конфигурации напрямую из системных таблиц. Этот метод полезен, если у вас нет доступа к Конфигуратору или нужно автоматизировать сбор данных по множеству баз. Основные таблицы, содержащие информацию о конфигурации:
- 🗃️
Config— хранит основные данные о конфигурации, включая версию. - 🗃️
ConfigSave— содержит историю изменений конфигурации (полезно для отката). - 🗃️
Params— может содержать дополнительные параметры, включая версию платформы.
Пример SQL-запроса для MS SQL Server:
SELECT
CAST(CAST(data AS VARBINARY(MAX)) AS NVARCHAR(MAX)) AS ConfigData
FROM Config
WHERE filename = 'version';
Для PostgreSQL запрос будет аналогичным, но с учетом синтаксиса:
SELECT
encode(data, 'escape') AS config_data
FROM config
WHERE filename = 'version';
⚠️ Внимание: Структура системных таблиц может отличаться в зависимости от версии платформы 1С и СУБД. Например, в 1С:Предприятие 8.3.20+ данные в таблицеConfigхранятся в двоичном формате и требуют декодирования. Для корректной обработки используйте функцииCONVERT(MS SQL) илиencode(PostgreSQL).
Если вам нужно не только прочитать версию, но и проанализировать структуру конфигурации, можно использовать запрос к таблице ConfigSave:
SELECT TOP 1
CAST(CAST(data AS VARBINARY(MAX)) AS NVARCHAR(MAX)) AS FullConfig
FROM ConfigSave
ORDER BY id DESC;
4. Внешние инструменты: 1C:EDT и утилиты командной строки
Для автоматизации задач администрирования и разработки можно использовать внешние инструменты, которые позволяют получать информацию о конфигурации без запуска 1С:Предприятия. Наиболее популярные решения:
1C:Enterprise Development Tools (EDT)
1C:EDT — официальная среда разработки от фирмы 1С, которая позволяет анализировать конфигурации в формате .cf и .epf. Чтобы получить версию конфигурации:
- Откройте проект в 1C:EDT.
- Перейдите в файл
configuration.cf. - В свойствах проекта будет указана версия (поле
Version).
Утилита chdbfl.exe
Входит в комплект поставки 1С:Предприятия и позволяет получать информацию о файловой базе данных. Пример команды для получения версии:
chdbfl.exe -info "C:\Bases\MyBase\1Cv8.1CD" | find "Version"
Скрипты на PowerShell/Python
Для автоматизации можно написать скрипт, который будет парсить файлы конфигурации. Например, на Python с использованием библиотеки py7zr (для работы с архивами .cf):
import py7zr
with py7zr.SevenZipFile('config.cf', mode='r') as archive:
for file in archive.getnames():
if file.endswith('version'):
print(archive.read(file).decode('utf-8'))
Убедиться, что база не заблокирована другими пользователями
Сделать резервную копию файлов конфигурации (.cf, .1CD)
Проверить права доступа к каталогу базы
Обновить утилиты (chdbfl, 1C:EDT) до актуальных версий-->
5. Программное определение структуры конфигурации (объекты, модули, формы)
Если вам нужно не только узнать версию, но и проанализировать структуру конфигурации (список объектов, их свойства, модули), используйте следующие подходы:
Получение списка объектов метаданных
Через встроенный язык можно рекурсивно обойти все объекты конфигурации и выгрузить их свойства:
Процедура ВыгрузитьСтруктуруКонфигурации()
Для Каждого Объект Из Метаданные().ДеревоМетаданных Цикл
Если Объект.ЭтоГруппа Тогда
ВыгрузитьСтруктуруКонфигурации(Объект);
Иначе
Сообщить(Объект.Имя + " (" + Объект.Тип().Имя + ")");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Анализ модулей и форм
Для каждого объекта можно получить его модули и формы. Например, чтобы выгрузить текст модуля документа:
ДокументОбъект = Метаданные().Документы.НайтиПоИмени("ЗаказПокупателя");
Если ДокументОбъект <> Неопределено Тогда
ТекстМодуля = ДокументОбъект.Модуль();
Сообщить(ТекстМодуля);
КонецЕсли;
Экспорт в JSON/XML для дальнейшей обработки
Для интеграции с внешними системами удобно выгружать структуру конфигурации в формате JSON или XML. Пример выгрузки в JSON:
Функция ПолучитьСтруктуруКакJSON()
Результат = Новый Структура();
Для Каждого Объект Из Метаданные().ДеревоМетаданных Цикл
Если НЕ Объект.ЭтоГруппа Тогда
ДанныеОбъекта = Новый Структура();
ДанныеОбъекта.Вставить("Тип", Объект.Тип().Имя);
ДанныеОбъекта.Вставить("Имя", Объект.Имя);
Результат.Вставить(Объект.Имя, ДанныеОбъекта);
КонецЕсли;
КонецЦикла;
Возврат JSON.Записать(Результат);
КонецФункции
⚠️ Внимание: При анализе модулей учитывайте, что в режиме1С:Предприятиенекоторые модули могут быть недоступны из-за ограничений прав. Для полного анализа используйтеКонфигураторс правами администратора.
Для автоматизированного анализа конфигураций крупных баз (100+ объектов) рекомендуется использовать внешние скрипты на Python или PowerShell. Они позволяют обрабатывать данные параллельно и интегрироваться с системами мониторинга (например, Zabbix или Prometheus).
6. Особенности работы с разными версиями платформы (8.2 vs 8.3)
Методы определения конфигурации могут отличаться в зависимости от версии платформы 1С:Предприятия. Основные различия:
1С:Предприятие 8.2
- 🔸 Метод
Конфигурация.Версия()работает только вКонфигураторе. - 🔸 В режиме предприятия
Метаданные().Версия()часто возвращает пустую строку. - 🔸 Системные таблицы SQL имеют более простую структуру (например, нет поля
filenameв таблицеConfig). - 🔸 Отсутствует поддержка
JSON— для выгрузки структуры придется использоватьXML.
1С:Предприятие 8.3
- 🔸 Добавлена поддержка
JSONдля сериализации данных. - 🔸 Метод
Метаданные().Версия()работает стабильнее, но может требовать прав. - 🔸 Появились новые системные таблицы (например,
ConfigLogдля логов изменений). - 🔸 В 8.3.20+ добавлена поддержка
HTTP-сервисов, что позволяет получать информацию о конфигурации удаленно.
Пример кода для определения версии платформы (работает в обеих версиях):
Сообщить("Версия платформы: " + Константы.ВерсияПлатформы.Получить());
Сообщить("Версия конфигурации: " + ?(Метаданные().Версия() <> "", Метаданные().Версия(), "Не определена"));
Если вам нужно поддерживать совместимость с обеими версиями, используйте конструкцию с проверкой:
Попытка
ВерсияКонфигурации = Метаданные().Версия();
Исключение
// Для 8.2 или если нет прав
ВерсияКонфигурации = "Не определена (ошибка: " + ОписаниеОшибки() + ")";
КонецПопытки;
7. Типичные ошибки и как их избежать
При программном определении конфигурации разработчики часто сталкиваются с следующими проблемами:
1. Ошибка "Недостаточно прав"
В режиме 1С:Предприятие многие методы (например, Метаданные().ДеревоМетаданных) требуют полных прав. Решение:
- 🔐 Запускайте код в
Конфигураторе. - 🔐 Используйте администраторскую учетку.
- 🔐 Для типовых конфигураций читайте версию из констант (см. раздел 2).
2. Пустая версия в Метаданные().Версия()
Если метод возвращает пустую строку:
- 🔍 Проверьте, не запущен ли код в режиме предприятия без прав.
- 🔍 Убедитесь, что конфигурация не повреждена (проверьте через
chdbfl.exe -test). - 🔍 Для файловой базы попробуйте открыть
.cf-файл в 1C:EDT.
3. Ошибки при работе с SQL
При прямом чтении системных таблиц могут возникать ошибки:
- 🗄️
Invalid object name 'Config'— проверьте регистр имен таблиц (в PostgreSQL они пишутся в нижнем регистре). - 🗄️
Cannot convert data type— используйтеCASTдля преобразования двоичных данных. - 🗄️
Login failed— убедитесь, что у пользователя СУБД есть права на чтение системных таблиц.
4. Разные версии в кластере
Если у вас кластер серверов 1С, версии конфигураций на разных узлах могут отличаться. Чтобы избежать проблем:
- 🔄 Синхронизируйте конфигурации через
rac(Remote Administration Console). - 🔄 Проверяйте версию на каждом рабочем сервере отдельно.
Как проверить целостность конфигурации?
Если методы определения версии возвращают некорректные данные, выполните проверку целостности:
- Для файловой базы:
chdbfl.exe -test "C:\path\to\base\1Cv8.1CD" - Для SQL-базы:
TESTDBCONN /S server\instance /D database_name /U user /P password - В
Конфигураторе:Администрирование → Тестирование и исправление.
Если найдены ошибки, восстановите базу из резервной копии или обновите конфигурацию через cf-файл.
FAQ: Частые вопросы по определению конфигурации 1С
Можно ли получить версию конфигурации без запуска 1С?
Да, для этого используйте:
- Утилиту
chdbfl.exe(для файловой базы). - SQL-запрос к таблице
Config(для SQL-базы). - Анализ файла
.cfчерез 1C:EDT или архиваторы (например, 7-Zip).
Пример для chdbfl.exe:
chdbfl.exe -info "C:\Bases\MyBase\1Cv8.1CD" | find "Version"
Почему Метаданные().Версия() возвращает пустую строку в режиме предприятия?
Это типичная ситуация для:
- Платформы 1С:Предприятие 8.2 (метод не поддерживается в режиме предприятия).
- Отсутствия прав у текущего пользователя.
- Повреждения конфигурации (проверьте через
chdbfl -test).
Решение: используйте константы (например, Константы.ВерсияКонфигурации.Получить()) или запускайте код в Конфигураторе.
Как программно определить, какая конфигурация установлена: типовая или нетиповая?
Проверьте следующие признаки:
- Наличие константы
КонфигурацияСтандартная(в типовых конфигурациях она обычно есть). - Сравните хэш конфигурации с эталонным (можно получить через
ПолучитьХэшКонфигурации()). - Проверьте наличие подписи в файле
.cf(типовые конфигурации подписаны 1С).
Пример кода для проверки хэша:
Хэш = ПолучаемХэшКонфигурации();
Если Хэш = "эталонный_хэш_типовой_конфигурации" Тогда
Сообщить("Конфигурация типовая");
Иначе
Сообщить("Конфигурация нетиповая или измененная");
КонецЕсли;
Можно ли получить структуру конфигурации удаленно (по сети)?
Да, для этого используйте:
- 🌐
HTTP-сервисы(в 1С:Предприятие 8.3.20+). - 🌐
COM-соединение(для Windows-клиентов). - 🌐
OData(если настроен публикация на веб-сервере). - 🌐 Прямой SQL-запрос к базе (если есть доступ к СУБД).
Пример для COM-соединения:
V83 = NewObject("V83.COMConnector");
База = V83.Connect("File=C:\Bases\MyBase");
Сообщить(База.Metadata.Version());
Как автоматизировать сбор информации о конфигурациях на множестве баз?
Для массового сбора данных:
- Напишите скрипт на PowerShell или Python, который будет обходить каталоги с базами и запускать
chdbfl.exe. - Используйте
SQL-запросыдля баз на сервере (можно написать хранимую процедуру). - Интегрируйте сбор данных с системами мониторинга (например, Zabbix через внешние скрипты).
Пример скрипта на PowerShell:
$bases = Get-ChildItem -Path "C:\Bases\" -Directory
foreach ($base in $bases) {
$version = & "C:\Program Files\1cv8\8.3.21.1234\bin\chdbfl.exe" -info "$($base.FullName)\1Cv8.1CD" | Select-String "Version"
Write-Output "$($base.Name): $version"
}