ИнформацияЭкранаКлиента

Типы · ClientDisplayInformation

Предназначен для описания экрана устройства.

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

ИнформацияЭкранаКлиента (ClientDisplayInformation)

ИнформацияЭкранаКлиента (ClientDisplayInformation)

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

Свойства:
DPI (DPI)
Высота (Height)
Ширина (Width)

Описание:

Предназначен для описания экрана устройства.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

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

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

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

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

Рассчитать свое учебное полотно и локальную сводку без раскрытия IP/MAC

Настоящие сведения клиентской платформы используются для конкретного расчета четырех карточек и локальных счетчиков. FixedArray экранов и Promise-массив адаптеров не заменяются неизвестными объектами. Нулевые/пустые данные и ограничения интерпретации объясняются отдельно.

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

Полный модуль собственной управляемой формы новой пустой файловойCF8.5.1.1343. Толстый управляемый Windowsx64 клиент; сервер только проверяет metadata guard. Actualsystemcalls/UI/1C/files/DB/network0.

Подготовка

  1. Создайте новую собственную пустую файловую ИБ платформы 8.5.1.1343. Имя корня CF — УчебнаяЛокальнаяСводкаКлиента85. Русский встроенный язык, управляемое приложение, совместимость «Не использовать». Никаких рабочих конфигураций, реальных документов и внешних сервисов.

  2. Конфигурация не содержит справочников, документов, регистров, планов, задач, общих реквизитов, заданий, подписок и внешних источников. Нет расширений БД и сеанса. Полный guard проверяет все эти условия, три источника расширений и отсутствие транзакции.

  3. Используйте собственную новую VM и толстый управляемый Windows x64 клиент под учебным профилем. Здесь VM/настройки ОС не создавались и системные API не вызывались. Сам урок при вашем будущем запуске только читает локальные сведения; сетевых запросов и подключения к внешнему серверу нет.

  4. Создайте внешнюю обработку OwnClientLayoutInfo85 с одной управляемой формой. Реквизиты: ПодтверждаюСвойСтенд85 — Булево, начально Ложь; Занято85 — Булево, начально Ложь, ТолькоПросмотр; Итог85 — Строка неограниченной длины, многострочная, ТолькоПросмотр. Добавьте команду и кнопку РассчитатьСвоюСводку85.

  5. Вставьте весь модуль формы. Асинх обработчик команды действительно делает Ждать ПолучитьИнформациюОСетевыхАдаптерахАсинх(), а экранные данные получает напрямую у клиентской платформы. Конструкторов экранов и адаптеров нет; настоящие объекты приходят только из native результатов.

  6. Задача: рассчитать учебную модель полотна из четырех карточек240×120 при базе96DPI, с внешним полем24. При известном DPI величины масштабируются и округляются до целых точек. Модель в памяти не меняет геометрию настоящей формы, параметры Windows, разрешение экранов или шрифты.

  7. ПолучитьИнформациюЭкрановКлиента возвращает ФиксированныйМассив, либо Неопределено для сеанса без клиента. Код различает Неопределено, пустой фиксированный массив и реальные объекты. Он не создает вместо них выдуманный массив, основной экран или DPI=96.

  8. Родная справка описывает первый элемент массива как основной экран. Этот урок не сверяет основной монитор ОС, не связывает элемент с текущим окном и не получает рабочую область. Все элементы просто нумеруются в порядке фактического массива; расчет — только по их возвращенным измерениям.

  9. Ширина и высота native выдаются в исходной ориентации, без учета поворота. Нельзя объявлять их текущими размерами окна или фактической доступной областью для формы. DPI означает число точек на дюйм, но не доказывает физические размеры или качество изображения.

  10. DPI=0 — неизвестный масштаб, не подтвержденные96DPI. При нулевом размере или неизвестном DPI полотно не рассчитывается. Справка отдельно предупреждает, что в большинстве браузеров DPI=0; здесь веб-клиент не используется как проверенный положительный контекст.

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

  12. Экранные сведения читаются до и после Ждать адаптеров. Если количество, размеры или DPI отличаются, старый расчет не принимается и предлагается новый собственный запуск. Это не блокировка/атомарный снимок устройства и не доказательство, что среда не изменится после второй проверки.

  13. Promise адаптеров возвращает обычный Массив объектов ИнформацияОСетевомАдаптере. Пустой массив допустимо показывается как отсутствие полученных записей, но не превращается в вывод «интернета нет». Неопределено вместо обещанного массива не маскируется пустой коллекцией.

  14. IPАдрес, MACАдрес и ИмяАдаптера читаются только для подсчета непустых строк. Сами значения даже в поле результата не показываются и нигде не сохраняются. Непустая строка не валидирует адрес, не определяет IPv4/IPv6 и не доказывает доступность сервера.

  15. ЭтоТекущийАдаптер имеет тип Булево или Неопределено. Истина описывает адаптер соединения клиента, не доступ к интернету; для веб-клиента всегда Неопределено. Код отдельно считает Истина/Ложь/Неопределено и сверяет сумму с числом записей. Не требует одного текущего, уникального MAC/IP или фиксированного количества адаптеров; файловаяИБ может не иметь такого соединения.

  16. НачатьПолучениеИнформацииОСетевыхАдаптерах не применяется: установленная справка одновременно пишет возвратМассив, передачу массива в обработчик и только один ДополнительныеПараметры в списке callback. Эта арность неоднозначна; вместо догадки выбран документированный Promise-метод.

  17. Не меняйте параметры экрана или адаптеров во время одного учебного расчета. После завершения можно безопасно запустить новую read-only сводку. Второй одновременно выполняемый расчет блокируется. Ошибка не выводит подробности с адресами и не делает повторных вызовов автоматически.

  18. Actualsystemcalls/UI/1C/files/DB/network0: здесь только авторство и статические проверки по установленной HBK. Никаких реальных сведений устройства не собирали. Код не отправляет сообщения, не записывает журнал/файлы, не создает фоновых заданий, не устанавливает соединение и не меняет ОС. Root/config только читались; резервные копии и архивы не создавались.

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

