Найти свою команду в двух областях интерфейса и проверить расчёт её настоящей формы

Учебные задачи

Два собственных клиента 1С: контроллер проверяет реальное дерево команд, сравнивает два непустых поиска своей кнопки, активизирует её действительную группу и нажимает только эту команду. Результат 50 + 75 читается из настоящих полей открывшейся собственной формы.

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

Полный модуль своего контроллера: клиентские процедуры в тонком /TESTMANAGER 8.5.1.1343 и серверный скалярный помощник НаСервереБезКонтекста; отдельно свой тонкий /TESTCLIENT той же новой пустой файловой базы, вручную подтверждённый loopback-порт 15391. Командная кнопка/группа приходят из настоящего собственного интерфейса.

Подготовка

  1. Только будущая ручная проверка. Здесь 1С, клиенты, соединения и интерфейс не запускались. Создайте с нуля отдельную собственную пустую файловую базу и конфигурацию УчебныйИнтерфейс12585 на платформе 8.5.1.1343, основной режим Управляемое приложение, Такси, совместимость Не использовать. Синоним корня конфигурации также УчебныйИнтерфейс12585. Без рабочих данных, расширений и чужих обработчиков.

  2. В собственной новой Windows-среде/профиле администратор вручную выделяет свободный локальный порт 15391 и подтверждает принадлежность клиентов. Только эту же свою базу открыть двумя тонкими клиентами: тестируемый с /TESTCLIENT -TPort15391, контроллер с /TESTMANAGER. Код не запускает процессы. Собственные порт и заголовок — диагностические ограничения, не аутентификация чужого клиента.

  3. Конфигуратор → Общие → Общие формы: создать управляемую КонтроллерКоманд12585. Реквизиты ПодтверждаюСвойКлиент85 — Булево, начальное значение Ложь; Протокол85 — Строка длиной 0 (неограниченная). Добавить флажок согласия и многострочное поле протокола ТолькоПросмотр. Команда формы ПроверитьКоманду85: действие одноимённое, использование текущей/выделенных строк НеИспользует. Добавить её кнопку. Основной блок целиком вставить в пустой модуль контроллера.

  4. Общие → Общие формы: создать управляемую СуммаКоманды12585. Заголовок Своя сумма12585, АвтоЗаголовок = Ложь. Первое85 и Второе85 — Число (9, 0), неотрицательное; Итого85 — Строка длиной 0. Три поля формы с внутренними именами ПервоеПоле85, ВтороеПоле85, ИтогоПоле85 связать с одноимёнными реквизитами, всем ТолькоПросмотр = Истина. Не задавать числовые форматные маски/разделители; это отдельные поля ввода, не колонки таблицы.

  5. Вставить блок расчёта в пустой модуль СуммаКоманды12585. В событиях этой формы привязать ПриОткрытии к ПриОткрытии(Отказ). Не вызывать обработчик вручную: его вызовет настоящее открытие формы. У контроллера обработчика автоматического запуска нет.

  6. У ОБЕИХ форм явно задать два разных свойства: АвтоматическоеСохранениеДанныхВНастройках = АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках = СохранениеДанныхФормыВНастройках.НеИспользовать. Переменную ПопыткаНачата85 не делать реквизитом или редактируемым полем.

  7. Создать собственную подсистему СвоиКоманды12585. Общие команды без параметра ОткрытьСуммуКоманды12585 и ОткрытьКонтроллерКоманд12585, включить в состав подсистемы. Два соответствующих полных блока вставить в пустые модули именно этих общих команд. Синоним первой строго Посчитать свои 50 и 75; синоним второй Открыть свой контроллер12585.

  8. В командном интерфейсе своего раздела расположить расчётную команду ровно один раз в панели действий. В тестируемом клиенте вручную открыть свой раздел, сделать его панель видимой; не дублировать ту же команду в других панелях. Контроллер открывать второй общей командой только в клиенте /TESTMANAGER.

  9. F7: проверить собственную конфигурацию для клиента/сервера и обновить только эту учебную базу. До теста в тестируемом клиенте не должно быть формы Своя сумма12585; основное окно должно быть активным. Вручную проверить, что его фактический заголовок содержит УчебныйИнтерфейс12585. Если оформление этого не даёт, остановиться: код не угадывает другой формат и не меняет системные заголовки.

  10. В контроллере вручную подтвердить собственный новый стенд и нажать ПроверитьКоманду85 один раз. Согласие расходуется до создания ТестируемоеПриложение и соединения. После любой попытки этот экземпляр повторно не используется; следующий опыт требует отдельной ручной подготовки новой собственной формы и отсутствия прежней формы результата.

&НаКлиенте
Перем ПопыткаНачата85;

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

