Перейти к содержанию
#std643

Работа в разных часовых поясах

1.

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

Например

Сервер в Москве, пользователи во Владивостоке. Операции - по времени Владивостока.

В стандарте не указано

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

2.1.

Используйте ТекущаяДатаСеанса вместо ТекущаяДата в серверном контексте. ТекущаяДатаСеанса приводит время к часовому поясу пользовательского сеанса. ТекущаяДата возвращает дату и время серверного компьютера.

2.2.

Когда требуется учесть время не зависящее от часового пояса текущего сеанса пользователя используйте УниверсальноеВремя.

Например

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

2.3.

Если метод платформы возвращает время в часовом поясе сервера, а время надо показать пользователю, приведите время к часовому поясу пользователя.

Правильно

ДатаАктуальностиУниверсальная = УниверсальноеВремя(ПолнотекстовыйПоиск.ДатаАктуальности());
ДатаАктуальности = МестноеВремя(ДатаАктуальностиУниверсальная, ЧасовойПоясСеанса());
3.1.

Не используйте ТекущаяДата на клиенте. Это может привести к сложно расследуемому неожиданному поведению.

Попробуйте вместо этого:

  • Передайте с сервера на клиент время и дату, приведенную к часовому поясу пользователя.
  • При работе с документами на клиенте используйте дату документа.
3.2.

Неправильно

Определять месяц, который надо закрыть, получая дату с клиента
&НаКлиенте
Процедура КомандаОткрытьЗакрытиеМесяца(Команда)

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

    ...
А при обработке использовать дату сервера
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ЗаполнитьЗначенияСвойств(Объект, Параметры);
    Если Не ЗначениеЗаполнено(Объект.ПериодРегистрации) Тогда
        Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДата());
    КонецЕсли;

    ...

Правильно

Определение даты переложить на сервер
&НаКлиенте
Процедура КомандаОткрытьЗакрытиеМесяца(Команда)

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

    ...
При обработке использовать ТекущаяДатаСеанса
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ЗаполнитьЗначенияСвойств(Объект, Параметры);
    Если Не ЗначениеЗаполнено(Объект.ПериодРегистрации) Тогда
        Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДатаСеанса());
    КонецЕсли;

    ...

3.3.

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

Неправильно

Не передавайте текущую дату для подбора номенклатуры в табличную часть
&НаКлиенте
Процедура ПодборТовары(Команда)

    ПараметрыПодбора = Новый Структура;
    ДатаРасчетов = ?(НачалоДня(Объект.Дата) = НачалоДня(ТекущаяДата()), Неопределено, Объект.Дата); // вызов ТекущаяДата() на клиенте
    ПараметрыПодбора.Вставить("ДатаРасчетов", ДатаРасчетов);
    ...
    ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.Форма", ПараметрыПодбора,
        ЭтотОбъект, УникальныйИдентификатор);

    ...

Правильно

Передавайте дату документа
&НаКлиенте
Процедура ПодборТовары(Команда)

    ПараметрыПодбора = Новый Структура;
    ПараметрыПодбора.Вставить("ДатаРасчетов", Объект.Дата);

    ...
    ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.Форма", ПараметрыПодбора,
        ЭтотОбъект, УникальныйИдентификатор);

    ...

Неправильно

Устанавливать отбор подобный условию: дата не больше переданной в форму
&НаКлиенте
Процедура ЗачетАвансовДокументАвансаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("КонецПериода",
        ?(ЗначениеЗаполнено(Параметры.Ключ), Объект.Дата - 1, КонецДня(ТекущаяДата()))); // вызов ТекущаяДата() на клиенте
    ...
    ОткрытьФорму("Документ.ДокументРасчетовСКонтрагентом.ФормаВыбора", ПараметрыФормы, Элемент);
    ...

Правильно

Вычислять отбор по дате документа
&НаКлиенте
Процедура ЗачетАвансовДокументАвансаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("КонецПериода",
        ?(ЗначениеЗаполнено(Параметры.Ключ), Объект.Дата - 1, КонецДня(Объект.Дата)));
    ...
    ОткрытьФорму("Документ.ДокументРасчетовСКонтрагентом.ФормаВыбора", ПараметрыФормы, Элемент);
    ...
3.4.

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

4.

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

5.

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

Неправильно

Рассчитывать дату каждый раз
ДатаПоследнегоОповещения = ТекущаяДатаСеанса();
ДатаСледующегоОповещения = РассчитатьДату() + ТекущаяДатаСеанса();

Правильно

Использовать ранее рассчитанную дату
ДатаПоследнегоОповещения = ТекущаяДатаСеанса();
ДатаСледующегоОповещения = РассчитатьДату() + ДатаПоследнегоОповещения;
Источник

https://its.1c.ru/db/v8std#content:643