&НаКлиенте
Функция ПомещаетсяСвоеПолотно85(Ширина, Высота, ПолотноШирина, ПолотноВысота, Поле)
    Если ТипЗнч(Ширина) <> Тип("Число") Или ТипЗнч(Высота) <> Тип("Число")
        Или ТипЗнч(ПолотноШирина) <> Тип("Число") Или ТипЗнч(ПолотноВысота) <> Тип("Число")
        Или ТипЗнч(Поле) <> Тип("Число") Тогда
        ВызватьИсключение "Свой геометрический расчет принимает только числа";
    КонецЕсли;
    Если Ширина <= 0 Или Высота <= 0 Или ПолотноШирина <= 0 Или ПолотноВысота <= 0 Или Поле < 0 Тогда
        ВызватьИсключение "Нужны положительные размеры и неотрицательное собственное поле";
    КонецЕсли;
    Возврат ПолотноШирина + 2 * Поле <= Ширина И ПолотноВысота + 2 * Поле <= Высота;
КонецФункции

&НаКлиенте
Функция РассчитатьЭкраны85(Экраны)
    Если Экраны = Неопределено Тогда
        Возврат Новый Структура("Подпись,Текст", "нет-клиента",
            "Экраны: native вернул Неопределено. Без связанных клиентских данных полотно не рассчитывается.");
    КонецЕсли;
    Если ТипЗнч(Экраны) <> Тип("ФиксированныйМассив") Тогда
        ВызватьИсключение "Native результат экранов — ФиксированныйМассив, не изменяемый Массив/список выдуманных структур";
    КонецЕсли;
    Если Экраны.Количество() = 0 Тогда
        Возврат Новый Структура("Подпись,Текст", "экраны-0",
            "Экраны: native фиксированный массив пуст. Размеры нельзя угадать, план не построен.");
    КонецЕсли;
    Подпись = "экраны:" + Строка(Экраны.Количество());
    Текст = "Учебная модель: четыре карточки240×120 и внешнее поле24 при базе96DPI."
        + Символы.ПС + "Расчет использует исходную ориентацию из native, не размер текущего окна или реальный интерфейс.";
    Для Индекс = 0 По Экраны.Количество() - 1 Цикл
        Экран = Экраны[Индекс];
        Если ТипЗнч(Экран) <> Тип("ИнформацияЭкранаКлиента") Тогда
            ВызватьИсключение "Нужна настоящая информация экрана из native массива";
        КонецЕсли;
        Ширина = Экран.Ширина;
        Высота = Экран.Высота;
        DPI = Экран.DPI;
        Если ТипЗнч(Ширина) <> Тип("Число") Или ТипЗнч(Высота) <> Тип("Число") Или ТипЗнч(DPI) <> Тип("Число")
            Или Ширина < 0 Или Высота < 0 Или DPI < 0 Тогда
            ВызватьИсключение "Для своей модели нужны числовые неотрицательные native измерения; неизвестные типы не приводим к0";
        КонецЕсли;
        Подпись = Подпись + "|" + Строка(Ширина) + ";" + Строка(Высота) + ";" + Строка(DPI);
        Текст = Текст + Символы.ПС + "Элемент экрана " + Строка(Индекс + 1)
            + ": native " + Строка(Ширина) + "×" + Строка(Высота) + " точек, DPI=" + Строка(DPI) + ". ";
        Если Ширина = 0 Или Высота = 0 Тогда
            Текст = Текст + "Есть нулевой размер; геометрия не рассчитывается.";
            Продолжить;
        КонецЕсли;
        Если ПомещаетсяСвоеПолотно85(Ширина, Высота, Ширина + 1, Высота, 0) Тогда
            ВызватьИсключение "Отрицательный тест: полотно шире экрана на1точку не должно поместиться";
        КонецЕсли;
        Если DPI = 0 Тогда
            Текст = Текст + "DPI не получен: 96 не подставляется. Масштабирование карточек не рассчитывается.";
            Продолжить;
        КонецЕсли;
        Масштаб = DPI / 96;
        ПолотноШирина = Окр(2 * 240 * Масштаб, 0);
        ПолотноВысота = Окр(2 * 120 * Масштаб, 0);
        Поле = Окр(24 * Масштаб, 0);
        Помещается = ПомещаетсяСвоеПолотно85(Ширина, Высота, ПолотноШирина, ПолотноВысота, Поле);
        Текст = Текст + "Собственное полотно " + Строка(ПолотноШирина) + "×" + Строка(ПолотноВысота)
            + ", поле " + Строка(Поле) + ": геометрически помещается=" + Строка(Помещается)
            + ". Не проверяет поворот, рабочую область, рамки окна, реальные шрифты или перенос строк.";
    КонецЦикла;
    Возврат Новый Структура("Подпись,Текст", Подпись, Текст);