&НаКлиенте
Процедура ОбойтиДерево85(Узел85, Глубина85, Группы85, Кнопки85)
    Если ТипЗнч(Узел85) <> Тип("ТестируемыйКомандныйИнтерфейсОкна")
        И ТипЗнч(Узел85) <> Тип("ТестируемаяГруппаКомандногоИнтерфейса") Тогда
        ВызватьИсключение "Нужны только реальные интерфейс и его группы";
    КонецЕсли;
    Если Глубина85 > 12 Тогда
        ВызватьИсключение "Собственное дерево слишком глубокое";
    КонецЕсли;
    Дочерние85 = Узел85.ПолучитьПодчиненныеОбъекты();
    Если ТипЗнч(Дочерние85) <> Тип("ФиксированныйМассив") Тогда
        ВызватьИсключение "Нет настоящего списка подчинённых объектов";
    КонецЕсли;
    Если Дочерние85.Количество() > 200 Или Глубина85 = 0 И Дочерние85.Количество() = 0 Тогда
        ВызватьИсключение "Нужно небольшое непустое дерево собственного интерфейса";
    КонецЕсли;
    Для Каждого Дочерний85 Из Дочерние85 Цикл
        Если ТипЗнч(Дочерний85) = Тип("ТестируемаяГруппаКомандногоИнтерфейса") Тогда
            Если ТипЗнч(Дочерний85.ТекстЗаголовка) <> Тип("Строка") Тогда
                ВызватьИсключение "Нужен настоящий заголовок группы";
            КонецЕсли;
            ОбойтиДерево85(Дочерний85, Глубина85 + 1, Группы85, Кнопки85);
        ИначеЕсли ТипЗнч(Дочерний85) = Тип("ТестируемаяКнопкаКомандногоИнтерфейса") Тогда
            ЗаголовокКнопки85 = Дочерний85.ТекстЗаголовка;
            СсылкаКнопки85 = Дочерний85.НавигационнаяСсылка;
            Если ТипЗнч(ЗаголовокКнопки85) <> Тип("Строка") Или ТипЗнч(СсылкаКнопки85) <> Тип("Строка") Тогда
                ВызватьИсключение "Нужны настоящие публичные значения кнопки";
            КонецЕсли;
            Если ЗаголовокКнопки85 = "Посчитать свои 50 и 75" Тогда
                Если СсылкаКнопки85 = "" Или ТипЗнч(Узел85) <> Тип("ТестируемаяГруппаКомандногоИнтерфейса") Тогда
                    ВызватьИсключение "Своя кнопка должна иметь ссылку и непосредственную группу";
                КонецЕсли;
                Группы85.Добавить(Узел85);
                Кнопки85.Добавить(Дочерний85);
            КонецЕсли;
        Иначе
            ВызватьИсключение "В этом простом учебном дереве найден неожиданный тип";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

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

&НаСервереБезКонтекста
Функция ИмяСвоейКонфигурации85()
    ИмяНаСервере85 = Метаданные.Имя;
    Возврат ИмяНаСервере85;
КонецФункции
Модуль своей формы СуммаКоманды12585

Своя CF → Общие → Общие формы → СуммаКоманды12585 → пустой модуль формы.

Настоящее клиентское событие ПриОткрытии(Отказ) собственной новой формы и серверный скалярный помощник НаСервереБезКонтекста; вычисляет два своих числа, выводит настоящий результат и отклоняет неверное открытие.

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

&НаСервереБезКонтекста
Функция ИмяСвоейКонфигурации85()
    ИмяНаСервере85 = Метаданные.Имя;
    Возврат ИмяНаСервере85;
КонецФункции
Модуль своей команды ОткрытьСуммуКоманды12585

Своя CF → Общие → Общие команды → ОткрытьСуммуКоманды12585 → пустой модуль.

Настоящая клиентская общая команда собственного расчёта с двумя потреблёнными параметрами события и серверным скалярным помощником НаСервере; только открывает свою форму.

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

&НаСервере
Функция ИмяСвоейКонфигурации85()
    ИмяНаСервере85 = Метаданные.Имя;
    Возврат ИмяНаСервере85;
КонецФункции
Модуль своей команды ОткрытьКонтроллерКоманд12585

Своя CF → Общие → Общие команды → ОткрытьКонтроллерКоманд12585 → пустой модуль.

Настоящая клиентская общая команда контроллера с двумя потреблёнными параметрами события и серверным скалярным помощником НаСервере; только открывает свою форму.

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

&НаСервере
Функция ИмяСвоейКонфигурации85()
    ИмяНаСервере85 = Метаданные.Имя;
    Возврат ИмяНаСервере85;
