В процессе администрирования и разработки крупных информационных систем на платформе 1С:Предприятие часто возникает необходимость программно определить, менялась ли конфигурация базы данных. Например, это требуется при запуске системы для инициализации обновления механизмов интеграции, очистки кэша, автоматической регистрации изменений или ведения логов обновления версий.
Выясним причину сложности этой задачи: стандартный метод КонфигурацияИзменена() проверяет исключительно различие между основной конфигурацией (которую редактирует разработчик в Конфигураторе) и конфигурацией базы данных (которая реально работает у пользователей). Если обновление базы данных (клавиша F7 в Конфигураторе) уже выполнено, этот метод вернет значение Ложь. Следовательно, для отслеживания факта обновления рабочей конфигурации во времени нам потребуются другие подходы.
В этой статье мы подробно разберем по шагам несколько эффективных способов программного определения изменения конфигурации — от простых встроенных функций до низкоуровневых запросов к СУБД и системному кэшу.
---
Этот метод подходит в сценариях, когда нам нужно перед выполнением какого-либо критического действия (например, групповой обработки данных или обмена) убедиться, что администратор не оставил «зависших» изменений в Конфигураторе, которые еще не были применены к базе данных.
Проанализируем пример кода на встроенном языке:
Если КонфигурацияИзменена() Тогда
Предупреждение = "Внимание! Основная конфигурация отличается от конфигурации базы данных.
|Рекомендуется применить изменения перед продолжением работы.";
ПоказатьПредупреждение(, Предупреждение);
КонецЕсли;
Важное ограничение: Метод эффективен только до момента обновления конфигурации базы данных. Как только обновление принято, этот метод больше не поможет определить, что конфигурация стала другой по сравнению с прошлым запуском системы.
---
Если ваша информационная база работает в клиент-серверном режиме под управлением СУБД (MS SQL Server, PostgreSQL, IBM DB2 или Oracle), всю информацию о метаданных можно получить напрямую из системных таблиц базы данных. Это самый быстрый и технологичный метод, так как он не требует монопольного доступа и тяжелых выгрузок файлов.
Вся конфигурация базы данных хранится в таблице Config (в некоторых СУБД имя таблицы может быть _config). В ней присутствует запись, где поле FileName имеет значение root. В двоичных данных этой записи хранится UUID версии конфигурации, а поле Modified содержит точную дату и время последнего изменения.
Рассмотрим, как прочитать дату модификации конфигурации через ADO-соединение прямо из кода 1С:
// Пример получения даты изменения конфигурации из СУБД MS SQL Server
СтрокаСоединения = "Provider=SQLOLEDB.1;Data Source=ИмяСервераSQL;Initial Catalog=ИмяБазыДанныхSQL;User ID=Логин;Password=Пароль;";
Соединение = Новый COMОбъект("ADODB.Connection");
Попытка
Соединение.Open(СтрокаСоединения);
ЗапросSQL = "SELECT [Modified] FROM [dbo].[Config] WHERE [FileName] = 'root'";
RecordSet = Соединение.Execute(ЗапросSQL);
Если Не RecordSet.EOF Тогда
ДатаМодификации = RecordSet.Fields("Modified").Value;
Сообщить("Конфигурация базы данных изменена: " + ДатаМодификации);
КонецЕсли;
Соединение.Close();
Исключение
Сообщить("Не удалось подключиться к СУБД: " + ОписаниеОшибки());
КонецПопытки;
Сохраняя полученную дату Modified (или UUID версии из двоичных данных) в параметры сеанса или константу, при следующем запуске системы мы сможем мгновенно сопоставить значения и понять, обновлялась ли конфигурация.
---
Этот способ является универсальным и работает как на файловых, так и на клиент-серверных базах данных. Идея заключается в том, чтобы периодически выгружать конфигурацию в файл формата .cf через пакетный запуск Конфигуратора, рассчитывать его контрольную сумму и сравнивать её с эталонным значением.
Разберем по шагам, как автоматизировать этот процесс с помощью встроенного в платформу объекта ХешированиеДанных (доступен начиная с версии 8.3):
Посмотрим на пример реализации данного алгоритма:
// Шаг 1. Формируем пути и строку запуска Конфигуратора в фоновом режиме
ПутьККаталогу = КаталогВременныхФайлов();
ИмяФайлаCF = ПутьККаталогу + "current_metadata.cf";
ЛогФайл = ПутьККаталогу + "dump_log.txt";
// Строка запуска зависит от типа базы (в примере файловая база)
СтрокаЗапуска = """C:\Program Files\1cv8\8.3.21.1622\bin\1cv8.exe"" DESIGNER "
+ " /F """ + СтрокаСоединенияИнформационнойБазы() + """"
+ " /N ""Администратор"" /P ""Пароль"""
+ " /DumpCfg """ + ИмяФайлаCF + """"
+ " /Out """ + ЛогФайл + """ /Visible";
// Шаг 2. Запускаем процесс выгрузки и ждем завершения
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
// Шаг 3. Проверяем успешность выгрузки и рассчитываем хэш
ФайлCF = Новый Файл(ИмяФайлаCF);
Если ФайлCF.Существует() Тогда
Хеширование = Новый ХешированиеДанных(ХешФункция.MD5);
Хеширование.ДобавитьФайл(ИмяФайлаCF);
ТекущийХэш = ПолучитьШестнадцатеричнуюСтрокуИзДвоичныхДанных(Хеширование.ХешСумма);
Сообщить("Уникальный хэш текущей конфигурации: " + ТекущийХэш);
// Удаляем временные файлы после проверки
Попытка
УдалитьФайлы(ИмяФайлаCF);
УдалитьФайлы(ЛогФайл);
Исключение
// Обработка возможных блокировок файлов операционной системой
КонецПопытки;
Иначе
ВызватьИсключение "Ошибка при выгрузке конфигурации. Подробности в логе: " + ЛогФайл;
EndIf;
Важное примечание: Этот метод дает 100% точный результат для любого типа базы, но требует времени на выгрузку файла конфигурации, поэтому его не рекомендуется выполнять при каждом открытии сеанса пользователем. Лучше запускать такую проверку регламентным заданием в ночное время или вызывать ее только при обновлении администратором системы.
---
Начиная с версии платформы 1С:Предприятие 8.3.17, разработчикам доступна специализированная утилита контроля целостности ci. Эта утилита поставляется вместе с платформой и предназначена специально для автоматического мониторинга изменений файлов СУБД и конфигурационных таблиц.
Утилита работает следующим образом:
config, где хранятся метаданные, и таблицу пользователей users).Использование утилиты ci позволяет полностью автоматизировать мониторинг целостности и изменений конфигурации на уровне системного администрирования без написания сложного кода на встроенном языке 1С.
---
Когда конфигурация базы данных обновляется, платформа 1С принудительно инвалидирует локальный кэш конфигурации на рабочих станциях пользователей при их следующем подключении. Локальный кэш метаданных хранится в каталоге пользователя:
%LOCALAPPDATA%\1C\1Cv8\<Уникальный_Идентификатор_Базы>\
Внутри этого каталога создаются служебные папки, такие как DBNameCache, Config и ConfigSave. Проанализируем дату изменения файлов в этих папках:
ПутьККэшу = КаталогВременныхФайлов() + "..\..\Local\1C\1Cv8\"; // Переход к Local AppData
// Программный поиск файлов кэша текущей базы данных
ФайлКэша = Новый Файл(ПутьККаталогуКэша + "DBNameCache");
Если ФайлКэша.Существует() Тогда
ДатаИзмененияКэша = ФайлКэша.ПолучитьВремяИзменения();
// Сравниваем эту дату с сохраненным временем последнего известного обновления
КонецЕсли;
Этот метод является косвенным, так как кэш может перезаписываться платформой и по другим техническим причинам, однако он работает мгновенно и не требует административных прав доступа к СУБД или монопольной выгрузки файлов.
---
Для решения различных бизнес-задач подходят разные инструменты:
КонфигурацияИзменена().Modified таблицы Config..cf файла с помощью объекта ХешированиеДанных.ci.