Снова об использовании ТекущаяДата() на клиенте и на сервере и о работе в разных часовых поясах

24.04.23

Разработка - БСП (Библиотека стандартных подсистем)

Можно ли применять ТекущаяДата() вопреки требованиям стандартов 1С? Безопасно ли использование функции ОбщегоНазначенияКлиент.ДатаСеанса() из БСП? Как правильно поступать при работе пользователей в разных часовых поясах?

Конечно не поспеваешь,

твои часы отстают на целых два дня!

Шляпник

 

 

К теме стандартов 1С, касающихся работы с датой и временем, авторы публикаций обращались уже не раз. Например здесь и здесь. Несмотря на, казалось бы, простоту этой темы, в ней имеется немало подводных камней. Попытаемся рассмотреть подробнее.

О стандартах

Существует стандарт от 1С Работа в разных часовых поясах. Посмотрим на его пункты внимательнее.

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

Хм.. Наверное разработчик должен понимать, какую задачу он решает, не так ли? Я был бы готов видеть этот пункт в виде: "Если для решения прикладной задачи требуется дата и время серверного компьютера, то следует использовать ТекущаяДата.  Если нужна дата и время, приведенная к часовому поясу пользовательского сеанса - то ТекущаяДатаСеанса". 

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

...................................................

 вместо вызова функции ТекущаяДата на клиенте необходимо 

  • передавать с сервера на клиент время и дату, приведенную к часовому поясу пользовательского сеанса;

...................................................

А это еще почему? А если не требуется сопоставление текущего времени, вычисленного в клиентском и серверном коде, почему я не могу использовать ТекущаяДата? Логичнее звучит: "Если по условию задачи алгоритм решения использует значения текущего времени, вычисленные в клиентском и серверном коде, то в большинстве случаев использование ТекущаяДата на клиенте будет неправильным". На самом деле существует немало задач, где достаточно только текущего времени, вычисленного на клиенте. Например:

  1. Учет событий, произошедших на стороне клиента. В документе вполне могут быть реквизиты ДатаВремяПосещенияЗаказчикомОфиса или ДатаОбращенияНаГорячуюЛинию. Здесь нам абсолютно все равно, какое в этот момент было время на сервере, и не надо лишний раз этот самый сервер нагружать.
  2. Замер интервалов, продолжительности выполнения:
    &НаКлиенте
    Процедура Команда1(Команда)             
    	Начало = ТекущаяДата();
    	ЧтоТоСложноеДелаемНаКлиенте();
    	ЧтоТоСложноеДелаемНаСервере();
    	Окончание = ТекущаяДата();
    	Продолжительность = Окончание-Начало;
    КонецПроцедуры

     

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

  4. Планирование работ и событий по местному времени: в 10:00 надо идти на совещание, к 15:00 подготовить отчет для директора, а в 16:58 надо закончить работу, чтобы успеть на автобус в 17:05.

Так что не видно никаких причин запрещать использование ТекущаяДата на клиенте.

О функции ДатаСеанса()

Что же нам советует стандарт для клиента?

 при использовании Библиотеки стандартных подсистем рекомендуется использовать функцию ДатаСеанса общего модуля ОбщегоНазначенияКлиент.

Ну, ок, давайте посмотрим, как она работает. Опустим тот факт что ее функционал размазан на, как минимум, пять общих модулей - из-за особенностей платформы и стандартов разработки меньше не получится:). В основе лежит использование ТекущаяДатаСеанса() на сервере. Чтобы каждый раз при вызове ДатаСеанса() на клиенте не обращаться к серверу, при первом запуске вычисляется поправка - разница между ТекущаяДатаСеанса() на сервере и ТекущаяДата() на клиенте. При последующих обращениях сервер не вызывается, а вычисляется ТекущаяДата() на клиенте и добавляется поправка. Отсутствие обращения к серверу происходит за счет использования модуля  с повторным использованием возвращаемых значений, т.е. поправка после вычисления кэшируется. Согласно ИТС значение поправки хранится в кэше от 6 до 20 минут, после чего при обращении к ДатаСеанса() поправка заново  рассчитывается на сервере. 

Таким образом, вместо даты сервера, приведенного к часовому поясу клиента, используется дата клиента увеличенная (уменьшенная) на некое значение поправки. И все было бы хорошо, если бы была уверенность что время на клиенте и сервере течет одинаково, а поправка всегда равна их разнице. А это не так...

