Как предотвратить автоматическое завершение сеанса 1С при работе с документом и избежать потери данных?

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

Многие пользователи 1С:Предприятие сталкиваются с неприятной ситуацией, когда при длительной работе с документом, например, при заполнении объемной табличной части, система автоматически завершает сеанс из-за «бездействия». Это приводит к потере внесенных данных и, как следствие, к испорченному настроению и необходимости выполнять работу заново. Давайте разберем эту проблему подробнее и рассмотрим несколько эффективных способов ее решения.

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

1. Понимание механизма работы сеансов 1С и времени засыпания

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

  1. При нештатном разрыве соединения: Для толстого клиента или тонкого клиента при прямом соединении с сервером. В этом случае сервер обнаруживает разрыв соединения в течение 2-3 минут.
  2. По истечении интервала времени без активности: Для веб-клиента и тонкого клиента, подключенного через веб-сервер. Если клиентское приложение бездействует (не выполняет никаких действий пользователя, которые инициируют обращение к серверу), оно периодически вызывает сервер 1С:Предприятия с интервалом 5-10 минут для поддержания активности сеанса.

Параметр Время засыпания пассивного сеанса в настройках кластера серверов 1С определяет, через сколько секунд бездействия сеанс будет переведен в спящее состояние. Если этот параметр установлен в небольшое значение (например, 600 секунд, т.е. 10 минут), а фоновые «пинги» клиента приходят с похожим интервалом (5-10 минут), возникает «гонка условий». Сервер может успеть пометить сеанс как спящий и завершить его за мгновение до прихода очередного фонового запроса от клиента.

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

2. Настройка времени засыпания пассивного сеанса 1С

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

  1. Откройте консоль администрирования кластера серверов 1С.
  2. Перейдите к свойствам рабочего сервера или кластера.
  3. Найдите параметр Время засыпания пассивного сеанса.
  4. Установите значение не менее 1200 секунд (20 минут), а лучше — 1800 секунд (30 минут). Это гарантирует, что даже при задержках сети или выполнении двух циклов фоновых запросов клиента сеанс не будет преждевременно завершен.

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

3. Корректировка настроек веб-сервера (IIS или Apache)

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

  1. Для IIS (Internet Information Services):
    • Проверьте параметр Idle Time-out (время простоя) для пула приложений, в котором работает 1С. По умолчанию он может быть равен 20 минутам. Увеличьте его до значения, превышающего ваш таймаут в 1С (например, 30-40 минут).
    • Также могут быть таймауты в файле web.config для вашего веб-приложения 1С (например, sessionState timeout или httpRuntime executionTimeout). Убедитесь, что они не конфликтуют с вашими желаемыми настройками.
  2. Для Apache:
    • Проверьте параметры KeepAliveTimeout и Timeout в конфигурационных файлах Apache (например, httpd.conf). Убедитесь, что эти значения достаточно велики, чтобы не обрывать соединения раньше времени.

Если веб-сервер обрывает соединение, 1С может интерпретировать это как нештатный разрыв и перевести сеанс в спящее состояние.

4. Программное поддержание активности сеанса на стороне клиента

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

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

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

  1. Подключаем обработчик ожидания при открытии формы документа:

    В модуле формы документа (например, в процедуре ПриСозданииНаСервере или ПриОткрытии):

    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        // Подключаем обработчик ожидания, который будет запускаться каждые 5 минут (300 секунд)
        // Интервал должен быть меньше, чем Время засыпания пассивного сеанса
        ПодключитьОбработчикОжидания("ПоддерживатьАктивностьСеанса", 300, Истина);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПоддерживатьАктивностьСеанса()
        // Вызываем серверную процедуру, чтобы сервер зарегистрировал активность
        // Можно передать параметры формы, если нужно, но для поддержания активности достаточно пустого вызова
        ВызватьСервернуюПроцедуруДляПоддержанияАктивности();
    КонецПроцедуры
    
  2. Создаем серверную процедуру:

    В модуле формы документа или в общем модуле (если процедура общая для нескольких документов) создаем простую серверную процедуру:

    
    &НаСервере
    Процедура ВызватьСервернуюПроцедуруДляПоддержанияАктивности()
        // Эта процедура ничего не делает, но ее вызов с клиента
        // регистрируется сервером как активность сеанса.
        // Можно добавить логирование или проверку каких-либо статусов, если это необходимо.
    КонецПроцедуры
    

    Критически важно: Обработчик ожидания должен вызывать именно серверную процедуру. Простое выполнение кода на клиенте не создает активности для сервера 1С.

  3. Отключаем обработчик ожидания при закрытии формы:

    Чтобы избежать утечек памяти и лишних вызовов, обязательно отключаем обработчик ожидания при закрытии формы:

    
    &НаКлиенте
    Процедура ПриЗакрытии()
        // Отключаем обработчик ожидания, когда документ закрывается
        ОтключитьОбработчикОжидания("ПоддерживатьАктивностьСеанса");
    КонецПроцедуры
    