КонецФункции

&НаКлиенте
Функция РассчитатьАдаптеры85(Адаптеры)
    Если ТипЗнч(Адаптеры) <> Тип("Массив") Тогда
        ВызватьИсключение "Результат native Promise — Массив настоящих ИнформацияОСетевомАдаптере, не Undefined или собственные структуры";
    КонецЕсли;
    Если Адаптеры.Количество() = 0 Тогда
        Возврат "Адаптеры: настоящий native массив пуст. Это не доказательство отсутствия интернета, сервера или сетевого оборудования.";
    КонецЕсли;
    ЗаполненныхIP = 0;
    ЗаполненныхMAC = 0;
    ЗаполненныхИмен = 0;
    Текущих = 0;
    НетТекущих = 0;
    Неизвестных = 0;
    Для Каждого Адаптер Из Адаптеры Цикл
        Если ТипЗнч(Адаптер) <> Тип("ИнформацияОСетевомАдаптере") Тогда
            ВызватьИсключение "Native массив должен содержать actual readonly информацию, не угаданный adapter-object";
        КонецЕсли;
        IP = Адаптер.IPАдрес;
        MAC = Адаптер.MACАдрес;
        Имя = Адаптер.ИмяАдаптера;
        Текущий = Адаптер.ЭтоТекущийАдаптер;
        Если ТипЗнч(IP) <> Тип("Строка") Или ТипЗнч(MAC) <> Тип("Строка") Или ТипЗнч(Имя) <> Тип("Строка") Тогда
            ВызватьИсключение "Native IP/MAC/имя должны быть строками; содержимое наружу не выводится";
        КонецЕсли;
        Если Не ПустаяСтрока(IP) Тогда
            ЗаполненныхIP = ЗаполненныхIP + 1;
        КонецЕсли;
        Если Не ПустаяСтрока(MAC) Тогда
            ЗаполненныхMAC = ЗаполненныхMAC + 1;
        КонецЕсли;
        Если Не ПустаяСтрока(Имя) Тогда
            ЗаполненныхИмен = ЗаполненныхИмен + 1;
        КонецЕсли;
        Если Текущий = Неопределено Тогда
            Неизвестных = Неизвестных + 1;
        ИначеЕсли ТипЗнч(Текущий) <> Тип("Булево") Тогда
            ВызватьИсключение "Native маркер текущего адаптера — только Булево либо Неопределено";
        ИначеЕсли Текущий Тогда
            Текущих = Текущих + 1;
        Иначе
            НетТекущих = НетТекущих + 1;
        КонецЕсли;
    КонецЦикла;
    Количество = Адаптеры.Количество();
    Если Текущих + НетТекущих + Неизвестных <> Количество
        Или ЗаполненныхIP > Количество Или ЗаполненныхMAC > Количество Или ЗаполненныхИмен > Количество Тогда
        ВызватьИсключение "Локальная производная сводка должна учесть каждую actual запись ровноодинраз";
    КонецЕсли;
    Возврат "Адаптеров в native массиве: " + Строка(Количество)
        + "; непустой IP: " + Строка(ЗаполненныхIP) + "; непустой MAC: " + Строка(ЗаполненныхMAC)
        + "; непустое имя: " + Строка(ЗаполненныхИмен) + Символы.ПС
        + "Native маркеры соединения клиента: Истина=" + Строка(Текущих) + ", Ложь=" + Строка(НетТекущих)
        + ", Неопределено=" + Строка(Неизвестных) + "."
        + Символы.ПС + "Количество текущих не обязано быть1. ФайловаяИБ может не иметь текущего сетевого адаптера."
        + Символы.ПС + "Непустая строка не валидирует IP/MAC/версиюIP. Маркер не доказывает интернетдоступ, маршрут, VPN, NAT или скорость."
        + Символы.ПС + "Сами IP, MAC и имена не показаны и не записаны; наружу не отправлены.";