КонецФункции

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

  1. Контроллер очищает прежний протокол, запрещает повтор, захватывает настоящий Булево согласия и сразу сбрасывает флажок. Имя конфигурации читает настоящий серверный помощник: тонкий клиент получает только проверяемую строку, не объект метаданных. В формах помощник НаСервереБезКонтекста, в модулях общих команд НаСервере. После проверки своей формы/команды, двух режимов без сохранения настроек и версии создаётся настоящее ТестируемоеПриложение.

  2. После соединения настоящий объект активного окна должен иметь правильный тип, настоящий Булево Основное = Истина и собственный фактический заголовок. Командный интерфейс берётся только от этого окна. Это не конструктор группы и не неизвестный переданный объект.

  3. Полностью обходится настоящее небольшое дерево: фиксированные массивы проверяются, каждый дочерний объект распознаётся как группа или кнопка, глубина ограничена 12, детей у узла не больше 200. Из всей иерархии должны получиться ровно одна расчётная кнопка и её непосредственная действительная группа. Пустые дочерние коллекции кнопок вообще не вызываются.

  4. НайтиОбъекты вызывается отдельно у интерфейса и у найденной группы, с настоящим Типом кнопки, точным своим заголовком, пропущенным внутренним именем и таймаутом 10 секунд. Каждый реальный результат должен быть фиксированным массивом из одной настоящей кнопки; весь массив обходится, полные заголовок и непустая ссылка сверяются с независимым деревом.

  5. Активизировать вызывается у этой группы, затем Нажать у настоящей кнопки из проверенного поиска группы. Оба метода без результата: никакие Булево успеха им не приписываются. Своё действие должно открыть именно единственную форму Своя сумма12585.

  6. Форма найдена настоящим НайтиОбъекты окна. Её три отдельные поля получаются через настоящий ПолучитьОбъект именно ТестируемаяФорма, а не одноимённые методы командной группы. ПолучитьПредставлениеДанных даёт настоящий текст каждого поля; тип, полное значение и преобразование в Число проверяются.

  7. Модуль тестируемой формы действительно вычисляет Первое85 + Второе85 и выводит строку. Контроллер независимо читает её 50, 75 и результат 125, снова складывает два прочитанных числа и сравнивает с прочитанным результатом. Протокол строится из действительных значений, количества найденных объектов, заголовка группы и собственной ссылки.

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

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

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

  2. Будущий нормальный запуск: по всему интерфейсу и в своей группе найдено по одному фактическому объекту; по нажатой собственной команде открылась одна форма, её поля показывают 50, 75 и вычисленные 125. Протокол контроллера использует эти прочитанные числа.

  3. Только в своём отдельном стенде: скрыть расчётную команду или убрать её из панели до новой попытки — СТОП, а не подстановка заранее известной кнопки. Дублирование заголовка/команды должно отклоняться при неоднозначном реальном поиске.

  4. Только при ручной проверке собственного изменённого учебного модуля: заменить исходное Второе85 на 76 — настоящий результат изменится, контроллер не должен подтвердить 125. Не подделывать результаты НайтиОбъекты и не вызывать ПриОткрытии вручную.

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

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

При будущем успешном запуске два настоящих поиска дали по одному совпадению, своя команда открыла единственную форму, прочитаны её 50/75/125, контроллер сравнил расчёт и нормально разорвал соединение. Здесь этот результат в 1С не получен.

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

  1. У одноимённых одиночных НайтиОбъект/ПолучитьОбъект и ПолучитьРодителя командных объектов справка перечисляет только семейство объектов формы. Эти методы, ПолучитьТекущуюСтраницу, Развернуть/Свернуть и дочерние коллекции кнопок намеренно НЕ включены; старые противоречия и недоказанные способности не обходятся.

  2. НайтиОбъекты возвращает фиксированный массив, но не гарантирует нужное совпадение для любой настройки клиента. Положительный результат условен: требуется реальная видимая собственная команда и строгие проверки всего настоящего массива. Пустой или неоднозначный результат — СТОП.

  3. Совпадение заголовка и полной ссылки — сравнение публичных значений. Оно не доказывает тождество экземпляров/глобальную уникальность URL или криптографическое владение клиентом. Без целиком собственного стенда и ручного подтверждения порта запуск запрещён.

  4. В интерфейсе могут быть собственные системные кнопки с пустой ссылкой: их не нажимают и не принимают за расчётную команду. Непустая ссылка обязательна именно у своей выбранной кнопки. Порядок детей и индекс первого результата не предполагаются.

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

  6. ТестируемоеПриложение существует только в клиенте /TESTMANAGER; целевой клиент требует /TESTCLIENT. Соединение — настоящее взаимодействие клиентов при будущем ручном запуске, а не выполненная здесь проверка. На сервер, веб-клиент и рабочие базы этот опыт не переносится.

  7. Активизировать не возвращает подтверждения фокуса. Прочитанный расчёт подтверждает результат своей команды, не отсутствие любых внутренних эффектов интерфейса. Нормальный разрыв соединения не закрывает само приложение.

  8. При исключении нет автоматических повторов, закрытия форм, разрыва соединения или очистки. Реальная форма/соединение могут остаться. Код не выполняет действий после ошибки, не выводит технические подробности и не обещает атомарность или гарантированное восстановление.

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

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

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

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

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