При работе с системой 1С:Предприятие мы иногда сталкиваемся с ситуациями, когда дата сеанса сервера по какой-то причине перестает быть актуальной или «залипает» на предыдущем дне. Это может приводить к некорректной работе обработок, созданию документов с неправильной датой и другим ошибкам, особенно если эти процессы автоматизированы и выполняются в фоновом режиме. В таких случаях возникает необходимость в регулярном и автоматическом обновлении даты сеанса сервера.
В данном материале мы подробно рассмотрим, как можно решить эту проблему, используя стандартный функционал платформы 1С:Предприятие – регламентные задания и функцию УстановитьТекущуюДатуСервера(). Мы разберем по шагам создание необходимой логики, рассмотрим примеры кода и обсудим важные нюансы, которые помогут вам избежать распространенных ошибок.
Прежде чем перейти к решению, давайте выясним, почему вообще возникает такая ситуация. Дата сеанса сервера 1С – это не всегда текущая системная дата сервера. Она устанавливается при старте сеанса и может не обновляться автоматически, если сеанс долгое время активен или если происходят сбои. Например, если сервер был перезагружен в середине дня, а сеанс фонового задания остался активным, он может продолжать работать с датой до перезагрузки. Кроме того, на работу с датой могут влиять настройки кластера серверов 1С или операционной системы, некорректная синхронизация времени или даже особенности работы rphost (рабочего процесса сервера 1С).
Когда внешняя обработка или любое другое фоновое задание, создающее документы, опирается на дату сеанса, некорректное значение этой даты может привести к серьезным проблемам с учетом и отчетностью. Поэтому нам необходимо обеспечить принудительное и регулярное обновление даты сеанса сервера.
Для решения поставленной задачи мы воспользуемся функцией платформы 1С УстановитьТекущуюДатуСервера(). Эта функция позволяет установить дату текущего сеанса сервера равной текущей системной дате операционной системы, на которой работает сервер 1С. Чтобы автоматизировать этот процесс, мы интегрируем вызов этой функции в регламентное задание.
Прежде всего, нам понадобится создать общую процедуру, которая будет вызываться регламентным заданием. Эту процедуру удобно разместить в общем модуле конфигурации. Важно, чтобы этот общий модуль был серверным, поскольку функция УстановитьТекущуюДатуСервера() доступна только на стороне сервера.
// УправлениеДатойСервера
Процедура УстановитьДатуСервераДляРегламентногоЗадания() Экспорт
// Устанавливаем текущую дату сеанса сервера равной системной дате сервера.
// Эта функция обновляет дату для текущего серверного сеанса.
УстановитьТекущуюДатуСервера();
КонецПроцедуры
Здесь ключевым является слово Экспорт, которое делает процедуру доступной для вызова извне, в том числе из регламентного задания.
После того как у нас есть серверная процедура, мы можем создать регламентное задание, которое будет регулярно ее вызывать.
УправлениеДатойСервера.УстановитьДатуСервераДляРегламентногоЗаданияПосле обновления конфигурации базы данных, регламентное задание станет активным и будет выполняться согласно заданному расписанию. Каждый раз при выполнении задания будет вызываться наша процедура УстановитьДатуСервераДляРегламентногоЗадания(), которая, в свою очередь, будет вызывать УстановитьТекущуюДатуСервера(), обновляя дату текущего серверного сеанса.
УстановитьТекущуюДатуСервера()При использовании функции УстановитьТекущуюДатуСервера() и регламентных заданий необходимо учитывать несколько важных моментов, которые были справедливо отмечены в обсуждении на форуме.
Сервер 1С:Предприятия может использовать несколько рабочих процессов rphost. Функция УстановитьТекущуюДатуСервера() устанавливает дату для текущего сеанса, в котором она была вызвана. Это означает, что если регламентное задание запускается в одном рабочем процессе, а другие активные сеансы (например, пользовательские или другие фоновые задания) работают в других процессах rphost, их даты сеанса не будут немедленно обновлены. Однако для фоновых заданий, которые запускаются в том же серверном контексте, что и регламентное задание (или через него), эта установка даты будет релевантной.
Для обработки, которая создает документы и работает в фоновом режиме, такое обновление даты через регламентное задание обычно достаточно, так как она, скорее всего, будет использовать дату того же серверного сеанса, либо сеанс, в котором она запускается, будет иметь уже актуальную дату благодаря нашему регламентному заданию.
Функция УстановитьТекущуюДатуСервера() опирается на системную дату операционной системы, на которой работает сервер 1С. Крайне важно убедиться, что системное время на вашем сервере (физическом или виртуальной машине) всегда актуально и правильно синхронизировано. Для этого обычно используют протокол NTP (Network Time Protocol), который позволяет синхронизировать время с авторитетными источниками. Если системное время сервера неправильное, то и дата, устанавливаемая УстановитьТекущуюДатуСервера(), будет неправильной.
Важно помнить, что УстановитьТекущуюДатуСервера() меняет дату только для текущего серверного сеанса. Это не глобальная настройка, которая мгновенно распространяется на все активные пользовательские или фоновые сеансы. Если у вас есть пользователи, работающие в клиент-серверном режиме, и их сеансы были запущены до выполнения регламентного задания, их даты сеансов не изменятся. Но для новых сеансов или фоновых заданий, которые будут запускаться после выполнения регламентного задания, дата сеанса уже будет актуальной.
С точки зрения системного администрирования, убедитесь, что учетная запись, под которой работает служба сервера 1С (обычно srvc_1cv8 или аналогичная), имеет достаточные права в операционной системе. В большинстве случаев для чтения системного времени специальные права не требуются, но если вы планируете устанавливать произвольную дату (см. следующий раздел), это может потребовать дополнительных привилегий, хотя такое использование крайне не рекомендуется для продуктивных систем.
Хотя в большинстве случаев нам нужна именно текущая системная дата, функция УстановитьТекущуюДатуСервера() имеет перегруженную версию, которая позволяет установить произвольную дату в качестве даты сеанса сервера. Эта возможность может быть полезна для тестирования, отладки или очень специфических сценариев, когда требуется имитировать работу с датами в прошлом или будущем.
Если нам необходимо установить не текущую, а какую-то конкретную дату, мы можем передать ее в качестве параметра функции УстановитьТекущуюДатуСервера():
// УправлениеДатойСервера
Процедура УстановитьПроизвольнуюДатуСервера(НужнаяДата) Экспорт
// Проверяем, что переданный параметр является датой.
Если ТипЗнч(НужнаяДата) = Тип("Дата") Тогда
// Устанавливаем дату сеанса сервера равной указанной дате.
УстановитьТекущуюДатуСервера(НужнаяДата);
Иначе
// Можно записать в журнал регистрации или оповестить о некорректном параметре.
ЗаписьЖурналаРегистрации(
"УстановкаДатыСервера",
УровеньВажности.Ошибка,
,
,
"Попытка установить некорректную дату сеанса сервера: " + Строка(НужнаяДата)
);
КонецЕсли;
КонецПроцедуры
В этом случае, при настройке регламентного задания, в качестве метода будет указываться УправлениеДатойСервера.УстановитьПроизвольнуюДатуСервера, а параметр НужнаяДата может быть передан, например, через ключ задания или константу, хотя это усложняет логику и выходит за рамки простого регламентного задания. Обычно для такого рода задач проще создать отдельную обработку.
Использование произвольной даты для серверного сеанса в продуктивной системе категорически не рекомендуется, если конфигурация не была специально разработана и протестирована для такого режима работы. Это может привести к следующим проблемам:
Данный функционал следует использовать с крайней осторожностью и, как правило, только в тестовых или отладочных средах.
Хотя установка даты сеанса через регламентное задание является эффективным «костылем» или временным решением, мы рекомендуем также рассмотреть возможность поиска и устранения первопричины «залипания» даты. Если дата постоянно становится некорректной, это может указывать на более глубокие проблемы:
Внедрение нашего регламентного задания позволит вам решить проблему с актуальностью даты сеанса здесь и сейчас, но долгосрочное решение всегда заключается в устранении корневой причины.
Мы рассмотрели эффективный способ автоматической установки текущей даты сеанса сервера 1С с помощью регламентного задания. Создав простую серверную процедуру в общем модуле и настроив ее регулярный вызов, мы можем гарантировать, что фоновые процессы и обработки будут работать с актуальной датой. Мы также обсудили важные технические нюансы, такие как влияние на rphost, зависимость от системной даты сервера и область действия функции УстановитьТекущуюДатуСервера().
Всегда помните о необходимости поддерживать корректную системную дату на сервере и использовать функцию установки произвольной даты сеанса с крайней осторожностью. Комбинируя автоматизацию с внимательным системным администрированием, вы сможете обеспечить стабильную и корректную работу вашей системы 1С:Предприятие.