Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=67212)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Синхронизация ТекущаяДата() и ТекущаяДатаСеанса()

Автор: Talkman 31.03.23, 9:01

После перевода часов ТекущаяДатаСеанса() стала показывать время на час раньше, из за чего в некоторых модулях конфигурации алгоритмы работают неверно. Время на сервере терминалов юзеров актуальное, время на сервере где установлен сервер 1С предприятия актуально + был перезапуск сервера при актуальном значении времени, время на сервере где БД актуально. Вопрос. Откуда рассинхрон? Платформа 8.3.16.1659. Заранее спасибо.

Talkman @ Сегодня, 9:41 * ,
Текущие данные по временам сеансов.

Текущая дата 31.03.2023 09:46:23
Текущая дата сеанса 31.03.2023 08:46:23
Часовой пояс Europe/Kiev
Часовой пояс сеанса Europe/Kyiv


Talkman @ Сегодня, 9:47 * ,
Часовой пояс у всех юзеров один.

Автор: denis84 31.03.23, 9:15

Talkman @ Сегодня, 10:01 * ,

Цитата
ИТС запрещает использовать ТекущаяДата(), но исчерпывающей информации на вопрос "Почему?" нет ни там, ни на ИС, поэтому написал данную заметку. Тем не менее, совсем не знакомым с темой, стоит прочитать статью на ИТС (по этой ссылке)и бегло статью на ИС "О времени и 1С" (к сожалению, ровно через неделю после моей публикации Юрий Пермитин удалил все свои статьи с инфостарта и ссылка уже не действительна).

Цитаты с ИТС:

2.1. Во всех серверных процедурах и функциях вместо функции ТекущаяДата, которая возвращает дату и время серверного компьютера, следует использовать функцию ТекущаяДатаСеанса, которая приводит время сервера к часовому поясу пользовательского сеанса.

3.1. В клиентском коде использование функции ТекущаяДата также недопустимо. Это требование обусловлено тем, что текущее время, вычисленное в клиентском и серверном коде, не должно различаться.

2.2. В тех случаях, когда требуется «универсальная» отметка времени, не зависящая от часового пояса текущего сеанса пользователя, в контексте которого выполняется серверный вызов, следует использовать функцию УниверсальноеВремя.

А именно остались вопросы:

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

Потому что ТекущаяДатаСеанса() - согласно СП это серверная дата и время + часовой пояс клиента. А значит мы страхуемся от того, что на клиенте время вообще от балды идёт, например отстаёт на секунду.

2. Хорошо, раз на клиенте недоступна ТекущаяДатаСеанса(), то почему ИТС не разрешает на клиенте вызывать ТекущаяДата()? Ведь ТекущаяДатаСеанса() выполненная на сервере по идее будет равняться ТекущаяДата() выполненная на клиенте.
Вместо этого ИТС рекомендует вызывать метод БСП ДатаСеанса(), который как раз и вернёт значение равное ТекущаяДатаСеанса() только при этом не будет делать серверный вызов, за счёт того, что он был сделан однократно в начале сеанса и была вычислена ПоправкаКВремениСеанса = ТекущаяДатаСеанса(вычисленная на сервере) - ТекущаяДата(вычисленная на клиенте).

Ответ на данный вопрос вытекает из предыдущего: серверное и клиентское время время может отличаться не только на часовой пояс, и единственный выход пользоваться одинаковым временем, это брать его с сервера и добавлять клиентские часовые пояса - т.е. ровно то, что и делается в ТекущаяДатаСеанса() и ДатаСеанса()

Второй аргумент подсказал коллега (в достоверности не могу ручаться): ТекущаяДатаСеанса() на сервере и ТекущаяДата() на клиенте могут отличаться во фреше, т.к. это эталонное время для области в которой крутится сеанс и время Кластера соответсвенно.

3. Почему в качестве универсального времени ИТС указывает безальтернативно использовать УниверсальноеВремя()? Почему вместо этого нельзя использовать ТекущаяДата() вычисленное на сервере?


ТекущаяДата() на сервере тоже может меняться - например если сервер переехал. Или серверов может быть несколько. Поэтому УниверсальноеВремя() универсально в отличии от ТекущаяДата().


Проверено на платформе 8.3.17.1989.



взято с infostarta https://pro1c.org.ua/redirect.php?https://infostart.ru/1c/articles/1714759/

посмотрите, может это то что вам надо

Автор: Talkman 31.03.23, 9:24

denis84 @ Сегодня, 10:15 * ,
Почему используется ТекущаяДатаСеанса() читал. Вопрос в том, какого рожна она резко стала отставать, когда часы на сервере 1С Предприятия показывают верное время, часы сервера терминалов (время сеансов юзверей) показывают верное время, время на сервере БД тоже верное. Вроде бы как все источники, откуда ТекущаяДатаСеанса() может браться имеют верное значение времени и синхронизированы с фактическим текущим временем, но по факту нет... Я не могу понять где в принципе может быть проблема. Хоть бери и ТекущаяДата() ставь вместо даты сеанса, что не есть красиво.
Перепроверил на другой базе, работающей на том же сервере 1С. Та же проблема... Сервер 1С предприятия перегружался при правильном времени на ОС сервера, где запущен.

Автор: denis84 31.03.23, 9:59

Talkman @ Сегодня, 10:01 * ,
https://pro1c.org.ua/redirect.php?https://forum.mista.ru/topic.php?id=724778

пишут "чистка кэша" помогает

вот еще, про часовые пояса

Платформа начиная с версии 8.2 поддерживает методы преобразования с учетом системного часового пояса. Пример перевода в универсальное время и обратно (UTC), работает и на клиенте и на сервере:
Пример кода в 1С 8.3:

ДатаВремяСервера = УниверсальноеВремя(ТекущаяДатаСеанса());
ДатаВремяМестное = МестноеВремя(ДатаВремяСервера);


Автор: Talkman 31.03.23, 10:11

denis84 @ Сегодня, 10:59 * ,
Симптомы похожи, но только похожи. Рабочее пространство юзеров одно с одним конкретным правильным временем. Проверил на другом сервере терминалов с правильным временем с теми же базами 1С. Та же картина. По ссылке сказано про чистку кеша. Не подскажете какой кеш имеется в виду?

denis84 @ Сегодня, 10:59 * ,
Тут вопрос не в том, что можно переделать, чтобы заработало, а в том, чтобы понять что не так с временем сеанса. Код в конфигурации рабочий и проблем с ним не было ранее при переходе на летнее/зимнее время. Банальная замена ТекущаяДатаСеанса() на ТекущаяДата() в данном конкретном случае тоже решит проблему, так как все юзеры работают с одного сервера терминалов с одним сервером 1С. Но как то не правильно решать проблему изменением кода, который раньше работал при такой же ситуации sad.gif.

Автор: denis84 31.03.23, 10:20

Talkman @ Сегодня, 11:11 * ,
а платформа все время была одна и тоже? или Вы меняли платформу?

Любят там, что-то менять.

У меня не стыковки, но в другом (оаскраска строк в ТЗ) у меня красило, а в пользователя нет. а как оказалось разные платформы

Автор: Talkman 31.03.23, 10:52

denis84 @ Сегодня, 11:20 * ,
Все работают на одном сервере терминалов на одной платформе в одной базе подключенной к одному серверу 1С. В том то и вся оказия. Проблема одна у всех. Но на всех серверах время правильное + сервер 1С перегружался при правильном времени в ОС, на которой он поднят. Все предпосылки вроде как к тому, что где то что то не поменяно, но я не могу понять где...

Talkman @ Сегодня, 11:24 * ,
Платформа, не менялась.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua