При работе с базами данных 1С, особенно в клиент-серверном варианте, разработчики и системные администраторы часто сталкиваются с необходимостью обновления конфигурации. Это стандартная процедура, которая требует монопольного доступа к информационной базе, что, в свою очередь, означает завершение всех активных сеансов пользователей. Завершение сеансов помогает избежать потери несохраненных данных, предотвращает конфликты блокировок и обеспечивает корректное применение изменений.
Однако, мы часто сталкиваемся с ситуацией, когда кнопка "Завершить сеансы и повторить" в конфигураторе остается неактивной, особенно при изменениях, касающихся только кода модулей, без затрагивания структуры метаданных. Это создает определенные трудности, так как для применения изменений в коде также может потребоваться перезапуск клиентских приложений.
Давайте подробно рассмотрим, почему так происходит, и какие "не кустарные" способы мы можем использовать для завершения сеансов пользователей, даже если прямой доступ к консоли кластера ограничен.
Чтобы понять, как обойти эту проблему, давайте сначала выясним ее причину. Платформа 1С автоматически активирует кнопку "Завершить сеансы и повторить" в Конфигураторе только в тех случаях, когда она обнаруживает изменения в структуре метаданных. К таким изменениям относятся:
Если мы вносим изменения исключительно в код модулей (модули объектов, формы, общие модули), без какого-либо воздействия на структуру метаданных, платформа не считает, что требуется глобальный перезапуск сеансов для применения структурных изменений. Поэтому кнопка остается неактивной. Однако, для корректного применения нового кода и избежания потенциальных ошибок, перезапуск клиентских приложений и, соответственно, завершение сеансов, часто все равно необходимы.
Многие разработчики, столкнувшись с проблемой неактивной кнопки, прибегают к следующему "кустарному" способу, как это описано в сообщении 1:
Этот метод, хоть и рабочий, является неоптимальным. Он требует дополнительных, рутинных действий и потенциально может внести временный "мусор" в структуру конфигурации. Давайте рассмотрим более элегантные и "не кустарные" решения, которые позволяют добиться того же результата.
Один из самых изящных способов активации кнопки "Завершить сеансы и повторить", предложенный форумчанами (сообщение 9), заключается в временном изменении типа данных существующего реквизита и последующем возвращении его к исходному состоянию. Этот подход обманывает платформу, заставляя ее думать, что структура метаданных изменилась.
Давайте разберем этот процесс по шагам:
Преимущества этого метода:
Недостатки:
Наиболее предпочтительными и "не кустарными" методами завершения работы пользователей являются те, что реализованы в самой платформе 1С и типовых конфигурациях. Эти подходы позволяют "мягко" завершать сеансы, предоставляя пользователям возможность сохранить свои данные и корректно выйти из программы.
В большинстве современных типовых конфигураций 1С (например, 1С:ERP, 1С:Бухгалтерия, 1С:ЗУП и др.) используется Библиотека Стандартных Подсистем (БСП), которая включает в себя мощный и гибкий механизм для управления сеансами и блокировки работы пользователей. Этот механизм является основным рекомендуемым способом для таких операций.
Давайте разберем этот механизм подробнее:
Важные нюансы для клиент-серверного варианта:
Преимущества использования механизма БСП:
Даже если конфигурация не использует БСП, сама платформа 1С в режиме "Предприятие" предоставляет базовую функциональность для установки блокировки входов. Этот механизм может быть доступен через меню "Администрирование" или аналогичные разделы, в зависимости от того, как разработчики конфигурации вывели этот функционал.
Принцип действия аналогичен БСП: мы устанавливаем запрет на вход и, при необходимости, система завершает активные сеансы, сообщая пользователям о причине. Это также является "не кустарным" способом, который не требует прямого вмешательства в структуру метаданных через Конфигуратор для активации кнопки. Для такой задачи подойдёт обработка для блокировки входа пользователей при отсутствии доступа к консоли кластера.
Хотя автор темы и указал на отсутствие доступа к консоли кластера, полезно знать и о других методах управления сеансами, которые являются частью комплексного подхода к администрированию 1С.
Если бы у нас был доступ к консоли кластера серверов 1С, это был бы наиболее полный и гибкий инструмент для управления сеансами в клиент-серверном варианте (сообщение 4). Через Консоль кластера мы можем:
Как получить доступ: Запустим приложение "Консоль кластера серверов 1С", которое обычно устанавливается вместе с сервером 1С:Предприятия. После подключения к кластеру, мы перейдем в раздел "Сеансы".
Примечание: Для автора темы этот способ недоступен, но важно понимать, что это "золотой стандарт" управления сеансами в клиент-серверном варианте.
Для продвинутых разработчиков существует возможность создать собственную обработку или регламентное задание для автоматизированного управления сеансами с использованием встроенного языка 1С. Для этого используется глобальный контекст РаботаССессиямиПользователей.
Мы можем написать код, который будет находить сессии по определенным параметрам (например, по имени пользователя, приложению, компьютеру) и завершать их программно. Это дает максимальную гибкость и возможность автоматизации.
Давайте посмотрим на пример такого программного завершения сеансов:
// Пример программного завершения сеансов определенных пользователей
// Этот код должен выполняться с административными правами
// и при наличии необходимых настроек для доступа к управлению сеансами.
// Получаем список всех активных сеансов
Сеансы = РаботаССессиямиПользователей.ПолучитьСеансы();
// Создаем список пользователей, сеансы которых нужно завершить
ПользователиДляЗавершения = Новый Массив();
ПользователиДляЗавершения.Добавить("Иванов И.И.");
ПользователиДляЗавершения.Добавить("Петров П.П.");
Для Каждого ТекущийСеанс Из Сеансы Цикл
// Проверяем, является ли пользователь текущего сеанса одним из тех, кого нужно завершить
Если ПользователиДляЗавершения.Найти(ТекущийСеанс.Пользователь.Наименование) <> Неопределено Тогда
Попытка
// Завершаем сеанс
РаботаССессиямиПользователей.ЗавершитьСеанс(ТекущийСеанс.Идентификатор);
Сообщить("Сеанс пользователя " + ТекущийСеанс.Пользователь.Наименование + " (ИД: " + ТекущийСеанс.Идентификатор + ") успешно завершен.");
Исключение Как Искл
Сообщить("Ошибка при завершении сеанса пользователя " + ТекущийСеанс.Пользователь.Наименование + ": " + Искл.Описание);
КонецПопытки;
КонецЕсли;
КонецЦикла;
// Пример завершения всех сеансов, кроме административного
// (ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ!)
// Для Каждого ТекущийСеанс Из РаботаССессиямиПользователей.ПолучитьСеансы() Цикл
// // Исключаем текущий сеанс администратора и другие критичные сеансы
// Если ТекущийСеанс.Пользователь.Наименование <> "Администратор" ИЛИ ТекущийСеанс.Идентификатор <> РаботаССессиямиПользователей.ИдентификаторТекущегоСеанса() Тогда
// Попытка
// РаботаССессиямиПользователей.ЗавершитьСеанс(ТекущийСеанс.Идентификатор);
// Сообщить("Сеанс ИД " + ТекущийСеанс.Идентификатор + " завершен.");
// Исключение Как Искл
// Сообщить("Ошибка завершения сеанса ИД " + ТекущийСеанс.Идентификатор + ": " + Искл.Описание);
// КонецПопытки;
// КонецЕсли;
// КонецЦикла;
Преимущества: Высокая гибкость, возможность точной настройки критериев завершения, потенциал для полной автоматизации.
Недостатки: Требует квалификации разработчика для написания и отладки кода.
Для полноты картины, стоит упомянуть, что в файловом варианте работы завершение сеансов пользователей из Конфигуратора является штатной и простой процедурой. В этом случае мы можем:
Этот метод не относится к проблеме автора (который работает с серверной базой), но является стандартным для файловых баз.
Независимо от выбранного метода, мы должны всегда придерживаться следующих рекомендаций:
В итоге, проблема с недоступностью кнопки "Завершить сеансы и повторить" в Конфигураторе при изменении только кода модулей вполне решаема. Мы рассмотрели как "хитрость" с изменением типа реквизита прямо в Конфигураторе, так и более предпочтительные штатные механизмы платформы 1С и БСП, доступные из режима "Предприятие". Выбор конкретного метода будет зависеть от наших прав доступа, используемой конфигурации и требований к "мягкости" завершения сеансов. Для автоматизации этого процесса можно использовать расширение для принудительного завершения сеансов пользователей.