Как узнать, кто обновил базу динамически, и почему сообщение о перезапуске появляется повторно?

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

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

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

Этап 1: Правильный анализ Журнала регистрации

Первое, что мы обычно делаем при возникновении вопросов «Кто это сделал?» — открываем Журнал регистрации. Однако часто мы ищем не там или не то. Давайте определим алгоритм поиска, который позволит нам гарантированно найти виновника торжества.

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

Для точного анализа нам необходимо настроить отбор по Событию. В конфигураторе перейдем в меню Администрирование -> Журнал регистрации и установим отбор по следующим событиям:

  1. Обновление конфигурации базы данных — это основное событие, фиксирующее применение изменений в структуре БД.
  2. Изменение расширения конфигурации — критически важный пункт. Часто динамическое обновление связано не с основной конфигурацией, а с подключенными расширениями (патчами, доработками).
  3. Обновление расширения — событие, фиксирующее факт применения новой версии расширения.

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

Также обратим внимание на колонку Транзакция и Пользователь. Если в колонке «Пользователь» пусто или указано служебное имя (например, «DefUser»), но событие обновления зафиксировано, это может указывать на:

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


СтруктураОтбора = Новый Структура;
МассивСобытий = Новый Массив;
МассивСобытий.Добавить("_$Data$_.ConfigUpdate"); // Внутреннее имя события обновления
МассивСобытий.Добавить("_$Data$_.ExtensionUpdate"); // Событие обновления расширения
СтруктураОтбора.Вставить("Событие", МассивСобытий);
СтруктураОтбора.Вставить("ДатаНачала", ТекущаяДата() - 86400); // За последние сутки

ТаблицаЖР = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТаблицаЖР, СтруктураОтбора);

Для Каждого Строка Из ТаблицаЖР Цикл
    Сообщить("Время: " + Строка.Дата + " | Пользователь: " + Строка.ИмяПользователя + " | Событие: " + Строка.ПредставлениеСобытия);
КонецЦикла;

Этап 2: Почему сообщение появляется повторно? Проблема «Дня сурка»

Часто бывает так: мы нашли, кто обновил базу (или выяснили, что это были мы сами, но забыли), перезапустили 1С, но через некоторое время (или сразу) окно с требованием перезапуска появляется снова. И так несколько раз.

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

Если сообщение появляется циклично, причины могут быть следующими:

1. Проблема локального кэша

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

Решение: В таких случаях помогает полная очистка кэша. Нам нужно удалить временные файлы из папок пользователя:

Самый простой способ для пользователя — удалить базу из списка запуска 1С и добавить её заново. При этом создается новая папка с чистым кэшем (UID базы в списке меняется).

2. «Зависшие» сеансы и фоновые задания

Кластер серверов 1С может считать процесс обновления незавершенным, если в системе остались «мертвые» сеансы, работающие на старой версии метаданных. Это могут быть:

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

Этап 3: Рассинхронизация узлов кластера

Если мы используем сложную архитектуру с несколькими рабочими серверами в кластере (версии платформы 8.3.20 и выше, и особенно 8.3.24), мы можем столкнуться с ситуацией рассинхронизации.

Механизм работы следующий: один рабочий процесс (rphost) узнал об обновлении и обновил свои структуры в памяти. Другой процесс на соседнем сервере еще «не знает» об этом. Пользовательский сеанс может мигрировать между процессами (или открывать новые соединения). Попадая на «старый» процесс, все работает нормально. Попадая на «обновленный» — пользователь получает требование перезапуска. После перезапуска он может снова попасть на «старый» процесс, который скажет ему, что его (клиента) версия слишком новая, или наоборот.

В этом случае помогает только полный перезапуск службы Агента сервера 1С на всех узлах кластера. Динамическое обновление на высоконагруженных кластерах — это всегда риск, и лучше его избегать.

Этап 4: Риски динамического обновления

В обсуждении справедливо замечено: «Кэш портится». Давайте проанализируем, почему многие опытные специалисты избегают «демонического» (динамического) обновления, даже если нужно поправить всего одну строчку кода.

При динамическом обновлении происходит подмена метаданных «на лету». Это может привести к следующим последствиям:

  1. Ошибки интерфейса («Разъехались формы»). Часто после динамического обновления у пользователей пропадают кнопки на командных панелях, исчезают разделы меню или поля на формах перемешиваются. Это связано с тем, что кэш форм не был корректно обновлен. Лечится только очисткой кэша.
  2. Непредсказуемое поведение кода. Если вы изменили модуль, который в данный момент выполняется у пользователя в долгом цикле, результат может быть фатальным (вплоть до аварийного завершения работы процесса rphost).
  3. «Сломанный» конфигуратор. Иногда после серии динамических обновлений невозможно выполнить обычное обновление — конфигуратор «зависает» или выдает ошибку формата потока. В этом случае приходится прибегать к выгрузке/загрузке .dt или чистке таблицы ConfigSave (что требует высокой квалификации).

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

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

  1. Проверьте Журнал регистрации с отбором не только по обновлению БД, но и по изменению Расширений. Ищите события без пользователя или под служебными пользователями.
  2. Не верьте памяти. Как показал опыт автора темы, часто мы сами запускаем процесс обновления (например, нажав «Обновить» в диалоге сравнения/объединения), отвлекаемся и забываем об этом. Запись в журнале — единственный объективный источник правды.
  3. Очистите кэш. Если сообщение о перезапуске появляется повторно — проблема на 99% на стороне клиента (кэш) или в зависших сеансах на сервере.
  4. Избегайте динамических обновлений для серьезных изменений. Добавление пробела или комментария безопасно, но изменение структуры данных, регистров или сложных форм лучше проводить в монопольном режиме.

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

← На главную