АдминистрированиеСчетчикПотребленияРесурсов.СчитатьОбъемДанныхСчитанныхСДиска

Свойства · CollectReadDiskDataSize

Тип: Булево. Определяет, нужно ли накапливать информацию об объеме данныех, которые считываются с диска.

Полное описание, параметры и ограничения

АдминистрированиеСчетчикПотребленияРесурсов.СчитатьОбъемДанныхСчитанныхСДиска (AdministrationResourceConsumptionCounter.CollectReadDiskDataSize)

АдминистрированиеСчетчикПотребленияРесурсов (AdministrationResourceConsumptionCounter)

СчитатьОбъемДанныхСчитанныхСДиска (CollectReadDiskDataSize)

Доступен, начиная с версии 8.3.14.

Использование:
Чтение и запись.
Описание:
Тип: Булево.
Определяет, нужно ли накапливать информацию об объеме данныех, которые считываются с диска.
Доступность:

Тонкий клиент, сервер, толстый клиент, интеграция.

Использование в версии:

Доступен, начиная с версии 8.3.14.

Методическая информация

Практические примеры

Проверить, какие метрики собирает собственный счётчик

Находим один заранее зарегистрированный УчебныйСчетчик85, читаем его область, отбор и флаги сбора. Отдельный список включённых метрик помогает не принять отсутствующее измерение за нулевую нагрузку.

Где и как запускать

Полный модуль собственной управляемой формы учебной обработки. Читает только явно выбранный УчебныйКластер85 через свой loopback ras, если вы сами запускаете его на стенде.

Подготовка

  1. Нужен отдельный собственный серверный стенд 1С 8.5.1.1343 без рабочих баз. Администратор должен заранее установить сервер, запустить совместимый ras и создать кластер с точным именем УчебныйКластер85. Код ничего не устанавливает и не регистрирует.

  2. Запускайте обработку в собственной пустой учебной конфигурации с именем метаданных УчебнаяКонфигурацияСинтаксиса. Серверное выполнение должно находиться на той же машине, что собственный ras: код разрешает только 127.0.0.1. Это адрес сервера выполнения, не обязательно компьютера тонкого клиента.

  3. Создайте учебную обработку с управляемой формой. Добавьте реквизиты формы: ПортRAS — Число без дробной части; ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера, JSONРезультат — Строка. У JSONРезультат длина 0, то есть неограниченная. ИмяАдминистратораКластера — логин, а не имя кластера.

  4. Выведите поля на форму. Для элементов ПарольАгента и ПарольАдминистратораКластера включите Режим пароля; не сохраняйте их значения в настройках и истории. Для JSONРезультат используйте многострочное поле строки только для просмотра. Маскировка ввода не шифрует пароль и не заменяет защищённый стенд.

  5. Создайте команду ПолучитьУчебныйСнимок, назначьте ей клиентский обработчик с таким же именем и вставьте весь приведённый модуль формы. Другие процедуры команд, общий модуль или готовые неизвестные объекты не нужны.

  6. ПортRAS возьмите из фактического запуска своего ras, не из порта ragent или рабочего процесса. Например, 1545 подходит только если именно этот порт настроен на вашем стенде. Используйте законные учётные данные своего агента и своего кластера; пустые допустимы только для намеренно настроенного учебного стенда без соответствующих администраторов.

  7. В первый раз оставьте ИдентификаторКластера пустым: появится JSON только с кластерами УчебныйКластер85. Скопируйте настоящий UUID из результата, вновь введите очищенные пароли и повторите команду. Кластер выбирается одновременно по UUID и точному учебному имени; чужой кластер не принимается.

  8. Для уроков счётчиков заранее штатными средствами администрирования своего стенда зарегистрируйте счётчик с точным именем УчебныйСчетчик85, выбрав нужные метрики. ПолучитьСчетчикиПотребленияРесурсов только читает уже зарегистрированные счётчики; этот код не создаёт и не включает их. Без этой отдельной подготовки будет явная ошибка, а не подставленные показания.

  9. Чтобы появились настоящие показания, откройте собственную учебную базу кластера и выполните несколько учебных действий, например константный запрос или отчёт из уроков СКД. Дождитесь накопления согласно реальной настройке счётчика. CPU, трафик, память и длительности зависят от стенда; фиксированные вымышленные значения не обещаются.

  10. Выполняйте каждый урок отдельно. JSON формируется в памяти и показывается только на своей форме; код не сохраняет файлы, не пишет настройки кластера, не прерывает сеансы и не запускает команды ОС. Он выполняет сетевое обращение к своему локальному ras только если вы сами запустите его на подготовленном стенде.

  11. Здесь подключение к ras и запуск в 1С не выполнялись. Проверены тексты, сигнатуры и привязки к локальной справке 8.5.1.1343. Пройдите контрольные действия сами только на своём учебном стенде.

&НаКлиенте
Процедура ПолучитьУчебныйСнимок(Команда)
    Попытка
        JSONРезультат = УчебныйСнимокНаСервере(ПортRAS, ИмяАгента, ПарольАгента,
            ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера);
    Исключение
        JSONРезультат = "Снимок не получен. Проверьте собственный стенд, порт, UUID, учебное имя и права. Подробную серверную ошибку исследуйте в отладчике без публикации учётных данных.";
    КонецПопытки;
    ПарольАгента = "";
    ПарольАдминистратораКластера = "";
КонецПроцедуры

