О времени и 1С







Основы и особенности работы со временем в 1С. Как избавиться от боли при работе в разных часовых поясах. Что такое момент времени. И другое.

Время бесценно

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

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

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

Статья может быть интересна:

  1. Начинающим разработчикам 1С.
  2. Любым разработчикам 1С, которые везде используют функцию "ТекущаяДата()".
  3. Кого интересует работа с разными часовыми поясами и функционал БСП работы со временем.
  4. Тем, кого интересует как будет работать кластер 1С, если сервера в разных часовых поясах (о ужас!).
  5. Кто хочет заглянуть как платформа 1С хранит дату и время в базе, как работает момент времени, какие проблемы могут быть.

Все нижесказанное актуально для версии платформы 8.3.13.1690. Вы все еще здесь? Тогда добро пожаловать в путешествие во времени (или по времени, или через….).

Основные основы основ

Язык программирования платформы 1С и синтаксис языка запросов имеют все необходимое для работы с датами и временем, чтобы решить большинство возникающих задач. Ниже приведен листинг кода встроенного языка, где мы применили все возможные операции с датами.

 

 Операции с датами из встроенного языка

Синтаксис языка запросов также позволяет выполнять некоторые манипуляции с датами на уроне СУБД. Конечно, количество доступных операций меньше, чем возможности самой СУБД (будь это SQL Server или PostgreSQL), но многие задачи все же позволяет решать.

 

 Операции с датами из языка запросов

Именно эти возможности мы, разработчики, чаще всего используем при работе со временем в алгоритмах, запросах и т.д. Казалось бы, что еще можно придумать?

 

 Может дальше будет интересней

Сквозь время и часовые пояса

На самом деле не все так просто! Если "копать" дальше, то первая тема, которая может усложнить жизнь разработчиков — это часовые пояса. Пока Вы работаете с файловой или клиент-серверной базой, в которой все пользователи находятся в одном часовом поясе, то проблем нет. Но как только бизнес вырос и стал распределенным между регионами в разных часовых поясах, вот тут то веселье и начинается!

Для начала рассмотрим какие инструменты предлагает платформа 1С для таких ситуаций.

 

 Что есть в платформе 1С для работы в разных часовых поясах

Отлично, у нас есть список часовых поясов и их локализованное представление. Но что с этим можно сделать?

Начнем с того, что у прикладных решений есть несколько стандартных настроек для часовых поясов:

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

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

 

 Параметры часового пояса базы и сеанса

Окей, мы знаем как смотреть и настраивать часовые пояса. Теперь рассмотрим основные функции для их использования при работе с датой и временем.

 

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

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

Однако, теперь Вы понимаете, к чему это может привести:

  • При изменении часового пояса в настройках сервера это повлияет на поведение функции "ТекущаяДата()", "ЧасовойПояс()" и др. А что если пояс поменяли ошибочно или база просто переехала в облако, но часовой пояс не должен был измениться?
  • При необходимости организовать работу в базе в разных часовых поясах потребуются дополнительные усилия по доработке конфигурации. Иногда значительные и с …. непредсказуемыми последствиями.

Часовые пояса могут использоваться и в других случаях, не только когда пользователи разделены географически:

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

В этих случаях в прикладном решении создаются настройки часовых поясов для объектов, а далее рассчитывается дСуть разницы часовых поясовата и время в зависимости от этих параметров. Подробнее на этом останавливаться не будем.

Как понять, есть ли необходимость разбивать работу сеансов на разные часовые пояса? Можно выделить две основные причины:

  1. В информационной базе ведется учет по нескольким обособленным управленческим единицам (организациям, филиалам), которые находятся в разных часовых поясах и ведут относительно обособленный учет. В этом случае использование часовых поясов избавит от множества проблем в учете, ведь то же закрытие месяца должно проходить с учетом локального времени.
  2. В базе ведется учет по одной организации, но с распределенными филиалами, складами и т.д. То есть организация одна, но ее подразделения могут быть в разных часовых поясах. Например:
    • Управленческий офис в Москве
    • Центральный склад в Тюмени
    • Производство в Новосибирске и Владивостоке

Для корректного учета Новосибирск и Владивосток работают по местному времени. Чтобы учет на центральном складе был корректным мы не можем использовать местное время производств, поэтому выходом будет использовать время управленческого офиса. Итого, будут использоваться три часовых пояса (Москва, Новосибирск, Владивосток).

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

Подробнее про работу в разных часовых поясах Вы можете прочитать в официальных источниках:

