Довідковий матеріал

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

1. Конфігурації мають бути розраховані на роботу в умовах, коли часовий пояс на серверному комп’ютері не збігається з реальним часовим поясом користувачів інформаційної бази. Наприклад, із сервером, розташованим у Москві, працюють співробітники компанії з Владивостока, і при цьому всі операції в системі мають виконуватися за місцевим часом (Владивостока).

1. Конфігурації мають бути розраховані на роботу в умовах, коли часовий пояс на серверному комп’ютері не збігається з реальним часовим поясом користувачів інформаційної бази. Наприклад, із сервером, розташованим у Москві, працюють співробітники компанії з Владивостока, і при цьому всі операції в системі мають виконуватися за місцевим часом (Владивостока).

Такий сценарій роботи часто затребуваний у клієнт-серверних інформаційних базах і в прикладних рішеннях у моделі сервісу (SaaS).

2.1. У всіх серверних процедурах і функціях замість функції ПоточнаДата, яка повертає дату й час серверного комп’ютера, слід використовувати функцію ПоточнаДатаСеансу, яка приводить час сервера до часового поясу користувацького сеансу.

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

2.3. Під час використання методів платформи, що повертають локальну дату серверного комп’ютера, слід приводити її або до універсального часу, або до часу користувацького сеансу. Наприклад:

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

3.1. У клієнтському коді використання функції ПоточнаДата також неприпустиме. Ця вимога зумовлена тим, що поточний час, обчислений у клієнтському та серверному коді, не має відрізнятися.

Наприклад, із сервером, розташованим у Москві, працюють користувачі з Києва. Функція ПоточнаДата для клієнтського комп’ютера повертає 10:00, а для сервера — 11:00. Водночас функція ПоточнаДатаСеансу поверне на сервері 10:00, якщо в інформаційній базі встановлено київський час (за допомогою методу УстановитиЧасовийПоясІнформаційноїБази).

Як правило, замість виклику функції ПоточнаДата на клієнті необхідно

  • передавати із сервера на клієнт час і дату, приведені до часового поясу користувацького сеансу;
  • під час роботи з документами на клієнті використовувати дату документа.

Розглянемо типові випадки на прикладах.

3.2. В алгоритмі закриття місяця з клієнта на сервер передається дата, за якою далі визначається, який місяць буде закриватися. Неправильно:

&НаКлієнті
Процедура КомандаВідкритиЗакриттяМісяця(Команда)
	ПоточніДані = Елементи.Список.ПоточніДані;
	Якщо ПоточніДані = Невизначено Тоді
		ПоточнаДата = ПоточнаДата(); // виклик ПоточнаДата() на клієнті
	Інакше
		ПоточнаДата = ПоточніДані.Дата;
	КінецьЯкщо;
	ПараметриФорми = Новий Структура;
	ПараметриФорми.Вставити("ПеріодРеєстрації", ПоточнаДата);
	ВідкритиФорму("Обробка.ЗакриттяМісяця.Форма.Форма", ПараметриФорми, ЦяФорма);

а потім у формі обробки:

&НаСервері
Процедура ПриСтворенніНаСервері(Відмова, СтандартнаОбробка)
	ЗаповнитиЗначенняВластивостей(Об’єкт, Параметри);
	Якщо Не ЗначенняЗаповнено(Об’єкт.ПеріодРеєстрації) Тоді
		Об’єкт.ПеріодРеєстрації = ПочатокМісяця(ПоточнаДата());
	КінецьЯкщо;

Правильно перенести отримання поточної дати на сервер:

&НаКлієнті
Процедура КомандаВідкритиЗакриттяМісяця(Команда)
	ПоточніДані = Елементи.Список.ПоточніДані;
	Якщо ПоточніДані = Невизначено Тоді
		ПоточнаДата = Невизначено; // немає виклику ПоточнаДата() на клієнті
	Інакше
		ПоточнаДата = ПоточніДані.Дата;
	КінецьЯкщо;
	ПараметриФорми = Новий Структура;
	ПараметриФорми.Вставити("ПеріодРеєстрації", ПоточнаДата);
	ВідкритиФорму("Обробка.ЗакриттяМісяця.Форма.Форма", ПараметриФорми, ЦяФорма);

і у формі обробки використовувати для цього функцію ПоточнаДатаСеансу:

