Как программно или в пакетном режиме проверить, что конфигурация базы данных не обновлена

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1. Использование ключа /GetConfigGenerationID

Этот метод является штатным средством платформы 1С:Предприятие 8.3. Проанализируем возможности команды /GetConfigGenerationID. Она предназначена для получения уникального идентификатора текущего «поколения» метаданных. При любом изменении основной конфигурации этот идентификатор обновляется.

Для реализации проверки нам потребуется выполнить следующую последовательность действий:

  1. Запустить конфигуратор в пакетном режиме с ключом /Out для записи результата в файл.
  2. Сохранить полученный идентификатор (хэш-сумму).
  3. Сравнить текущий идентификатор с тем, который был зафиксирован сразу после последнего успешного обновления конфигурации базы данных.

Пример командной строки для получения идентификатора:

"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "D:\Base1C" /N "Admin" /P "Pass" /GetConfigGenerationID /Out "C:\Logs\gen_id.txt"

В файле gen_id.txt мы увидим строку вида: 4d8d1d994cd4534c9accd32a5b44b35300000000. Если база пустая, идентификатор будет состоять из нулей. Важно понимать, что этот метод сам по себе не говорит о расхождении с БД, он лишь позволяет отследить, менялась ли основная конфигурация с момента последнего замера.

Метод 2. Проверка через метод КонфигурацияИзменена()

Одним из самых надежных программных способов является использование встроенного языка 1С. Функция КонфигурацияИзменена() возвращает Истина, если основная конфигурация отличается от конфигурации базы данных. Разберем, как запустить эту проверку без участия пользователя.

Создадим внешнюю обработку, которая при открытии выполняет проверку и завершает работу системы с определенным кодом возврата. Это позволит внешнему скрипту (например, на PowerShell или Python) понять статус базы.

Рассмотрим пример кода внутри обработки:


Процедура ПриОткрытии()
    Если КонфигурацияИзменена() Тогда
        ЗавершитьРаботуСистемы(Ложь, Истина, 100); // Код 100 — изменения есть
    Иначе
        ЗавершитьРаботуСистемы(Ложь, Истина, 0);   // Код 0 — изменений нет
    КонецЕсли;
КонецПроцедуры

Запуск такой проверки в пакетном режиме будет выглядеть так:

1cv8.exe ENTERPRISE /F "ПутьКБазе" /Execute "C:\Scripts\CheckChanges.epf"

Важный нюанс: использование этого метода требует запуска клиентского приложения, что может быть накладно по времени и ресурсам. Однако этот способ дает 100% точный результат, идентичный поведению конфигуратора.

Метод 3. Использование Web-сервисов или HTTP-сервисов

Для минимизации накладных расходов на запуск тяжелого клиента 1С, мы можем разработать небольшой Web-сервис внутри самой конфигурации. Проанализируем этот подход: нам достаточно одного метода, который будет вызывать функцию КонфигурацияИзменена() и возвращать булево значение.

Преимущества данного решения:

Пример кода метода Web-сервиса:


Функция CheckConfigModified()
    Возврат КонфигурацияИзменена();
КонецФункции

Метод 4. Низкоуровневый анализ через SQL-запросы

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

В структуре таблиц 1С существуют таблицы Config (основная конфигурация) и DBCfg (конфигурация базы данных). При сохранении изменений в конфигураторе обновляется таблица Config. При выполнении команды «Обновить конфигурацию базы данных» данные из Config переносятся в DBCfg.

Для проверки расхождений мы можем сравнить записи в этих таблицах. Самый простой способ — проверить запись с FileName = 'root'. Рассмотрим логику запроса:

  1. Выбираем значение версии или хэша из таблицы Config для файла root.
  2. Выбираем аналогичное значение из таблицы DBCfg.
  3. Если значения различаются — конфигурация БД не обновлена.

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

Метод 5. Анализ результата пакетного обновления с ключом /DumpResult

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

Рассмотрим команду:

1cv8.exe DESIGNER /F "ПутьКБазе" /UpdateDBCfg /DumpResult "C:\Logs\result.xml" /Out "C:\Logs\log.txt"

Платформа сформирует XML-файл, в котором будет четко указано, завершилось ли обновление успешно или оно не потребовалось. Проанализируем пример структуры result.xml, если обновлять было нечего:


<?xml version="1.0" encoding="UTF-8"?>
<dumpResult>
    <error count="0"/>
    <warning count="0"/>
    <info count="1">
        <message>Конфигурация базы данных уже соответствует основной конфигурации.</message>
    </info>
</dumpResult>

Этот метод удобен тем, что он совмещает в себе и проверку, и само действие по обновлению. Если обновление требует реструктуризации, которую нельзя выполнить динамически, команда вернет ошибку, которую также можно обработать скриптом.

Метод 6. Использование специализированных инструментов (OneScript)

В современной среде разработки 1С для таких задач часто используется OneScript. Существуют готовые библиотеки, такие как vanessa-runner, которые инкапсулируют в себе всю логику работы с пакетным режимом. Выясним, как это упрощает жизнь администратору.

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


// Пример логики на OneScript с использованием runner
Если Ранер.НужноОбновитьКонфигурациюБД(ПараметрыПодключения) Тогда
    Сообщить("Требуется обновление!");
    Ранер.ОбновитьКонфигурациюБД(ПараметрыПодключения);
КонецЕсли;

Библиотека сама запустит конфигуратор с нужными ключами, проанализирует лог-файлы и коды возврата, избавив вас от необходимости писать парсеры текстовых файлов.

Резюме и рекомендации

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

Важно помнить, что наличие «восклицательного знака» может также означать необходимость реструктуризации таблиц, что потребует монопольного доступа к базе. Рекомендуем всегда логировать вывод пакетного режима конфигуратора (/Out), чтобы в случае ошибки оперативно выяснить причину отказа в обновлении.

← На главную