А теперь перейдем к небольшому примеру.

Очень простой пример

Рассмотрим простой пример, который можно встретить в реальном бизнесе. Компания работает по всей стране. Центральный офис и центральный склад находятся в Москве. Два дополнительных обособленных офиса открыты в Тюмени и Новосибирске. Информационная база одна для всех.

Пользователи из разных часовых поясовТак как учет в удаленных подразделениях обособленный, то работа там ведется по местному времени. Для этого сделаны следующие настройки:

  • Для информационной базы установлен часовой пояс "Europe/Moscow"
  • Для пользовательских сеансов в Новосибирске при запуске устанавливается часовой пояс "Asia/Novosibirsk"
  • Для сеансов из Тюмени при запуске устанавливается часовой пояс "Asia/Oral"

Сравним результаты вызова основных функций работы со временем на сервере.

Метод платформы (вызов на сервере) Пользователи в Москве Пользователи в Новосибирске Пользователи в Тюмени
ЧасовойПояс() Europe/Moscow Europe/Moscow Europe/Moscow
ПолучитьЧасовойПоясИнформационнойБазы() Europe/Moscow Europe/Moscow Europe/Moscow
ЧасовойПоясСеанса() Europe/Moscow Asia/Novosibirsk Asia/Oral
ТекущаяДата()  30.03.2025  23:01:01 30.03.2025  23:01:01 30.03.2025  23:01:01
ТекущаяДатаСеанса() 30.03.2025  23:01:01 31.03.2025 1:01:01 31.03.2025 3:01:01
ТекущаяУниверсальнаяДата() 30.03.2025 20:01:01 30.03.2025 20:01:01 30.03.2025 20:01:01
ТекущаяУниверсальнаяДатаВМиллисекундах() 63 689 572 861 383 63 689 572 861 383 63 689 572 861 383

 

Поскольку сервер один, то функции "ЧасовойПояс()" и "ТекущаяДата()" возвращают один и тот же результат для всех сеансов. Часовой пояс информационной базы тоже один для всех, ведь база то одна. Универсальная дата, в т.ч. и в миллисекундах, тоже одинаковое, т.к. время в UTC не может различаться. А вот часовые пояса сеансов и, что логично, текущие даты сеансов различаются. Все из-за того, что при запуске приложения в Тюмени и Новосибирске, пользователям программно устанавливаются часовые пояса, отличные от часового пояса информационной базы. Вот так наглядно можно проверить работу этого механизма.

Часовые пояса сеансов позволили организовать обособленный учет, при этом вся компания работает в единой информационной базе. Теперь Вы представляете для чего нужен часовой пояс информационной базы и часовые пояса сеансов. На простом примере мы рассмотрели работу с ними, а ранее пробежались практически по всем механизмам платформы для работы со временем. Теперь рассмотрим более сложный пример, а после перейдем к другим особенностям.

Нереальная инфраструктура

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

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

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

Метод платформы (вызов на сервере) Сервер №1 Сервер №2 Сервер №3
ЧасовойПояс() Europe/Moscow Asia/Oral America/New_York
ПолучитьЧасовойПоясИнформационнойБазы() Неопределено Неопределено Неопределено
ЧасовойПоясСеанса() Europe/Moscow Asia/Oral America/New_York
ТекущаяДата()  30.03.2025 23:01:05 31.03.2025 1:01:05 30.03.2025 16:01:05
ТекущаяДатаСеанса() 30.03.2025 23:01:06 31.03.2025 1:01:06 30.03.2025 16:01:06
ТекущаяУниверсальнаяДата() 30.03.2025 21:00:54 30.03.2025 21:00:54 30.03.2025 21:00:54
ТекущаяУниверсальнаяДатаВМиллисекундах() 63 689 576 454 039 63 689 576 454 039

63 689 576 454 039

 

Поскольку в кластере три сервера 1С, а часовой пояс информационной базы не настроен, то настройка часового пояса получается непосредственно с сервера. Но у нас их 3! И все они находятся в разных поясах. Допустим, сервер №1 — это центральный сервер кластера, а сервера №2 и №3 — это рабочие сервера. Кластер распределяет нагрузку и перенаправляет сеансы 1С то на 1, то на 2 сервер, а кому-то повезло и сеанс запустился на 3 сервере.

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

Если бы у нас был настроен хотя бы часовой пояс информационной базы, то таких проблем бы уже удалось избежать.

В мире БСП

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

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