&НаСервереБезКонтекста
Функция УчебныйСнимокНаСервере(ПортRAS, ИмяАгента, ПарольАгента,
    ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера)
    Если ТипЗнч(ПортRAS) <> Тип("Число") Тогда
        ВызватьИсключение "Порт ras должен быть числом";
    КонецЕсли;
    Если ПортRAS <> Цел(ПортRAS) Или ПортRAS < 1 Или ПортRAS > 65535 Тогда
        ВызватьИсключение "Недопустимый порт собственного ras";
    КонецЕсли;
    ТекстовыеПараметры = Новый Массив;
    ТекстовыеПараметры.Добавить(ИмяАгента);
    ТекстовыеПараметры.Добавить(ПарольАгента);
    ТекстовыеПараметры.Добавить(ИдентификаторКластера);
    ТекстовыеПараметры.Добавить(ИмяАдминистратораКластера);
    ТекстовыеПараметры.Добавить(ПарольАдминистратораКластера);
    Для Каждого ТекстовыйПараметр Из ТекстовыеПараметры Цикл
        Если ТипЗнч(ТекстовыйПараметр) <> Тип("Строка") Тогда
            ВызватьИсключение "Учётные данные и UUID должны быть строками";
        КонецЕсли;
    КонецЦикла;
    Агент = Новый АдминистрированиеСервера("127.0.0.1", ПортRAS);
    Агент.ВыполнитьАутентификацию(ПарольАгента, ИмяАгента);
    Кластеры = Агент.ПолучитьКластеры();
    Если ПустаяСтрока(СокрЛП(ИдентификаторКластера)) Тогда
        Каталог = Новый Массив;
        Для Каждого Найденный Из Кластеры Цикл
            Если Найденный.Имя = "УчебныйКластер85" Тогда
                СтрокаКаталога = Новый Структура;
                СтрокаКаталога.Вставить("UUID", Строка(Найденный.ИдентификаторКластера));
                СтрокаКаталога.Вставить("Имя", Найденный.Имя);
                Каталог.Добавить(СтрокаКаталога);
            КонецЕсли;
        КонецЦикла;
        Возврат СериализоватьСвойСнимок(Новый Структура("УчебныеКластеры", Каталог));
    КонецЕсли;
    Кластер = Неопределено;
    Совпадений = 0;
    Для Каждого Найденный Из Кластеры Цикл
        Если НРег(Строка(Найденный.ИдентификаторКластера)) = НРег(СокрЛП(ИдентификаторКластера))
            И Найденный.Имя = "УчебныйКластер85" Тогда
            Кластер = Найденный;
            Совпадений = Совпадений + 1;
        КонецЕсли;
    КонецЦикла;
    Если Совпадений <> 1 Тогда
        ВызватьИсключение "Нужен один собственный учебный кластер с подтверждённым UUID";
    КонецЕсли;
    Кластер.ВыполнитьАутентификацию(ИмяАдминистратораКластера, ПарольАдминистратораКластера);
    Снимок = Новый Структура;
    Снимок.Вставить("UUIDКластера", Строка(Кластер.ИдентификаторКластера));
    Снимок.Вставить("ИмяКластера", Кластер.Имя);
    СвойСчетчик = Неопределено;
    СовпаденийСчетчика = 0;
    Для Каждого Счетчик Из Кластер.ПолучитьСчетчикиПотребленияРесурсов() Цикл
        Если Счетчик.Имя = "УчебныйСчетчик85" Тогда
            СвойСчетчик = Счетчик;
            СовпаденийСчетчика = СовпаденийСчетчика + 1;
        КонецЕсли;
    КонецЦикла;
    Если СовпаденийСчетчика <> 1 Тогда
        ВызватьИсключение "Заранее зарегистрируйте один свой УчебныйСчетчик85";
    КонецЕсли;
    Снимок.Вставить("Группировка", Строка(СвойСчетчик.Группировка));
    Снимок.Вставить("ДлительностьНакопления", СвойСчетчик.ДлительностьНакопления);
    Снимок.Вставить("ЗначениеОтбора", СвойСчетчик.ЗначениеОтбора);
    Снимок.Вставить("Имя", СвойСчетчик.Имя);
    Снимок.Вставить("Описание", СвойСчетчик.Описание);
    Снимок.Вставить("СчитатьДлительностьВызовов", СвойСчетчик.СчитатьДлительностьВызовов);
    Снимок.Вставить("СчитатьДлительностьВызововСервисов", СвойСчетчик.СчитатьДлительностьВызововСервисов);
    Снимок.Вставить("СчитатьДлительностьВызововСУБД", СвойСчетчик.СчитатьДлительностьВызововСУБД);
    Снимок.Вставить("СчитатьКоличествоАктивныхСеансов", СвойСчетчик.СчитатьКоличествоАктивныхСеансов);
    Снимок.Вставить("СчитатьКоличествоВызовов", СвойСчетчик.СчитатьКоличествоВызовов);
    Снимок.Вставить("СчитатьКоличествоСеансов", СвойСчетчик.СчитатьКоличествоСеансов);
    Снимок.Вставить("СчитатьОбъемДанныхЗаписанныхНаДиск", СвойСчетчик.СчитатьОбъемДанныхЗаписанныхНаДиск);
    Снимок.Вставить("СчитатьОбъемДанныхПереданныхИПолученныхСУБД", СвойСчетчик.СчитатьОбъемДанныхПереданныхИПолученныхСУБД);
    Снимок.Вставить("СчитатьОбъемДанныхСчитанныхСДиска", СвойСчетчик.СчитатьОбъемДанныхСчитанныхСДиска);
    Снимок.Вставить("СчитатьПотреблениеПамяти", СвойСчетчик.СчитатьПотреблениеПамяти);
    Снимок.Вставить("СчитатьПроцессорноеВремя", СвойСчетчик.СчитатьПроцессорноеВремя);
    Снимок.Вставить("ТипОтбора", Строка(СвойСчетчик.ТипОтбора));
    ВключенныеМетрики = Новый Массив;
    Если СвойСчетчик.СчитатьДлительностьВызовов Тогда
        ВключенныеМетрики.Добавить("ДлительностьВызовов");
    КонецЕсли;
    Если СвойСчетчик.СчитатьДлительностьВызововСервисов Тогда
        ВключенныеМетрики.Добавить("ДлительностьВызововСервисов");
    КонецЕсли;
    Если СвойСчетчик.СчитатьДлительностьВызововСУБД Тогда
        ВключенныеМетрики.Добавить("ДлительностьВызововСУБД");
    КонецЕсли;
    Если СвойСчетчик.СчитатьКоличествоАктивныхСеансов Тогда
        ВключенныеМетрики.Добавить("КоличествоАктивныхСеансов");
    КонецЕсли;
    Если СвойСчетчик.СчитатьКоличествоВызовов Тогда
        ВключенныеМетрики.Добавить("КоличествоВызовов");
    КонецЕсли;
    Если СвойСчетчик.СчитатьКоличествоСеансов Тогда
        ВключенныеМетрики.Добавить("КоличествоСеансов");
    КонецЕсли;
    Если СвойСчетчик.СчитатьОбъемДанныхЗаписанныхНаДиск Тогда
        ВключенныеМетрики.Добавить("ОбъемДанныхЗаписанныхНаДиск");
    КонецЕсли;
    Если СвойСчетчик.СчитатьОбъемДанныхПереданныхИПолученныхСУБД Тогда
        ВключенныеМетрики.Добавить("ОбъемДанныхПереданныхИПолученныхСУБД");
    КонецЕсли;
    Если СвойСчетчик.СчитатьОбъемДанныхСчитанныхСДиска Тогда
        ВключенныеМетрики.Добавить("ОбъемДанныхСчитанныхСДиска");
    КонецЕсли;
    Если СвойСчетчик.СчитатьПотреблениеПамяти Тогда
        ВключенныеМетрики.Добавить("ПотреблениеПамяти");
    КонецЕсли;
    Если СвойСчетчик.СчитатьПроцессорноеВремя Тогда
        ВключенныеМетрики.Добавить("ПроцессорноеВремя");
    КонецЕсли;
    Снимок.Вставить("ВключенныеМетрики", ВключенныеМетрики);
    Возврат СериализоватьСвойСнимок(Снимок);
