Хранилище двоичных данных

Типы · IBinaryDataStorageInfo

Определяет хранилище двоичных данных.

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

Хранилище двоичных данных (IBinaryDataStorageInfo)

Хранилище двоичных данных (IBinaryDataStorageInfo)

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

Свойства:
BinaryDataStorageType (BinaryDataStorageType)
Name (Name)

Описание:

Определяет хранилище двоичных данных.

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

Интеграция.

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

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

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

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

Подключиться к своему рабочему процессу: прочитать две строки и состав хранилищ

Через настоящий собственный COM-агент выбираем рабочий процесс, устанавливаем административное и внешнее соединения, читаем ровно две вручную подготовленные записи с расчётом 5 единиц и 800, затем полностью считаем типы возвращённых хранилищ. Код не изменяет данные или настройки.

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

Неглобальный серверный общий модуль своей будущей новой CF на Windows x64 8.5.1.1343. Native административные интерфейсы доступны в Интеграция через COM wrappers; underlying каталоговый reader доступен Внешнее соединение. Локальная арифметика и глобальные BSL функции выполняются на сервере.

Подготовка

  1. Это код будущего ручного опыта. Здесь 1С, COM, рабочий процесс, сеть и база не запускались. Нужна новая собственная изолированная Windows x64 VM с 8.5.1.1343, отдельным новым агентом/кластером и собственной серверной ИБ. Не используйте рабочий кластер и не регистрируйте новую базу внутри общего чужого кластера.

  2. Администратор будущего стенда вручную заранее устанавливает и регистрирует доверенный V85.COMConnector нужной версии и разрядности, готовит собственный агент на 127.0.0.1:1540, кластер и отдельные реальные учебные учётные записи. Код ничего не устанавливает, не регистрирует и не назначает прав; наличие ProgID не проверяет версию DLL.

  3. В собственной консоли администрирования создайте только будущую свою учебную серверную ИБ с точным именем owned-work-process85-31ac8d49. Это имя регистрации ИБ, а не только название ярлыка запуска. Создайте в ней новую пустую CF: Имя = УчебныйРабочийПроцесс85; Версия = OWN85:working-process:readonly; Основной режим запуска = Управляемое приложение; Режим совместимости = Не использовать. Расширения, общие реквизиты, регламентные задания и обработчики запуска не добавляйте.

  4. В новой CF → Справочники создайте УчебныеМатериалы85, без иерархии, владельцев, табличных частей и предопределённых элементов. Тип кода = Строка, длина кода 2, автонумерация выключена; длина наименования 25. Добавьте Количество85: Число, длина 9, точность 0; Цена85: Число, длина 12, точность 2. Создайте свою подсистему УчебныйПроцесс85 и включите справочник. Обновляйте только свою новую учебную базу.

  5. В будущем своей штатной формой справочника вручную создайте ровно две записи: A1 / Фанера / Количество85 = 2 / Цена85 = 250; A2 / Краска / Количество85 = 3 / Цена85 = 100. Другие записи не создавайте. Запись этих двух строк относится только к ручной подготовке; приведённый код их не создаёт и не изменяет.

  6. Администратор вручную готовит своего пользователя этой ИБ с административным доступом и чтением собственного справочника. Конкретные минимальные права не обещаются. В уроке используются только реальные собственные непустые имена и пароли агента, кластера и этой ИБ; чужие учётные данные запрещены. Для полного опыта нужен заранее подготовленный собственный изолированный стенд с существующим непустым списком хранилищ. Урок не создаёт хранилища, не включает и не перенастраивает их ради результата; пустой возвращённый список означает неподготовленный стенд и СТОП.

  7. Общие → Общие модули: создайте РабочийПроцесс85Сервер. Сервер = Да; Глобальный, Привилегированный, ВызовСервера, Клиент (управляемое приложение), Клиент (обычное приложение), ВнешнееСоединение = Нет; ПовторноеИспользованиеВозвращаемыхЗначений = НеИспользовать. В пустой модуль вставьте весь основной код. Его вызывает своя серверная функция формы, не прямой клиентский вызов общего модуля.

  8. Общие → Общие формы: создайте управляемую РабочийПроцесс85. Строка, длина 0: ИмяКластера85, СерверКластера85, СерверПроцесса85, PIDПроцесса85, АдминистраторАгента85, ПарольАгента85, АдминистраторКластера85, ПарольКластера85, ПользовательИБ85, ПарольИБ85, Результат85. ПортКластера85 и ПортПроцесса85: Число, длина 5, точность 0. Согласие85 и Остановка85: Булево. Остановка85 не выводится для редактирования, сбросов и обработчиков открытия не создавайте. Фактическое начальное Ложь проверяется кодом, значение редактора не предполагается.

  9. Выведите поля выбора и учётных данных. У трёх парольных полей РежимПароля = Да. Согласие85 — флажок однократного подключения только к своему изолированному стенду. Результат85 — многострочное поле, ТолькоПросмотр = Да. АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать; СохранениеДанныхВНастройках = НеИспользовать, это два разных перечисления, не Булево.

  10. В форме → Команды создайте Прочитать85: Действие = Прочитать85; ИспользованиеТекущейСтроки и ИспользованиеВыделенныхСтрок = НеИспользует. Добавьте кнопку. Блок «Модуль своей формы» вставьте целиком вместо пустого обработчика. Общие → Общие команды: создайте ОткрытьРабочийПроцесс85 без параметра, включите в свою подсистему и вставьте отдельный блок модуля команды ниже. Он только открывает свою форму.

  11. В будущей своей консоли администрирования перепишите фактические ClusterName, HostName и MainPort кластера, а также HostName, MainPort и строковый PID одного собственного активного рабочего процесса на той же VM. Порт процесса динамический; не подставляйте 1540 агента, 1541 кластера или 1545 RAS по привычке. Вводите значения без изменения регистра. Имя, версия и PID — признаки выбора, не доказательство владения сервером. Если изоляция, права, регистрация COM или подготовка не подтверждены — не ставьте согласие и остановитесь.