ТекущаяДатаСеанса = ОбщегоНазначенияКлиент.ДатаСеанса();
ТекущаяДатаУниверсальная = ОбщегоНазначенияКлиент.ДатаУниверсальная();

Но как им удается получить эти значения без вызова сервера?

// Возвращает текущую дату, приведенную к часовому поясу сеанса.
//
// Функция возвращает время, близкое к результату функции ТекущаяДатаСеанса() в серверном контексте.
// Погрешность обусловлена временем выполнения серверного вызова.
// Предназначена для использования вместо функции ТекущаяДата().
//
Функция ДатаСеанса() Экспорт
Возврат ТекущаяДата() + СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПоправкаКВремениСеанса;
КонецФункции

// Возвращает универсальную дату сеанса, получаемую из текущей даты сеанса.
//
// Функция возвращает время, близкое к результату функции УниверсальноеВремя() в серверном контексте.
// Погрешность обусловлена временем выполнения серверного вызова.
// Предназначена для использования вместо функции УниверсальноеВремя().
//
Функция ДатаУниверсальная() Экспорт
ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента();
ДатаСеанса = ТекущаяДата() + ПараметрыРаботыКлиента.ПоправкаКВремениСеанса;
Возврат ДатаСеанса + ПараметрыРаботыКлиента.ПоправкаКУниверсальномуВремени;
КонецФункции

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

Что касается часовых поясов, то основной пояс информационной базы настраивается в панели администрирования. О работе с этим параметром из кода встроенного языка мы уже говорили ранее.

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

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

На стороне базы данных

В базе данных даты могут храниться в некотором измененном виде. Например, если Вы используйте SQL Server, то при стандартной настройке используется смещение в 2000 лет, которое позволяет обойти ограничение СУБД на минимальную дату 01.01.1753. Для платформы 1С это критично, т.к. не позволит сохранить пустую дату 01.01.0001 в базе. Вот так, например, выглядят даты в таблице.

Хранение даты в SQL ServerЕсли же речь идет о PostgreSQL, то смещение дат в этом случае использовать не обязательно, т.к. СУБД позволяет хранить дату 01.01.0001 без лишних телодвижений.

Хранение дат в PostgreSQLНастройка смещения дат задается при создании информационной базы и доступна только для SQL Server. 

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

Для хранения даты и времени в таблицах базы данных используется тип "datetime2(0)", который позволяет хранить большой диапазон дат, и при этом более высокую точность в долях секунд. Кстати, платформа 1С эту высокую точность не использует и всегда сохраняет значения с точностью до секунды, миллисекунды не используются! На первый взгляд в этом случае логичнее было бы использовать тип "datetime",  но на самом деле нет. По рекомендациям Microsoft тип "datetime2" является более предпочтительным из-за расширенных возможностей.

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

Скрытая особенность

В одной из прошлых статей "Баг или фича? Неожиданное поведение платформы" было описание интересной особенности при работе с датами в коде встроенного языка. Речь идет о недокументированной фиче (или баге, кто знает), заключающейся в поддержке миллисекунд в датах.

ДатаОбычная = Дата(2025,2,1);
ДатаСтранная = ДатаОбычная + 0.001;
СравнениеДат1 = ДатаСтранная = ДатаОбычная;
Сообщить("Вариант с датами 1: " + СравнениеДат1); // ЛОЖЬ - даты не равны

ДатаСтранная = ДатаСтранная - 0.001;
СравнениеДат2 = ДатаСтранная = ДатаОбычная;
Сообщить("Вариант с датами 2: " + СравнениеДат2); // ИСТИНА - даты равны

При этом в отладке даже сразу и не определить, что дата содержит миллисекунды. Но можно использовать такой способ.

ДатаОбычная = Дата(2025,2,1);
ДатаСтранная = ДатаОбычная + 0.068;
МиллисекундВДате = ДатаСтранная - ДатаОбычная;
Если ЗначениеЗаполнено(МиллисекундВДате) Тогда
Сообщить("В дате содержатся миллисекунды: " + МиллисекундВДате);
Иначе
Сообщить("Миллисекунд в дате нет!");
КонецЕсли;

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

Будьте бдительны! Миллисекунды ждут, когда Вы ими воспользуетесь!

Момент, пожалуйста!

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

Но и это еще не все! Есть также такая сущность как "Граница", которая позволяет хранить границы некоторого интервала значений. При этом также дает возможность указать признак включения / исключения граничного значения интервала.