КонецФункции

&НаСервереБезКонтекста
Функция СериализоватьСвойСнимок(Снимок)
    Писатель = Новый ЗаписьJSON;
    Писатель.УстановитьСтроку();
    ЗаписатьJSON(Писатель, Снимок);
    Возврат Писатель.Закрыть();
КонецФункции

Разбор по шагам

  1. Проверка имени учебной конфигурации и числового порта выполняется до создания соединения. Удалённый адрес не принимается: 127.0.0.1 записан в серверном коде.

  2. У агента порядок аутентификации — пароль, имя; у кластера — имя, пароль. Два вызова имеют разные контракты и не взаимозаменяемы.

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

  4. В JSON попадают только явно перечисленные диагностические поля. Объект администрирования целиком не сериализуется; пароли и сырая ошибка аутентификации не выводятся.

  5. После любого исхода клиент очищает два поля пароля. Для следующего запуска их нужно вводить заново; остальные параметры и результат остаются на своей форме.

  6. ПолучитьСчетчикиПотребленияРесурсов читает зарегистрированные объекты. Ищем точное собственное имя и требуем одно совпадение; нет выбора случайного счётчика.

  7. Имя и Описание объясняют назначение; Группировка, ТипОтбора и ЗначениеОтбора задают разные части области наблюдения.

  8. ДлительностьНакопления выводится как исходное число. Эта страница API не указывает единицу явно; мы не придумываем для него секунды.

  9. Каждый флаг Считать... читается отдельно. Формируем список ВключенныеМетрики только по истинным флагам, не подменяем их фиктивными показаниями.

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

Как проверить результат

  1. Без подготовленного собственного счётчика ожидается ошибка и нейтральное сообщение формы. Ни один посторонний счётчик не выбирается вместо него.

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

  3. Группировка и ТипОтбора сериализованы представлениями строк; реальные значения сравните с собственной зарегистрированной настройкой.

Ожидаемый результат

Получено полное определение реально существующего собственного счётчика и перечень активных измерений.

На что обратить внимание

  1. Имя и loopback-адрес — защитные условия учебного сценария, не замена правам администратора и сетевой защите. Не переименовывайте рабочий кластер ради обхода проверки.

  2. Свойства настроек могут быть записываемыми, но этот урок их только читает. Нет Записать, Удалить, Прервать или Отключить и нет автоматического исправления конфигурации.

  3. Снимок меняется со временем. Пустая коллекция и нулевое показание имеют разные причины; проверяйте подготовку, включённые метрики и интервалы наблюдения.

  4. Расширенная серверная ошибка может содержать чувствительные сведения. Клиент показывает нейтральную причину; диагностируйте свой стенд в отладчике, не публикуя учётные данные.

  5. Платформа и ras должны соответствовать установленной версии. Чтение свойства не доказывает, что этот параметр используется текущей версией сервера.

  6. Считать... — настройки сбора, а не уже накопленные значения. Прочитанный true не доказывает, что за интервал уже были серверные вызовы.

  7. Не меняйте флаги и не вызывайте Записать или ОчиститьНакопленныеЗначения для получения красивого результата; этого в коде нет.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Зарегистрировать собственный счетчик и лимит ras, изменить порог и удалить только свои объекты

Полный цикл настоящих административных объектов на отдельной VM. Только один пустой кластер точной версии, свой UUID-профиль, проверяемые паспорта и действие Нет. Урок не создает базы, не завершает сеансы и не имитирует показания.

Где и как запускать

Полный серверный общий модуль УчебныеРесурсыRAS85 собственной отдельной файловой базы УчебныеОграниченияRAS85. Административные вызовы только к127.0.0.1 на отдельной VM с одним пустым кластером, не к рабочему серверу.

