О времени и 1С

01.04.19

Разработка - Механизмы платформы 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.2019  23:01:01 30.03.2019  23:01:01 30.03.2019  23:01:01
ТекущаяДатаСеанса() 30.03.2019  23:01:01 31.03.2019 1:01:01 31.03.2019 3:01:01
ТекущаяУниверсальнаяДата() 30.03.2019 20:01:01 30.03.2019 20:01:01 30.03.2019 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.2019 23:01:05 31.03.2019 1:01:05 30.03.2019 16:01:05
ТекущаяДатаСеанса() 30.03.2019 23:01:06 31.03.2019 1:01:06 30.03.2019 16:01:06
ТекущаяУниверсальнаяДата() 30.03.2019 21:00:54 30.03.2019 21:00:54 30.03.2019 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С хранит дату и время на стороне базы данных и не испугаетесь, увидев четвертое тысячелетие в таблице.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Платформа даты время синхронизация клиент-сервер МоментВремени граница особенности миллисекунды

См. также

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

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

23.06.2024    7429    bayselonarrend    20    

154

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5939    dsdred    16    

80

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

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

24.01.2024    17656    YA_418728146    26    

71

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

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

11.12.2023    11220    dsdred    44    

130

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

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

06.10.2023    23753    SeiOkami    48    

135

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18824    human_new    27    

80

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

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

28.08.2023    14728    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. 3vs 01.04.19 09:15 Сейчас в теме
А если пользователь летает на МКС, или на Луне, к примеру, какой часовой пояс выставлять?
Lacoste4life; kaaasteeen; Terabaytus; zqzq; ls600; SagittariusA; Rabot; bulpi; CyberCerber; Ганс; YPermitin; +11 Ответить
3. пользователь 01.04.19 09:19
(1) знатно посмеялся. 1С на МКС?)))

Надо писать фоновое задание, которое будет менять часовой пояс сеанса в зависимости от геолокации!
Прикрепленные файлы:
begemot; SagittariusA; TeMochkiN; YoungHero; mark_oilbass; +5 Ответить
5. пользователь 01.04.19 09:23
(3) хотя фоновое не пойдет. Обработчиком ожидания! =D
6. CyberCerber 872 01.04.19 10:25 Сейчас в теме
(3) Ну а чего смеетесь, вот новость на днях была:
https://infostart.ru/journal/news/mir-1s/firma-1s-predstavila-konfiguratsiyu-dlya-upravleniya-resursami-v-kosmose_1030907/
Terabaytus; METAL; Gendelf; Алексей_mir2mb; ixijixi; wowik; for_sale; YPermitin; +8 Ответить
7. пользователь 01.04.19 10:30
(6) раз серьёзно, то надо UTC использовать :)
Алексей_mir2mb; +1 Ответить
10. 3vs 01.04.19 12:49 Сейчас в теме
(7)Да, уж, 1С шутить не любит! :-)
Раз Дональд дал задачу американцам первыми во второй раз высадиться на Луне,
чтобы следы первого посещения не затоптали, значит 1С надо подсуетиться и первым
выпустить продукт для Луны! :-)
Crazy_Max; SirYozha; tsmult; 2PRV; CyberCerber; wowik; mark_oilbass; YPermitin; +8 Ответить
11. пользователь 01.04.19 12:50
(10) жжете товарищи! Огонь))))
8. erutan 105 01.04.19 11:03 Сейчас в теме
(1) с Луной в "Артемиде" Энди Вейра решалось очень просто - кто колонию основал на луне, того и часовой пояс :3
bulpi; YPermitin; +2 Ответить
9. Darklight 33 01.04.19 12:15 Сейчас в теме
(1)Будет время ЦУПа - причём, на МКС в Российском и Американском модулях будет своё время!
Aggressorak; YPermitin; +2 Ответить
2. kuzyara 2090 01.04.19 09:17 Сейчас в теме
При использовании явной установки ссылки для объектов также не гарантируется последовательность генерации 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.


А статья хороша.
bigmak; YPermitin; +2 Ответить
4. пользователь 01.04.19 09:22
(2) спасибо!

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

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