Пример 1.

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

Пример 2.

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

Хорошо, но ведь ситуация, когда существенно изменяется время на компьютере, достаточно редкая, тем более, что переход на летнее время отменили? Да, редкая. Но существует другая проблема: значение поправки зависит от скорости сетевого соединения!

Пример 3.

Предположим, что между клиентом и сервером крайне нестабильное сетевое соединение. Также допустим, что нам надо периодически получать отметки времени на клиенте с интервалом около единиц секунд.

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


&НаКлиенте
Процедура Команда1(Команда)             
	Сообщить("Старт");
	ТекущееВремяНаКлиенте = ТекущаяДата();
	Время = ОбщегоНазначенияКлиент.ДатаСеанса();	
	Сообщить("НаКлиенте: "+Формат(ТекущееВремяНаКлиенте, "ДФ=ЧЧ:мм:сс") 
			+ " ВремяСеанса: Текущее = "+Формат(Время, "ДФ=ЧЧ:мм:сс"));
	ПодключитьОбработчикОжидания("ОбработчикОжидания",1,Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОжидания()          
	ТекущееВремяНаКлиенте = ТекущаяДата();
	ТекущееВремя = ОбщегоНазначенияКлиент.ДатаСеанса();
	Дельта = ТекущееВремя - Время;
	Если Дельта>2 Или Дельта<0 Тогда
		Сообщить("НаКлиенте: "+Формат(ТекущееВремяНаКлиенте, "ДФ=ЧЧ:мм:сс")
				+ " ВремяСеанса: Текущее = "+Формат(ТекущееВремя, "ДФ=ЧЧ:мм:сс")
				+ " Предыдущее = "+Формат(Время, "ДФ=ЧЧ:мм:сс")
				+ " Разница = "+Дельта);
	КонецЕсли;                
	Время = ТекущееВремя;
КонецПроцедуры

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

Процедура ДобавитьПоправкиКВремени(Параметры, СвойстваКлиента)
	..............................................
	..............................................
	..............................................
	Сообщить("НаКлиенте: "+Формат(СвойстваКлиента.ТекущаяДатаНаКлиенте, "ДФ=ЧЧ:мм:сс") 
			+ " Расчет новой поправки на сервере. Поправка = "+Параметры.ПоправкаКВремениСеанса);
КонецПроцедуры

Синхронизируем для простоты время клиента и сервера. Запустим обработку в веб-клиенте, в браузере Google Chrome - в нем мы можем гибко настраивать ограничение сети (в 1С с этим не все гладко). 

В окне сообщений:

Старт
НаКлиенте: 11:45:57 Расчет новой поправки на сервере. Поправка = 0
НаКлиенте: 11:45:57 ВремяСеанса: Текущее = 11:45:57

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

Включаем в свойствах браузера ограничение сети и ждем.

 

 

Через 20 минут получаем:

НаКлиенте: 12:05:58 Расчет новой поправки на сервере. Поправка = 11
НаКлиенте: 12:05:58 ВремяСеанса: Текущее = 12:06:20 Предыдущее = 12:05:57 Разница = 23

Время на клиенте теперь будет отставать от "времени сервера" на 11 секунд! Хотя на самом деле оно и там, и там совпадает, просто клиент будет "думать", что на сервере оно больше.

Ну и разница с предыдущим значением стала 23 секунды - это вполне объяснимо - время ушло на серверный вызов расчета поправки в условиях низкой скорости.

Уберем любые ограничения: 

 

 

Спустя 20 минут:

НаКлиенте: 12:26:09 Расчет новой поправки на сервере. Поправка = 0
НаКлиенте: 12:26:09 ВремяСеанса: Текущее = 12:26:09 Предыдущее = 12:26:19 Разница = -10

Поправка стала опять равна 0, но время сеанса на 10 секунд меньше, чем предыдущее!

 

 

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

Что здесь можно посоветовать? Если необходимо использовать время и дату, приведенную к часовому поясу пользовательского сеанса, то лучше переписать алгоритм так, чтобы работа с ней была на сервере. Если она нужна на клиенте - получать ее с помощью внеконтекстного серверного вызова. Использование ОбщегоНазначенияКлиент.ДатаСеанса(), на мой взгляд имеет мало смысла - частый вызов может дать ошибки, а редкий не имеет существенных преимуществ кэширования. Сама идея этого механизма, однако, неплоха. Возможен какой-нибудь процесс обработки данных, где нужно будет часто получать на клиенте ТекущаяДатаСеанса(). В этом случае надо аналогичным образом получить поправку, сохранить ее в переменной или реквизите формы, и до окончания обработки ее не менять.

 

Как же правильно разрабатывать конфигурации для работы в разных часовых поясах?

Это одновременно и просто, и сложно. Для начала надо уяснить, что все компьютеры, клиентские и серверные, могут иметь различное, несинхронизированное время и разные часовые пояса. Далее надо решить: какой функционал требует единой оси времени и будет ли эта ось единая для всей базы. Для тех задач, где нужна синхронизация даты/времени объектов и событий, вне зависимости от того, кто работает с ними (например отгрузка должна быть после поступления), необходимо так или иначе использовать время сервера, а не клиентского компьютера. В зависимости от ситуации, для сохранения данных в базе, время сервера необходимо привести либо к универсальному времени, либо к часовому поясу информационной базы, либо к часовому поясу сеанса. Согласно ИТС:Работа с документами в различных часовых поясах для единого предприятия надо использовать часовой пояс информационной базы, все часовые пояса сеансов должны быть равны поясу ИБ. Когда в одной базе ведут учет несколько фирм, филиалов, подразделений, у которых отдельные оси времени, тогда у каждой такой фирмы используется свой часовой пояс всех ее сеансов. Какие здесь могут быть подводные камни? Регламентные задания, если в них происходит использование текущей даты, для каждой такой фирмы должны быть свои. Часовой пояс должен быть передан в параметре регламентного задания.

В случае, когда часовой пояс клиента отличается от часового пояса ИБ, необходимо предусмотреть ситуацию, когда дату/время, сохраненное в ИБ, надо привести к часовому поясу клиента. Например, дата/время отгрузки в печатной форме товарно-транспортной накладной, время выезда автомобиля для путевого листа и т.п. Иногда такое приведение к часовому поясу клиента требуется для дат - реквизитов на форме или для запросов, динамических списков. В последнем случае можно использовать параметр - вычисленное смещение дат.

Иногда может потребоваться сохранение даты (например UTC) и отдельно - часового пояса. Часовой пояс можно сохранять как число - смещение от UTC или от часового пояса ИБ, либо как строку - имя часового пояса. Последний вариант предпочтительнее, проще работать с зимним/летним временем.

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

Предположим, что у нас есть постановщик задач в Новосибирске (UTC+7), исполнители в Магадане (UTC+11) и Калининграде (UTC+2). Все они работают по графику с 9:00 до 17:00 (для простоты - без обеда) по местному времени. Обычно постановщик задачи обозначает либо плановый срок ее завершения, либо время ее выполнения.

Если назначен плановый срок:

 

   Новосибирск   Магадан   Калининград 
Начало работы №1: 09:00  13:00 04:00
Плановый срок завершения 15:00 19:00 10:00
Время на работу 6 ч 4 ч 1 ч

 

Здесь постановщик назначил срок завершения, исходя из предполагаемой длительности работы в 6 часов, но фактически у Магадана есть 4 часа на выполнение, а у Калининграда - всего 1 час.

 

   Новосибирск    Магадан   Калининград 
Начало работы №2: 15:00  19:00 10:00
Плановый срок завершения 10:00 след.дня 14:00 след.дня 05:00 след.дня
Время на работу 3 ч 5 ч 7 ч

 

А здесь наоборот, вместо запланированного времени в 3 часа, у Магадана есть 5 часов, а у Калининграда - 7 часов на выполнение работы.

Если назначено время выполнения:

 

   Новосибирск   Магадан   Калининград 
Начало работы №1: 09:00  13:00 04:00
Время на работу 6 ч 6 ч 6 ч
Срок завершения 15:00 11:00 след.дня (06:00 след.дня в Новосибирске) 15:00 (20:00 в Новосибирске)

 

И в Магадане, и в Калининграде по Новосибирскому времени работы будут завершены позже.

 

   Новосибирск   Магадан   Калининград 
Начало работы №2: 15:00  19:00 10:00
Время на работу 3 ч 3 ч 3 ч
Срок завершения 10:00 след.дня 12:00 след.дня (08:00 след.дня в Новосибирске) 13:00 (18:00 в Новосибирске)

 

И в Магадане, и в Калининграде по Новосибирскому времени работы будут завершены раньше.

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

Это не единственный класс задач, где возникают неожиданные ситуации. Можно еще привести примеры: судопроизводство (с его сроками вступления в силу, обжалования и т.п.) - как должно работать в разных часовых поясах?; транспортные перевозки по стране; задачи определения даты просрочки долга, расчета пени и многие другие.

 

Подведем итоги.

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

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

3. Разработка системы, рассчитанной на работу в разных часовых поясах, вполне реальна, в платформе есть достаточно средств для этого. Иногда нужно работать в часовом поясе информационной базы, иногда - в часовых поясах сеансов, а иногда - сохранять дату UTC и часовой пояс. Но, перед разработкой необходим тщательный анализ предметной области и сценариев работы, часто обнаруживается множество подводных камней. Алгоритмы работы должны все эти особенные случаи учитывать.

 

Тест проводился в веб-клиенте 8.3.21.1393, в браузере Google Chrome, БСП 3.1.7.82

Как всегда, приветствуются замечания / дополнения / комментарии.

 PS: За рамками статьи остался интересный вопрос, у меня нет возможности его проверить: как поведут себя функции вычисления даты, когда есть кластер серверов, а время рабочих серверов не синхронизировано (отличается на несколько секунд). Вычисления ведь могут быть распределены по разным серверам, тогда одновременный запрос времени даст одинаковый, или разный результат?  Если кто-нибудь поставит этот эксперимент, и расскажет о результатах, было бы неплохо.

 
 Некоторые из прочих моих публикаций 

 

ТекущаяДата ТекущаяДатаСеанса ДатаСеанса Дата Время часовой пояс БСП стандарты

См. также

БСП. Добавляем отчет в меню Отчеты

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Добавим новый отчет в меню нового документа средствами БСП.

02.04.2024    3206    John_d    10    

89

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

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

28.12.2023    5017    mrXoxot    11    

100

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    7072    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    19181    SeiOkami    46    

118

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9510    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6562    sebekerga    54    

95

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    17005    SeiOkami    31    

104
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sandr13 34 25.04.23 15:25 Сейчас в теме
Тут как бы засада мне думается гораздо больше. Так как любители перевода стрелок в разных регионах (особое "спасибо" любителям ввода летнего / зимнего времени) постарались сделать адом вычисление времени для поясов на определенный промежуток времени. Первой ласточкой в этой идиотизме стала советская власть со своим декретным часом...(
3. Alxby 1145 25.04.23 18:58 Сейчас в теме
(1)Всё же "летнее", "зимнее" время, как и "декретное", само по себе не приносит хлопот. Я думаю, они однозначно определяются часовым поясом. А вот переход на "летнее"/"зимнее" во время работы информационной системы требует особого внимания и методики перехода, особенно для системы с разными часовыми поясами. В таком случае, например, возможен вариант с фактическим одновременным переходом, вне зависимости от часа перехода конкретного часового пояса. Для случая с использованием только часового пояса ИБ это будет происходить автоматически.
4. sandr13 34 26.04.23 00:09 Сейчас в теме
(3) Да хлопот не приносило бы, если бы не распоряжения ещё и местной власти со своими хотелками править время как вздумается с какого-то периода, в какой-то конкретной местности.
7. Alxby 1145 26.04.23 08:00 Сейчас в теме
(4)Все такие хотелки местной власти рассматриваются и утверждаются Госдумой и отражаются в законе. Я уверен, что и на международном уровне учитывается, что с определенной даты в условной Самаре или Волгограде изменилось местное время.
2. aSHA-1 25.04.23 18:09 Сейчас в теме
вот надо было так заморочиться...
5. Knych 23 26.04.23 06:54 Сейчас в теме
Часовые пояса могут доставить массу удовольствий, как и разница времени на разных машинах, особенно при критичности последовательности и разборе каких то ситуаций. Проще и понятнее, когда учет и работа ведётся всегда в одном часовом поясе, а там, где нужно - приводится к местному. Это решение тоже не без изъянов и сложностей, но убирает зависимость зафиксированной даты от контекста образования этой самой даты/времени. , и ошибок работы с данными, которых можно избежать, например что-то вычисляет продолжительность, например отчёт, а в документе решили изменить расчёт даты на московское время вместо локального. Если использовать хранение всегда в одном поясе, то с отчётом ничего не случится, изменится механизм расчёта для отображения на формах документа. А в другом случае - придётся дописывать отчёт. А их может быть много. Изначальная заложенная архитектура сильно влияет на ресурсоёмкость, казалось бы, маленьких изменений.
6. Alxby 1145 26.04.23 07:56 Сейчас в теме
(5)Да, именно такой вариант рекомендуется на ИТС.
8. kser87 2441 26.04.23 10:21 Сейчас в теме
9. Dragonim 139 26.04.23 13:19 Сейчас в теме
3.1. В клиентском коде использование функции ТекущаяДата также недопустимо. Это требование обусловлено тем, что текущее время, вычисленное в клиентском и серверном коде, не должно различаться.

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

В общем случае нельзя верить всему, что приходит с клиента, включая отметку времени. Если у вас есть задача привести время сервера к времени пользователя, то разницу между временем сервера и временем пользователя надо хранить на стороне сервера, а не вычислять её раз в несколько минут.
10. Alxby 1145 26.04.23 13:32 Сейчас в теме
(9)Есть ряд задач, для которых требуется только время клиента. Оно может вообще не уходить на сервер. Для таких случаев использование на клиенте ТекущаяДата() не только допустимо, но и наиболее оптимально. Недопустимо это только для определенного вида задач, по вполне конкретным причинам, а вовсе не для всех задач, о чем говорится в стандарте.
NataliaZh; cleaner_it; +2 Ответить
11. reset2 17 26.04.23 13:50 Сейчас в теме
О функции ДатаСеанса()


Можно было ограничиться копи-пастом комментария разработчиков к функции, в котором все эти "подводные камни" описаны. Так что претензия не засчитана.
Прикрепленные файлы:
Mizhgan42; Sodrugestvo; Andreyyy; Alxby; G_116449793522595596167; +5 Ответить
15. Alxby 1145 26.04.23 20:51 Сейчас в теме
(11)В этом комментарии не расписано, какой эффект может дать задержка вызова сервера, в статье я постарался подробно показать это на примере. Главная здесь мысль: погрешность однократного получения времени - это пол-беды. Гораздо хуже ситуация получается, когда мы пытаемся измерить не очень большой промежуток времени. В худшем случае мы получаем отрицательное значение, и это подтвержденный экспериментом факт. Совет всегда переносить алгоритм на сервер также не всегда уместен, некоторые задачи эффективно решаются только на клиенте. К тому же я в статье не акцентировал внимание на то, что часовые пояса сеанса и клиентского компьютера могут быть разными, иногда это неприемлемо.
19. reset2 17 27.04.23 15:19 Сейчас в теме
(15)
В этом комментарии не расписано, какой эффект может дать задержка вызова сервера,

Написано же
"близкое к результату функции ТекущаяДатаСеанса в серверном коде.Погрешность обусловлена временем выполнения серверного вызова."

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

Но если всё же нужна какая-то супер-пупер точность на клиенте (например какие-то логи с клиента собирать), то только ТекущаяДата() с обоснованием (об этом в стандарте есть).

И кстати эта проблема не только 1С, а всех клиент-серверных приложений, веб-комьюнити например часто эту тему перетирает.
21. Alxby 1145 28.04.23 08:25 Сейчас в теме
(19)Здесь мы, видимо, не сойдемся во мнениях. Вы, наверное, полагаете что все разработчики в обязательном порядке читают в полном объеме документацию и описание функций библиотек, и их опыта достаточно, чтобы по краткому описанию смоделировать последствия в разных случаях использования? Я думаю что это не так. Статьи на Инфостарте читают с бОльшей охотой, и бывает, что практически полный копипаст синтаксис-помощника или статьи ИТС пользуются большой популярностью, о чем свидетельствует их высокий рейтинг.
cleaner_it; +1 Ответить
23. reset2 17 28.04.23 10:10 Сейчас в теме
(21) Я не оспариваю, что статья и пример полезны (да, наглядно и со вкусом), а лишь говорю, что претензии к разработчикам БСП и авторам стандарта не обоснованы.
cleaner_it; +1 Ответить
12. axelerleo 339 26.04.23 15:03 Сейчас в теме
1С Документооборот передает привет стандартам разработки :)

При помещении файла через веб-клиент и при последующем захвате его и помещении через тонкий клиент при отличающихся часовых поясах сервера и клиента легко получить ситуацию, когда помещаемый файл оказывается старше того, что был помещен веб-клиентом.
Пример: поместил через веб-клиент файл в 10 по мск, на сервере + 2 часа от московского.
Файл становится с датой изменения в 12 по мск.
Помещаю этот же файл в 11 по мск через тонкий клиент - ура! мне говорят, что есть более поздняя версия, у вас мол на 11 по мск, а на сервере есть на 12 по мск, идите лесом.
mrChOP93; triviumfan; +2 Ответить
13. Romyl01 37 26.04.23 18:22 Сейчас в теме
имхо про грубое нарушение стандартов перебор, для 99 процентов задач мб и сб, нет смысла заморачиваться с подсчетом часового пояса и т.п., если конечно у тебя есть конкретная задача где куча часовых поясов и решение энтерпрайз уровня то да. А так продать ИП пупкин из 10 человек лишние часы на всякие энтерпрайз стандарты, такое себе.
14. Alxby 1145 26.04.23 20:05 Сейчас в теме
(13)Соблюдение стандартов вендора необходимо, например, для крупных проектов 1С:Совместимо. Или коробочного решения массового продукта. Для автоматизации небольшого предприятия, киоска, вроде бы нет необходимости их соблюдать, но других стандартов для нас нет. Такое ПО может носить гордое название "нестандартное" :).
cleaner_it; +1 Ответить
16. Romyl01 37 27.04.23 06:44 Сейчас в теме
(14) а я что то написал другое, эти стандарты нужны для энтерпрайза, но автору надо делать дисклеймер, что если вы будете пытаться продавать свои "стандарты" оторванные от реальности, малому и среднему бизнесу в большинстве случаях вы проиграете конкурентную борьбу обычному кодеру с земли. Поэтому некорректно писать про грубое нарушение, а расписать что к чему и как, и вводить начинающих спецов в заблуждение, у же не раз люди обжигались на этом. А про стандарты я и на итс могу прочитать.
17. Alxby 1145 27.04.23 13:30 Сейчас в теме
(16)По поводу стандартов я с Вами и не спорю, есть ниша, где стандарты требуются, а где-то - нет. Но статья-то не об этом. А о том, что не всегда надо слепо доверять советам, рекомендациям, стандартам, а принимать решения вдумчиво, понимая, откуда взялись эти самые стандарты, учитывая все плюсы и минусы принимаемого решения. Вот о возможных проблемах я и написал: в некоторых случаях рекомендуемый механизм работает ошибочно. Это совсем не означает, что в других случаях он не будет работать правильно, и уж тем более не означает, что нельзя использовать БСП и учитывать требования стандартов.
18. Romyl01 37 27.04.23 14:30 Сейчас в теме
(17) не просто ниша а 95 процентов рынка, особенно для начинающих 1сников, вот тут то и ваше грубое нарушение в подавляющем случае единственно верный способ правильно все сделать. Имхо иногда приходиться гавнокодить по умному, чтобы масла по больше было на хлеб.
20. Alxby 1145 28.04.23 08:17 Сейчас в теме
(18)Не совсем понял о каком моем грубом нарушении, которое позволяет правильно все сделать, Вы говорите. Об ошибках использования ДатаСеанса() в некоторых случаях?
22. Romyl01 37 28.04.23 09:29 Сейчас в теме
(20) я про стандарты, но да ладно не хочу спорить, статья интересная будет полезно тем кто начинает работать с компаниям в разных часовых поясах.
24. Quantum81 6 02.05.23 13:24 Сейчас в теме
Мне кажется автор не дошёл до самого интересного :) УстановитьЧасовойПоясСеанса() . Какие даты пишутся в доки, и что видит пользователь в списках. :))
А в целом подход "простой". - если нужна разработка в разных часовых поясах, то везде, где есть данные типа дата, должно быть понимание в каком часовом поясе оно задано. Из коробки такого не идёт. Имхо, то что автор говорил про доп поле - я бы добавил в тип даты на уровне платформы. Интересно как в 9.0 сделано.
25. Alxby 1145 02.05.23 21:25 Сейчас в теме
(24)Да, я упомянул об этом лишь вскользь. Простор для различных вариантов здесь безграничен)). А уж если вспомнить про момент времени у документов и попытаться совместить это с часовыми поясами... Но это тема для другой статьи. Кстати, тип даты, вернее ее представление, со смещением от универсального времени, есть в json.
26. maksa2005 534 04.05.23 09:49 Сейчас в теме
Текущую дату можно использовать и даже сама 1С в общих модулях использует. Не является ошибкой. Задумать стоит только при 1 условии = у магазина есть фирмы в разных часовых поясах?
Оставьте свое сообщение