Подготовка

  1. Подготовку выполняйте вручную только на отдельной собственной VM, где нет рабочих серверов и баз. Установите сервер1С и ras8.5.1.1343. В агенте должен быть единственный кластер с точным именем Уч85ПустойКластерРесурсов, без зарегистрированных информационных баз. Код проверяет это перед административными записями. Системные службы и ras здесь не запускаются.

  2. Нужна законная лицензия/редакция, поддерживающая управление потреблением ресурсов. Механизм первоначально предоставлен для КОРП; его наличие и права проверьте на своем сервере до опыта. Отказ лицензии не обходят привилегированным режимом. Используйте только фактический порт ras и реальные учетные данные своего агента и кластера.

  3. В консоли своего пустого кластера вручную создайте счетчик Уч85ОбразецСчетчика с описанием ровно owned-ras85-resource-lifecycle-no-infobases. Выберите длительность накопления штатным редактором и запишите ее показанное значение/режим. Урок берет уже принятую сервером длительность из настоящего объекта, не угадывает единицы числового значения и не изменяет образец. Информационные базы и пользователь Уч85РесурсыБезСеансов для него не создаются.

  4. На этой же VM создайте отдельную пустую ФАЙЛОВУЮ базу с именем конфигурации УчебныеОграниченияRAS85, русский встроенный язык, режим совместимости Не использовать, управляемое приложение Такси. Никаких предметных объектов, расширений и фоновых заданий не добавляйте. Не регистрируйте эту базу в учебном кластере: он должен оставаться пустым.

  5. Создайте серверный общий модуль УчебныеРесурсыRAS85: Сервер=Истина, Клиент=Ложь, ВызовСервера=Ложь, Глобальный=Ложь, Привилегированный=Ложь. Вставьте весь основной код. В форме ниже серверный обработчик вызывает его экспортную функцию; клиент напрямую общий модуль не вызывает.

  6. Создайте внешнюю обработку УчебныеРесурсы85 с пустой основной управляемой формой. Добавьте реквизиты ПортRAS типа Число(5,0), ПодтвержденСвойRAS типа Булево и строковые реквизиты ИмяАгента, ПарольАгента, UUIDКластера, ИмяАдминистратора, ПарольАдминистратора, ПрофильUUID, КлючВосстановления длиной200. UUIDКластера и ПрофильUUID показывайте только для просмотра. Пароли вводите полями в режиме пароля; хранение в настройках/истории отключите. Обработка запускается в своей файловой базе на VM, не в рабочей базе.

  7. В форме создайте команды Каталог85, Создать85, Прочитать85, Изменить85, Очистить85, Удалить85, Восстановить85. У каждой действие ВыполнитьОперацию85, снимите ИзменяетСохраняемыеДанные и разместите семь кнопок. Вставьте полный вспомогательный модуль формы. Откройте свою внешнюю обработку в толстом управляемом клиенте собственной файловой базы. ПодтвержденСвойRAS включайте только после ручной проверки отдельной VM и пустого кластера.

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

  9. Перед созданием запишите видимый ПрофильUUID. Он формируется до первого серверного вызова и остается даже при ошибке. Если пульт закрыли, в новом пустом пульте вводите этот фактический ключ в КлючВосстановления, нажмите Восстановить85; он принимается только после нахождения сохраненного своего объекта. Новый UUID не является восстановлением старого профиля.

  10. Порогами упражнение меняет настоящие административные записи. Из-за Действие=Нет и пустого кластера оно не проверяет прекращение вызовов, лицензирование нагрузочного сценария или реальные метрики. В1С, ras и сеть пример не запускались; подготовка и ручной опыт остаются за пользователем.