4.2. Отправка "бесполезного" запроса при изменении табличной части

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

Например, в обработчике события ПриИзменении для табличной части или ее полей, или в обработчиках событий ПриДобавленииСтроки / ПриУдаленииСтроки:


&НаКлиенте
Процедура ТабличнаяЧасть_ПриИзменении(Элемент)
    // Отправляем небольшой запрос на сервер.
    // Например, можно запросить ИНН организации/контрагента или вызвать пустую серверную процедуру.
    // Это гарантирует регистрацию активности.
    ВызватьСервернуюПроцедуруДляПоддержанияАктивности(); 
КонецПроцедуры

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

5. Механизм автосохранения данных формы (Черновики)

Самым надежным архитектурным решением для предотвращения потери данных, независимо от того, почему завершился сеанс (по таймауту, из-за сбоя сети или клиента), является внедрение механизма автосохранения. В современных типовых конфигурациях 1С (на базе БСП) часто реализован механизм «Автосохранение» или «Черновики».

Принцип работы:

  1. Раз в несколько минут данные из текущей формы документа (или только измененные данные) неявно для пользователя передаются на сервер.
  2. Эти данные записываются во временное хранилище (например, в специальный регистр сведений или в отдельную таблицу).
  3. Если сеанс прерывается, при следующем открытии документа (или даже при запуске программы) система проверяет наличие черновиков.
  4. Пользователю предлагается восстановить данные из этого черновика, что позволяет продолжить работу с минимальными потерями.

Реализация для самописной конфигурации:

  1. Создайте регистр сведений (или отдельную таблицу) для хранения черновиков документов. Он должен содержать поля для идентификации пользователя, типа документа, ссылки на объект (если он уже создан) и, самое главное, сериализованные данные формы.
  2. В модуле формы документа реализуйте обработчик ожидания (как описано в пункте 4.1), который будет не просто пинговать сервер, а вызывать серверную процедуру для сохранения данных формы.
  3. Серверная процедура должна получать данные формы, сериализовать их (например, с помощью ЗаписатьXML или сериализации структуры) и записывать в регистр черновиков.
  4. При открытии формы документа реализуйте логику проверки наличия черновика для текущего пользователя и документа. Если черновик найден, предложите пользователю восстановить данные.

Этот подход требует значительных доработок, но он обеспечивает максимальную защиту от потери данных и является наиболее предпочтительным с точки зрения надежности.

Заключение

Проблема автоматического завершения сеансов 1С при длительной работе с документами, особенно в веб-клиенте, является общей. Мы рассмотрели несколько подходов для ее решения:

  1. Административная настройка: Увеличение Времени засыпания пассивного сеанса в кластере 1С и таймаутов на веб-сервере (IIS/Apache). Это первый и самый простой шаг.
  2. Программное поддержание активности: Использование клиентского ПодключитьОбработчикОжидания для периодического вызова пустой серверной процедуры или событийно-ориентированных вызовов при изменениях в документе. Этот метод требует небольших изменений в коде.
  3. Архитектурное решение: Внедрение механизма автосохранения (черновиков). Это наиболее надежный, но и самый трудоемкий путь, гарантирующий защиту данных независимо от причины разрыва сеанса.

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

← На главную