Почему нельзя использовать ТекущаяДата()
Разработка - Механизмы платформы 1С
ИТС запрещает использовать ТекущаяДата(), но исчерпывающей информации на вопрос "Почему?" нет ни там, ни на ИС, поэтому написал данную заметку. Тем не менее, совсем не знакомым с темой, стоит прочитать статью на ИТС (по этой ссылке)и бегло статью на ИС "О времени и 1С" (к сожалению, ровно через неделю после моей публикации Юрий Пермитин удалил все свои статьи с инфостарта. НО СЕЙЧАС 27.10.2023 СТАТЬЮ ОПЯТЬ ВОССТАНОВИЛИ).
Цитаты с ИТС:
2.1. Во всех серверных процедурах и функциях вместо функции ТекущаяДата, которая возвращает дату и время серверного компьютера, следует использовать функцию ТекущаяДатаСеанса, которая приводит время сервера к часовому поясу пользовательского сеанса.
3.1. В клиентском коде использование функции ТекущаяДата также недопустимо. Это требование обусловлено тем, что текущее время, вычисленное в клиентском и серверном коде, не должно различаться.
2.2. В тех случаях, когда требуется «универсальная» отметка времени, не зависящая от часового пояса текущего сеанса пользователя, в контексте которого выполняется серверный вызов, следует использовать функцию УниверсальноеВремя.
А именно остались вопросы:
1. Раз уж по неведомой пока причине, запретили использовать ТекущаяДата(), то почему бы вместо неё не дать возможность всегда использовать ТекущаяДатаСеанса()? Почему в платформе не сделали функцию ТекущаяДатаСеанса() доступной на клиенте? Тем более, что инфа о времени сеанса клиента изначально физически лежит на клиенте.
Потому что ТекущаяДатаСеанса() - согласно СП это серверная дата и время + часовой пояс клиента. А значит мы страхуемся от того, что на клиенте время вообще от балды идёт, например отстаёт на секунду.
2. Хорошо, раз на клиенте недоступна ТекущаяДатаСеанса(), то почему ИТС не разрешает на клиенте вызывать ТекущаяДата()? Ведь ТекущаяДатаСеанса() выполненная на сервере по идее будет равняться ТекущаяДата() выполненная на клиенте.
Вместо этого ИТС рекомендует вызывать метод БСП ДатаСеанса(), который как раз и вернёт значение равное ТекущаяДатаСеанса() только при этом не будет делать серверный вызов, за счёт того, что он был сделан однократно в начале сеанса и была вычислена ПоправкаКВремениСеанса = ТекущаяДатаСеанса(вычисленная на сервере) - ТекущаяДата(вычисленная на клиенте).
Ответ на данный вопрос вытекает из предыдущего: серверное и клиентское время время может отличаться не только на часовой пояс, и единственный выход пользоваться одинаковым временем, это брать его с сервера и добавлять клиентские часовые пояса - т.е. ровно то, что и делается в ТекущаяДатаСеанса() и ДатаСеанса()
Второй аргумент подсказал коллега (в достоверности не могу ручаться): ТекущаяДатаСеанса() на сервере и ТекущаяДата() на клиенте могут отличаться во фреше, т.к. это эталонное время для области в которой крутится сеанс и время Кластера соответсвенно.
3. Почему в качестве универсального времени ИТС указывает безальтернативно использовать УниверсальноеВремя()? Почему вместо этого нельзя использовать ТекущаяДата() вычисленное на сервере?
ТекущаяДата() на сервере тоже может меняться - например если сервер переехал. Или серверов может быть несколько. Поэтому УниверсальноеВремя() универсально в отличии от ТекущаяДата().
Опосляскриптум:
Да, тема вроде похожа на древний копролит. Но при попытке дать джунам почитать что-то, чтобы найти ответы на конкретно поставленные вопросы, пришлось сочинять самому. Поэтому если вы считаете что, данные вопросы уже отвечены, то милости просим ссылку + конкретные цитаты, отвечающие на данные вопросы - в противном случае злословия не принимаются)))
------------------------------------
ИНТЕРЕСНЫХ ВАМ ЗАДАЧ, ПЛОДОТВОРНОЙ РАБОТЫ И ОРИГИНАЛЬНЫХ/ОПТИМАЛЬНЫХ РЕШЕНИЙ!!
Проверено на платформе 8.3.17.1989.
Вступайте в нашу телеграмм-группу Инфостарт
ТекущаяДата ТекущаяДатаСеанса Ограничения Нельзя Стандарт УниверсальноеВремя ДатаСеанса Дата Время ЧасовойПояс
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
БСП (Библиотека стандартных подсистем) Разработчик Платные (руб)
Синтакс-помощник БСП - cправочник по библиотекам стандартных подсистем и электронных документов. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП и БЭД.
3254 руб.
21.11.2024 14587 51 30
Адаптация типовых решений БСП (Библиотека стандартных подсистем) Кадровый учет ЭДО и ОФД 1C:Бухгалтерия 1С:Зарплата и кадры 7.7 1C:ERP 1С:ЗУП 1С:УТ 1С:ДО Платные (руб)
Наше расширение 1С Госключ обеспечивает интеграцию любой конфигурации 1С на базе БСП с мобильным приложением «Госключ», позволяя сотрудникам подписывать кадровые документы (КЭДО) и документы материальной ответственности (МОЛ, ПБ) усиленной электронной подписью прямо со смартфона. Решение автоматизирует формирование и отправку документов на подпись, отслеживает статусы подписания и хранит подписанные файлы непосредственно в базе 1С
25000 руб.
06.03.2026 2741 4 0
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45556 TitanLuchs 109
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46691 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26384 VAAngelov 60
БСП (Библиотека стандартных подсистем) Разработчик 1С:Предприятие 8 Бесплатно (free)
Наиболее часто используемые методы БСП 3.1.9
24.07.2024 51068 SergMuravev 45
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40373 bayselonarrend 24
БСП (Библиотека стандартных подсистем) Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Добавим новый отчет в меню нового документа средствами БСП.
02.04.2024 23432 John_d 15
Есть стандарты - рекомендации от вендора. Их нужно стремиться соблюдать.
А есть типовые конфигурации, при написании которых архитектор не отследил, что разработчик не соблюдает стандарт.
То есть если типовая не соблюдает стандарты, это не значит, что их нет и их не надо соблюдать.
Позиция, что если типовые не соблюдают, то мы тоже не будем - контрпродуктивная
"вендор часто пишет то что сам не делает" - вендор это не один человек, а команда. И добиться от каждого разработчика 100% соблюдения, близко к нереальному.
Кроме того часть кода могли быть написаны до появления стандарта, но тот код не меняют.
Это не является аргументом в пользу того, что не нужно соблюдать стандарты.
"не рекомендуют" - соглашусь.. так как могут быть последствия .. а запрещают...- бред!
1. коллега, вы ответили на цитату из ИТС, где написано, что использовать ТекущаяДата "недопустимо" и всё равно пишите что это чушь.
2. приводить в пример типовой код хрен знает какой древности, возможно до создания этого стандарта в обоснование, что этого стандарта нет - это очень странно
см. :)
P/S вендор часто пишет то что сам не делает. "Мой стандарт - как хочу так и применяю"
Есть стандарты - рекомендации от вендора. Их нужно стремиться соблюдать.
А есть типовые конфигурации, при написании которых архитектор не отследил, что разработчик не соблюдает стандарт.
То есть если типовая не соблюдает стандарты, это не значит, что их нет и их не надо соблюдать.
Позиция, что если типовые не соблюдают, то мы тоже не будем - контрпродуктивная
"вендор часто пишет то что сам не делает" - вендор это не один человек, а команда. И добиться от каждого разработчика 100% соблюдения, близко к нереальному.
Кроме того часть кода могли быть написаны до появления стандарта, но тот код не меняют.
Это не является аргументом в пользу того, что не нужно соблюдать стандарты.
(40)
Какие ключевые параметры стандарта? - это дата его принятия ( где на ИТС дата принятия что данный метод... с такого то числа , как тогда можно говорить что код написан до появления :)
я никоим образом не говорю что стандартов не нужно придерживаться в процессе разработки, нужно! Но и вендору следовало бы в этом случае контролировать не только тех кто подает заявки на 1С:Совместимо ( а там как раз и проверяют по актуальному стандарту не зависимо от того когда этот стандарт был принят ( хоть даже сегодня)..) . но и свои собственные решения .. Как никак вендор сертифицирован по ИСО :)
В стандарте же разработки .. такого нет!! мало того этот стандарт применим и к 8.2 :) А там этих методов и в помине нет.. !
1) Офис во Владивостоке
2) Офис в МСК.
3) Сервер в МСК.
4) Во Владивостоке по местному времени ввели поступление товара например в 12:00.
Какой датой этот товар появится на остатках для пользователя в МСК?
По идее, для обоих пользователей поступление товара должно отображаться одинаково, чтобы он был доступен для них в одно и тоже время.
То есть нам это время нужно приводить к одному часовому поясу, например, 05:00 по МСК.
А как по человечески для такой ситуации использовать ТекущаяДатаСеанса()?
(13)
1. данную ссылку я привёл и ответов на три заданных вопроса там нет.
2. если считаете иначе, специально для этого написал "если вы считаете что, данные вопросы уже отвечены, то милости просим ссылку + конкретные цитаты, отвечающие на данные вопросы"
Теперь вот думаю как разрулить ситуацию:
HTTP-сервис, внешнее событие - входящий телефонный звонок. Приходит из облачной АТС билайна. Надо фиксировать пропущенный звонок. Звонки идут на +3 и +7 часовые пояса.
Причем клиенты могут звонить на общеканальные номера - "группы обзвона" (а не конкрентному менеджеру, в спр. пользователе которого как раз и можно было бы хранить часовой пояс). В 1С такое приходит как "событие звонок" на все номера в "группе номеров". Т.е. если в группе 4 номера, то придёт 4 события звонок. Если звонок был пропущенный, то должен сформироваться 1 пропущенный звонок (а не 4). И вот как определять дату для такого пропущенного? Вычислять часовой пояс по всем пользователям входящим в группу, брать УниверсальноеВремя() + ЧасовойПояс? 0_о
Как вообще жить пользователям с разными часовыми поясами в одной базе? Я пока в раздумиях...
Вы не описали, зачем вам дата.
1. УниверсальноеВремя используется в одном случае - когда необходимо в хронологической последовательности эти события отсортировать. И часовой пояс к нему в таком случае прибавлять не нужно - вызываете без параметров, и часовой пояс прибавится из тек сеанса автоматом.
2. если цель любая другая, то ТекущаяДатаСеанса() и ДатаСеанса() в случае клиента.
3. может быть вам нужна и универсальная дата и дата сеанса сразу в разных реквизитах.
ТекущаяДатаСеанса() меня не спасёт, т.к. событие всегда происходит на сервере который в часосвом поясе +7. Само событие "Пропущенный телефонный звонок" должно быть зафиксировано во времени часового пояса пользователя, которому звонили. Т.е. на сервере всегда +7, а звонки могут быть для пользователей +3 и +7 часовых поясов
Тогда вам нужна ТекущаяДатаСеанса()
Об этом цитата из ИТС в начале статьи
ТекущаяДатаСеанса() выполненная на сервере будет разной в зависимости от часового пояса сеанса а не сервера.
Так. И какая же будет ТекущаяДатаСеанса(), если речь идёт про HTTP сервис работающий на сервере с часовым поясом +7??
Пример: у вас в базе работают одновременно из Москвы (UTC+3) и из Красноярска (UTC+7). Они примерно одновременно вводят поступление товара на склад +1 шт. После этого пользователь из Мск хочет посмотреть остаток на текущий момент времени. Если у вас что-то такое, то вам нужно определиться с тем как вы формируете текущие движения. Должно быть так, чтобы пользователь из Мск увидел этот остаток по своему времени, а не через 4 часа.
Определитесь с датой/временем движений — ответите на свой вопрос.
В большинстве случаев у заказчика в кластере 1 или 2, или 3 сервера, и все они в одном часовом поясе, поэтому достаточно использовать ТекущуюДату.
Вот для таких случаев лучше использовать ТекущаяУниверсальнаяДатаВМиллисекундах(). Во-первых, повышается точность, во-вторых не столкнётесь с ошибкой при переходе между летним и зимним временем во время выполнения (редкий случай, знаю).
И, кстати, "Заблуждения программистов относительно времени":
И объяснено это будет тем, что мол в случае, когда синхронизация времени с сервером не нужна, используйте просто дату, это будет быстрее. Прямо будет вообще на много быстрее, летать прям будет, а в случае с синхронизацией - будет дольше. Ну и конечно же можно потом полемику разводить по этому поводу.
А то что советует 1С это хрень.
Потому что заходит пользователь МСК в базу начинает что-то делать, и у него только 12:00, а он видит что кто-то внес изменения уже 18:00 (а это был Владивосток)
И сколько багов мы наелись при переходе дня. Когда во Владике уже новый день а в МСК еще прошлый....
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1714759
Создание 23.08.22 08:00
Обновление 27.10.23 12:47
Просмотры 47518
Загрузки 0
Рейтинг
98
Комментарии 62
Код открыт Да
Рубрики БСП (Библиотека стандартных подсистем) Механизмы платформы 1С
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)