Как программно получить дату последнего обновления конфигурации в 1С 8.2

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

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

Метод 1: Сравнение версий конфигурации (рекомендуемый способ)

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

Для реализации этого метода нам понадобятся два объекта в конфигурации:

  1. Константа НомерВерсииКонфигурации (тип: Строка).
  2. Константа ДатаПоследнегоОбновления (тип: Дата).

Разберем алгоритм работы по шагам. При каждом обновлении разработчик должен инкрементировать (увеличивать) номер версии в свойствах корня конфигурации (например, с 1.0.1 на 1.0.2). При запуске системы мы будем проверять, изменилась ли эта версия.

Рассмотрим пример кода, который следует разместить в модуле обычного приложения (или управляемого приложения) в процедуре ПриНачалеРаботыСистемы():


Процедура ПриНачалеРаботыСистемы()
    
    // Получаем текущую версию из метаданных конфигурации
    ТекущаяВерсияМТ = Метаданные.Версия;
    
    // Получаем версию, которая была сохранена в базе до этого
    ВерсияВБазе = Константы.НомерВерсииКонфигурации.Получить();
    
    // Сравниваем версии
    Если ТекущаяВерсияМТ <> ВерсияВБазе Тогда
        // Если версии различаются, значит было произведено обновление
        // Фиксируем текущую дату как дату последнего обновления
        ДатаОбновления = ТекущаяДата();
        
        // Записываем новые данные в константы
        Константы.НомерВерсииКонфигурации.Установить(ТекущаяВерсияМТ);
        Константы.ДатаПоследнегоОбновления.Установить(ДатаОбновления);
        
        ИнформироватьОбОбновлении = Истина;
    Иначе
        // Если версии совпадают, просто берем ранее сохраненную дату
        ДатаОбновления = Константы.ДатаПоследнегоОбновления.Получить();
        ИнформироватьОбОбновлении = Ложь;
    КонецЕсли;

    // Устанавливаем заголовок системы с датой обновления
    ТекстЗаголовка = "Моя Конфигурация (обновлена: " + Формат(ДатаОбновления, "ДЛФ=D") + ")";
    УстановитьЗаголовокСистемы(ТекстЗаголовка);

КонецПроцедуры

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

Метод 2: Получение даты из Журнала регистрации (оптимизированный)

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

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


Функция ПолучитьДатуПоследнегоИзмененияИзЖурнала()
    
    Фильтр = Новый Структура;
    Фильтр.Вставить("Событие", "_$Config$_.Modify"); // Код события изменения конфигурации
    
    ТаблицаСобытий = Новый ТаблицаЗначений;
    // Выгружаем только последнюю запись
    ВыгрузитьЖурналРегистрации(ТаблицаСобытий, Фильтр, "Дата", , 1);
    
    Если ТаблицаСобытий.Количество() > 0 Тогда
        Возврат ТаблицаСобытий[0].Дата;
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции

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

Метод 3: Использование истории хранилища (через командную строку)

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

Мы можем запустить конфигуратор в пакетном режиме с ключом /ConfigurationRepositoryGetHistory, выгрузить историю в XML-файл и прочитать дату последнего чекина. Однако, делать это при каждом запуске пользователя — плохая практика из-за огромных задержек.

Посмотрим на логику оптимизации: данный скрипт лучше запускать регламентно или только один раз при обновлении базы, сохраняя результат в ту же константу ДатаПоследнегоОбновления.

  1. Создаем регламентное задание или внешнюю обработку.
  2. Выполняем запуск 1С с параметрами выгрузки истории хранилища.
  3. Парсим полученный XML.
  4. Записываем дату последнего коммита в базу.

Метод 4: Использование внешнего файла-маркера

Проанализируем ситуацию, когда обновление базы происходит путем загрузки файла .cf. В этом случае мы можем ориентироваться на дату изменения самого файла конфигурации или специального текстового файла, который кладется в папку с базой в момент деплоя.

Разберем пример кода для файлового варианта базы, который считывает дату изменения файла:


ПутьКФайлу = "C:\1C_Bases\MyBase\last_update.txt";
ФайлМаркер = Новый Файл(ПутьКФайлу);
Если ФайлМаркер.Существует() Тогда
    ДатаОбновления = ФайлМаркер.ПолучитьВремяИзменения();
    УстановитьЗаголовокСистемы("Дата сборки: " + Формат(ДатаОбновления, "ДЛФ=DT"));
КонецЕсли;

Этот метод прост, но требует дисциплины при обновлении: вместе с загрузкой .cf нужно обновлять или перезаписывать файл-маркер.

Итоги и рекомендации

Мы рассмотрели несколько подходов к определению даты обновления в 1С 8.2. Подведем итог:

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

← На главную