При работе с самописными конфигурациями на платформе 1С:Предприятие 8.2 часто возникает необходимость выводить дату последнего обновления в заголовке системы или в окне «О программе». Это помогает пользователям и администраторам быстро понимать, актуальна ли текущая версия базы. Однако платформа не предоставляет прямой функции типа ДатаОбновления(). В этой статье мы подробно разберем, как реализовать этот механизм программно, не прибегая к тяжелым запросам к SQL-серверу или парсингу журнала регистрации.
Проанализируем самый надежный и производительный метод, который используется в типовых решениях, построенных на Библиотеке Стандартных Подсистем (БСП). Суть заключается в том, чтобы сравнивать версию метаданных конфигурации с номером версии, зафиксированным в информационной базе при предыдущем запуске.
Для реализации этого метода нам понадобятся два объекта в конфигурации:
НомерВерсииКонфигурации (тип: Строка).ДатаПоследнегоОбновления (тип: Дата).Разберем алгоритм работы по шагам. При каждом обновлении разработчик должен инкрементировать (увеличивать) номер версии в свойствах корня конфигурации (например, с 1.0.1 на 1.0.2). При запуске системы мы будем проверять, изменилась ли эта версия.
Рассмотрим пример кода, который следует разместить в модуле обычного приложения (или управляемого приложения) в процедуре ПриНачалеРаботыСистемы():
Процедура ПриНачалеРаботыСистемы()
// Получаем текущую версию из метаданных конфигурации
ТекущаяВерсияМТ = Метаданные.Версия;
// Получаем версию, которая была сохранена в базе до этого
ВерсияВБазе = Константы.НомерВерсииКонфигурации.Получить();
// Сравниваем версии
Если ТекущаяВерсияМТ <> ВерсияВБазе Тогда
// Если версии различаются, значит было произведено обновление
// Фиксируем текущую дату как дату последнего обновления
ДатаОбновления = ТекущаяДата();
// Записываем новые данные в константы
Константы.НомерВерсииКонфигурации.Установить(ТекущаяВерсияМТ);
Константы.ДатаПоследнегоОбновления.Установить(ДатаОбновления);
ИнформироватьОбОбновлении = Истина;
Иначе
// Если версии совпадают, просто берем ранее сохраненную дату
ДатаОбновления = Константы.ДатаПоследнегоОбновления.Получить();
ИнформироватьОбОбновлении = Ложь;
КонецЕсли;
// Устанавливаем заголовок системы с датой обновления
ТекстЗаголовка = "Моя Конфигурация (обновлена: " + Формат(ДатаОбновления, "ДЛФ=D") + ")";
УстановитьЗаголовокСистемы(ТекстЗаголовка);
КонецПроцедуры
Преимущество этого метода: он практически не потребляет ресурсов при запуске, так как чтение констант происходит мгновенно. Единственное условие — разработчик не должен забывать менять номер версии в свойствах конфигурации перед выпуском обновления.
Если вы не хотите вручную менять номера версий, можно попытаться получить дату из системных событий 1С. Платформа фиксирует событие «Конфигурация изменена» в Журнале регистрации. Проанализируем, как сделать это максимально быстро, чтобы не замедлять загрузку программы.
Выясним причину, по которой обычное чтение журнала может быть медленным: если журнал содержит миллионы записей, поиск по нему займет много времени. Поэтому мы будем использовать фильтр, ограничивающий выборку только событиями изменения конфигурации.
Функция ПолучитьДатуПоследнегоИзмененияИзЖурнала()
Фильтр = Новый Структура;
Фильтр.Вставить("Событие", "_$Config$_.Modify"); // Код события изменения конфигурации
ТаблицаСобытий = Новый ТаблицаЗначений;
// Выгружаем только последнюю запись
ВыгрузитьЖурналРегистрации(ТаблицаСобытий, Фильтр, "Дата", , 1);
Если ТаблицаСобытий.Количество() > 0 Тогда
Возврат ТаблицаСобытий[0].Дата;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Важный нюанс: этот метод сработает только в том случае, если ведение журнала регистрации включено и в нем сохраняются события изменения метаданных. Если журнал был очищен или отключен, функция вернет пустое значение.
Если ваша конфигурация подключена к хранилищу, дата последнего обновления фактически совпадает с датой последнего помещения объектов в хранилище. Рассмотрим более сложный, но автоматизированный способ для систем, где разработка ведется активно.
Мы можем запустить конфигуратор в пакетном режиме с ключом /ConfigurationRepositoryGetHistory, выгрузить историю в XML-файл и прочитать дату последнего чекина. Однако, делать это при каждом запуске пользователя — плохая практика из-за огромных задержек.
Посмотрим на логику оптимизации: данный скрипт лучше запускать регламентно или только один раз при обновлении базы, сохраняя результат в ту же константу ДатаПоследнегоОбновления.
Проанализируем ситуацию, когда обновление базы происходит путем загрузки файла .cf. В этом случае мы можем ориентироваться на дату изменения самого файла конфигурации или специального текстового файла, который кладется в папку с базой в момент деплоя.
Разберем пример кода для файлового варианта базы, который считывает дату изменения файла:
ПутьКФайлу = "C:\1C_Bases\MyBase\last_update.txt";
ФайлМаркер = Новый Файл(ПутьКФайлу);
Если ФайлМаркер.Существует() Тогда
ДатаОбновления = ФайлМаркер.ПолучитьВремяИзменения();
УстановитьЗаголовокСистемы("Дата сборки: " + Формат(ДатаОбновления, "ДЛФ=DT"));
КонецЕсли;
Этот метод прост, но требует дисциплины при обновлении: вместе с загрузкой .cf нужно обновлять или перезаписывать файл-маркер.
Мы рассмотрели несколько подходов к определению даты обновления в 1С 8.2. Подведем итог:
Метаданные.Версия). Это стандарт индустрии, который гарантирует корректную работу в любых условиях (файловый/клиент-серверный вариант, наличие или отсутствие журнала регистрации).Config), хоть и возможны через ADODB.Connection, крайне не рекомендуются, так как они зависят от структуры СУБД, которая может меняться от версии к версии платформы 1С.Используя предложенные инструкции, вы сможете сделать работу пользователей более прозрачной, всегда отображая актуальную информацию о состоянии информационной системы.