КонецФункции

&НаКлиенте
Процедура ПроверитьСвоегоКлиента85()
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Система = Новый СистемнаяИнформация;
        Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Или Не ПодтверждаюСвойСтенд85 Тогда
            ВызватьИсключение "Только своя новая пустаяCF, подтвержденный толстый управляемый Windowsx64 клиент8.5.1.1343";
        КонецЕсли;
        ПроверитьНаСервере85();
    #Иначе
        ВызватьИсключение "Другой клиент не входит в positive маршрут этой самостоятельнойкарточки";
    #КонецЕсли
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьНаСервере85()
    ПроверитьСвойПустойСтенд();
КонецПроцедуры

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

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

  1. Подготовьте собственную пустую VM/файловуюИБ и форму с тремя реквизитами. Подтвердите только этот стенд и нажмите РассчитатьСвоюСводку85.

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

  3. Для положительных размеров проверьте заведомо слишком широкое собственное полотно. При DPI>0 рассчитайте два ряда/два столбца240×120 с полем24, масштабируя модель наDPI/96. При DPI0 не подставляйте масштаб.

  4. Ждать ПолучитьИнформациюОСетевыхАдаптерахАсинх дает настоящий обычный Массив. Проверьте тип каждого native объекта; посчитайте непустые строки, не показывая значения IP/MAC/имени.

  5. Раздельно посчитайте nullable маркеры Истина/Ложь/Неопределено и проверьте, что каждый элемент учтен один раз. Не выводите из них наличие интернета или единственного текущего адаптера.

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

  7. Второй запуск во время Ждать должен отказать. После завершения новый запуск разрешен и снова читает данные. Не подменяйте результаты вручную fake объектами и не вызывайте неоднозначный Begin-метод.

  8. Проверьте, что итог содержит только размеры, расчет полотна и количества. IP/MAC/имена, файлы, сообщения и журнал не сохраняются. Это read-only модель, не доказательство реального интерфейса или соединения.

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

  1. Screen результат отличает native FixedArray/Undefined/пустую коллекцию. Типы содержимого проверены; readonly свойства не присваиваются.

  2. Собственная геометрия использует размеры и настоящий известныйDPI; отрицательный тест слишком широкого полотна отказывает. DPI0 не превращается в96.

  3. NIC Promise дает native Array; отдельные nullable счетчики суммируются в его реальный размер. Не предполагаются один текущий, IPv4/IPv6, уникальность или интернетдоступ.

  4. Независимый второй screen read обнаруживает наблюдаемую смену данных, не обещая атомарности или постоянной актуальности.

  5. В итоговом поле только производные сведения; IP/MAC/имена не выводятся/не отправляются/не записываются. Actualsystemcalls/UI/1C/files/DB/network0.

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

Ожидаемый ручной результат: для известных размеров/DPI рассчитано собственное полотно и честная геометрическая проверка; локальные счетчики подтверждают фактические native записи без раскрытия адресов. Неизвестные данные и смена среды не объявляются готовым планом. Реальный запуск здесь не выполнялся.

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

  1. ИнформацияЭкранаКлиента — данные экрана, не текущего окна. Исходная ориентация, серверный снимок иDPI0 ограничивают выводы; не обещайте физическую точность или готовую верстку.

  2. ЭтоТекущийАдаптер — nullable маркер соединения клиента, а не тест интернета, маршрута, VPN/NAT или скорости. Пустые значения и несколько записей не являются ошибкой по умолчанию.

  3. Не создавайте эти информационные объекты собственными структурами или отсутствующими конструкторами. Источник — реальные native методы; неоднозначный Begin callback не угадывается.

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

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

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

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

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

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