&НаСервері
Процедура ПриСтворенніНаСервері(Відмова, СтандартнаОбробка)
	ЗаповнитиЗначенняВластивостей(Об’єкт, Параметри);
	Якщо Не ЗначенняЗаповнено(Об’єкт.ПеріодРеєстрації) Тоді
		Об’єкт.ПеріодРеєстрації = ПочатокМісяця(ПоточнаДатаСеансу());
	КінецьЯкщо;

3.3. Під час роботи з документами слід розглянути можливість використання дати самого документа замість поточної дати. Наприклад, у реалізації добору номенклатури до табличної частини документа у форму добору з клієнтського коду передається дата розрахунків для виведення цін і залишків на цю дату. Неправильно:

&НаКлієнті
Процедура ДобірТовари(Команда)
	ПараметриДобору = Новий Структура;
	ДатаРозрахунків = ?(ПочатокДня(Об’єкт.Дата) = ПочатокДня(ПоточнаДата()),
	Невизначено, Об’єкт.Дата); // виклик ПоточнаДата() на клієнті
	ПараметриДобору.Вставити("ДатаРозрахунків", ДатаРозрахунків);
	...
	ВідкритиФорму("Обробка.ПідбірНоменклатури.Форма.Форма", ПараметриДобору,
	ЦяФорма, УнікальнийІдентифікатор);

Правильно передавати на сервер дату документа, а обчислення дати розрахунків виконувати на сервері:

&НаКлієнті
Процедура ДобірТовари(Команда)
	ПараметриДобору = Новий Структура;
	ПараметриДобору.Вставити("ДатаРозрахунків", Об’єкт.Дата);
	...
	ВідкритиФорму("Обробка.ПідбірНоменклатури.Форма.Форма", ПараметриДобору,
	ЦяФорма, УнікальнийІдентифікатор);

Інший приклад. Під час добору документів для зарахування авансу у формі добору встановлюється відбір за умовою «дата документів авансу не більша за передану у форму». Неправильно:

&НаКлієнті
Процедура ЗарахуванняАвансівДокументАвансуПочатокВибору(Елемент, ДаніВибору, СтандартнаОбробка)
	СтандартнаОбробка = Хибність;
	ПараметриФорми = Новий Структура;
	ПараметриФорми.Вставити("КінецьПеріоду", 
	?(ЗначенняЗаповнено(Параметри.Ключ), Об’єкт.Дата - 1, КінецьДня(ПоточнаДата()))); // виклик ПоточнаДата() на клієнті
	...
	ВідкритиФорму("Документ.ДокументРозрахунківЗКонтрагентом.ФормаВибору", 
	ПараметриФорми, Елемент);
	...

Правильно обчислювати параметр КінецьПеріоду за датою документа:

&НаКлієнті
Процедура ЗарахуванняАвансівДокументАвансуПочатокВибору(Елемент, ДаніВибору,
	СтандартнаОбробка)
	СтандартнаОбробка = Хибність;
	ПараметриФорми = Новий Структура;
	ПараметриФорми.Вставити("КінецьПеріоду", ?(ЗначенняЗаповнено(Параметри.Ключ),
	Об’єкт.Дата - 1, КінецьДня(Об’єкт.Дата)));
	...
	ВідкритиФорму("Документ.ДокументРозрахунківЗКонтрагентом.ФормаВибору", ПараметриФорми, Елемент);

4. Винятки з правил 2 і 3 можливі в окремих, обґрунтованих випадках, коли потрібно використовувати дійсно поточний час серверного комп’ютера. Такі винятки мають бути обґрунтовані в тексті коментаря до виклику.

5. Слід уникати в коді однієї процедури (функції) багаторазового звернення до функції ПоточнаДатаСеансу (ПоточнаДата), оскільки значення, що повертаються, відрізнятимуться одне від одного.

Наприклад, неправильно:

ДатаОстанньогоСповіщення = ПоточнаДатаСеансу();
ДатаНаступногоСповіщення = РозрахуватиДату() + ПоточнаДатаСеансу();

правильно використовувати раніше розраховані дату й час:

ДатаОстанньогоСповіщення = ПоточнаДатаСеансу();
ДатаНаступногоСповіщення = РозрахуватиДату() + ДатаОстанньогоСповіщення;
Записатися телефоном