Рассмотрим несколько примеров на некотором регистре накопления вида "Остатки", где применим возможные способы использования даты, момента времени и границы.

 

 Остатки на обычную дату

 

 Остатки на момент времени

 

 Остатки на границу с видом "Исключая"

 

 Остатки на границу с видом "Включая"

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

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

Порядок ссылок в базе может быть случайным, если:

  1. У вас используется УРБД, ведь ссылки в разных базах и на разных серверах, в разных часовых поясах могут генерироваться не так как Вы ожидаете. В итоге — документы в единой базе будут также иметь последовательность на временной оси, которая не совсем может подходить для решения учетных задач.
  2. Если это таблица, объединяющая несколько типов метаданных (журналы документов, последовательность и т.д.), ведь для разных типов идентификаторы объектов могут сильно отличаться.
  3. При использовании явной установки ссылки для объектов также не гарантируется последовательность генерации GUID’ов. Речь идет о таком методе явной установки ссылки.
ИдентификаторСсылка = Новый УникальныйИдентификатор;
НоваяСсылка = Документы.ПростойДокумент.ПолучитьСсылку(ИдентификаторСсылка);

НовыйОбъект = Документы.ПростойДокумент.СоздатьДокумент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);

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

Ранее на ИС уже поднимались темы, связанные с моментом времени. Вот ссылки:

Спасибо их авторам за хороший материал!

Бегите, глупцы!

В статье мы рассмотрели многие вопросы по работе с датой и временем в платформе 1С, начиная от основ и заканчивая тонкостями работы самой платформы с датами и временем, часовыми поясами и особенностями хранения даты в базе данных.

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

Если у Вас есть интересные кейсы по работе с часовыми поясами в платформе или по другим затронутым темам, то прошу в комментарии. Это очень интересное направление при разработке, жаль что не сильно востребованное.

Другие ссылки