Все доходчиво описано!
bigmak; Serj1C; +2 Ответить
12. Serj1C 483 01.04.19 13:15 Сейчас в теме
Я немного бегло пробежал статью, но не нашел про Линукс время (которое может использоваться на сайтах или ява скрипте)
Это количество секунд прошедших с 1 января 1970 года

Функция ВремяЛинукс(unixtime)
Возврат Дата(1970, 1, 1, 0, 0, 0) + unixtime;
КонецФункции
Crazy_Max; maXon777; SagittariusA; creatermc; YPermitin; +5 Ответить
13. пользователь 01.04.19 13:21
(12) не знаю где в публикации об этом упомянуть, но интересно.

Спасибо!
14. СергейК 51 01.04.19 20:14 Сейчас в теме
Подскажите, есть особенности установки времени база данных в случае РИБ?
bigmak; YPermitin; +2 Ответить
18. пользователь 02.04.19 06:50
(14) действуют те же самые правила. Если узел базы принадлежит организации, которая ведет учет обособлено, то для узла используется местное время. Обычно оно совпадает с временем сервера, если это конечно не облака.

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

Конечно, могут быть случаи и сложнее. Но Вы сами поймете, когда стандартная схема вас не устроит. :)
41. СергейК 51 08.04.19 20:26 Сейчас в теме
(18) Т.е. в каждом узле время устанавливается автономно, как для отдельно БД. Никакой "передачи" настроек времени между узлами нет. Спасибо.
YPermitin; +1 Ответить
42. пользователь 08.04.19 20:33
(41) да, в абсолютном большинстве случае это так.
15. ellavs 1052 01.04.19 20:44 Сейчас в теме
Спасибо, интересно.
YPermitin; +1 Ответить
16. CheBurator 2712 02.04.19 01:37 Сейчас в теме
17. t278 58 02.04.19 02:13 Сейчас в теме
Как быть с терминальными пользователями, работающие в 4-х часовых поясах?
YPermitin; +1 Ответить
19. пользователь 02.04.19 07:06
(17) думаю, сначала нужно понять нужны ли им разные часовые пояса. Они ведут учет в одной организации или в обособленных?

Если часовые пояса все же нужны, то можно модифицировать конфигурацию, устанавливая часовой пояс сеанса пользователям при запуске в коде. Тогда не важно будет какой часовой пояс у сервера 1С / сервера терминалов. Примеры в статье такие есть.
30. tanat74 68 03.04.19 19:37 Сейчас в теме
(17) Лично я - настроил проброс часового пояса в rdp. При создании критически важных документов устанавливаю дату сеанса, а сервер пишет «журналы» (например версии объектов) в едином часов поясе сервера. Проблемы возникают лишь при некорректной настройке часового пояса на компе клиента.
YPermitin; +1 Ответить
32. пользователь 03.04.19 20:32
(30) то есть часовой пояс сеанса устанавливайте часовым поясом клиента?

Если подробнее опишите как реализовали, то будет отлично. Интересуют подробности)
34. tanat74 68 04.04.19 06:47 Сейчас в теме
(32) 1с подтягивает сама часовой пояс системы (платформа 8.3.8.2137 толстый клиент).
Проброс часового пояса в RDP разрешается через групповые политики - инструкцию находил в интернете.
Какие ещё подробности интересуют?
acanta; YPermitin; +2 Ответить
35. пользователь 04.04.19 06:49
(34) спасибо.

Теперь понял о чем речь.
20. w.r. 650 02.04.19 11:46 Сейчас в теме
По поводу последней секунды - такая вакханалия только в виртулальной таблице остатков, а вот в таблице оборотов и остатков секунда не режется в отборе

WHERE T3._Period >= @P1 
         AND T3._Period <= @P2
Merkalov; YPermitin; +2 Ответить
31. пользователь 03.04.19 20:02
(20) да, отсюда и вопрос. С остатками это все же фича, или баг :)

Хоть с оборотами все логично работает.
33. w.r. 650 03.04.19 21:45 Сейчас в теме
(31) как я понял из описания, которое даёт 1С https://its.1c.ru/db/metod8dev#content:2610:hdoc функция виртуальной таблицы остатков - сугубо прикладная и служит для получения остатков по документу, исключая момент времени самого документа. Для отчетов и другой аналитики нужно использовать таблицу остатков и оборотов
21. bulpi 217 02.04.19 12:24 Сейчас в теме
1)
из всех примеров выше только один вернет результат для текущего документа - это последний пример с границей вида "Включая"


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

2)Как хорошо работать в стране, где всего 1 пояс :)
bigmak; YPermitin; +2 Ответить
22. пользователь 02.04.19 12:28
(21) ничего плохого или хорошего не хотел сказать. Просто факт, само собой разумеющееся :)

Счастливчики!:)
24. bulpi 217 02.04.19 15:33 Сейчас в теме
(22)
Что-то я туплю. Что значит "результат для текущего документа" ? А остальные не вернут для текущего документа? Это слишком расплывчатая и многозначная фраза. Имхо, результат такого запроса зависит от того , как построен документ. Что выбрано в конфигураторе в параметре "удаление движений". Что написано в модуле проведения до того (чистятся ли наборы записей, записываются ли они перед запросом).
25. пользователь 02.04.19 15:39
23. acanta 02.04.19 12:59 Сейчас в теме
26. pun4er 02.04.19 19:11 Сейчас в теме
Спасибо за интересный и развернутый материал, читать было достаточно интересно!
YPermitin; +1 Ответить
27. frkbvfnjh 805 03.04.19 08:34 Сейчас в теме
Спасибо за публикацию, подЪитожил знания.
YPermitin; +1 Ответить
28. philya 77 03.04.19 09:33 Сейчас в теме
А чем вас не устроило преобразование даты к строке в запросе в варианте

ПРЕДСТАВЛЕНИЕ(ДАТАВРЕМЯ(2019, 4, 3, 12, 29, 30))?
CratosX; acanta; YPermitin; +3 Ответить
29. пользователь 03.04.19 10:44
(28) честно сказать, никогда не пользовался. Если действительно работает, то позже добавлю в саму статью.
36. пользователь 06.04.19 10:30
(28) добавил исправление в публикации. Еще раз спасибо!
37. cartograph 06.04.19 19:58 Сейчас в теме
Спасибо. Интересная статья.
YPermitin; +1 Ответить
38. пользователь 06.04.19 20:29
(37) спасибо на добром слове!
39. ids79 8535 08.04.19 07:55 Сейчас в теме
Спасибо, Юрий.
Интересная статья.
YPermitin; +1 Ответить
40. пользователь 08.04.19 08:03
43. ghostaz 145 06.06.19 22:36 Сейчас в теме
Отличная статья, прям пособие по времени в 1с. Самое обидное, что не задумывался об этом, когда писал конфу с нуля.
Возможно стоит описать работу с летним временем, сейчас хоть и не актуально, но само явление делало жизнь программиста еще сложнее. Сейчас уже не помню, учитывала ли 1с летнее время в своих функциях. Может кто помнит?
Особенность с миллисекундами уже документирована и тоже удивила.
У нас в организации много споров возникало про период день и месяц. Нужно ли месяц переводить? А если перевели, а периодичность регистров день, то все равно теряем данные? А если отчет по взаиморасчетам, а часовые пояса переводятся, то взаиморасчеты могут зависеть от расположения.
В общем не стоит забывать о времени.
YPermitin; +1 Ответить
44. пользователь 06.06.19 23:03
(43) Спасибо :)

Время наше все!
45. Serj1C 483 09.07.19 09:04 Сейчас в теме
Еще раз прочитал статью. Некоторые вещи забываются.
Раз уж подняли тему про гуиды, то рекомендую еще дополнить материал про "Как формируется GUID?" (https://infostart.ru/public/635159/)
YPermitin; +1 Ответить
46. пользователь 09.07.19 09:15
(45) время заставляет забывать :)

Статья про гуиды отличная, я выше в комментариях уже добавлял на нее ссылку.
47. rujiy_kot 11 09.07.19 12:13 Сейчас в теме
У меня отображается первый комментарий датой: 01.04.19 09:15
Это дата - ТекущаяДата() или ТекущаяДатаСеанса()?
Если ТекущаяДата() - то на сервере или клиенте?
YPermitin; +1 Ответить
48. пользователь 09.07.19 20:23
(47) ммм...Вы думаете, что бэкенд Инфостарта сделан на платформе 1С?

В любом случае, надо узнать у разработчиков что они используют для присвоения даты. :)
Есть лишь предположение, что это время по Москве.
60. CratosX 114 28.11.19 19:29 Сейчас в теме
(48) на форумах запоминание даты действия всегда должна быть в одном часовом поясе (поясе сервера или дефолт-сити), а отображаться - в часовом поясе клиента.
49. aleksdiez 4 10.07.19 10:04 Сейчас в теме
К "недокументированным особенностям" : попробуйте получить дату Дата("15821005")
zqzq; CratosX; YPermitin; +3 Ответить
51. пользователь 10.07.19 18:17
50. Evil Beaver 8243 10.07.19 18:12 Сейчас в теме
52. regint 17.07.19 09:09 Сейчас в теме
Это выражение тоже будет работать
Дата = Дата("08.03.2019 14:30:15"); // 08.03.2019 14:30:15
SagittariusA; CratosX; YPermitin; +3 Ответить
53. skv_79 378 31.07.19 18:13 Сейчас в теме
Интересная статья, спасибо!
YPermitin; +1 Ответить
54. list770 06.09.19 09:35 Сейчас в теме
Подскажите, в каком месте в конфигурации лучше сделать установку часового пояса сеанса? заранее спасибо
55. 7OH 70 30.09.19 14:52 Сейчас в теме
Буду признателен за помощь в направлении решения задачи.
Необходимо провести замер времени (логично в миллисекундах) перехода с клиента на сервер (или обратно).
Вроде бы банально, но только до того момента, пока время синхронизировано.
Если допустить отставание клиента от сервера - появляется вопрос - как ?
56. max_zhilin 08.10.19 14:31 Сейчас в теме
(55) Считайте разницу времени между клиентом и сервером путем тестовых быстрых вызовов
57. 7OH 70 08.10.19 16:53 Сейчас в теме
(56) вопрос принципиальный.
По разнице одного из замеров можно работать - да, но показатели замеров будут не совсем те.
У вас вызов в одно время может отличаться по времени от вызова через минуту.
Если это тот же 2G интернет, то очень глобально.
Ну а по сути 100% решения нету - платформа не предоставляет такого инструмента, кроме отладчика.
58. AgentNiCho 15.10.19 15:48 Сейчас в теме
Спасибо за статью. Время - основа основ. В статье описано то, что нужно знать и часто не доходят руки.
YPermitin; +1 Ответить
59. пользователь 15.10.19 15:49
(58) Вам спасибо за хороший отзыв!

Рад стараться :)
61. Nuki4 17.09.20 17:23 Сейчас в теме
Спасибо, отличная статья.
62. SagittariusA 12.03.21 16:21 Сейчас в теме
Юрий, спасибо! Прекрасная статья.
63. Yashazz 4790 20.05.21 14:17 Сейчас в теме
Блестяще. Очень сильная, точная, полная и грамотная статья. Спасибо!
64. AnryMc 848 05.10.21 13:38 Сейчас в теме
В 2013 году в регламентированных отчетах "споткнулся" с определением даты аналогичного периода предыдущего года (если год ВИСОКОСНЫЙ)...
Особенности ВИСОКОСНОГО года в СТАНДАРТНЫХ ОТЧЕТАХ

Особенность кода для февраля
ДобавитьМесяц(ДатаОкончанияТекущегоПериода, -12);

Если текущий год високосный - возвращает Максимум, т.е. 28. Всё Ок!
Если предыдущий год високосный - возвращает как и положено 28, и если надо конец месяца - получаем ошибку...
65. sinichenko_alex 211 28.10.21 11:53 Сейчас в теме
Добрый день Юрий!
Думаю можно добавить к этой статье еще одну замечательную функцию платформы
СмещениеСтандартногоВремени() которая возвращает смещение в секундах стандартного времени заданного часового пояса относительно универсального времени без учета летнего времени для заданного универсального времени.
66. Vlad_2008 16 28.11.21 07:21 Сейчас в теме
Добрый.

Наткнулся на проблему с датой в журнале регистрации и как быть пока не знаю.

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

- журнал регистрации

1) 26.11.2021 12:32:19 - изменение цены (регистр сведений)
2) 26.11.2021 12:50:52 - изменение объекта

- мой лог (порядок появления записи + ВерсияДанных

1) 26.11.2021 12:50:52 - объект AAAAAAAAAAU= (старое) - AAAAAAAAAAY= (новое)
2) 26.11.2021 12:32:19 - регистр AAAAAAAAAAY= (версия на момент записи регистра)

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

Настроек часовых поясов не делалось (один офис, одна база, база серверная) , использую ТекущаяДата() на сервере.

Вопрос: какое же время попадает в журнал регистрации и из-за чего оно идет в обратном порядке ?? Что делать ??

События делались разными пользователями с разных локальных машин с подключением на сервер по RDP.

Help ))))
67. Vlad_2008 16 28.11.21 08:11 Сейчас в теме
(66) Ложная тревога, разобрался.

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

Опс )))
68. oldy 3 16.02.22 11:38 Сейчас в теме
Я отправляю запросы на сторонний веб-сервис, снабжая каждый запрос целочисленным параметром nonce, который по требованиям сервиса для каждого следующего запроса должен быть больше, чем для предыдущего, в противном случае веб-сервис вернет ошибку. В качестве значения этого параметра передаю результат функции ТекущаяУниверсальнаяДатаВМиллисекундах(). Мой 1С-код выполняется в фоновом задании. У меня кластер из двух серверов. Вопрос такой - если часы на серверах кластера идут немного несинхронно, возможно ли получить ошибку от веб-сервиса, если два последовательных запроса выполнялись на разных серверах кластера? Или, по-другому, с какого компьютера берет время функция ТекущаяУниверсальнаяДатаВМиллисекундах() при вызове ее из фонового задания? С того сервера, на котором выполняется фоновое задание или с центрального сервера?
69. AlexO 135 03.03.22 21:10 Сейчас в теме
(68) 1С не "берет время с сервера", а пользуется стандартным time операционной системы для получения времени, а потом, в зависимости от генератора сигналов процессора, - рассчитывает "ТекущаяУниверсальнаяДатаВМиллисекундах()".
Тут где-то уже ставили эксперимент, и выяснили, что погрешность - где-то до 0,07 сек.
В общем, в случае 1С речь вообще не идет про "с какого компьютера берет время функция ТекущаяУниверсальнаяДатаВМиллисекундах()", и вы вполне можете получить конфликт либо запрос из будущего (по миллисекундам), к тому же у вас еще и рассинхронизация на серверах кластера 1С.
Возникает вопрос - а как вообще у вас сама 1С работает стабильно в условиях рассинхронизации времени на внутренних серверах кластера?!
70. oldy 3 08.04.22 11:57 Сейчас в теме
(69) Наверное, я плохо сформулировал вопрос. "Немного несинхронно" - это значит, что время серверов кластера синхронизируется со временем контроллера домена с точностью до секунды.
Когда кластере был один сервер, проблем с тем, что функция ТекущаяУниверсальнаяДатаВМиллисекундах() может возвращать невозрастающие значения, не было. Либо этот эффект не проявлялся (запросы к сервису были реже, чем величина погрешности), либо функция таки возвращает возрастающую величину

>а потом, в зависимости от генератора сигналов процессора, - рассчитывает "ТекущаяУниверсальнаяДатаВМиллисекундах()"

Получается, мой вопрос о том, где именно происходит такой расчет - на том сервере, где выполняется код или, допустим, на центральном сервере кластера? Т.е., эта величина имеет абсолютный смысл, или только в пределах одного серверного вызова?
71. Crazy_Max 83 20.05.22 08:07 Сейчас в теме
Статья написана старательно и с любовью. Однако, я лишний раз убедился, что в большинстве моих разработок нужна именно "ТекущаяДата()", хотя пользователи работают по всей стране.
Одно меня расстраивает: почему распространилось мнение, то использование "ТекущаяДата()" стало нерекомендованным? Если мне нужна опорная дата для сквозного использования во всех механизмах, то именно эта дата мне и нужна, а ни в коем случае не "ТекущаяДатаСеанса()".
Получается, что вместо того, чтобы сказать нашим горе-программистам "Подумайте о часовых поясах", говорят "используйте "ТекущаяДатаСеанса() вместо ТекущаяДата()", а потом эти горе-программисты напарываются на то, что у каждого сеанса свой часовой пояс, в зависимости от настроек компьютера-клиента, и всё летит в ад.
72. пользователь 20.05.22 08:11
(71) статье уже столько лет, а комментарии сюда до сих пор пишутся))))

Думается мне, что Вы увидели, что хотели и ничего больше.
Пожалуйста, вдумчиво прочитайте документацию. И не приводите в абсолют:

>> опорная дата для сквозного использования во всех механизмах, то именно эта дата мне и нужна, а ни в коем случае не "ТекущаяДатаСеанса()"

После изучения документации все встанет на свои места.

P.S. Ни в коем случае не хочу создать дискуссию и дальнейшее обсуждение.
Просто рекомендую прочитать документацию по этому поводу.
73. Ndochp 103 16.08.22 16:54 Сейчас в теме
(71) Потому, что это мнение распространяет фирма 1С
https://its.1c.ru/db/v8std#content:643:hdoc:_top:%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B0%D1%8F%D0%B4%D0%B0%D1%82­%D0%B0()
п.2

Про горе программистов - пункт 2.2
76. Ranetka 23 04.10.24 17:23 Сейчас в теме
(71) Вы правы в ситуации, если люди сидят в разных часовых поясах, но по сути работают с одними и теми же общими данными. Например, есть один склад в Москве, а менеджеры в разных городах выдают задания на отгрузку с него. Тогда, при условии, что на сервере время московское, то можно использовать ТекущаяДата() (вызов на сервере!). А если у них только сервер общий находится в Москве, а работают они со своими данными, например, ведут учет своих обособленных подразделений, то им нужно местное время - ТекущаяДатаСеанса().
(ТекущаяДата() на клиенте не используется, т.к. в общем случае вернет "неизвестно точно, что")

Надо учесть, что если сервер перенесли / разделили / поменяли на нем время, то и ваша ТекущаяДата() внезапно начнет возвращать что-то другое, чем раньше, произойдет сдвиг в вашей временной последовательности. А если вы использовали ТекущуюДатуСеанса(), то временная последовательность не нарушится, т.к. система просто будет брать другую "поправку ко времени сеанса" после изменении серверного времени.

Надеюсь, автор статьи поправит, если что-то не так.
74. VZhulanov 5 04.12.23 20:14 Сейчас в теме
а если пользователю в Москве надо будет поработать с документом, который создал пользователь в Новосибирске, то он будет какую дату документа видеть?

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

в Новосибирске создан документ в 10:00 (10 утра), в Москве в это время 6 утра
в Новосибирске этот документ поменяли в 11:00, в Москве 7 утра
Москвич пришел на работу и решил в 10:30 по Москве подкорректировать документ, в Новосибе уже 14:30

какое время в итоге будет указано в документе и в истории изменений
кто какие даты будет видеть в документе и в истории изменений документа?

в идеале
Новосибирец должен видеть дату 14:30 и в истории изменений даты: 10:00, 11:00, 14:30
Москвич должен видеть дату 10:30 и в истории изменений даты: 06:00, 07:00, 10:30

как этого добиться или 1ска сама будет данные к часовому времени сеанса преобразовывать при показе, а в базе все данные будут храниться в часовом поясе сервера ?
75. nvv1970 27.03.24 00:43 Сейчас в теме
Дополню, что проблема производительности при получении остатков на момент времени исправлена и отныне не актуальна. Из SQL запроса исключен OR.
Оставьте свое сообщение