Как автоматизировать установку текущей даты сеанса на сервере 1С с помощью регламентного задания?

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

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

В данном материале мы подробно рассмотрим, как можно решить эту проблему, используя стандартный функционал платформы 1С:Предприятие – регламентные задания и функцию УстановитьТекущуюДатуСервера(). Мы разберем по шагам создание необходимой логики, рассмотрим примеры кода и обсудим важные нюансы, которые помогут вам избежать распространенных ошибок.

Понимание проблемы: Почему дата сеанса может «залипать»?

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

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

Основное решение: Установка текущей системной даты сервера

Для решения поставленной задачи мы воспользуемся функцией платформы 1С УстановитьТекущуюДатуСервера(). Эта функция позволяет установить дату текущего сеанса сервера равной текущей системной дате операционной системы, на которой работает сервер 1С. Чтобы автоматизировать этот процесс, мы интегрируем вызов этой функции в регламентное задание.

Шаг 1: Создание общего серверного модуля

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

  1. Откроем конфигуратор 1С:Предприятия.
  2. Перейдем в раздел "Общие" -> "Общие модули".
  3. Создадим новый общий модуль (например, назовем его "УправлениеДатойСервера").
  4. В свойствах нового общего модуля обязательно установим флажки "Сервер" и "Вызов сервера" (для возможности экспорта процедур для регламентных заданий). Флажок "Клиент (обычное приложение)" и "Клиент (управляемое приложение)" могут быть сняты, если модуль не предназначен для вызова с клиента. Флажок "Глобальный" также обычно не требуется для таких служебных процедур.
  5. Добавим в этот модуль следующую процедуру:

// УправлениеДатойСервера
Процедура УстановитьДатуСервераДляРегламентногоЗадания() Экспорт
    // Устанавливаем текущую дату сеанса сервера равной системной дате сервера.
    // Эта функция обновляет дату для текущего серверного сеанса.
    УстановитьТекущуюДатуСервера();
КонецПроцедуры

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

Шаг 2: Создание регламентного задания

После того как у нас есть серверная процедура, мы можем создать регламентное задание, которое будет регулярно ее вызывать.

  1. В конфигураторе перейдем в раздел "Общие" -> "Регламентные задания".
  2. Создадим новое регламентное задание (например, назовем его "ОбновлениеДатыСеансаСервера").
  3. Заполним основные свойства:
    • Имя: ОбновлениеДатыСеансаСервера
    • Метод: Укажем полное имя нашей процедуры: УправлениеДатойСервера.УстановитьДатуСервераДляРегламентногоЗадания
    • Использование: Установим флажок "Использование".
    • Ключ: При необходимости можно указать уникальный ключ для задания, но для данной задачи это не критично.
  4. Настроим расписание выполнения задания:
    • Нажмем кнопку "Настройка расписания".
    • В открывшемся окне зададим периодичность. Например, для обеспечения актуальности даты можно настроить задание на ежечасное выполнение. Выберем закладку "Дневное", установим флажок "Каждый час". Также можно указать другие параметры, например, время начала и окончания, если требуется выполнять задание только в определенные часы.
    • Подтвердим расписание.
  5. Сохраним конфигурацию.

После обновления конфигурации базы данных, регламентное задание станет активным и будет выполняться согласно заданному расписанию. Каждый раз при выполнении задания будет вызываться наша процедура УстановитьДатуСервераДляРегламентногоЗадания(), которая, в свою очередь, будет вызывать УстановитьТекущуюДатуСервера(), обновляя дату текущего серверного сеанса.

Нюансы и важные замечания по использованию УстановитьТекущуюДатуСервера()

При использовании функции УстановитьТекущуюДатуСервера() и регламентных заданий необходимо учитывать несколько важных моментов, которые были справедливо отмечены в обсуждении на форуме.

Влияние на рабочие процессы (rphost)

Сервер 1С:Предприятия может использовать несколько рабочих процессов rphost. Функция УстановитьТекущуюДатуСервера() устанавливает дату для текущего сеанса, в котором она была вызвана. Это означает, что если регламентное задание запускается в одном рабочем процессе, а другие активные сеансы (например, пользовательские или другие фоновые задания) работают в других процессах rphost, их даты сеанса не будут немедленно обновлены. Однако для фоновых заданий, которые запускаются в том же серверном контексте, что и регламентное задание (или через него), эта установка даты будет релевантной.

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

Системная дата сервера

Функция УстановитьТекущуюДатуСервера() опирается на системную дату операционной системы, на которой работает сервер 1С. Крайне важно убедиться, что системное время на вашем сервере (физическом или виртуальной машине) всегда актуально и правильно синхронизировано. Для этого обычно используют протокол NTP (Network Time Protocol), который позволяет синхронизировать время с авторитетными источниками. Если системное время сервера неправильное, то и дата, устанавливаемая УстановитьТекущуюДатуСервера(), будет неправильной.