Функция Выполнить85(Операция, ПортRAS, ИмяАгента, ПарольАгента, UUIDКластера,
    ИмяАдминистратора, ПарольАдминистратора, ПрофильUUID, ПодтвержденСвойRAS) Экспорт
    ПроверитьСвойПустойСтенд();
    Если ТипЗнч(ПодтвержденСвойRAS) <> Тип("Булево") Или Не ПодтвержденСвойRAS Тогда
        ВызватьИсключение "Подтвердите собственную отдельную VM с пустым учебным кластером";
    КонецЕсли;
    Операции = СтрРазделить("Каталог85,Создать85,Прочитать85,Изменить85,Очистить85,Удалить85,Восстановить85", ",");
    Если Операции.Найти(Операция) = Неопределено Тогда
        ВызватьИсключение "Неизвестная учебная операция";
    КонецЕсли;
    Если ТипЗнч(ПортRAS) <> Тип("Число") Тогда
        ВызватьИсключение "Нужен фактический числовой порт своего ras";
    КонецЕсли;
    Если ПортRAS < 1 Или ПортRAS > 65535 Или ПортRAS <> Цел(ПортRAS) Тогда
        ВызватьИсключение "Недопустимый порт";
    КонецЕсли;
    Параметры = Новый Структура("ИмяАгента,ПарольАгента,UUIDКластера,ИмяАдминистратора,ПарольАдминистратора,ПрофильUUID",
        ИмяАгента, ПарольАгента, UUIDКластера, ИмяАдминистратора, ПарольАдминистратора, ПрофильUUID);
    Для Каждого Параметр Из Параметры Цикл
        Если ТипЗнч(Параметр.Значение) <> Тип("Строка") Тогда
            ВызватьИсключение "Учетные данные и UUID должны быть строками";
        КонецЕсли;
    КонецЦикла;
    Агент = Новый АдминистрированиеСервера("127.0.0.1", ПортRAS);
    Агент.ВыполнитьАутентификацию(ПарольАгента, ИмяАгента);
    Если Агент.ПолучитьВерсию() <> "8.5.1.1343" Тогда
        ВызватьИсключение "Нужен ras и сервер точной версии8.5.1.1343";
    КонецЕсли;
    Кластеры = Агент.ПолучитьКластеры();
    Если Кластеры.Количество() <> 1 Тогда
        ВызватьИсключение "В собственном агенте должен быть только один учебный кластер";
    КонецЕсли;
    Кластер = Кластеры[0];
    Если Кластер.Имя <> "Уч85ПустойКластерРесурсов" Тогда
        ВызватьИсключение "Имя собственного пустого кластера не совпало";
    КонецЕсли;
    Если Операция = "Каталог85" Тогда
        Возврат Новый Структура("Операция,UUIDКластера,Имя", Операция, Строка(Кластер.ИдентификаторКластера), Кластер.Имя);
    КонецЕсли;
    ПроверитьUUID85(UUIDКластера);
    Если UUIDКластера <> Строка(Кластер.ИдентификаторКластера) Тогда
        ВызватьИсключение "UUID собственного кластера не совпал";
    КонецЕсли;
    Кластер.ВыполнитьАутентификацию(ИмяАдминистратора, ПарольАдминистратора);
    Если Кластер.ПолучитьИнформационныеБазы().Количество() <> 0 Тогда
        ВызватьИсключение "Учебный кластер должен быть полностью пустым; формы запускаются в отдельной файловой базе";
    КонецЕсли;
    ПроверитьUUID85(ПрофильUUID);
    ИмяСчетчика = "own-r85-counter-" + ПрофильUUID;
    ИмяЛимита = "own-r85-limit-" + ПрофильUUID;
    Счетчик = НайтиСвойСчетчик85(Кластер, ИмяСчетчика);
    Лимит = НайтиСвойЛимит85(Кластер, ИмяЛимита, ИмяСчетчика);
    Если Операция = "Создать85" Тогда
        Если Счетчик <> Неопределено Или Лимит <> Неопределено Тогда
            ВызватьИсключение "Собственный профиль уже существует или создан частично; используйте чтение и очистку, не перезапись";
        КонецЕсли;
        Образец = НайтиСчетчикПоИмени85(Кластер, "Уч85ОбразецСчетчика");
        Если Образец = Неопределено Тогда
            ВызватьИсключение "Сначала вручную создайте свой счетчик-образец в консоли";
        КонецЕсли;
        Если Образец.Описание <> "owned-ras85-resource-lifecycle-no-infobases" Тогда
            ВызватьИсключение "Паспорт собственного счетчика-образца не совпал";
        КонецЕсли;
        ДлительностьОбразца = Образец.ДлительностьНакопления;
        Если ТипЗнч(ДлительностьОбразца) <> Тип("Число") Или ДлительностьОбразца < 0 Тогда
            ВызватьИсключение "Не получена реальная допустимая длительность образца";
        КонецЕсли;
        Счетчик = Кластер.СоздатьСчетчикПотребленияРесурсов();
        Счетчик.Имя = ИмяСчетчика;
        Счетчик.Описание = "owned-ras85-resource-lifecycle-no-infobases";
        Счетчик.Группировка = АдминистрированиеТипГруппировкиСчетчикаПотребленияРесурсов.Пользователи;
        Счетчик.ТипОтбора = АдминистрированиеТипОтбораСчетчикаПотребленияРесурсов.ВсеВыбранные;
        Счетчик.ЗначениеОтбора = "user=Уч85РесурсыБезСеансов;";
        Счетчик.ДлительностьНакопления = ДлительностьОбразца;
        Счетчик.СчитатьДлительностьВызовов = Истина;
        Счетчик.СчитатьДлительностьВызововСервисов = Истина;
        Счетчик.СчитатьДлительностьВызововСУБД = Истина;
        Счетчик.СчитатьКоличествоАктивныхСеансов = Истина;
        Счетчик.СчитатьКоличествоВызовов = Истина;
        Счетчик.СчитатьКоличествоСеансов = Истина;
        Счетчик.СчитатьОбъемДанныхЗаписанныхНаДиск = Истина;
        Счетчик.СчитатьОбъемДанныхПереданныхИПолученныхСУБД = Истина;
        Счетчик.СчитатьОбъемДанныхСчитанныхСДиска = Истина;
        Счетчик.СчитатьПотреблениеПамяти = Истина;
        Счетчик.СчитатьПроцессорноеВремя = Истина;
        Счетчик.Записать();
        Счетчик = НайтиСвойСчетчик85(Кластер, ИмяСчетчика);
        Если Счетчик = Неопределено Тогда
            ВызватьИсключение "Запись счетчика не подтверждена повторным чтением; собственный UUID сохраните для диагностики";
        КонецЕсли;
        Лимит = Кластер.СоздатьОграничениеПотребленияРесурсов();
        Лимит.Имя = ИмяЛимита;
        Лимит.Описание = "owned-ras85-resource-lifecycle-no-infobases";
        Лимит.Счетчик = ИмяСчетчика;
        Лимит.Действие = АдминистрированиеДействиеПриПревышенииОграниченияПотребленияРесурсов.Нет;
        Лимит.СообщениеОбОшибке = "Уч85 только свой учебный профиль; действие Нет";
        Лимит.ДлительностьВызова = 1000;
        Лимит.ПроцессорноеВремя = 1000;
        Лимит.ДлительностьВызововСУБД = 1000;
        Лимит.ДлительностьВызововСервисов = 1000;
        Лимит.ПотреблениеПамяти = 64 * 1024 * 1024;
        Лимит.ОбъемДанныхЗаписанныхНаДиск = 1024 * 1024;
        Лимит.ОбъемДанныхСчитанныхСДиска = 1024 * 1024;
        Лимит.ОбъемДанныхПереданныхИПолученныхСУБД = 1024 * 1024;
        Лимит.КоличествоАктивныхСеансов = 2;
        Лимит.КоличествоСеансов = 2;
        Лимит.КоличествоВызовов = 10;
        Лимит.Записать();
        Лимит = НайтиСвойЛимит85(Кластер, ИмяЛимита, ИмяСчетчика);
        Если Лимит = Неопределено Тогда
            ВызватьИсключение "Запись лимита не подтверждена; счетчик мог уже сохраниться, проверьте свой UUID";
        КонецЕсли;
    ИначеЕсли Операция = "Изменить85" Тогда
        Если Лимит = Неопределено Тогда
            ВызватьИсключение "Собственного лимита нет";
        КонецЕсли;
        Лимит.ДлительностьВызова = 2000;
        Лимит.Записать();
        Лимит = НайтиСвойЛимит85(Кластер, ИмяЛимита, ИмяСчетчика);
        Если Лимит = Неопределено Тогда
            ВызватьИсключение "Повторное чтение измененного лимита не подтверждено";
        КонецЕсли;
        Если Лимит.ДлительностьВызова <> 2000 Тогда
            ВызватьИсключение "Изменение собственного порога не подтверждено";
        КонецЕсли;
    ИначеЕсли Операция = "Очистить85" Тогда
        Если Счетчик = Неопределено Тогда
            ВызватьИсключение "Собственного счетчика нет";
        КонецЕсли;
        Счетчик.ОчиститьНакопленныеЗначения();
    ИначеЕсли Операция = "Удалить85" Тогда
        Если Лимит <> Неопределено Тогда
            Лимит.Удалить();
        КонецЕсли;
        Лимит = НайтиСвойЛимит85(Кластер, ИмяЛимита, ИмяСчетчика);
        Если Лимит <> Неопределено Тогда
            ВызватьИсключение "Удаление собственного лимита не подтверждено; счетчик не удаляется";
        КонецЕсли;
        Если Счетчик <> Неопределено Тогда
            Для Каждого ЗависимыйЛимит Из Кластер.ПолучитьОграниченияПотребленияРесурсов() Цикл
                Если ЗависимыйЛимит.Счетчик = ИмяСчетчика Тогда
                    ВызватьИсключение "На свой счетчик ссылается другой лимит; он и счетчик не удаляются";
                КонецЕсли;
            КонецЦикла;
            Счетчик.Удалить();
        КонецЕсли;
        Счетчик = НайтиСвойСчетчик85(Кластер, ИмяСчетчика);
        Если Счетчик <> Неопределено Тогда
            ВызватьИсключение "Удаление собственного счетчика не подтверждено";
        КонецЕсли;
    ИначеЕсли Операция = "Восстановить85" Тогда
        Если Счетчик = Неопределено И Лимит = Неопределено Тогда
            ВызватьИсключение "Нет сохраненного собственного профиля для восстановления ключа";
        КонецЕсли;
    КонецЕсли;
    Отчет = Новый Структура("Операция,ПрофильUUID,СчетчикСуществует,ЛимитСуществует,ПаспортЛимита,НакопленныхПоказаний",
        Операция, ПрофильUUID, Счетчик <> Неопределено, Лимит <> Неопределено, Новый Структура, 0);
    Если Лимит <> Неопределено Тогда
        Отчет.ПаспортЛимита = ПаспортЛимита85(Лимит);
    КонецЕсли;
    Если Счетчик <> Неопределено Тогда
        Показания = Счетчик.ПолучитьНакопленныеЗначения();
        Если ТипЗнч(Показания) <> Тип("Массив") Тогда
            ВызватьИсключение "Не получен реальный массив накопленных значений";
        КонецЕсли;
        Отчет.НакопленныхПоказаний = Показания.Количество();
    КонецЕсли;
    Возврат Отчет;