&НаСервере
Функция ПрочитатьРабочийПроцесс85(Знач ИмяКластера85, Знач СерверКластера85, Знач ПортКластера85, Знач СерверПроцесса85, Знач ПортПроцесса85, Знач PIDПроцесса85, Знач АдминистраторАгента85, Знач ПарольАгента85, Знач АдминистраторКластера85, Знач ПарольКластера85, Знач ПользовательИБ85, Знач ПарольИБ85, Знач Подтверждено85) Экспорт
    Если ТипЗнч(Подтверждено85) <> Тип("Булево") Или Не Подтверждено85 Тогда
        ВызватьИсключение "Подключение к своему стенду не подтверждено";
    КонецЕсли;
    Среда85 = Новый СистемнаяИнформация;
    Если Среда85.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
        ВызватьИсключение "Нужна серверная часть 8.5.1.1343 на своей Windows x64 VM";
    КонецЕсли;
    Если ТипЗнч(ИмяКластера85) <> Тип("Строка") Или ТипЗнч(СерверКластера85) <> Тип("Строка")
        Или ТипЗнч(СерверПроцесса85) <> Тип("Строка") Или ТипЗнч(PIDПроцесса85) <> Тип("Строка")
        Или ТипЗнч(АдминистраторАгента85) <> Тип("Строка") Или ТипЗнч(ПарольАгента85) <> Тип("Строка")
        Или ТипЗнч(АдминистраторКластера85) <> Тип("Строка") Или ТипЗнч(ПарольКластера85) <> Тип("Строка")
        Или ТипЗнч(ПользовательИБ85) <> Тип("Строка") Или ТипЗнч(ПарольИБ85) <> Тип("Строка") Тогда
        ВызватьИсключение "Не подтверждены строковые параметры своего стенда";
    КонецЕсли;
    Если ПустаяСтрока(ИмяКластера85) Или ПустаяСтрока(СерверКластера85) Или ПустаяСтрока(СерверПроцесса85)
        Или ПустаяСтрока(PIDПроцесса85) Или ПустаяСтрока(АдминистраторАгента85) Или ПустаяСтрока(ПарольАгента85)
        Или ПустаяСтрока(АдминистраторКластера85) Или ПустаяСтрока(ПарольКластера85)
        Или ПустаяСтрока(ПользовательИБ85) Или ПустаяСтрока(ПарольИБ85) Тогда
        ВызватьИсключение "Нужны настоящие собственные параметры и непустые учебные пароли";
    КонецЕсли;
    Если ТипЗнч(ПортКластера85) <> Тип("Число") Или ТипЗнч(ПортПроцесса85) <> Тип("Число") Тогда
        ВызватьИсключение "Порты должны быть числами";
    КонецЕсли;
    Если Цел(ПортКластера85) <> ПортКластера85 Или ПортКластера85 < 1 Или ПортКластера85 > 65535
        Или Цел(ПортПроцесса85) <> ПортПроцесса85 Или ПортПроцесса85 < 1 Или ПортПроцесса85 > 65535 Тогда
        ВызватьИсключение "Укажите фактические целые положительные IP-порты";
    КонецЕсли;
    Соединитель85 = Новый COMОбъект("V85.COMConnector");
    Если ТипЗнч(Соединитель85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Не получен штатный локальный COM-соединитель";
    КонецЕсли;
    Агент85 = Соединитель85.ConnectAgent("127.0.0.1:1540");
    Если ТипЗнч(Агент85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Не получено соединение с собственным агентом";
    КонецЕсли;
    Агент85.AuthenticateAgent(АдминистраторАгента85, ПарольАгента85);
    МассивКластеров85 = Агент85.GetClusters();
    Если ТипЗнч(МассивКластеров85) <> Тип("COMSafeArray") Тогда
        ВызватьИсключение "Агент не вернул COMSafeArray кластеров";
    КонецЕсли;
    Кластеры85 = МассивКластеров85.Выгрузить();
    Если ТипЗнч(Кластеры85) <> Тип("Массив") Тогда
        ВызватьИсключение "Не получен массив кластеров";
    КонецЕсли;
    НайденоКластеров85 = 0;
    Кластер85 = Неопределено;
    Для Каждого КандидатКластера85 Из Кластеры85 Цикл
        Если ТипЗнч(КандидатКластера85) <> Тип("COMОбъект") Тогда
            ВызватьИсключение "Вместо кластера получен иной объект";
        КонецЕсли;
        ИмяКандидата85 = КандидатКластера85.ClusterName;
        СерверКандидата85 = КандидатКластера85.HostName;
        ПортКандидата85 = КандидатКластера85.MainPort;
        Если ТипЗнч(ИмяКандидата85) <> Тип("Строка") Или ТипЗнч(СерверКандидата85) <> Тип("Строка")
            Или ТипЗнч(ПортКандидата85) <> Тип("Число") Тогда
            ВызватьИсключение "Не подтверждены признаки кластера";
        КонецЕсли;
        Если ИмяКандидата85 = ИмяКластера85 И СерверКандидата85 = СерверКластера85 И ПортКандидата85 = ПортКластера85 Тогда
            НайденоКластеров85 = НайденоКластеров85 + 1;
            Кластер85 = КандидатКластера85;
        КонецЕсли;
    КонецЦикла;
    Если НайденоКластеров85 <> 1 Или ТипЗнч(Кластер85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Свой кластер не выбран однозначно";
    КонецЕсли;
    Агент85.Authenticate(Кластер85, АдминистраторКластера85, ПарольКластера85);
    МассивПроцессов85 = Агент85.GetWorkingProcesses(Кластер85);
    Если ТипЗнч(МассивПроцессов85) <> Тип("COMSafeArray") Тогда
        ВызватьИсключение "Не получен COMSafeArray рабочих процессов";
    КонецЕсли;
    Процессы85 = МассивПроцессов85.Выгрузить();
    Если ТипЗнч(Процессы85) <> Тип("Массив") Тогда
        ВызватьИсключение "Не получен массив рабочих процессов";
    КонецЕсли;
    НайденоПроцессов85 = 0;
    Процесс85 = Неопределено;
    Для Каждого КандидатПроцесса85 Из Процессы85 Цикл
        Если ТипЗнч(КандидатПроцесса85) <> Тип("COMОбъект") Тогда
            ВызватьИсключение "Вместо процесса получен иной объект";
        КонецЕсли;
        ХостКандидата85 = КандидатПроцесса85.HostName;
        ПортПроцессаКандидата85 = КандидатПроцесса85.MainPort;
        PIDКандидата85 = КандидатПроцесса85.PID;
        Если ТипЗнч(ХостКандидата85) <> Тип("Строка") Или ТипЗнч(ПортПроцессаКандидата85) <> Тип("Число")
            Или ТипЗнч(PIDКандидата85) <> Тип("Строка") Тогда
            ВызватьИсключение "Не подтверждены признаки рабочего процесса";
        КонецЕсли;
        Если ХостКандидата85 = СерверПроцесса85 И ПортПроцессаКандидата85 = ПортПроцесса85 И PIDКандидата85 = PIDПроцесса85 Тогда
            НайденоПроцессов85 = НайденоПроцессов85 + 1;
            Процесс85 = КандидатПроцесса85;
        КонецЕсли;
    КонецЦикла;
    Если НайденоПроцессов85 <> 1 Или ТипЗнч(Процесс85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Свой процесс не выбран однозначно";
    КонецЕсли;
    ФактическийХост85 = Процесс85.HostName;
    ФактическийПорт85 = Процесс85.MainPort;
    ФактическийPID85 = Процесс85.PID;
    Если ТипЗнч(ФактическийХост85) <> Тип("Строка") Или ТипЗнч(ФактическийПорт85) <> Тип("Число")
        Или ТипЗнч(ФактическийPID85) <> Тип("Строка") Или ФактическийХост85 <> СерверПроцесса85
        Или ФактическийПорт85 <> ПортПроцесса85 Или ФактическийPID85 <> PIDПроцесса85 Тогда
        ВызватьИсключение "Повторные признаки процесса не совпали";
    КонецЕсли;
    ПортТекст85 = Формат(ФактическийПорт85, "Л=en_US;ЧГ=0;ЧДЦ=0");
    Если ТипЗнч(ПортТекст85) <> Тип("Строка") Или СтрДлина(ПортТекст85) < 1 Или СтрДлина(ПортТекст85) > 5 Тогда
        ВызватьИсключение "Порт не представлен короткой строкой цифр";
    КонецЕсли;
    Для Позиция85 = 1 По СтрДлина(ПортТекст85) Цикл
        Цифра85 = Сред(ПортТекст85, Позиция85, 1);
        Если СтрНайти("0123456789", Цифра85) = 0 Тогда
            ВызватьИсключение "В порте есть символ, отличный от ASCII цифры";
        КонецЕсли;
    КонецЦикла;
    РабочееСоединение85 = Соединитель85.ConnectWorkingProcess("tcp://127.0.0.1:" + ПортТекст85);
    Если ТипЗнч(РабочееСоединение85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Не получено административное соединение с процессом";
    КонецЕсли;
    РабочееСоединение85.AuthenticateAdmin(АдминистраторКластера85, ПарольКластера85);
    МассивБаз85 = РабочееСоединение85.GetInfoBases();
    Если ТипЗнч(МассивБаз85) <> Тип("COMSafeArray") Тогда
        ВызватьИсключение "Не получен COMSafeArray информационных баз";
    КонецЕсли;
    Базы85 = МассивБаз85.Выгрузить();
    Если ТипЗнч(Базы85) <> Тип("Массив") Тогда
        ВызватьИсключение "Не получен массив информационных баз";
    КонецЕсли;
    НайденоБаз85 = 0;
    База85 = Неопределено;
    Для Каждого КандидатБазы85 Из Базы85 Цикл
        Если ТипЗнч(КандидатБазы85) <> Тип("COMОбъект") Тогда
            ВызватьИсключение "Вместо описания ИБ получен иной объект";
        КонецЕсли;
        ИмяБазы85 = КандидатБазы85.Name;
        Если ТипЗнч(ИмяБазы85) <> Тип("Строка") Тогда
            ВызватьИсключение "Имя ИБ не является строкой";
        КонецЕсли;
        Если ИмяБазы85 = "owned-work-process85-31ac8d49" Тогда
            НайденоБаз85 = НайденоБаз85 + 1;
            База85 = КандидатБазы85;
        КонецЕсли;
    КонецЦикла;
    Если НайденоБаз85 <> 1 Или ТипЗнч(База85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Собственная учебная ИБ не выбрана однозначно";
    КонецЕсли;
    РабочееСоединение85.AddAuthentication(ПользовательИБ85, ПарольИБ85);
    СоединениеИБ85 = РабочееСоединение85.Connect(База85, ПользовательИБ85, ПарольИБ85);
    Если ТипЗнч(СоединениеИБ85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Не получено внешнее соединение с собственной ИБ";
    КонецЕсли;
    Справочники85 = СоединениеИБ85.Справочники;
    Если ТипЗнч(Справочники85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Не получен менеджер справочников своей ИБ";
    КонецЕсли;
    Материалы85 = Справочники85.УчебныеМатериалы85;
    Если ТипЗнч(Материалы85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Не получен свой менеджер УчебныеМатериалы85";
    КонецЕсли;
    Выборка85 = Материалы85.Выбрать();
    Если ТипЗнч(Выборка85) <> Тип("COMОбъект") Тогда
        ВызватьИсключение "Не получена настоящая выборка своего справочника";
    КонецЕсли;
    Отчет85 = Новый Массив;
    Отчет85.Добавить("Прочитаны данные собственной учебной ИБ. Адрес процесса: tcp://127.0.0.1:" + ПортТекст85 + "; выбранный PID: " + ФактическийPID85);
    СтрокМатериалов85 = 0;
    ВиделиПервую85 = Ложь;
    ВиделиВторую85 = Ложь;
    ВсегоКоличество85 = 0;
    ВсегоСумма85 = 0;
    Пока Истина Цикл
        ЕстьСтрока85 = Выборка85.Следующий();
        Если ТипЗнч(ЕстьСтрока85) <> Тип("Булево") Тогда
            ВызватьИсключение "Next не вернул логическое значение";
        КонецЕсли;
        Если Не ЕстьСтрока85 Тогда
            Прервать;
        КонецЕсли;
        Код85 = Выборка85.Код;
        Наименование85 = Выборка85.Наименование;
        Количество85 = Выборка85.Количество85;
        Цена85 = Выборка85.Цена85;
        Если ТипЗнч(Код85) <> Тип("Строка") Или ТипЗнч(Наименование85) <> Тип("Строка")
            Или ТипЗнч(Количество85) <> Тип("Число") Или ТипЗнч(Цена85) <> Тип("Число") Тогда
            ВызватьИсключение "Не подтверждены типы собственных учебных полей";
        КонецЕсли;
        Если Код85 = "A1" Тогда
            Если ВиделиПервую85 Или Наименование85 <> "Фанера" Или Количество85 <> 2 Или Цена85 <> 250 Тогда
                ВызватьИсключение "Первая собственная учебная строка неверна или повторяется";
            КонецЕсли;
            ВиделиПервую85 = Истина;
        ИначеЕсли Код85 = "A2" Тогда
            Если ВиделиВторую85 Или Наименование85 <> "Краска" Или Количество85 <> 3 Или Цена85 <> 100 Тогда
                ВызватьИсключение "Вторая собственная учебная строка неверна или повторяется";
            КонецЕсли;
            ВиделиВторую85 = Истина;
        Иначе
            ВызватьИсключение "В собственном учебном справочнике есть посторонняя строка";
        КонецЕсли;
        СуммаСтроки85 = Количество85 * Цена85;
        ВсегоКоличество85 = ВсегоКоличество85 + Количество85;
        ВсегоСумма85 = ВсегоСумма85 + СуммаСтроки85;
        СтрокМатериалов85 = СтрокМатериалов85 + 1;
        Отчет85.Добавить(Код85 + " / " + Наименование85 + ": " + Строка(Количество85) + " × " + Строка(Цена85) + " = " + Строка(СуммаСтроки85));
    КонецЦикла;
    Если СтрокМатериалов85 <> 2 Или Не ВиделиПервую85 Или Не ВиделиВторую85
        Или ВсегоКоличество85 <> 5 Или ВсегоСумма85 <> 800 Тогда
        ВызватьИсключение "Полное чтение двух собственных строк не подтверждено";
    КонецЕсли;
    Отчет85.Добавить("Всего фактически прочитано строк: " + Строка(СтрокМатериалов85) + "; единиц: " + Строка(ВсегоКоличество85) + "; сумма: " + Строка(ВсегоСумма85));
    МассивХранилищ85 = РабочееСоединение85.GetInfoBaseBinaryDataStorages(База85);
    Если ТипЗнч(МассивХранилищ85) <> Тип("COMSafeArray") Тогда
        ВызватьИсключение "Не получен COMSafeArray описаний хранилищ";
    КонецЕсли;
    Хранилища85 = МассивХранилищ85.Выгрузить();
    Если ТипЗнч(Хранилища85) <> Тип("Массив") Тогда
        ВызватьИсключение "Не получен массив описаний хранилищ";
    КонецЕсли;
    ЧислоХранилищ85 = Хранилища85.Количество();
    Если ЧислоХранилищ85 = 0 Тогда
        ВызватьИсключение "Стенд не подготовлен: для полного опыта нужен фактический непустой список хранилищ";
    КонецЕсли;
    Встроенных85 = 0;
    Внешних85 = 0;
    Неизвестных85 = 0;
    Для Каждого Хранилище85 Из Хранилища85 Цикл
        Если ТипЗнч(Хранилище85) <> Тип("COMОбъект") Тогда
            ВызватьИсключение "Вместо описания хранилища получен иной объект";
        КонецЕсли;
        ИмяХранилища85 = Хранилище85.Name;
        КодХранилища85 = Хранилище85.BinaryDataStorageType;
        Если ТипЗнч(ИмяХранилища85) <> Тип("Строка") Или ТипЗнч(КодХранилища85) <> Тип("Число") Тогда
            ВызватьИсключение "Не подтверждены два поля описания хранилища";
        КонецЕсли;
        Если КодХранилища85 = 0 Тогда
            Встроенных85 = Встроенных85 + 1;
            НазначениеХранилища85 = "встроенное";
        ИначеЕсли КодХранилища85 = 1 Тогда
            Внешних85 = Внешних85 + 1;
            НазначениеХранилища85 = "внешнее";
        Иначе
            Неизвестных85 = Неизвестных85 + 1;
            НазначениеХранилища85 = "неизвестный код, значение не угадывается";
        КонецЕсли;
        Отчет85.Добавить("Хранилище: " + ИмяХранилища85 + "; код " + Строка(КодХранилища85) + "; " + НазначениеХранилища85);
    КонецЦикла;
    Если Встроенных85 + Внешних85 + Неизвестных85 <> ЧислоХранилищ85 Тогда
        ВызватьИсключение "Полный обход массива хранилищ не подтвержден";
    КонецЕсли;
    Отчет85.Добавить("Возвращено описаний хранилищ: " + Строка(ЧислоХранилищ85) + "; встроенных: " + Строка(Встроенных85) + "; внешних: " + Строка(Внешних85) + "; неизвестных: " + Строка(Неизвестных85));
    Отчет85.Добавить("Данные и настройки не записывались кодом. Чтения последовательные: это не атомарный снимок и не гарантия привязки PID к подключению во время изменения процесса.");
    Возврат СтрСоединить(Отчет85, Символы.ПС);
КонецФункции
Модуль своей формы РабочийПроцесс85

Общие → Общие формы → РабочийПроцесс85 → пустой модуль формы; команда связана через Действие, оба сохранения НеИспользовать.

Настоящая клиентская команда с очисткой отчёта/паролей и расходованием захваченного Boolean до RPC; своя серверная функция формы без контекста передаёт все 13 аргументов.

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

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

Общие → Общие команды → ОткрытьРабочийПроцесс85 → пустой модуль команды; без параметра, видима в своей подсистеме.

Штатная клиентская ОбработкаКоманды с двумя потреблёнными параметрами; только открытие своей формы, не автоматическое COM подключение.

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

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

  1. Начните с формы собственной команды. Введите реальные признаки своего кластера и процесса и собственные учётные данные; проверьте, что не выбрали рабочий сервер. После однократного согласия нажмите Прочитать85. Старый отчёт и парольные поля очищаются до проверки и до вызова сервера; согласие расходуется, повтор блокируется до RPC.

  2. Сначала создаётся новый локальный COM-соединитель. Подключение к агенту даёт реальный список кластеров, а Authenticate выбирает контекст своего удержанного кластера. GetWorkingProcesses возвращает описания процессов; каждый COMSafeArray явно выгружается в настоящий Массив, не обходится как неизвестный объект.

  3. Выбирается один фактический процесс по хосту, динамическому порту и строковому PID. Порт форматируется локально на сервере и проверяется посимвольно как 1–5 ASCII цифр. Именно Менеджер COM-соединений, а не агент, выполняет ConnectWorkingProcess. Это административное соединение с процессом, ещё не соединение для чтения справочника.

  4. AuthenticateAdmin выполняет аутентификацию своего администратора кластера. GetInfoBases возвращает реальные IInfoBaseInfo; удерживается ровно один объект с именем собственной зарегистрированной ИБ. AddAuthentication использует своего администратора этой ИБ, а Connect с тем же объектом и учётными данными возвращает внешнее соединение. Никакие пустые описания ИБ или неизвестные экспортные функции не создаются.

  5. Из настоящего внешнего соединения получаем менеджер своего справочника и Выбрать(). Сначала каждый Следующий() должен вернуть Булево; поля читаются только после Истина. Две свои строки распознаются по коду, а не номеру позиции. Фактические Количество85 и Цена85 перемножаются и суммируются: 2 × 250 + 3 × 100 = 800, количество 5. Неверная, лишняя, повторная или отсутствующая строка даёт СТОП.

  6. GetInfoBaseBinaryDataStorages получает описания хранилищ той же удержанной ИБ. Если фактический массив пустой, полный опыт прекращается как неподготовленный: поля описания хранилища не были прочитаны. Непустой массив обходится целиком; Name читается как Строка, BinaryDataStorageType как Число. Код 0 означает встроенное, 1 — внешнее, другие значения показываются как неизвестные. Сумма трёх счётчиков сравнивается с Количество() реального массива. Ничего не включается, не очищается и не копируется.

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

  1. Только после будущего успешного ручного запуска ожидаются две фактические строки A1 и A2, суммы 500 и 300, количество 5 и общий итог 800. Порядок строк может отличаться. Откройте свой справочник: reader не изменил эти записи.

  2. Адрес в отчёте содержит фактический порт собственного процесса, а не порт агента/кластера/RAS. PID подписан как выбранный, не как атомарно доказанная идентичность соединения. После перезапуска своего процесса старые признаки не исправляются кодом.

  3. У состава хранилищ нет заранее обещанных имён, количества или размеров. Для положительного полного опыта фактический список должен быть непустым: все элементы показаны, счётчики в сумме равны реальной длине массива. Пустой массив даёт СТОП, а не успешный полный отчёт по семи API; он не доказывает отсутствие или доступность физического хранилища.

  4. Пароли исчезают из полей формы до RPC и не появляются в отчёте или техническом тексте ошибки. Результат ошибки — СТОП, без успешного итога и без повторного подключения. Повтор на этой же форме запрещён и после успеха.

  5. Не проверяйте ошибку отключением клиента, созданием чужих соединений или изменением рабочих данных. Разбор неправильных типов, лишних строк и порядка вызовов здесь статический; 1С и COM не запускались.

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

После будущего успешного ручного опыта показаны фактические две учебные строки, 5 единиц и 800, а также весь фактический непустой состав хранилищ с проверенным числом описаний. При пустом массиве хранилищ стенд считается неподготовленным, полный опыт прекращается без успешного отчёта. Данные не записывались приведённым кодом. Это не атомарный снимок, проверка исправности сервера или обещание мгновенного освобождения соединений. Запуск в 1С не проверялся.

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

  1. ConnectWorkingProcess — метод Менеджера COM-соединений. GetWorkingProcesses — метод агента и возвращает описания процессов. Connect рабочего соединения возвращает внешнее соединение с ИБ. Это три разные роли, их нельзя заменить одним неизвестным ИсходныйОбъект.

  2. Интеграционные интерфейсы представлены настоящими COMОбъектами. Не вызывайте Новый КластерСерверов или Тип("Информационная база") в серверном BSL. Каталоговые методы работают через документированный контекст внешнего соединения; ТипЗнч, Формат, Сред, СтрДлина и арифметика выполняются локально в серверном модуле, не через СоединениеИБ85.Формат.

  3. Native GetInfoBases допускает Name и Descr без аутентификации, а страница самого IInfoBaseInfo иначе формулирует права на свойства. Урок читает только Name, не скрывает расхождение и не выводит пароль или параметры СУБД.

  4. AuthenticateAdmin документирует необходимость для создания ИБ. Урок только читает: он не обещает обязательность этого вызова для всех getter или минимальные права. Аутентификация и Connect могут создавать сеансы и внутренние записи платформы; это не чисто операция в памяти.

  5. Disconnect аварийно завершает клиентское приложение. Он НЕ Close для наших COM-объектов и здесь отсутствует. CreateInfoBaseInfo создаёт описание в памяти, но оно не нужно этому reader. Нет CreateInfoBase, DropInfoBase, UpdateInfoBase, очистки, резервных копий, восстановления, регистрации и setters административных свойств.

  6. Чтения не транзакционный или атомарный снимок. Процесс может измениться между получением описания, подключением и чтением данных; сравнение PID не доказывает неизменность во время гонки. Нет монополии, блокировок, опроса или повторного подключения.

  7. Очищенные строки паролей не означают гарантированного стирания памяти или запрета внутреннего аудита. Не выдумывайте Close/Dispose/logout для этих интерфейсов: мгновенное освобождение COM, сеанса или платформенных ресурсов не обещается. После ошибки native recovery/cleanup не вызывается.

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

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

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

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

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