Область действия: Только текущий сеанс

Важно помнить, что УстановитьТекущуюДатуСервера() меняет дату только для текущего серверного сеанса. Это не глобальная настройка, которая мгновенно распространяется на все активные пользовательские или фоновые сеансы. Если у вас есть пользователи, работающие в клиент-серверном режиме, и их сеансы были запущены до выполнения регламентного задания, их даты сеансов не изменятся. Но для новых сеансов или фоновых заданий, которые будут запускаться после выполнения регламентного задания, дата сеанса уже будет актуальной.

Права доступа

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

Расширенное решение: Установка произвольной даты сеанса сервера

Хотя в большинстве случаев нам нужна именно текущая системная дата, функция УстановитьТекущуюДатуСервера() имеет перегруженную версию, которая позволяет установить произвольную дату в качестве даты сеанса сервера. Эта возможность может быть полезна для тестирования, отладки или очень специфических сценариев, когда требуется имитировать работу с датами в прошлом или будущем.

Пример кода для установки произвольной даты

Если нам необходимо установить не текущую, а какую-то конкретную дату, мы можем передать ее в качестве параметра функции УстановитьТекущуюДатуСервера():


// УправлениеДатойСервера
Процедура УстановитьПроизвольнуюДатуСервера(НужнаяДата) Экспорт
    // Проверяем, что переданный параметр является датой.
    Если ТипЗнч(НужнаяДата) = Тип("Дата") Тогда
        // Устанавливаем дату сеанса сервера равной указанной дате.
        УстановитьТекущуюДатуСервера(НужнаяДата);
    Иначе
        // Можно записать в журнал регистрации или оповестить о некорректном параметре.
        ЗаписьЖурналаРегистрации(
            "УстановкаДатыСервера",
            УровеньВажности.Ошибка,
            ,
            ,
            "Попытка установить некорректную дату сеанса сервера: " + Строка(НужнаяДата)
        );
    КонецЕсли;
КонецПроцедуры

В этом случае, при настройке регламентного задания, в качестве метода будет указываться УправлениеДатойСервера.УстановитьПроизвольнуюДатуСервера, а параметр НужнаяДата может быть передан, например, через ключ задания или константу, хотя это усложняет логику и выходит за рамки простого регламентного задания. Обычно для такого рода задач проще создать отдельную обработку.

Предостережения при использовании произвольной даты

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

  1. Нарушение хронологии документов: Документы могут создаваться с датами, которые не соответствуют реальному времени, что приведет к ошибкам в учете и отчетности.
  2. Некорректная работа алгоритмов: Многие алгоритмы 1С (например, расчеты остатков, проведение документов, закрытие периодов) критически зависят от даты сеанса и могут работать неверно, если она искусственно изменена.
  3. Сложности отладки: Отслеживание ошибок и анализ работы системы становятся намного сложнее, когда дата сеанса не соответствует системному времени.

Данный функционал следует использовать с крайней осторожностью и, как правило, только в тестовых или отладочных средах.

Дополнительные рекомендации и поиск первопричины

Хотя установка даты сеанса через регламентное задание является эффективным «костылем» или временным решением, мы рекомендуем также рассмотреть возможность поиска и устранения первопричины «залипания» даты. Если дата постоянно становится некорректной, это может указывать на более глубокие проблемы:

  1. Проблемы с синхронизацией времени на сервере: Убедитесь, что ваш сервер настроен на корректную синхронизацию времени с помощью NTP. Неправильно настроенный NTP-клиент или отсутствие связи с серверами времени могут приводить к «уходу» системного времени.
  2. Проблемы с виртуализацией: Если сервер 1С работает на виртуальной машине, проверьте настройки синхронизации времени между гостевой ОС и хост-системой. Некоторые гипервизоры могут иметь свои особенности управления временем виртуальных машин.
  3. Особенности работы кластера 1С: В некоторых случаях, особенно при работе с высоконагруженными кластерами 1С, могут возникать специфические проблемы, связанные с кэшированием или распределением нагрузки, которые влияют на дату сеанса. Изучите документацию по настройке кластера.
  4. Проблемы с ОС: В редких случаях причиной может быть некорректная работа самой операционной системы или установленного ПО.

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

Итоги

Мы рассмотрели эффективный способ автоматической установки текущей даты сеанса сервера 1С с помощью регламентного задания. Создав простую серверную процедуру в общем модуле и настроив ее регулярный вызов, мы можем гарантировать, что фоновые процессы и обработки будут работать с актуальной датой. Мы также обсудили важные технические нюансы, такие как влияние на rphost, зависимость от системной даты сервера и область действия функции УстановитьТекущуюДатуСервера().

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

← На главную