КонецФункции

Процедура ПроверитьUUID85(Значение)
    Если ТипЗнч(Значение) <> Тип("Строка") Или СтрДлина(Значение) <> 36 Тогда
        ВызватьИсключение "Нужен точный собственный UUID из консоли или сохраненного пульта";
    КонецЕсли;
    UUID = Новый УникальныйИдентификатор(Значение);
    Если Строка(UUID) <> Значение Тогда
        ВызватьИсключение "Нужна каноническая строка UUID без пробелов";
    КонецЕсли;
КонецПроцедуры

Функция НайтиСчетчикПоИмени85(Кластер, Имя)
    Найденный = Неопределено;
    Для Каждого Кандидат Из Кластер.ПолучитьСчетчикиПотребленияРесурсов() Цикл
        Если Кандидат.Имя = Имя Тогда
            Если Найденный <> Неопределено Тогда
                ВызватьИсключение "Имя счетчика не уникально";
            КонецЕсли;
            Найденный = Кандидат;
        КонецЕсли;
    КонецЦикла;
    Возврат Найденный;
КонецФункции

Функция НайтиСвойСчетчик85(Кластер, Имя)
    Счетчик = НайтиСчетчикПоИмени85(Кластер, Имя);
    Если Счетчик <> Неопределено Тогда
        Если Счетчик.Описание <> "owned-ras85-resource-lifecycle-no-infobases"
            Или Счетчик.Группировка <> АдминистрированиеТипГруппировкиСчетчикаПотребленияРесурсов.Пользователи
            Или Счетчик.ТипОтбора <> АдминистрированиеТипОтбораСчетчикаПотребленияРесурсов.ВсеВыбранные Тогда
            ВызватьИсключение "Паспорт собственного счетчика не совпал";
        КонецЕсли;
    КонецЕсли;
    Возврат Счетчик;
КонецФункции

