Получить интервал времени в секундах, по завершении которого неактивный сеанс переводится в спящий режим.
Синтаксис
ПолучитьВремяЗасыпанияПассивногоСеанса()Полное описание, параметры и ограничения
Глобальный контекст.ПолучитьВремяЗасыпанияПассивногоСеанса (Global context.GetPassiveSessionHibernateTime)
Глобальный контекст (Global context)
ПолучитьВремяЗасыпанияПассивногоСеанса (GetPassiveSessionHibernateTime)
Доступен, начиная с версии 8.3.5.
Синтаксис:
ПолучитьВремяЗасыпанияПассивногоСеанса()
Возвращаемое значение:
Тип: Число.
Описание:
Получить интервал времени в секундах, по завершении которого неактивный сеанс переводится в спящий режим.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Вызов метода выполняет обращение к серверу.
Использование в версии:
Доступен, начиная с версии 8.3.5.
Методическая информация
Практические примеры
Прочитать настройки блокировок, сна сеансов и пересчёта итогов без их изменения
Диагностический паспорт отделяет установленные параметры от фактического числа активных заданий и наличия индексов.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной базе выполните код на сервере. Читаются настройки, не строки справочников и документов.
В коде нет вызовов УстановитьРегиональныеНастройки, изменения индексов, монопольного режима или завершения сеансов.
Результаты зависят от настроек вашей учебной базы и пользователя: фиксированных значений для всех конфигураций нет.
Сообщить("Ожидание блокировки данных, секунд: " + Строка(ПолучитьВремяОжиданияБлокировкиДанных()));
Сообщить("Засыпание пассивного сеанса, секунд: " + Строка(ПолучитьВремяЗасыпанияПассивногоСеанса()));
Сообщить("Завершение спящего сеанса, секунд: " + Строка(ПолучитьВремяЗавершенияСпящегоСеанса()));
Сообщить("Настройка числа заданий пересчёта: " + Строка(ПолучитьКоличествоЗаданийПересчетаИтогов()));
НужныДополнительныеИндексы = ПолучитьИспользованиеДополнительныхИндексов();
Сообщить("Настроено использование дополнительных индексов: " + Строка(НужныДополнительныеИндексы));
СтолетиеБазы = ПолучитьНачалоСтолетияИнформационнойБазы();
Если СтолетиеБазы = Неопределено Тогда
Сообщить("Начало столетия в базе отдельно не задано");
Иначе
Сообщить("Год начала столетия базы: " + Строка(СтолетиеБазы));
КонецЕсли;
Сообщить("Год начала столетия текущего сеанса: " + Строка(НачалоСтолетияСеанса()));
ЯвнаяДата = Дата(2030, 1, 1);
Сообщить(Год(ЯвнаяДата) = 2030);Разбор по шагам
Три временных параметра возвращаются в секундах и относятся к разным событиям: ожидание блокировки, сон и завершение сна.
Количество заданий пересчёта — настройка, не число уже выполняющихся фоновых заданий.
Признак дополнительных индексов задаёт необходимость создания/удаления при соответствующих операциях, не подтверждает физическое наличие индексов сейчас.
Начало столетия базы может быть Неопределено; год, действующий в сеансе, читаем отдельно.
Дата с явным четырёхзначным годом не зависит от интерпретации сокращённого года пользовательского ввода.
Как проверить результат
Получены три интервала и настройка числа заданий без завершения других сеансов.
Отсутствующее начало столетия обработано отдельным сообщением, не превращено в 0.
Последняя проверка года 2030 Истина; данные настройки не изменены.
Ожидаемый результат
Параметры диагностики прочитаны с правильными единицами и пояснением, что они не являются счётчиками текущей работы.
На что обратить внимание
Файловая/серверная база, права и режим разделения данных могут влиять на применимость отдельных настроек.
Не увеличивайте ожидание блокировки наугад: это не устранит причину взаимной блокировки.
Нет вызовов установки параметров, пересчёта итогов, реструктуризации и разрыва соединений.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Свой учебный профиль: пять таймаутов, проверка чисел и точное восстановление
Одна кнопка собственной новой File ИБ: фактически получить положительный профиль, явно изменить все5 чисел в секундах, перечитать, восстановить сохранённые исходные числа и проверить каждое.
Где и как запускать
Неглобальный обычный клиентский модуль собственной новой пустой File CF 8.5.1.1343 в отдельной VM; один обычный толстый клиент. Будущие административные изменения своей базы, не только памяти.
Подготовка
Только в отдельной НОВОЙ одноразовой Windows VM вручную создайте новую пустую файловую ИБ C:\1c-labs\OwnSessionTimeouts5_c2e5dc81-1386-47c4-a48d-4206cf19c695\IB. Не используйте копию рабочей базы, типовую конфигурацию или чужую CF. UUID пути и имена — контроль учебной подготовки, не защита от злонамеренной подмены или junction.
Конфигуратор → Конфигурация → свойства: Имя=СтендТаймаутов85; Версия=OwnSessionTimeouts5-5b908a73-7c6d-4204-a0a4-b2c4514ff156; ОсновнойРежимЗапуска=ОбычноеПриложение; РежимСовместимости=НеИспользовать; встроенный язык Русский. Не добавляйте документы, справочники, регистры, общие реквизиты, задания или расширения. Отсутствие общих реквизитов исключает разделители в этом пустом стенде.
Общие → Роли → Таймауты85Администратор: права Администрирование, АктивныеПользователи и доступ к собственной общей форме. Администрирование → Пользователи: единственный свой Таймауты85Ученик с этой ролью и РежимЗапуска=ОбычноеПриложение. Код не создаёт пользователей, не меняет права и проверяет настоящий UUID текущего пользователя и единственного соединения.
В Конфигураторе только этой новой ИБ: Администрирование → Параметры информационной базы. Установленная справка описывает в группе Информационная база ожидание блокировок и четыре таймера: завершение при бездействии, завершение спящего сеанса, засыпание пассивного сеанса, предупреждение о завершении. Вручную подготовьте строго положительные длительные значения, например 86400, 172800, 28800, 43200 секунд для соответствующих четырёх таймеров и30 секунд ожидания блокировки. Это отдельная ручная подготовка своей базы, не код урока и не обещание эквивалентности полей UI глобальным getter. Ноль не трактуется. Закройте Конфигуратор и все соединения, затем фактически прочитайте все5 getter этим уроком; неположительные значения означают отказ ДО setter.
Общие → Общие модули → Таймауты85: КлиентОбычноеПриложение=Да; Сервер, Глобальный, ВызовСервера, Привилегированный, КлиентУправляемоеПриложение, ВнешнееСоединение=Нет; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. Вставьте CODE целиком. Все вызовы идут из одного обычного толстого клиента, без собственного серверного обработчика формы или переноса между сеансами. Native методы спящего/пассивного сеанса сами документируют серверный запрос; отсутствие собственного RPC не означает отсутствия такого запроса.
Общие → Общие формы → УрокТаймаутов85: создайте ОБЫЧНУЮ форму. Добавьте реквизит Протокол85, неограниченная Строка; многострочное поле для него только для просмотра. Исходные числа не переводятся в реквизиты формы с фиксированной точностью и не округляются. Добавьте обычный элемент управления Кнопка с именем Настроить85 и заголовком Проверить, настроить и восстановить. Его событие Нажатие привяжите к Настроить85Нажатие() из FORM. Это не команда управляемой формы и не кнопка командной панели. Вставьте весь FORM, включая Перем. Не вызывайте обработчик вручную; его native синтаксис Нажатие() не имеет параметров.
Конфигурация → Открыть модуль обычного приложения: вставьте APPLICATION целиком. Штатное ПриНачалеРаботыСистемы() получает именно свою обычную общую форму и открывает её. Обновите только эту новую пустую конфигурацию. Запустите один обычный толстый клиент 8.5.1.1343 под своим единственным пользователем; Конфигуратор и другие подключения должны быть закрыты. Не переносите урок в тонкий/веб/управляемый клиент.
Нажмите собственную кнопку ровно один раз. Сначала считываются все пять настоящих getter и проверяются числовые типы и строго положительные исходные значения. Любой ноль, отрицательное число, неверный тип или стенд останавливает урок без setter. Начальный профиль должен быть достаточно длительным для непрерывного ручного прогона; не оставляйте сеанс бездействовать, не ставьте паузы или остановы отладчика.
Временный профиль выбирается явно и отличается по каждому параметру: завершение43200 либо86400; спящий86400 либо172800; засыпание14400 либо28800; предупреждение21600 либо43200; блокировка30 либо45 секунд. Альтернатива нужна, если исходное число равно предпочтительному. Это только учебные положительные числа, не рекомендованные производственные настройки и не утверждение о хронологии предупреждений. Сон, завершение сеанса и конкурирующие транзакции не создаются и не ожидаются.
После пяти setter выполняются все пять getter и полное сравнение с выбранным профилем. Затем setter получают точные сохранённые реальные исходные числа, включая возможную дробную часть; снова читаются и сравниваются все пять getter. Только после этого возвращается фиксированный пакет из15 числовых полей и строкового кода; форма проверяет все16 полей до отображения. Каждая строка показывает исходное → фактически прочитанное временное → фактически восстановленное.
УстановитьВремяОжиданияБлокировкиДанных меняет параметр информационной базы, требует Администрирование и неустановленные разделители; при необходимости на время вызова захватывает монопольный режим, отказ его захвата вызывает исключение. Урок — только собственная новая File ИБ без других соединений, не SQL/IBM DB2. Проверка одного соединения не защищает от гонки появления другого. Не вызывайте native setter без аргумента ради восстановления: документированные defaults20/1200/86400 не равны обещанию вернуть реальное исходное значение.
Для четырёх таймеров установленная справка не уточняет охват текущих/прочих/будущих сеансов и сохранение настройки; урок ничего такого не обещает. Он доказывает лишь будущую нормальную последовательность вызовов и сравнение getter в том же клиентском контексте. Семантика нуля не установлена, поэтому он исключён. Никаких обещаний фактического сна, завершения или блокировочного конфликта по числовому чтению нет.
После ЛЮБОЙ ошибки обработчик устанавливает постоянный STOP текущей формы и повторно поднимает исходную ошибку. В catch нет восстановительных setter, повторной команды или автоматического rollback. Возможен частично изменённый профиль, новые срабатывания таймеров и потеря сеанса до завершения. Не переоткрывайте форму для обхода STOP; сохраните ошибку и остановите эту учебную VM. Отдельное ручное восстановление или создание нового пустого стенда требует отдельного решения; код его не выполняет.
Нормальный протокол подтверждает восстановление только после всех проверок; отказ не считается успешным примером. Нет операций с прикладными данными, но это будущие реальные административные изменения собственной базы, не пример только в памяти; возможные платформенные системные записи не исключаются. Здесь VM/CF/ИБ не создавались, платформа не запускалась, настройки не менялись: проверка статическая по установленной справке.
Процедура ПроверитьСтенд85() Экспорт
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Или ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnSessionTimeouts5_c2e5dc81-1386-47c4-a48d-4206cf19c695\IB"";" Тогда
ВызватьИсключение "Разрешён только свой новый обычный толстый клиент в отдельной учебной VM";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("Таймауты85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("УрокТаймаутов85") = Неопределено Тогда
ВызватьИсключение "Нужен пустой стенд: один модуль и форма, без данных, разделителей и заданий";
КонецЕсли;
МодульМД = Метаданные.ОбщиеМодули.Найти("Таймауты85");
Если Не МодульМД.КлиентОбычноеПриложение Или МодульМД.Сервер Или МодульМД.Глобальный
Или МодульМД.ВызовСервера Или МодульМД.Привилегированный Или МодульМД.КлиентУправляемоеПриложение
Или МодульМД.ВнешнееСоединение
Или МодульМД.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Нужен неглобальный обычный клиентский модуль без сервера, RPC, привилегий и кеширования";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "В своей лаборатории не должно быть расширений";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если ТипЗнч(Текущий) <> Тип("ПользовательИнформационнойБазы") Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один настоящий собственный учебный пользователь";
КонецЕсли;
Если Текущий.Имя <> "Таймауты85Ученик" Или Текущий.РежимЗапуска <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение
Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпала собственная идентичность или обычный режим пользователя";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Закройте Конфигуратор и все остальные соединения своей новой базы";
КонецЕсли;
Соединение = Соединения[0];
Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или Соединение.Пользователь.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Единственное соединение должно принадлежать своему текущему пользователю";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьЧисловыеПоля85(Пакет, Имена, ЕстьКод)
Если ТипЗнч(Пакет) <> Тип("ФиксированнаяСтруктура") Тогда
ВызватьИсключение "Нужен собственный фиксированный пакет";
КонецЕсли;
Поля = СтрРазделить(Имена, ",");
Если Пакет.Количество() <> Поля.Количество() + ?(ЕстьКод, 1, 0) Тогда
ВызватьИсключение "Число полей пакета не совпало";
КонецЕсли;
Для Каждого Имя Из Поля Цикл
Если Не Пакет.Свойство(Имя, ЗначениеПоля) Или ТипЗнч(ЗначениеПоля) <> Тип("Число") Тогда
ВызватьИсключение "Каждое обязательное поле должно быть настоящим числом";
КонецЕсли;
Если ЗначениеПоля <= 0 Тогда
ВызватьИсключение "Только строго положительные значения в секундах; ноль не интерпретируется";
КонецЕсли;
КонецЦикла;
Если ЕстьКод Тогда
Если Не Пакет.Свойство("Код", ЗначениеКода) Или ТипЗнч(ЗначениеКода) <> Тип("Строка") Тогда
ВызватьИсключение "Нужен строковый код собственного урока";
КонецЕсли;
Если ЗначениеКода <> "OwnSessionTimeouts5-5b908a73-7c6d-4204-a0a4-b2c4514ff156" Тогда
ВызватьИсключение "Подменён код собственного пакета";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьПрофиль85(Профиль)
ПроверитьЧисловыеПоля85(Профиль, "Завершение,Спящий,Засыпание,Предупреждение,Блокировка", Ложь);
КонецПроцедуры
Функция ПрочитатьПрофиль85()
Профиль = Новый ФиксированнаяСтруктура(Новый Структура("Завершение,Спящий,Засыпание,Предупреждение,Блокировка",
ПолучитьВремяЗавершенияСеансаПриБездействии(), ПолучитьВремяЗавершенияСпящегоСеанса(),
ПолучитьВремяЗасыпанияПассивногоСеанса(), ПолучитьВремяПредупрежденияОЗавершенииСеансаПриБездействии(),
ПолучитьВремяОжиданияБлокировкиДанных()));
ПроверитьПрофиль85(Профиль);
Возврат Профиль;
КонецФункции
Функция ВыбратьПрофиль85(Исходный)
ПроверитьПрофиль85(Исходный);
Учебный = Новый ФиксированнаяСтруктура(Новый Структура("Завершение,Спящий,Засыпание,Предупреждение,Блокировка",
?(Исходный.Завершение = 43200, 86400, 43200), ?(Исходный.Спящий = 86400, 172800, 86400),
?(Исходный.Засыпание = 14400, 28800, 14400), ?(Исходный.Предупреждение = 21600, 43200, 21600),
?(Исходный.Блокировка = 30, 45, 30)));
ПроверитьПрофиль85(Учебный);
Возврат Учебный;
КонецФункции
Процедура УстановитьПрофиль85(Профиль)
ПроверитьСтенд85();
ПроверитьПрофиль85(Профиль);
УстановитьВремяЗавершенияСеансаПриБездействии(Профиль.Завершение);
УстановитьВремяЗавершенияСпящегоСеанса(Профиль.Спящий);
УстановитьВремяЗасыпанияПассивногоСеанса(Профиль.Засыпание);
УстановитьВремяПредупрежденияОЗавершенииСеансаПриБездействии(Профиль.Предупреждение);
УстановитьВремяОжиданияБлокировкиДанных(Профиль.Блокировка);
КонецПроцедуры
Процедура СверитьПрофиль85(Фактический, Ожидаемый)
ПроверитьПрофиль85(Фактический);
ПроверитьПрофиль85(Ожидаемый);
Если Фактический.Завершение <> Ожидаемый.Завершение Или Фактический.Спящий <> Ожидаемый.Спящий
Или Фактический.Засыпание <> Ожидаемый.Засыпание Или Фактический.Предупреждение <> Ожидаемый.Предупреждение
Или Фактический.Блокировка <> Ожидаемый.Блокировка Тогда
ВызватьИсключение "Все пять фактических getter должны подтвердить ожидаемый профиль";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьИтог85(Итог) Экспорт
ПроверитьЧисловыеПоля85(Итог, "ДоЗавершение,ДоСпящий,ДоЗасыпание,ДоПредупреждение,ДоБлокировка,УчебныйЗавершение,УчебныйСпящий,УчебныйЗасыпание,УчебныйПредупреждение,УчебныйБлокировка,ПослеЗавершение,ПослеСпящий,ПослеЗасыпание,ПослеПредупреждение,ПослеБлокировка", Истина);
Для Каждого Имя Из СтрРазделить("Завершение,Спящий,Засыпание,Предупреждение,Блокировка", ",") Цикл
Итог.Свойство("До" + Имя, До);
Итог.Свойство("Учебный" + Имя, Учебный);
Итог.Свойство("После" + Имя, После);
Если До <> После Или До = Учебный Тогда
ВызватьИсключение "Каждый параметр должен реально измениться и вернуться к исходному числу";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция НастроитьИВосстановить85() Экспорт
ПроверитьСтенд85();
Исходный = ПрочитатьПрофиль85();
Учебный = ВыбратьПрофиль85(Исходный);
УстановитьПрофиль85(Учебный);
Фактический = ПрочитатьПрофиль85();
СверитьПрофиль85(Фактический, Учебный);
УстановитьПрофиль85(Исходный);
Восстановленный = ПрочитатьПрофиль85();
СверитьПрофиль85(Восстановленный, Исходный);
Итог = Новый ФиксированнаяСтруктура(Новый Структура("ДоЗавершение,ДоСпящий,ДоЗасыпание,ДоПредупреждение,ДоБлокировка,УчебныйЗавершение,УчебныйСпящий,УчебныйЗасыпание,УчебныйПредупреждение,УчебныйБлокировка,ПослеЗавершение,ПослеСпящий,ПослеЗасыпание,ПослеПредупреждение,ПослеБлокировка,Код",
Исходный.Завершение, Исходный.Спящий, Исходный.Засыпание, Исходный.Предупреждение, Исходный.Блокировка,
Фактический.Завершение, Фактический.Спящий, Фактический.Засыпание, Фактический.Предупреждение, Фактический.Блокировка,
Восстановленный.Завершение, Восстановленный.Спящий, Восстановленный.Засыпание, Восстановленный.Предупреждение, Восстановленный.Блокировка,
"OwnSessionTimeouts5-5b908a73-7c6d-4204-a0a4-b2c4514ff156"));
ПроверитьИтог85(Итог);
Возврат Итог;
КонецФункцииОбычная кнопка, полный числовой протокол и остановка после ошибки
Общие → Общие формы → УрокТаймаутов85 → Модуль обычной формы
Толстый обычный клиент
Перем Остановка85;
Перем Завершено85;
Процедура Настроить85Нажатие()
Попытка
Если Остановка85 = Истина Или Завершено85 = Истина Тогда
ВызватьИсключение "В этой форме повторение запрещено";
КонецЕсли;
Итог = Таймауты85.НастроитьИВосстановить85();
Таймауты85.ПроверитьИтог85(Итог);
Протокол85 = "Все числа в секундах. Исходное → временно установленное → восстановленное:";
Для Каждого Имя Из СтрРазделить("Завершение,Спящий,Засыпание,Предупреждение,Блокировка", ",") Цикл
Итог.Свойство("До" + Имя, До);
Итог.Свойство("Учебный" + Имя, Учебный);
Итог.Свойство("После" + Имя, После);
Протокол85 = Протокол85 + Символы.ПС + Имя + ": " + Строка(До) + " → " + Строка(Учебный) + " → " + Строка(После);
КонецЦикла;
Завершено85 = Истина;
Протокол85 = Протокол85 + Символы.ПС + "Подтверждено чтением всех пяти параметров. Сон, завершение сеанса и конфликт блокировок не проверялись.";
Исключение
Остановка85 = Истина;
Протокол85 = "ОТКАЗ, не успех. Повторение запрещено. Часть параметров могла остаться изменённой; новые срабатывания таймеров возможны. Не переоткрывайте форму для обхода STOP, сохраните исходную ошибку и остановите свою учебную VM.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыШтатный запуск своей обычной общей формы
Конфигурация → Открыть модуль обычного приложения
Толстый обычный клиент
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
Таймауты85.ПроверитьСтенд85();
СвояФорма = ПолучитьОбщуюФорму("УрокТаймаутов85");
Если ТипЗнч(СвояФорма) <> Тип("Форма") Тогда
ВызватьИсключение "Нужна собственная обычная форма";
КонецЕсли;
СвояФорма.Открыть();
#Иначе
ВызватьИсключение "Нужен толстый обычный клиент 8.5.1.1343";
#КонецЕсли
КонецПроцедурыРазбор по шагам
В новой отдельной VM подготовить пустую File CF, точные имена/версию, единственного администратора, обычную форму/кнопку, клиентский модуль и модуль обычного приложения. Отдельно вручную задать положительную подготовку через Параметры информационной базы, не обещая UI/global эквивалентность.
До первого setter проверить стенд и все пять фактических положительных исходных чисел. Выбрать длительный положительный профиль, отличающийся по каждому полю.
Один раз установить все пять чисел и прочитать весь профиль в том же клиентском контексте. Полностью сравнить его с выбранным; без этого не переходить к нормальному продолжению.
Установить точные ранее прочитанные исходные числа, снова прочитать все пять и подтвердить полное равенство. Проверить пакет16 и вывести фактические три числовых набора без ожидания сна или конфликта.
Как проверить результат
Все пять До/Учебный/После имеют native числовой тип и значения>0 в секундах. Учебный отличается от До, После точно равно До для каждого. Реальные getter после каждого набора setter обязательны.
Пакет имеет ровно16 полей:15 положительных чисел и собственный строковый код. Полные проверки имён/типов выполняются до чтения и отображения. Provider0args, ровно5 primary; zero scope и фактические таймерные события не выдумываются.
Любая ошибка — отказ со sticky STOP этой формы, без повторных мутаций/автоматического восстановления. Успех возможен только по нормальному пути после полного последнего чтения.
Ожидаемый результат
Ожидаемый будущий ручной результат: пять строк До → Учебный → После, где Учебный фактически отличается, а После полностью равно сохранённому До. Это проверка параметров, не доказательство сна/завершения/конфликта. Здесь 1С не запускалась.
На что обратить внимание
Никогда не используйте рабочую или чужую ИБ. Путь/имена не являются защитой от намеренной подмены; требуется действительно собственная новая изолированная лаборатория.
Ноль и отрицательные исходные числа исключены ДО setter. Не подменяйте неизвестную семантику нуля догадкой и не приписывайте четырём таймерам область всех/будущих сеансов или постоянное хранение.
Getter подтверждают числовое чтение, а не срабатывание таймера. Нет паузы, ожидания, отладки с остановом, специально спящего сеанса или конкурирующих транзакций.
Lock setter относится к ИБ и может временно требовать монопольный режим. Не гарантируется отсутствие гонки подключения. Native defaults не восстановление; все пять исходных чисел берутся из getter.
Ошибка может оставить профиль изменённым и вызвать новые таймерные события; автоматический откат не обещается. STOP ограничен текущей формой; не переоткрывайте её для обхода запрета.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.