Многие пользователи 1С:Предприятие сталкиваются с неприятной ситуацией, когда при длительной работе с документом, например, при заполнении объемной табличной части, система автоматически завершает сеанс из-за «бездействия». Это приводит к потере внесенных данных и, как следствие, к испорченному настроению и необходимости выполнять работу заново. Давайте разберем эту проблему подробнее и рассмотрим несколько эффективных способов ее решения.
Суть проблемы заключается в том, что система 1С имеет механизм контроля активности сеансов. Если клиентское приложение (особенно веб-клиент или тонкий клиент через веб-сервер) не проявляет активности на стороне сервера в течение определенного времени, сеанс считается «спящим» и может быть завершен. Проблема усугубляется тем, что заполнение табличной части документа на стороне клиента, без явных обращений к серверу (например, запросов данных из справочников), воспринимается сервером как отсутствие активности.
Для начала, давайте выясним, как работает механизм контроля активности сеансов в 1С. Сеансы могут находиться в активном или спящем состоянии. Переход в спящее состояние происходит по нескольким причинам:
Параметр Время засыпания пассивного сеанса в настройках кластера серверов 1С определяет, через сколько секунд бездействия сеанс будет переведен в спящее состояние. Если этот параметр установлен в небольшое значение (например, 600 секунд, т.е. 10 минут), а фоновые «пинги» клиента приходят с похожим интервалом (5-10 минут), возникает «гонка условий». Сервер может успеть пометить сеанс как спящий и завершить его за мгновение до прихода очередного фонового запроса от клиента.
Важно понимать: Заполнение табличной части документа вручную на клиенте, без подтягивания данных из базы, не регистрируется сервером как активность. Сервер видит только запросы к базе данных или выполнение серверных процедур.
Самое простое и быстрое решение, не требующее изменения кода конфигурации, это увеличение интервала времени засыпания пассивного сеанса. Мы рекомендуем устанавливать этот параметр значительно больше стандартных 10 минут, чтобы дать клиенту достаточно времени для отправки своих фоновых «пингов».
Время засыпания пассивного сеанса.Также обратите внимание на параметр Время завершения спящего сеанса. Этот параметр определяет, через сколько секунд после перехода в спящий режим сеанс будет окончательно удален, освободив лицензию и память. Если пользователь успеет вернуться к работе с документом до истечения этого второго таймаута, сеанс должен «проснуться» без потери данных.
Часто проблема с завершением сеансов может быть связана не только с настройками 1С, но и с параметрами веб-сервера, через который происходит подключение к информационной базе. Веб-серверы, такие как IIS или Apache, имеют свои таймауты, которые могут прерывать соединение раньше, чем это сделает сервер 1С.
Idle Time-out (время простоя) для пула приложений, в котором работает 1С. По умолчанию он может быть равен 20 минутам. Увеличьте его до значения, превышающего ваш таймаут в 1С (например, 30-40 минут).web.config для вашего веб-приложения 1С (например, sessionState timeout или httpRuntime executionTimeout). Убедитесь, что они не конфликтуют с вашими желаемыми настройками.KeepAliveTimeout и Timeout в конфигурационных файлах Apache (например, httpd.conf). Убедитесь, что эти значения достаточно велики, чтобы не обрывать соединения раньше времени.Если веб-сервер обрывает соединение, 1С может интерпретировать это как нештатный разрыв и перевести сеанс в спящее состояние.
Если вышеуказанные меры недостаточны или вы хотите обеспечить более точный контроль над активностью сеанса непосредственно в документе, мы можем использовать программные методы.
Один из эффективных способов — это подключение обработчика ожидания на форме документа, который будет периодически вызывать пустую серверную процедуру. Это действие будет регистрироваться сервером как активность сеанса.
В модуле формы документа (например, в процедуре ПриСозданииНаСервере или ПриОткрытии):
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем обработчик ожидания, который будет запускаться каждые 5 минут (300 секунд)
// Интервал должен быть меньше, чем Время засыпания пассивного сеанса
ПодключитьОбработчикОжидания("ПоддерживатьАктивностьСеанса", 300, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПоддерживатьАктивностьСеанса()
// Вызываем серверную процедуру, чтобы сервер зарегистрировал активность
// Можно передать параметры формы, если нужно, но для поддержания активности достаточно пустого вызова
ВызватьСервернуюПроцедуруДляПоддержанияАктивности();
КонецПроцедуры
В модуле формы документа или в общем модуле (если процедура общая для нескольких документов) создаем простую серверную процедуру:
&НаСервере
Процедура ВызватьСервернуюПроцедуруДляПоддержанияАктивности()
// Эта процедура ничего не делает, но ее вызов с клиента
// регистрируется сервером как активность сеанса.
// Можно добавить логирование или проверку каких-либо статусов, если это необходимо.
КонецПроцедуры
Критически важно: Обработчик ожидания должен вызывать именно серверную процедуру. Простое выполнение кода на клиенте не создает активности для сервера 1С.
Чтобы избежать утечек памяти и лишних вызовов, обязательно отключаем обработчик ожидания при закрытии формы:
&НаКлиенте
Процедура ПриЗакрытии()
// Отключаем обработчик ожидания, когда документ закрывается
ОтключитьОбработчикОжидания("ПоддерживатьАктивностьСеанса");
КонецПроцедуры
В качестве альтернативы периодическому обработчику ожидания можно использовать событийно-ориентированный подход. При добавлении или удалении строки в табличной части (или при изменении данных в ней) мы можем инициировать небольшое серверное обращение. Это особенно актуально, когда пользователь активно работает именно с табличной частью.
Например, в обработчике события ПриИзменении для табличной части или ее полей, или в обработчиках событий ПриДобавленииСтроки / ПриУдаленииСтроки:
&НаКлиенте
Процедура ТабличнаяЧасть_ПриИзменении(Элемент)
// Отправляем небольшой запрос на сервер.
// Например, можно запросить ИНН организации/контрагента или вызвать пустую серверную процедуру.
// Это гарантирует регистрацию активности.
ВызватьСервернуюПроцедуруДляПоддержанияАктивности();
КонецПроцедуры
Этот метод более точно отражает реальную активность пользователя в документе, поскольку реагирует на конкретные действия. Однако он менее надежен, если пользователь просто долго думает или вводит данные в одно поле, не вызывая изменений, которые запускают серверные вызовы.
Самым надежным архитектурным решением для предотвращения потери данных, независимо от того, почему завершился сеанс (по таймауту, из-за сбоя сети или клиента), является внедрение механизма автосохранения. В современных типовых конфигурациях 1С (на базе БСП) часто реализован механизм «Автосохранение» или «Черновики».
Принцип работы:
Реализация для самописной конфигурации:
ЗаписатьXML или сериализации структуры) и записывать в регистр черновиков.Этот подход требует значительных доработок, но он обеспечивает максимальную защиту от потери данных и является наиболее предпочтительным с точки зрения надежности.
Проблема автоматического завершения сеансов 1С при длительной работе с документами, особенно в веб-клиенте, является общей. Мы рассмотрели несколько подходов для ее решения:
Времени засыпания пассивного сеанса в кластере 1С и таймаутов на веб-сервере (IIS/Apache). Это первый и самый простой шаг.ПодключитьОбработчикОжидания для периодического вызова пустой серверной процедуры или событийно-ориентированных вызовов при изменениях в документе. Этот метод требует небольших изменений в коде.Мы рекомендуем начать с административных настроек, а затем рассмотреть программные решения в зависимости от специфики вашей конфигурации и требований к надежности.