Функция НайтиСвойЛимит85(Кластер, Имя, ИмяСчетчика)
    Найденный = Неопределено;
    Для Каждого Кандидат Из Кластер.ПолучитьОграниченияПотребленияРесурсов() Цикл
        Если Кандидат.Имя = Имя Тогда
            Если Найденный <> Неопределено Тогда
                ВызватьИсключение "Имя собственного лимита не уникально";
            КонецЕсли;
            Если Кандидат.Описание <> "owned-ras85-resource-lifecycle-no-infobases" Или Кандидат.Счетчик <> ИмяСчетчика
                Или Кандидат.Действие <> АдминистрированиеДействиеПриПревышенииОграниченияПотребленияРесурсов.Нет Тогда
                ВызватьИсключение "Паспорт собственного лимита не совпал; чужое правило не изменяется";
            КонецЕсли;
            Найденный = Кандидат;
        КонецЕсли;
    КонецЦикла;
    Возврат Найденный;
КонецФункции

Функция ПаспортЛимита85(Лимит)
    Паспорт = Новый Структура;
    Паспорт.Вставить("Действие", Строка(Лимит.Действие));
    Паспорт.Вставить("ДлительностьВызова", Лимит.ДлительностьВызова);
    Паспорт.Вставить("ДлительностьВызововСервисов", Лимит.ДлительностьВызововСервисов);
    Паспорт.Вставить("ДлительностьВызововСУБД", Лимит.ДлительностьВызововСУБД);
    Паспорт.Вставить("Имя", Лимит.Имя);
    Паспорт.Вставить("КоличествоАктивныхСеансов", Лимит.КоличествоАктивныхСеансов);
    Паспорт.Вставить("КоличествоВызовов", Лимит.КоличествоВызовов);
    Паспорт.Вставить("КоличествоСеансов", Лимит.КоличествоСеансов);
    Паспорт.Вставить("ОбъемДанныхЗаписанныхНаДиск", Лимит.ОбъемДанныхЗаписанныхНаДиск);
    Паспорт.Вставить("ОбъемДанныхПереданныхИПолученныхСУБД", Лимит.ОбъемДанныхПереданныхИПолученныхСУБД);
    Паспорт.Вставить("ОбъемДанныхСчитанныхСДиска", Лимит.ОбъемДанныхСчитанныхСДиска);
    Паспорт.Вставить("Описание", Лимит.Описание);
    Паспорт.Вставить("ПотреблениеПамяти", Лимит.ПотреблениеПамяти);
    Паспорт.Вставить("ПроцессорноеВремя", Лимит.ПроцессорноеВремя);
    Паспорт.Вставить("СообщениеОбОшибке", Лимит.СообщениеОбОшибке);
    Паспорт.Вставить("Счетчик", Лимит.Счетчик);
    Возврат Паспорт;
КонецФункции

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры
Полный модуль управляемого пульта УчебныеРесурсы85

Модуль управляемой основной формы собственной внешней обработки в отдельной файловой учебной базе на VM.

&НаКлиенте
Процедура ВыполнитьОперацию85(Команда)
    Операция = Команда.Имя;
    Если Операция = "Создать85" И ПрофильUUID = "" Тогда
        ПрофильUUID = Строка(Новый УникальныйИдентификатор);
    КонецЕсли;
    Если Операция = "Восстановить85" И ПрофильUUID <> "" Тогда
        ВызватьИсключение "У пульта уже есть профиль; не заменяйте его восстановленным ключом";
    КонецЕсли;
    КлючВызова = ПрофильUUID;
    Если Операция = "Восстановить85" Тогда
        КлючВызова = КлючВосстановления;
    КонецЕсли;
    Попытка
        Отчет = ВыполнитьНаСервере85(Операция, ПортRAS, ИмяАгента, ПарольАгента, UUIDКластера,
            ИмяАдминистратора, ПарольАдминистратора, КлючВызова, ПодтвержденСвойRAS);
        Если Операция = "Восстановить85" Тогда
            ПрофильUUID = Отчет.ПрофильUUID;
        КонецЕсли;
        Если Операция = "Каталог85" Тогда
            UUIDКластера = Отчет.UUIDКластера;
            Сообщить("Настоящий UUID собственного кластера: " + UUIDКластера);
        Иначе
            Сообщить("Свой профиль: " + Отчет.ПрофильUUID);
            Сообщить("Счетчик существует: " + Строка(Отчет.СчетчикСуществует));
            Сообщить("Лимит существует: " + Строка(Отчет.ЛимитСуществует));
            Сообщить("Накопленных показаний: " + Строка(Отчет.НакопленныхПоказаний));
            Для Каждого Поле Из Отчет.ПаспортЛимита Цикл
                Сообщить(Поле.Ключ + ": " + Строка(Поле.Значение));
            КонецЦикла;
        КонецЕсли;
    Исключение
        Сообщить("Операция не подтверждена. Сохраните свой UUID, проверьте расхождение в серверном отладчике без публикации паролей. Частичная запись могла остаться; чтение и удаление выполняйте только по этому ключу");
    КонецПопытки;
    ПарольАгента = "";
    ПарольАдминистратора = "";
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере85(Операция, ПортRAS, ИмяАгента, ПарольАгента, UUIDКластера,
    ИмяАдминистратора, ПарольАдминистратора, КлючВызова, ПодтвержденСвойRAS)
    Возврат УчебныеРесурсыRAS85.Выполнить85(Операция, ПортRAS, ИмяАгента, ПарольАгента, UUIDКластера,
        ИмяАдминистратора, ПарольАдминистратора, КлючВызова, ПодтвержденСвойRAS);
КонецФункции