60 Comments

  1. 3vs

    А если пользователь летает на МКС, или на Луне, к примеру, какой часовой пояс выставлять?

    Reply
  2. kuzyara
    При использовании явной установки ссылки для объектов также не гарантируется последовательность генерации GUID’ов. Речь идет о таком методе явной установки ссылки.

    Если быть точнее, то установка явно сгененированных гуидов _гарантирует_ случайную последовательность ссылок (в пределах секунды).

    Для Сч = 1 По 5 Цикл
    ИдентификаторСсылка = Новый УникальныйИдентификатор;
    НоваяСсылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(ИдентификаторСсылка);
    Сообщить(XMLСтрока(НоваяСсылка));
    КонецЦикла;
    // fb0bc5ff-ebea-417a-9aef-0142ed881c84
    // 575fee83-4c35-4e72-b5f3-7c5d4be8771c
    // 35315176-d1d2-46ea-8eaa-7312a41bee87
    // 7ffae9bb-9fbe-4f7e-99d3-1128e10c26d1
    // cae1078c-3714-4f00-b6ee-c6a66864100c
    

    Показать

    rfc4122, пункт 4.1.4:

    For UUID version 4, the timestamp is a randomly or pseudo-randomly

    generated 60-bit value, as described in Section 4.4.

    А статья хороша.

    Reply
  3. YPermitin

    (1) знатно посмеялся. 1С на МКС?)))

    Надо писать фоновое задание, которое будет менять часовой пояс сеанса в зависимости от геолокации!

    Reply
  4. YPermitin

    (2) спасибо!

    Все так. Наверное, в случае полного описания по уникальным идентификатор лучше обращаться к вашей публикации.

    https://infostart.ru/public/635159/

    Все доходчиво описано!

    Reply
  5. YPermitin

    (3) хотя фоновое не пойдет. Обработчиком ожидания! =D

    Reply
  6. CyberCerber

    (3) Ну а чего смеетесь, вот новость на днях была:

    https://infostart.ru/journal/news/mir-1s/firma-1s-predstavila-konfiguratsiyu-dlya-upravleniya-resursami-v-kosmose_1030907/

    Reply
  7. YPermitin

    (6) раз серьёзно, то надо UTC использовать 🙂

    Reply
  8. erutan

    (1) с Луной в «Артемиде» Энди Вейра решалось очень просто — кто колонию основал на луне, того и часовой пояс :3

    Reply
  9. Darklight

    (1)Будет время ЦУПа — причём, на МКС в Российском и Американском модулях будет своё время!

    Reply
  10. 3vs

    (7)Да, уж, 1С шутить не любит! 🙂

    Раз Дональд дал задачу американцам первыми во второй раз высадиться на Луне,

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

    выпустить продукт для Луны! 🙂

    Reply
  11. YPermitin

    (10) жжете товарищи! Огонь))))

    Reply
  12. Serj1C

    Я немного бегло пробежал статью, но не нашел про Линукс время (которое может использоваться на сайтах или ява скрипте)

    Это количество секунд прошедших с 1 января 1970 года

    Функция ВремяЛинукс(unixtime)

    Возврат Дата(1970, 1, 1, 0, 0, 0) + unixtime;

    КонецФункции

    Reply
  13. YPermitin

    (12) не знаю где в публикации об этом упомянуть, но интересно.

    Спасибо!

    Reply
  14. СергейК

    Подскажите, есть особенности установки времени база данных в случае РИБ?

    Reply
  15. ellavs

    Спасибо, интересно.

    Reply
  16. CheBurator

    Хорошо

    Reply
  17. t278

    Как быть с терминальными пользователями, работающие в 4-х часовых поясах?

    Reply
  18. YPermitin

    (14) действуют те же самые правила. Если узел базы принадлежит организации, которая ведет учет обособлено, то для узла используется местное время. Обычно оно совпадает с временем сервера, если это конечно не облака.

    В центральной базе ствится часовой пояс той организации, которая эти данные использует.

    Конечно, могут быть случаи и сложнее. Но Вы сами поймете, когда стандартная схема вас не устроит. 🙂

    Reply
  19. YPermitin

    (17) думаю, сначала нужно понять нужны ли им разные часовые пояса. Они ведут учет в одной организации или в обособленных?

    Если часовые пояса все же нужны, то можно модифицировать конфигурацию, устанавливая часовой пояс сеанса пользователям при запуске в коде. Тогда не важно будет какой часовой пояс у сервера 1С / сервера терминалов. Примеры в статье такие есть.

    Reply
  20. w.r.

    По поводу последней секунды — такая вакханалия только в виртулальной таблице остатков, а вот в таблице оборотов и остатков секунда не режется в отборе

    WHERE T3._Period >= @P1
    AND T3._Period <= @P2
    Reply
  21. bulpi

    1)

    из всех примеров выше только один вернет результат для текущего документа — это последний пример с границей вида «Включая»

    Вот этим утверждением автор что хотел сказать ?

    2)Как хорошо работать в стране, где всего 1 пояс 🙂

    Reply
  22. YPermitin

    (21) ничего плохого или хорошего не хотел сказать. Просто факт, само собой разумеющееся 🙂

    Счастливчики!:)

    Reply
  23. acanta

    (21) Нет.

    Reply
  24. bulpi

    (22)

    Что-то я туплю. Что значит «результат для текущего документа» ? А остальные не вернут для текущего документа? Это слишком расплывчатая и многозначная фраза. Имхо, результат такого запроса зависит от того , как построен документ. Что выбрано в конфигураторе в параметре «удаление движений». Что написано в модуле проведения до того (чистятся ли наборы записей, записываются ли они перед запросом).

    Reply
  25. YPermitin

    (24) ок.

    Reply
  26. pun4er

    Спасибо за интересный и развернутый материал, читать было достаточно интересно!

    Reply
  27. frkbvfnjh

    Спасибо за публикацию, подЪитожил знания.

    Reply
  28. philya

    А чем вас не устроило преобразование даты к строке в запросе в варианте

    ПРЕДСТАВЛЕНИЕ(ДАТАВРЕМЯ(2019, 4, 3, 12, 29, 30))?

    Reply
  29. YPermitin

    (28) честно сказать, никогда не пользовался. Если действительно работает, то позже добавлю в саму статью.

    Reply
  30. tanat74

    (17) Лично я — настроил проброс часового пояса в rdp. При создании критически важных документов устанавливаю дату сеанса, а сервер пишет «журналы» (например версии объектов) в едином часов поясе сервера. Проблемы возникают лишь при некорректной настройке часового пояса на компе клиента.

    Reply
  31. YPermitin

    (20) да, отсюда и вопрос. С остатками это все же фича, или баг 🙂

    Хоть с оборотами все логично работает.

    Reply
  32. YPermitin

    (30) то есть часовой пояс сеанса устанавливайте часовым поясом клиента?

    Если подробнее опишите как реализовали, то будет отлично. Интересуют подробности)

    Reply
  33. w.r.

    (31) как я понял из описания, которое даёт 1С https://its.1c.ru/db/metod8dev#content:2610:hdoc функция виртуальной таблицы остатков — сугубо прикладная и служит для получения остатков по документу, исключая момент времени самого документа. Для отчетов и другой аналитики нужно использовать таблицу остатков и оборотов

    Reply
  34. tanat74

    (32) 1с подтягивает сама часовой пояс системы (платформа 8.3.8.2137 толстый клиент).

    Проброс часового пояса в RDP разрешается через групповые политики — инструкцию находил в интернете.

    Какие ещё подробности интересуют?

    Reply
  35. YPermitin

    (34) спасибо.

    Теперь понял о чем речь.

    Reply
  36. YPermitin

    (28) добавил исправление в публикации. Еще раз спасибо!

    Reply
  37. cartograph

    Спасибо. Интересная статья.

    Reply
  38. YPermitin

    (37) спасибо на добром слове!

    Reply
  39. ids79

    Спасибо, Юрий.

    Интересная статья.

    Reply
  40. YPermitin

    (39) Вам спасибо!

    Reply
  41. СергейК

    (18) Т.е. в каждом узле время устанавливается автономно, как для отдельно БД. Никакой «передачи» настроек времени между узлами нет. Спасибо.

    Reply
  42. YPermitin

    (41) да, в абсолютном большинстве случае это так.

    Reply
  43. ghostaz

    Отличная статья, прям пособие по времени в 1с. Самое обидное, что не задумывался об этом, когда писал конфу с нуля.

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

    Особенность с миллисекундами уже документирована и тоже удивила.

    У нас в организации много споров возникало про период день и месяц. Нужно ли месяц переводить? А если перевели, а периодичность регистров день, то все равно теряем данные? А если отчет по взаиморасчетам, а часовые пояса переводятся, то взаиморасчеты могут зависеть от расположения.

    В общем не стоит забывать о времени.

    Reply
  44. YPermitin

    (43) Спасибо 🙂

    Время наше все!

    Reply
  45. Serj1C

    Еще раз прочитал статью. Некоторые вещи забываются.

    Раз уж подняли тему про гуиды, то рекомендую еще дополнить материал про «Как формируется GUID?» (https://infostart.ru/public/635159/)

    Reply
  46. YPermitin

    (45) время заставляет забывать 🙂

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

    Reply
  47. rujiy_kot

    У меня отображается первый комментарий датой: 01.04.19 09:15

    Это дата — ТекущаяДата() или ТекущаяДатаСеанса()?

    Если ТекущаяДата() — то на сервере или клиенте?

    Reply
  48. YPermitin

    (47) ммм…Вы думаете, что бэкенд Инфостарта сделан на платформе 1С?

    В любом случае, надо узнать у разработчиков что они используют для присвоения даты. 🙂

    Есть лишь предположение, что это время по Москве.

    Reply
  49. aleksdiez

    К «недокументированным особенностям» : попробуйте получить дату Дата(«15821005»)

    Reply
  50. Evil Beaver

    Шикарно!

    Reply
  51. YPermitin

    (49) интересно:)

    Reply
  52. regint

    Это выражение тоже будет работать

    Дата = Дата(«08.03.2019 14:30:15»); // 08.03.2019 14:30:15

    Reply
  53. skv_79

    Интересная статья, спасибо!

    Reply
  54. list770

    Подскажите, в каком месте в конфигурации лучше сделать установку часового пояса сеанса? заранее спасибо

    Reply
  55. 7OH

    Буду признателен за помощь в направлении решения задачи.

    Необходимо провести замер времени (логично в миллисекундах) перехода с клиента на сервер (или обратно).

    Вроде бы банально, но только до того момента, пока время синхронизировано.

    Если допустить отставание клиента от сервера — появляется вопрос — как ?

    Reply
  56. max_zhilin

    (55) Считайте разницу времени между клиентом и сервером путем тестовых быстрых вызовов

    Reply
  57. 7OH

    (56) вопрос принципиальный.

    По разнице одного из замеров можно работать — да, но показатели замеров будут не совсем те.

    У вас вызов в одно время может отличаться по времени от вызова через минуту.

    Если это тот же 2G интернет, то очень глобально.

    Ну а по сути 100% решения нету — платформа не предоставляет такого инструмента, кроме отладчика.

    Reply
  58. AgentNiCho

    Спасибо за статью. Время — основа основ. В статье описано то, что нужно знать и часто не доходят руки.

    Reply
  59. YPermitin

    (58) Вам спасибо за хороший отзыв!

    Рад стараться 🙂

    Reply
  60. CratosX

    (48) на форумах запоминание даты действия всегда должна быть в одном часовом поясе (поясе сервера или дефолт-сити), а отображаться — в часовом поясе клиента.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *