Получает текущую дату сервера, приведенную к часовому поясу сеанса. При вычислении даты используется один из заданных часовых поясов в порядке: часовой пояс сеанса, часовой пояс информационной базы, часовой пояс сервера.
Синтаксис
ТекущаяДатаСеанса()Полное описание, параметры и ограничения
Глобальный контекст.ТекущаяДатаСеанса (Global context.CurrentSessionDate)
Глобальный контекст (Global context)
ТекущаяДатаСеанса (CurrentSessionDate)
Доступен, начиная с версии 8.2.
Синтаксис:
ТекущаяДатаСеанса()
Возвращаемое значение:
Тип: Дата.
Описание:
Получает текущую дату сервера, приведенную к часовому поясу сеанса.
При вычислении даты используется один из заданных часовых поясов в порядке:
часовой пояс сеанса, часовой пояс информационной базы, часовой пояс сервера.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
См. также:
Глобальный контекст, метод ЧасовойПоясСеанса
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Настроить свой неактивный сервис и проверить возврат после кэша
Полная обычная форма показывает разницу между настройками в памяти, их записью и последующим чтением. Четыре действия сохраняют только заранее заданные учебные строки, проверяют их и возвращают пустую подготовку; черновик сообщения никуда не отправляется.
Где и как запускать
Полный модуль обычной формы Пульт обработки УчебныеНастройки85 своего стенда УчебныеНастройкиОбмена85. Только толстый клиент. Переменные формы и все помощники включены. Не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу 8.5.1.1343: имя конфигурации УчебныеНастройкиОбмена85, совместимость НеИспользовать, обычное приложение и толстый клиент. Не копию рабочей базы. Никаких разделителей, общих реквизитов, расширений, подписок и сторонних заданий. Здесь база и код не запускались: runtimeVerifiedScenarios=0.
Общие → Сервисы интеграции: только один собственный УчебныйОбмен85, синоним Учебный обмен, комментарий guide-owned-settings-85, без каналов и кода модуля. Адрес и учётные данные в Конфигураторе оставьте пустыми. Активность в Предприятии никогда НЕ включайте. Отсутствие каналов относится только к этому уроку настроек, не к рабочему обмену.
В своём стенде вручную создайте роль УчебныйАдминистратор85 с правами Администрирование и Администрирование данных и доступом к своей обработке. Создайте пользователя УчебныйАдминистратор85 с этой ролью и входите только им. Эти административные права — для собственного изолированного стенда, не рекомендация прав рабочему обработчику сообщений.
Создайте обработку УчебныеНастройки85, обычную основную форму Пульт. В её модуль вставьте полный основной код ниже целиком, на верхнем уровне. Общий модуль НЕ нужен: переменные Фаза и МоментЗаписи являются состоянием этой формы.
На форме четыре кнопки: Записать учебные настройки → действие ЗаписатьНажатие; Проверить и создать черновик → ПроверитьНажатие; Вернуть пустую подготовку → ВернутьНажатие; Проверить возврат → ПроверитьВозвратНажатие. Имена действий должны точно совпадать с процедурами. В коде нет иных обязательных обработчиков событий.
Выполните F7 и обновите только собственную новую конфигурацию. Будущий опыт пишет четыре настройки и значение активности Ложь в системные данные этого стенда. Он НЕ беззаписный; рабочие данные и реальные сервисы запрещены. Мы здесь никаких записей не выполняли.
Порядок будущего ручного опыта: Записать → самостоятельно подождать не меньше 21 секунды → Проверить → Вернуть → снова подождать не меньше 21 секунды → Проверить возврат. Форма не блокирует интерфейс ожиданием, не спит и не использует фоновых заданий.
Не закрывайте форму и не меняйте настройки другим сеансом до завершения. Если форма закрылась после записи, откройте Пульт заново и используйте Вернуть: это отдельная аварийная возможность ТОЛЬКО для тех же заранее заданных учебных значений/пустых строк. При неизвестных значениях код откажется их затирать. Затем дождитесь 21 секунды и проверьте возврат.
guide-user-85 и not-a-secret-85 — вымышленные учётные данные, никуда не отправляются. Учебный адрес http://127.0.0.1:9/guide-settings-85 намеренно не обслуживается. Нельзя подставлять реальные адреса или пароли. Сервис остаётся неактивным, отправка сообщений и подключение каналов отсутствуют.
Перем Фаза;
Перем МоментЗаписи;
Процедура ЗаписатьНажатие(Кнопка)
ПроверитьСвойКонтекст();
ПроверитьСвойНеактивныйСервис();
Если Фаза <> Неопределено И Фаза <> "ВозвратПроверен" Тогда
ВызватьИсключение "Завершите прежний опыт кнопками Вернуть и Проверить возврат";
КонецЕсли;
Настройки = СервисыИнтеграции.УчебныйОбмен85.ПолучитьНастройки();
Если Не НастройкиПусты(Настройки) Тогда
ВызватьИсключение "Начальный опыт требует четыре пустые настройки; чужие значения не перезаписываются";
КонецЕсли;
Настройки.АдресВнешнегоСервисаИнтеграции = "http://127.0.0.1:9/guide-settings-85";
Настройки.ИмяПользователя = "УчебныйАдминистратор85";
Настройки.ИмяПользователяВнешнегоСервисаИнтеграции = "guide-user-85";
Настройки.ПарольПользователяВнешнегоСервисаИнтеграции = "not-a-secret-85";
Фаза = "ОжидаетПроверки";
МоментЗаписи = ТекущаяДатаСеанса();
СервисыИнтеграции.УчебныйОбмен85.УстановитьАктивность(Ложь);
СервисыИнтеграции.УчебныйОбмен85.УстановитьНастройки(Настройки);
Сообщить("Учебные настройки записаны, активность только Ложь. Подождите 21 секунду и нажмите Проверить. Пароль не выводится.");
КонецПроцедуры
Процедура ПроверитьНажатие(Кнопка)
ПроверитьСвойКонтекст();
Если Фаза <> "ОжидаетПроверки" Тогда
ВызватьИсключение "Сначала выполните запись учебных настроек";
КонецЕсли;
ПроверитьИстечениеКэша();
ПроверитьСвойНеактивныйСервис();
Настройки = СервисыИнтеграции.УчебныйОбмен85.ПолучитьНастройки();
Если Не НастройкиУчебные(Настройки) Тогда
ВызватьИсключение "Четыре настройки не совпали с опытом; используйте Вернуть, неизвестные значения не затираются";
КонецЕсли;
Срок = ТекущаяДатаСеанса() + 86400;
Черновик = СервисыИнтеграции.УчебныйОбмен85.СоздатьСообщение(Срок);
Если ТипЗнч(Черновик) <> Тип("СообщениеСервисаИнтеграции") Или Черновик.ДатаУстаревания <> Срок Тогда
ВызватьИсключение "Фабрика не вернула сообщение с заданным сроком";
КонецЕсли;
ПараметрыЧерновика = Новый Соответствие;
КлючОпыта = Строка(Новый УникальныйИдентификатор);
ПараметрыЧерновика.Вставить("study-id", КлючОпыта);
ПараметрыЧерновика.Вставить("quantity", "3");
Черновик.Параметры = ПараметрыЧерновика;
Если Черновик.Параметры.Получить("study-id") <> КлючОпыта Или Черновик.Параметры.Получить("quantity") <> "3" Тогда
ВызватьИсключение "Не совпали строковые параметры своего черновика";
КонецЕсли;
Фаза = "НастройкиПроверены";
Сообщить("Четыре настройки совпали после ожидания; сервис неактивен. Создан только черновик со строковыми параметрами, без отправки.");
Сообщить("Теперь нажмите Вернуть пустую подготовку. Пароль и объект настроек не выводятся.");
КонецПроцедуры
Процедура ВернутьНажатие(Кнопка)
ПроверитьСвойКонтекст();
ПроверитьСвойНеактивныйСервис();
Настройки = СервисыИнтеграции.УчебныйОбмен85.ПолучитьНастройки();
Если Не НастройкиТолькоСвои(Настройки) Тогда
ВызватьИсключение "Есть неизвестные настройки: автоматический возврат запрещен";
КонецЕсли;
Настройки.АдресВнешнегоСервисаИнтеграции = "";
Настройки.ИмяПользователя = "";
Настройки.ИмяПользователяВнешнегоСервисаИнтеграции = "";
Настройки.ПарольПользователяВнешнегоСервисаИнтеграции = "";
Фаза = "ОжидаетВозврата";
МоментЗаписи = ТекущаяДатаСеанса();
СервисыИнтеграции.УчебныйОбмен85.УстановитьАктивность(Ложь);
СервисыИнтеграции.УчебныйОбмен85.УстановитьНастройки(Настройки);
Сообщить("Записана пустая учебная подготовка. Подождите 21 секунду и нажмите Проверить возврат.");
КонецПроцедуры
Процедура ПроверитьВозвратНажатие(Кнопка)
ПроверитьСвойКонтекст();
Если Фаза <> "ОжидаетВозврата" Тогда
ВызватьИсключение "Сначала нажмите Вернуть пустую подготовку";
КонецЕсли;
ПроверитьИстечениеКэша();
ПроверитьСвойНеактивныйСервис();
Настройки = СервисыИнтеграции.УчебныйОбмен85.ПолучитьНастройки();
Если Не НастройкиПусты(Настройки) Тогда
ВызватьИсключение "Пустая подготовка не подтверждена; опыт не завершен";
КонецЕсли;
Фаза = "ВозвратПроверен";
Сообщить("Четыре строки пусты, сервис неактивен. Это возврат учебных значений, не удаление записей системных настроек.");
КонецПроцедуры
Процедура ПроверитьИстечениеКэша()
Если МоментЗаписи = Неопределено Или ТекущаяДатаСеанса() - МоментЗаписи < 21 Тогда
ВызватьИсключение "Подождите не меньше 21 секунды после записи; мгновенное чтение не проверяет обновление кэша";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойНеактивныйСервис()
Если Метаданные.СервисыИнтеграции.Количество() <> 1 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда
ВызватьИсключение "Нужен единственный собственный сервис без разделителей и общих реквизитов";
КонецЕсли;
МДСервиса = Метаданные.СервисыИнтеграции.Найти("УчебныйОбмен85");
Если МДСервиса = Неопределено Тогда
ВызватьИсключение "Не найден собственный сервис";
КонецЕсли;
Если МДСервиса.Каналы.Количество() <> 0 Или Не ПустаяСтрока(МДСервиса.АдресВнешнегоСервисаИнтеграции)
Или МДСервиса.ПринадлежностьОбъекта <> Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный
Или МДСервиса.РасширениеКонфигурации() <> Неопределено Или МДСервиса.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Подготовка требует свой сервис без каналов, адреса и расширений";
КонецЕсли;
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователь.Имя <> "УчебныйАдминистратор85" Тогда
ВызватьИсключение "Войдите собственным учебным администратором";
КонецЕсли;
Если СервисыИнтеграции.УчебныйОбмен85.ПолучитьАктивность() Тогда
ВызватьИсключение "Сервис стал активным: не продолжайте этот опыт и не меняйте чужую активность";
КонецЕсли;
КонецПроцедуры
Функция НастройкиПусты(Настройки)
Возврат Настройки.АдресВнешнегоСервисаИнтеграции = ""
И Настройки.ИмяПользователя = ""
И Настройки.ИмяПользователяВнешнегоСервисаИнтеграции = ""
И Настройки.ПарольПользователяВнешнегоСервисаИнтеграции = "";
КонецФункции
Функция НастройкиУчебные(Настройки)
Возврат Настройки.АдресВнешнегоСервисаИнтеграции = "http://127.0.0.1:9/guide-settings-85"
И Настройки.ИмяПользователя = "УчебныйАдминистратор85"
И Настройки.ИмяПользователяВнешнегоСервисаИнтеграции = "guide-user-85"
И Настройки.ПарольПользователяВнешнегоСервисаИнтеграции = "not-a-secret-85";
КонецФункции
Функция НастройкиТолькоСвои(Настройки)
Возврат (Настройки.АдресВнешнегоСервисаИнтеграции = "" Или Настройки.АдресВнешнегоСервисаИнтеграции = "http://127.0.0.1:9/guide-settings-85")
И (Настройки.ИмяПользователя = "" Или Настройки.ИмяПользователя = "УчебныйАдминистратор85")
И (Настройки.ИмяПользователяВнешнегоСервисаИнтеграции = "" Или Настройки.ИмяПользователяВнешнегоСервисаИнтеграции = "guide-user-85")
И (Настройки.ПарольПользователяВнешнегоСервисаИнтеграции = "" Или Настройки.ПарольПользователяВнешнегоСервисаИнтеграции = "not-a-secret-85");
КонецФункции
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеНастройкиОбмена85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Состояние Фаза и МоментЗаписи хранится в своей форме, не в общем модуле и не в базе. Четыре кнопки разделяют запись и проверки, чтобы не блокировать интерфейс ожиданием.
ПроверитьСвойКонтекст требует свой стенд. Дополнительно проверяются один собственный сервис, отсутствие каналов/общих реквизитов, пустой адрес определения, отсутствие расширений и имя своего пользователя.
ПолучитьАктивность возвращает Булево; до записи и проверки требуется Ложь. Служебные права различаются у чтения активности, установки активности и установки настроек, поэтому подготовка явно даёт своему пользователю оба административных права.
ПолучитьНастройки возвращает НастройкиСервисаИнтеграции; при отсутствии настройки в Предприятии — новый объект. Документированного конструктора Новый НастройкиСервисаИнтеграции нет, урок его не выдумывает.
Начать можно только с четырёх пустых строк. Полученный объект меняется в памяти; четыре присваивания сами по себе не означают запись. УстановитьНастройки сохраняет этот объект в системных данных информационной базы без разделителей.
УстановитьАктивность вызывается только с Ложь, никогда с Истина. Ложь не является удалением сохранённой записи активности. Урок не включает отправку и не подключает каналы; сервис вообще не имеет каналов.
После записи время сохраняется в форме. Следующую проверку разрешаем не раньше 21 секунды: справка задаёт кэш 20 секунд и уведомление заданий о перезапуске, не гарантирует мгновенную видимость другим сеансом.
После ожидания читаем настройки заново и сравниваем все четыре значения, включая учебный пароль без вывода. Изменения другого сеанса и ошибки чтения не поглощаются и не объявляются успехом.
СоздатьСообщение получает явный срок ТекущаяДатаСеанса()+86400. ДатаУстаревания проверяется как readonly-результат фабрики; ей ничего не присваивается. Это срок в часовом поясе сеанса с преобразованием платформой в UTC, не ручная строка UTC.
Параметры черновика — Соответствие, где и ключи, и значения Строка. quantity поэтому содержит "3", не число 3. Собственный UUID превращается в строковый ключ опыта; проверяется его точное сохранение. ОтправитьСообщение отсутствует.
Вернуть доступна и после повторного открытия формы. Каждое текущее поле должно быть пустым либо равным именно нашему заранее заданному учебному значению; неизвестный адрес, имя или пароль запрещают автоматическое затирание.
Возврат записывает четыре пустые строки и Ложь. Через второе ожидание проверяется чтение четырёх пустых строк. Это возврат исходной учебной подготовки, не восстановление произвольных чужих настроек и не удаление служебных записей базы.
Как проверить результат
Будущий ручной тест: F7, вход своим УчебныйАдминистратор85, Записать, ожидание 21 секунды, Проверить, Вернуть, второе ожидание, Проверить возврат. Каждый успешный этап сообщает только статус, не объект настроек и не пароль. runtimeVerifiedScenarios=0.
Нажмите Проверить сразу после записи: должна возникнуть просьба подождать, а не заявление, что значение уже видно всем заданиям. После ожидания сравнение выполняется заново.
Попробуйте начать с непустыми настройками своего стенда: должна быть ошибка без перезаписи. Если это наши известные учебные значения после прерванного опыта, используйте Вернуть и дождитесь подтверждения.
Только в своём стенде измените одно поле на неизвестную тестовую строку: Вернуть должна отказать, не затирать её. Возвращайте подготовку самостоятельно через администратора своего стенда; урок не является универсальной утилитой отката.
Закройте форму после записи только для отдельного будущего негативного опыта. В новой форме Вернуть разрешена для наших известных строк и работает без утраченного состояния; затем второе ожидание и Проверить возврат.
Черновик содержит study-id как строку UUID и quantity как строку 3; его срок задан фабрикой. Никакая доставка, ответ, дата отправки или обработка получателем не проверяются.
После возврата четыре значения пусты, активность Ложь. Служебные записи настройки могут оставаться в базе: код не обещает полное отсутствие следов записи.
Ожидаемый результат
Будущий опыт подтверждает запись и чтение четырёх заранее заданных строк после окна кэша и возврат пустой учебной подготовки. В памяти создаётся неотправленный черновик. Здесь форма и 1С не выполнялись.
На что обратить внимание
Пустая строка означает «не установлено», поэтому наследуется значение Конфигуратора. Она не очищает заданный там адрес или пароль. В этом стенде исходные значения определения намеренно пусты.
ИмяПользователя задаёт пользователя 1С для обработки полученных сообщений; ИмяПользователяВнешнегоСервисаИнтеграции — внешнюю учётную запись. Это разные назначения, не два названия одного логина.
Без ИмяПользователя обработка использует ОсновныеРоли; если они пусты, справка допускает выполнение без ограничения прав. Не переносите пустую настройку пользователя и административные права этого изолированного опыта в production.
Кэш активности и настроек действует 20 секунд. ПолучитьАктивность не доказывает, что сервис никогда не активировали в прошлом. Такой новый стенд и отсутствие конкурентных изменений — обязательная подготовка.
Ожидание измеряется датой сеанса, не монотонным таймером: во время опыта нельзя менять часы. Код не доказывает одновременную синхронизацию всех сеансов или фоновых заданий.
Настройки сохраняются в базе; это не беззаписный getter-пример. При исключении опыт не завершён: используйте собственную кнопку возврата, проверьте права и окончательное чтение. Рабочая база запрещена.
Проверка известных строк защищает лишь от случайного выбора чужих настроек; одинаковый адрес или пароль не доказывает право менять произвольную информационную базу. Нужен именно новый собственный стенд.
ДатаУстаревания создаваемого сообщения задаётся фабрикой. Параметры отправляемого черновика допускают строки; изменять параметры уже полученного сообщения нельзя.
Учебный пароль не является секретом, но в рабочем коде пароль нельзя печатать, писать в журнал или публиковать вместе с диагностикой. Урок не проверяет внешнюю аутентификацию.
Статическая сверка методов и HTML не компилируют форму и не запускают её: перед будущим ручным опытом нужен F7 в этом собственном стенде. Сервер обмена отсутствует и не требуется.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Не перепутать миллисекунды 1С с timestamp внешнего API
Восстанавливаем UTC из счётчика 1С и сравниваем его с текущей датой UTC. Отдельно показываем дату сеанса, чтобы не выдавать её за универсальный момент.
Где и как запускать
Полный серверный общий модуль учебной копии. Только чтение настроек и вычисления в памяти.
Подготовка
Работайте в отдельной учебной копии базы. Создайте серверный общий модуль УчебныеЗадачи, вставьте полный модуль урока и вызовите ВыполнитьПример() из серверного обработчика учебной команды.
Код выполняется на сервере: часть функций локализации и часовых поясов недоступна непосредственно в тонком клиенте. Реквизиты пользователя, региональные настройки и часовые пояса код не меняет.
Для двух уроков о метаданных используйте копию КА2 Progress: в исходном Languages/Русский.xml действительно есть язык Русский с КодЯзыка = ru. Остальные уроки не требуют объектов конкретной конфигурации.
Процедура ВыполнитьПример() Экспорт
UTCДо = ТекущаяУниверсальнаяДата();
Миллисекунды1С = ТекущаяУниверсальнаяДатаВМиллисекундах();
UTCПосле = ТекущаяУниверсальнаяДата();
ВосстановленноеUTC = Дата(1, 1, 1) + Цел(Миллисекунды1С / 1000);
Сообщить(ТипЗнч(Миллисекунды1С) = Тип("Число"));
Сообщить(ТипЗнч(ВосстановленноеUTC) = Тип("Дата"));
Если UTCПосле >= UTCДо Тогда
Сообщить(ВосстановленноеUTC >= UTCДо И ВосстановленноеUTC <= UTCПосле);
Иначе
Сообщить("Системные часы изменились между вызовами; интервальную проверку пропускаем");
КонецЕсли;
Сообщить("Восстановленное UTC: " + Формат(ВосстановленноеUTC, "ДФ=yyyy-MM-dd HH:mm:ss"));
ДатаСеанса = ТекущаяДатаСеанса();
Сообщить("Дата сеанса: " + Формат(ДатаСеанса, "ДФ=yyyy-MM-dd HH:mm:ss"));
Сообщить("Пояс сеанса: " + ЧасовойПоясСеанса());
УчебныйUTC = Дата(1970, 1, 1, 0, 0, 10);
УчебныеМиллисекундыUnix = (УчебныйUTC - Дата(1970, 1, 1)) * 1000;
Сообщить(УчебныеМиллисекундыUnix = 10000);
КонецПроцедурыРазбор по шагам
ТекущаяУниверсальнаяДатаВМиллисекундах считает миллисекунды с 01.01.0001. Делим на 1000 и берём целую часть, потому что обычная Дата имеет секундную точность.
Дата(1, 1, 1) — начало шкалы счётчика 1С. Прибавление количества секунд восстанавливает UTC, а не местное время сервера.
Два независимых чтения UTC ограничивают момент измерения. Обычно интервальная проверка истинна; системная корректировка часов может повлиять на диагностику. Это не монотонный таймер.
ТекущаяДатаСеанса возвращает дату сервера в поясе сеанса; приоритет — пояс сеанса, затем базы, затем сервера. Это не второй способ получить UTC.
Unix-миллисекунды имеют начало 01.01.1970. Последний расчёт только для своего явно заданного UTC: 10 секунд после начала дают 10000. Контракт реального внешнего API необходимо проверить отдельно.
Как проверить результат
Две проверки типов — Истина. При неизменных часах интервальная проверка — Истина; учебный Unix-пример в конце — Истина.
Значения текущего времени меняются при каждом запуске. Не сравнивайте их с жёстко заданной сегодняшней датой.
В коде нет setter часового пояса, изменения системных часов или обращения к внешнему API.
Ожидаемый результат
Начинающий различает UTC, дату сеанса и две разные эпохи миллисекунд.
На что обратить внимание
Нельзя передавать счётчик миллисекунд 1С в API, ожидающий Unix timestamp, без преобразования эпохи.
Не оценивайте точную производительность по настенным часам: они могут корректироваться ОС.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.