Разбор по шагам

  1. Введите фактический порт ras и собственные учетные данные. Каталог85 читает единственный учебный кластер и показывает его реальный UUID. Для остальных операций требуется точное совпадение UUID и имени, а также успешная аутентификация кластера.

  2. Нажмите Создать85. Пульт сначала сохраняет свой UUID. Сервер проверяет отсутствие обоих UUID-имен. При занятом или частично созданном профиле существующие настройки не перезаписываются. Собственный счетчик-образец определяется по точному имени и описанию.

  3. Фабрика кластера создает новый счетчик с пустыми свойствами. Код назначает свое имя/описание, группировку Пользователи, ВсеВыбранные и собственный строковый отбор user=Уч85РесурсыБезСеансов;. ЗначениеОтбора только записывается: это write-only свойство. Длительность берется из принятого сервером образца, все11 измерений явно включены. После Записать счетчик ищется заново.

  4. Новый лимит ссылается на точное имя сохраненного счетчика. Время вызова, CPU, СУБД и сервисов задается в миллисекундах; память/дисковый ввод-вывод/трафик СУБД — в байтах; сеансы и вызовы — количественные пороги. 64*1024*1024 означает64MiB, 1024*1024 означает1MiB, не мегабит. Действие Нет не прерывает сеанс; текст СообщениеОбОшибке не доказывает его фактический показ.

  5. После записи лимит перечитывается из кластера, его имя, описание, счетчик и действие проверяются. Прочитать85 выводит фактический паспорт всех16 свойств и число реальных накопленных показаний. На пустом кластере отсутствие показаний ожидаемо; значения нагрузки и превышение порогов не выдумываются.

  6. Нажмите Изменить85. У уже сохраненного собственного лимита меняется только ДлительностьВызова с1000 на2000 миллисекунд. Записать обновляет, а не создает случайный другой объект. Свежий объект должен подтвердить2000; собственное имя не переименовывается.

  7. Очистить85 вызывает реальный ОчиститьНакопленныеЗначения только на проверенном UUID-счетчике. Отбор не передается, поскольку очищаются все экземпляры именно этого собственного счетчика. На пустом кластере уже может быть пусто: вызов очистки не доказывает, что существовали реальные измерения.

  8. Удалить85 сначала удаляет только свой лимит и повторно проверяет его отсутствие. Перед удалением своего счетчика перечитываются все ограничения: чужая ссылка на этот счетчик останавливает удаление, сам чужой лимит не меняется. После удаления счетчик ищется заново; оба флага должны стать Ложь.

  9. Если запись или ответ ras завершились ошибкой, автоматического отката нет. Собственный счетчик/лимит мог сохраниться. Не повторяйте создание с новым ключом: прочитайте и удалите только исходный UUID. При отказе удаления лимита счетчик не удаляется; исправьте свой стенд и повторите очистку по тому же ключу.

  10. Закройте пульт после подтвержденного удаления. Счетчик-образец создан вручную и не удаляется этим кодом. Его и одноразовую VM утилизируйте штатными средствами самостоятельно; чужие серверы и записи урок не трогает.

Как проверить результат

  1. После Создать85 оба флага Истина, паспорт содержит свое UUID-имя, связь со своим счетчиком, действие Нет,1000ms и64MiB. Сверьте все16 исходных значений со своей консолью; это проверка реальной записи, не проверка производительности.

  2. После Изменить85 фактически перечитанный ДлительностьВызова равен2000. Остальные пороги сверяйте с исходным паспортом; код не присваивает их при обновлении.

  3. После Удалить85 оба флага Ложь. Прочитать85 с тем же ключом не создает новых записей. Повторное Удалить85 при отсутствии обоих объектов ничего не удаляет. Восстановить85 уже отсутствующий ключ явно отклоняется.

  4. Отдельная зарегистрированная база, другой кластер/UUID, измененный паспорт, чужая зависимость, неизвестная операция, неправильный порт и неверная версия дают отказ без положительного отчета. Собственный UUID при ошибке остается для повторной диагностики.

Ожидаемый результат

Настоящие UUID-счетчик и ограничение зарегистрированы, прочитаны, порог обновлен и свои записи удалены с повторным чтением. Изменение действия на опасное, нагрузка, чужие объекты, реальные метрики и запуск в1С не подтверждались.

На что обратить внимание

  1. Это не локальный массив или файл настроек: Записать/Удалить и ОчиститьНакопленныеЗначения действительно изменяют кластер при ручном запуске. Даже Действие Нет не отменяет административную запись. Учебное имя само по себе не защищает production; необходима отдельная VM, один кластер, ноль баз, UUID и паспорта.

  2. Сигнатуры и readonly/write-only проверены по установленной справке8.5.1.1343. ЗначениеОтбора у счетчика — Только запись; код не пытается его перечитать. Подтверждение паспорта не доказывает фактический текст отбора, поэтому кластер намеренно пустой.

  3. ДлительностьНакопления счетчика и ДлительностьВызова лимита — разные параметры. Первую копируем из реального принятого образца; второй назначаем миллисекунды по нативной справке. Не переносите числовое значение длительности между полями по совпадению слова.

  4. Официальное руководство административного механизма: https://1c-dn.com/library/tutorials/1c_enterprise_administrator_guide_client_server_mode_8_3_27/ . Оно описывает связь лимита со счетчиком, значения/группировки/отбор. Используется как методическая информация более раннего релиза; точные BSL-контракты берутся только из установленного8.5.1.1343.

  5. Аутентификация агента получает аргументы Пароль, Имя; аутентификация кластера — Имя, Пароль. Это разные порядки и разные учетные записи. В коде нет COMConnector, rac.exe, запуска служб и установки серверных компонентов.

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

  7. Параллельная работа других администраторов не поддерживается: между проверкой и записью ras нет прикладной транзакции. Не меняйте собственные UUID-записи вне опыта. UUID не является криптографической защитой; паспорта и пустой отдельный кластер — ограничения учебного сценария.

  8. Ошибка удаления лимита оставляет счетчик для ручной повторной очистки; чужую зависимость автоматически не удаляют. Частичная запись и потерянный ответ не равны откату. Сохраненный ключ следует восстановить, а не заменить новым.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.