Глобальный контекст.ПолучитьОбщуюФорму

Методы · GetCommonForm

Получает общую форму.

Синтаксис

ПолучитьОбщуюФорму(<Форма>, <Владелец>, <КлючУникальности>)

Примеры платформы

Форма = ПолучитьОбщуюФорму("ВыборСтрудника", ЭлементыФормы.Работники, Ссылка);
Форма.РежимВыбора = Истина;
Форма.ЗакрыватьПриВыборе = Ложь;
Форма.ОткрытьМодально();
Полное описание, параметры и ограничения

Глобальный контекст.ПолучитьОбщуюФорму (Global context.GetCommonForm)

Глобальный контекст (Global context)

ПолучитьОбщуюФорму (GetCommonForm)

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

Синтаксис:
ПолучитьОбщуюФорму(<Форма>, <Владелец>, <КлючУникальности>)
Параметры:

<Форма> (необязательный)
Тип: Строка, ОбъектМетаданных: Форма.
Имя формы, как оно задано в конфигураторе, или объект описания метаданного требуемой формы. Если параметр не указан, то используется основная форма, заданная в конфигураторе.

<Владелец> (необязательный)
Тип: Форма; Элемент управления.
Объект, который будет являться владельцем открываемой формы.

<КлючУникальности> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм.
При поиске учитываются значения свойств открытых форм соответствующим значениям параметров метода. Если найдена открытая форма (по совпадению всех параметров), то она будет возвращена вместо новой формы.
Если из некой формы (один и тот же владелец) требуется открывать новые экземпляры другой формы, то при каждом вызове метода значение данного параметра должно быть уникально (в рамках соответствующих значений свойств открытых форм).
Значение параметра присваивается свойству открываемой формы КлючУникальности.
Следует учитывать, что при получении формы из "объекта" система получает форму для конкретного экземпляра объекта с учетом совокупности переданных параметров, в то время как для "ссылки" всегда существует только один объект в базе данных и форма получается одна (для одинаковой совокупности параметров).
Возвращаемое значение:
Тип: Форма.

Описание:

Получает общую форму.

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

Толстый клиент.

Пример:

Форма = ПолучитьОбщуюФорму("ВыборСтрудника", ЭлементыФормы.Работники, Ссылка);
Форма.РежимВыбора = Истина;
Форма.ЗакрыватьПриВыборе = Ложь;
Форма.ОткрытьМодально();

См. также:
Глобальный контекст, метод ПолучитьФорму
Глобальный контекст, метод ОткрытьФорму
Глобальный контекст, метод ОткрытьФормуМодально

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

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

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

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

Свой обычный бланк: редакторы в ячейках, пересчет850→530, подсказка и безопасная очистка собственной служебной формы

Целый ordinary UI workflow, не обертка над неизвестным объектом: actual Controls получены из readonly Форма.ЭлементыФормы; real Add fourth-owner spreadsheet field создает связанные с ним input editors/overlay extension. Числа читаются из своих actual полей, затем из своего numeric результата. Clear касается только fresh whole-owned scratch, не основного бланка.

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

MAIN FORM только модуль собственной обычной общей формы Бланк85 нового host УчебныйОбычныйБланк85. Windows thick ОбычноеПриложение/FileIB/actual ownuser. Actual controls collection catalog56 и extension от native fourthowner spreadsheet field; supporting SCRATCH/APPLICATION в своих точных местах.

Подготовка

  1. Только собственная отдельная Windows VM/платформа8.5.1.1343, толстый клиент в режиме ОбычноеПриложение. Не thin/web/managed Forms: здесь именно native ЭлементыФормы (Controls), registry owner ЭлементыФормы @Controls; одноименный managed FormItems имеет другую справку/factory/контекст.

  2. Вручную создайте canonical nonzero UUID-marker и новую пустую FileIB C:\1c-labs\Уч85Бланк_<UUID>\ИБ\. Connection строго File="C:\1c-labs\Уч85Бланк_<UUID>\ИБ\";. Конфигурация УчебныйОбычныйБланк85. Marker пути/имени не UUID информационной базы или настоящего пользователя; реальный UUID базы не измеряется.

  3. Создайте одного actual IBUser Уч85Бланк_<UUID> с правами этого своего стенда/чтения списка пользователей, без privileged mode. Native currentuser UUID сверяется с единственным настоящим пользователем, а marker извлекается из его actual имени. Не используйте типовую/рабочую конфигурацию или другого OS/1C-пользователя.

  4. Собственная CF пуста: нет справочников/документов/регистров/общих реквизитов/разделителей/внешних данных/расширений/ботов/констант/подписок/регламентных заданий. Создайте только две ordinary общие формы Бланк85 и Служебная85 с модулями ниже; основной блок FORM вставляется исключительно в модуль собственной Бланк85.

  5. Конфигуратор → Общие → Общие формы → Бланк85: тип Обычная форма. Реквизиты формы: МеткаОпыта Строка36, Согласен85 Булево с начальным Ложь, Бланк85 ТабличныйДокумент. Поле флажка связано с Согласен85. МеткаОпыта назначается настоящим app module перед открытием, вручную не подменяется.

  6. На Бланк85 создайте ПолеТабличногоДокумента Уч85Бланк, Данные=Бланк85. Разместите его так, чтобы были видны четыре колонки/строки1..16; разрешите ввод в нем на собственном стенде. Не назначайте ни ПолеВвода, ни ТабличноеПоле владельцем этой формы: native spreadsheet-field extension тогда недоступно.

  7. Создайте пять обычных кнопок с точными именами: Подготовить85, Пересчитать85, Просмотр85, УдалитьПодсказку85, ОчиститьСлужебную85. В свойствах каждой кнопки → События → Нажатие явно назначьте соответственно ПодготовитьБланк85, ПересчитатьБланк85, РежимПросмотра85, УдалитьПодсказку85, ЗавершитьСлужебнуюПроверку85. Имя кнопки само по себе не связывает событие с процедурой.

  8. Все пять handlers имеют один параметр Элемент: исходное native Button.Нажатие() не содержит собственных параметров, но ordinary Расширение элементов управления, расположенных в форме добавляет первый Элемент. Это actual initiating Кнопка, а не managed Команда и не произвольный объект. Не вызывайте эти handlers вручную.

  9. Полностью вставьте FORM в модуль Бланк85. Actual readonly ЭтаФорма типа Форма дает readonly ЭлементыФормы; их не создают через Новый и не присваивают другой коллекцией. Stored ПоляКоличества85/Подсказка85 — только реальные объекты, возвращенные own Controls.Добавить, не найденные чужие объекты.

  10. Служебная85 — отдельная собственная ordinary общая форма. Реквизиты МеткаОпыта Строка36 и СлужебноеКоличество85 Число(2,0). Число7 назначает MAIN своему fresh экземпляру перед проверкой/открытием, а не выдуманное metadata initial-value свойство. Она не редактирует бланк и не содержит кнопок, подписок или сторонних элементов. Именно ее целая новая коллекция позже удаляется Clear.

  11. Для Служебная85 сохраните/назовите native главную панель Уч85СлужебнаяПанель. Затем создайте строго в таком порядке Надпись Уч85СлужебнаяНадпись с текстом "Только свои служебные элементы" и ПолеВвода Уч85СлужебныйВвод, Данные=СлужебноеКоличество85, ТолькоПросмотр=Истина. Удалите все прочие elements только при собственной ручной подготовке этой новой формы.

  12. Если native главная панель присутствует в Controls, она обязана быть индексом0 и actual объектом readonly Форма.Панель с точным собственным именем. За ней ожидаются только подготовленная надпись и ввод; если root panel не входит в коллекцию, ожидаются только два этих controls. Код проверяет actual Индекс/Получить identity и порядок, а не угадывает наличие панели по имени переменной.

  13. Вставьте SCRATCH целиком в модуль собственной Служебная85. Ее export проверяет actual typed attribute7, data binding и реальное input.Value. MAIN получает только fresh native ПолучитьОбщуюФорму("Служебная85",ЭтаФорма,freshUUID), назначает own marker, проверяет и открывает этот экземпляр. Владельцем служит собственная Форма, не input/table control.

  14. В обычный модуль приложения этой CF вставьте APPLICATION целиком. Реальное native ПриНачалеРаботыСистемы() получает actual ownuser marker, выполняет полный guard, затем получает fresh Бланк85 через GetCommonForm и открывает. Оно не запускает очистку, расчет, печать или искусственные button events.

  15. Вручную проверьте модули конфигуратором и запустите только эту собственную новую ИБ actual пользователем. Автор не создавал ИБ/формы/файлы и не запускал1С/UI. В открытой Бланк85 отметьте Согласен85 и нажмите Подготовить85 один раз. При ошибке нет автоматического retry/сноса неизвестных controls; закройте только свои новые формы и исправьте own metadata вручную.

  16. После подготовки три actual ПолеВвода созданы Add(Тип("ПолеВвода"),ownName,Истина,actual Уч85Бланк). Это документированный четвертый owner ПолеТабличногоДокумента. Расположить получает actual его область ячейки, ВстроенВЯчейку=True; numeric cells/ОграничениеТипа задают собственный Число, Value читается и проверяется. Для данных через форму Data неизвестная переменная редакторам не придумывается.

  17. Начальные количества Пакет2/Папка3/Маркер5 и actual ячейки цен100/200/10 должны дать numeric850. Вручную введите1/2/3, завершите ввод уходом из редактора, нажмите Пересчитать85: actual значения и независимо прочитанные outputcells должны дать530. Нецелые/строки/0/100 и измененные ячейки цен отказывают до result writes; источник не используется как fallback.

  18. Собственная overlay Надпись помещена в тот же spreadsheet field, но ВстроенВЯчейку=False. Ее Лево5/Верх42/Ширина80/Высота10 заданы именно в МИЛЛИМЕТРАХ от границы табличного документа, не в logical units обычной формы. Из-за разрешенного округления geometry readback имеет допуск0.2mm; embedded input geometry вручную не перезаписывается.

  19. Просмотр85 сначала пересчитывает собственные числа, затем только скрывает/показывает редакторы и подсказку, значения не уничтожаются. ВыводитьНаПечать=False на каждом служебном control читается обратно; значения количества и сумм остаются числовыми в собственном бланке. Это настройка исключения controls из печати, не выполненная/проверенная печать и не обещание произвольного экспортного формата.

  20. УдалитьПодсказку85 удаляет только actual сохраненную nativeAdd надпись после name/type/Index/Get/identity guard. Native Count уменьшается на1, Find возвращает Undefined, три input editors и исходные элементы остаются. Повторное удаление отказывает; unknown одноименный объект не подставляется.

  21. Последней командой ОчиститьСлужебную85 удалите целую исключительно fresh собственную Служебная85. Не закрывайте ее вручную до этой команды: actual IsOpen проверяется, уже закрытая форма отказывает без восстановления. До Clear совпадают marker, native source, exact whitelist/order/identity, typed7 и count; дополнительный/измененный control означает отказ. Только эта коллекция становится0, затем закрывается только эта своя форма и IsOpen=False подтверждает закрытие; основная Controls должна сохранить count/identity.

  22. Ручной negative протокол выполняйте только на отдельном собственном экземпляре: без Согласен85 нажать подготовку — отказ; повторить подготовку — отказ; поменять typed quantity на0/100 — отказ; добавить лишний control/поменять порядок в own scratch metadata — отказ до Clear. После частичной ошибки нельзя переносить коллекцию/объекты из другого экземпляра или удалять их автоматически.

Перем НачатаПодготовка85;
Перем Подготовлено85;
Перем ПоляКоличества85;
Перем Подсказка85;
Перем СлужебнаяФорма85;
Перем ИсходноеКоличество85;
Перем Просмотр85;

Процедура ПодготовитьБланк85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Подготовить85");
    Если НачатаПодготовка85 = Истина Тогда
        ВызватьИсключение "Подготовка одноразовая. После ошибки закройте только свои формы и откройте новый собственный экземпляр, не дополняйте частичную коллекцию";
    КонецЕсли;
    Имена = ПолучитьИменаСвоихРедакторов85();
    Для Каждого Имя Из Имена Цикл
        Если ЭтаФорма.ЭлементыФормы.Найти(Имя) <> Неопределено Тогда
            ВызватьИсключение "Собственное новое имя уже занято. Существующий элемент не переиспользуется";
        КонецЕсли;
    КонецЦикла;
    Если ЭтаФорма.ЭлементыФормы.Найти("Уч85Подсказка") <> Неопределено Тогда
        ВызватьИсключение "Имя собственного overlay уже занято";
    КонецЕсли;
    ПолеБланка = ЭтаФорма.ЭлементыФормы.Найти("Уч85Бланк");
    Если ПолеБланка = Неопределено Или ТипЗнч(ПолеБланка) <> Тип("ПолеТабличногоДокумента") Или ПолеБланка.Данные <> "Бланк85" Тогда
        ВызватьИсключение "Нужно собственное prepared spreadsheet field с реальной связью Данные=Бланк85";
    КонецЕсли;
    НачатаПодготовка85 = Истина;
    ИсходноеКоличество85 = ЭтаФорма.ЭлементыФормы.Количество();
    Бланк85 = Новый ТабличныйДокумент;
    Бланк85.Область(1, 1).Текст = "Собственный учебный бланк: количество вводится в трех редакторах";
    Бланк85.Область(2, 1).Текст = "Товар";
    Бланк85.Область(2, 2).Текст = "Количество";
    Бланк85.Область(2, 3).Текст = "Цена";
    Бланк85.Область(2, 4).Текст = "Сумма";
    Товары = ПолучитьСвоиТовары85();
    Цены = ПолучитьСвоиЦены85();
    Количества = Новый Массив;
    Количества.Добавить(2);
    Количества.Добавить(3);
    Количества.Добавить(5);
    ПоляКоличества85 = Новый Массив;
    Для ИндексСтроки = 0 По 2 Цикл
        Номер = ИндексСтроки + 3;
        Бланк85.Область(Номер, 1).Текст = Товары[ИндексСтроки];
        ЗаписатьСвоюЧисловуюЯчейку85(Номер, 2, Количества[ИндексСтроки]);
        ЗаписатьСвоюЧисловуюЯчейку85(Номер, 3, Цены[ИндексСтроки]);
        ПолеКоличества = ЭтаФорма.ЭлементыФормы.Добавить(Тип("ПолеВвода"), Имена[ИндексСтроки], Истина, ПолеБланка);
        ПолеКоличества.ОграничениеТипа = Новый ОписаниеТипов("Число");
        ПолеКоличества.Расположить(ПолеБланка.Область(Номер, 2));
        ПолеКоличества.ВстроенВЯчейку = Истина;
        ПолеКоличества.ВыводитьНаПечать = Ложь;
        ПолеКоличества.Значение = Количества[ИндексСтроки];
        Если Не ПолеКоличества.ВстроенВЯчейку Или ПолеКоличества.ВыводитьНаПечать
            Или ТипЗнч(ПолеКоличества.Значение) <> Тип("Число") Или ПолеКоличества.Значение <> Количества[ИндексСтроки] Тогда
            ВызватьИсключение "Реальный spreadsheet-field editor не подтвердил embedded/value/print-exclusion. Формальные свойства неизвестного объекта не используются";
        КонецЕсли;
        ПоляКоличества85.Добавить(ПолеКоличества);
    КонецЦикла;
    Бланк85.Область(6, 1).Текст = "Итого";
    Бланк85.Область(16, 1).Текст = "Служебные редакторы не являются печатным документом";
    Подсказка85 = ЭтаФорма.ЭлементыФормы.Добавить(Тип("Надпись"), "Уч85Подсказка", Истина, ПолеБланка);
    Подсказка85.Заголовок = "Введите количества1..99 и нажмите Пересчитать. База данных и принтер не используются.";
    Подсказка85.ВстроенВЯчейку = Ложь;
    Подсказка85.Лево = 5;
    Подсказка85.Верх = 42;
    Подсказка85.Ширина = 80;
    Подсказка85.Высота = 10;
    Подсказка85.ВыводитьНаПечать = Ложь;
    Если Подсказка85.ВстроенВЯчейку Или Подсказка85.ВыводитьНаПечать Или Не Подсказка85.Видимость
        Или Абс(Подсказка85.Лево - 5) > 0.2 Или Абс(Подсказка85.Верх - 42) > 0.2
        Или Абс(Подсказка85.Ширина - 80) > 0.2 Или Абс(Подсказка85.Высота - 10) > 0.2 Тогда
        ВызватьИсключение "Own free overlay geometry в миллиметрах не подтверждена; embedded редакторам эти координаты не задаются";
    КонецЕсли;
    Просмотр85 = Ложь;
    Подготовлено85 = Истина;
    ПроверитьКоллекциюСвоихРедакторов85();
    Сумма = ПересчитатьПоActualРедакторам85();
    Если Сумма <> 850 Тогда
        ВызватьИсключение "Фактические редакторы2/3/5 и прочитанные результатные ячейки не дали850";
    КонецЕсли;
    СлужебнаяФорма85 = ПолучитьОбщуюФорму("Служебная85", ЭтаФорма, Строка(Новый УникальныйИдентификатор));
    Если ТипЗнч(СлужебнаяФорма85) <> Тип("Форма") Тогда
        ВызватьИсключение "Native factory не вернул собственную свежую ordinary служебную форму";
    КонецЕсли;
    СлужебнаяФорма85.МеткаОпыта = МеткаОпыта;
    СлужебнаяФорма85.СлужебноеКоличество85 = 7;
    СлужебнаяФорма85.ПроверитьСвоиСлужебныеЭлементы85();
    СлужебнаяФорма85.Открыть();
    Если Не СлужебнаяФорма85.Открыта() Тогда
        ВызватьИсключение "Собственная native служебная форма не открыта; это не считается UI success";
    КонецЕсли;
    Сообщить("Бланк подготовлен: actual сумма850. Для530 вручную введите1/2/3, подтвердите ввод уходом из ячейки и нажмите Пересчитать. Служебная форма очищается отдельной командой только после проверки ее собственной коллекции.");
КонецПроцедуры

Процедура ПересчитатьБланк85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Пересчитать85");
    ПроверитьКоллекциюСвоихРедакторов85();
    Сумма = ПересчитатьПоActualРедакторам85();
    Сообщить("Сумма из actual input values и независимо прочитанных собственных output cells=" + Строка(Сумма));
КонецПроцедуры

Процедура РежимПросмотра85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Просмотр85");
    ПроверитьКоллекциюСвоихРедакторов85();
    Сумма = ПересчитатьПоActualРедакторам85();
    Просмотр85 = Не Просмотр85;
    ДолженОтображаться = Не Просмотр85;
    Для Каждого ПолеКоличества Из ПоляКоличества85 Цикл
        ПолеКоличества.Видимость = ДолженОтображаться;
        Если ПолеКоличества.Видимость <> ДолженОтображаться Или ПолеКоличества.ВыводитьНаПечать Тогда
            ВызватьИсключение "Own visibility/readback/print exclusion не подтвердились";
        КонецЕсли;
    КонецЦикла;
    Если Подсказка85 <> Неопределено Тогда
        Подсказка85.Видимость = ДолженОтображаться;
        Если Подсказка85.Видимость <> ДолженОтображаться Тогда
            ВызватьИсключение "Own overlay visibility не подтверждена";
        КонецЕсли;
    КонецЕсли;
    Если Бланк85.Область(6, 4).Значение <> Сумма Тогда
        ВызватьИсключение "Режим просмотра не должен удалять/подменять own numeric result";
    КонецЕсли;
    Сообщить("Режим просмотра=" + Строка(Просмотр85) + ". Редакторы только скрыты, значения сохранены. Печать не выполнялась.");
КонецПроцедуры

Процедура УдалитьПодсказку85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "УдалитьПодсказку85");
    ПроверитьКоллекциюСвоихРедакторов85();
    Если Подсказка85 = Неопределено Тогда
        ВызватьИсключение "Собственная подсказка уже удалена; неизвестный одноименный объект не ищется для удаления";
    КонецЕсли;
    Если ЭтаФорма.ЭлементыФормы.Найти("Уч85Подсказка") <> Подсказка85 Или ТипЗнч(Подсказка85) <> Тип("Надпись") Тогда
        ВызватьИсключение "Удаление разрешено только actual созданной own overlay надписи";
    КонецЕсли;
    ИндексПодсказки = ЭтаФорма.ЭлементыФормы.Индекс(Подсказка85);
    До = ЭтаФорма.ЭлементыФормы.Количество();
    Если ИндексПодсказки < 0 Или ИндексПодсказки >= До Или ЭтаФорма.ЭлементыФормы.Получить(ИндексПодсказки) <> Подсказка85 Тогда
        ВызватьИсключение "Actual index/get identity собственного удаляемого элемента не совпали";
    КонецЕсли;
    ЭтаФорма.ЭлементыФормы.Удалить(Подсказка85);
    Подсказка85 = Неопределено;
    Если ЭтаФорма.ЭлементыФормы.Количество() <> До - 1 Или ЭтаФорма.ЭлементыФормы.Найти("Уч85Подсказка") <> Неопределено Тогда
        ВызватьИсключение "Удаление только своей надписи не подтверждено";
    КонецЕсли;
    ПроверитьКоллекциюСвоихРедакторов85();
    Сообщить("Удалена только собственная динамическая надпись; три редактора, бланк и подготовленные кнопки сохранены. Ее нельзя восстановить повторной подготовкой этого экземпляра.");
КонецПроцедуры

Процедура ЗавершитьСлужебнуюПроверку85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "ОчиститьСлужебную85");
    ПроверитьКоллекциюСвоихРедакторов85();
    Если СлужебнаяФорма85 = Неопределено Тогда
        ВызватьИсключение "Своей fresh служебной формы нет или она уже очищена; чужая форма не подставляется";
    КонецЕсли;
    Если Не СлужебнаяФорма85.Открыта() Тогда
        ВызватьИсключение "Собственная служебная форма уже закрыта вручную; ее controls не восстанавливаются/не очищаются после закрытия";
    КонецЕсли;
    СлужебнаяФорма85.ПроверитьСвоиСлужебныеЭлементы85();
    Если СлужебнаяФорма85.МеткаОпыта <> МеткаОпыта Тогда
        ВызватьИсключение "Marker собственного экземпляра служебной формы изменился";
    КонецЕсли;
    Коллекция = СлужебнаяФорма85.ЭлементыФормы;
    Надпись = Коллекция.Найти("Уч85СлужебнаяНадпись");
    Ввод = Коллекция.Найти("Уч85СлужебныйВвод");
    Если Надпись = Неопределено Или Ввод = Неопределено Или ТипЗнч(Надпись) <> Тип("Надпись")
        Или ТипЗнч(Ввод) <> Тип("ПолеВвода") Или Ввод.Данные <> "СлужебноеКоличество85" Или Ввод.Значение <> 7 Тогда
        ВызватьИсключение "Fresh own scratch whitelist/type/binding/value не совпал; Clear не разрешен";
    КонецЕсли;
    Ожидаемые = Новый Массив;
    ИндексПанели = Коллекция.Индекс(СлужебнаяФорма85.Панель);
    Если ИндексПанели >= 0 Тогда
        Если ИндексПанели <> 0 Или СлужебнаяФорма85.Панель.Имя <> "Уч85СлужебнаяПанель" Тогда
            ВызватьИсключение "Если native root panel входит в Controls, она должна быть собственным первым подготовленным элементом";
        КонецЕсли;
        Ожидаемые.Добавить(СлужебнаяФорма85.Панель);
    КонецЕсли;
    Ожидаемые.Добавить(Надпись);
    Ожидаемые.Добавить(Ввод);
    Если Коллекция.Количество() <> Ожидаемые.Количество() Тогда
        ВызватьИсключение "В whole owned scratch есть дополнительный неизвестный элемент. Его нельзя удалять Clear";
    КонецЕсли;
    Для ИндексЭлемента = 0 По Ожидаемые.Количество() - 1 Цикл
        Если Коллекция.Получить(ИндексЭлемента) <> Ожидаемые[ИндексЭлемента]
            Или Коллекция.Индекс(Ожидаемые[ИндексЭлемента]) <> ИндексЭлемента Тогда
            ВызватьИсключение "Own scratch native order/Get/Index identity не совпали";
        КонецЕсли;
    КонецЦикла;
    ОсновныхДо = ЭтаФорма.ЭлементыФормы.Количество();
    Коллекция.Очистить();
    Если Коллекция.Количество() <> 0 Или ЭтаФорма.ЭлементыФормы.Количество() <> ОсновныхДо Тогда
        ВызватьИсключение "Clear собственного целого scratch не подтвердил0 либо затронул основной бланк";
    КонецЕсли;
    СлужебнаяФорма85.Закрыть();
    Если СлужебнаяФорма85.Открыта() Тогда
        ВызватьИсключение "Закрытие только своей очищенной служебной формы не подтверждено";
    КонецЕсли;
    СлужебнаяФорма85 = Неопределено;
    ПроверитьКоллекциюСвоихРедакторов85();
    Сообщить("Whole own scratch Controls очищена до0 и своя служебная форма закрыта. Основная коллекция не очищалась.");
КонецПроцедуры

Функция ПересчитатьПоActualРедакторам85()
    ПроверитьКоллекциюСвоихРедакторов85();
    Количества = Новый Массив;
    Для Каждого ПолеКоличества Из ПоляКоличества85 Цикл
        Значение = ПолеКоличества.Значение;
        Если ТипЗнч(Значение) <> Тип("Число") Или Значение < 1 Или Значение > 99 Или Значение <> Цел(Значение) Тогда
            ВызватьИсключение "Сначала завершите ввод: каждому actual редактору нужно целое число1..99. Строки/0/100 не конвертируются и не заменяются исходными значениями";
        КонецЕсли;
        Количества.Добавить(Значение);
    КонецЦикла;
    Цены = ПолучитьСвоиЦены85();
    Для ИндексЦены = 0 По 2 Цикл
        ЯчейкаЦены = Бланк85.Область(ИндексЦены + 3, 3);
        Если Не ЯчейкаЦены.СодержитЗначение Или ТипЗнч(ЯчейкаЦены.Значение) <> Тип("Число")
            Или ЯчейкаЦены.Значение <> Цены[ИндексЦены] Тогда
            ВызватьИсключение "Собственные actual числовые цены изменены или отсутствуют. Расчет не маскирует это исходными ценами";
        КонецЕсли;
    КонецЦикла;
    Сумма = 0;
    Для ИндексСтроки = 0 По 2 Цикл
        Номер = ИндексСтроки + 3;
        ЗаписатьСвоюЧисловуюЯчейку85(Номер, 2, Количества[ИндексСтроки]);
        ЦенаИзЯчейки = Бланк85.Область(Номер, 3).Значение;
        ЗаписатьСвоюЧисловуюЯчейку85(Номер, 4, Количества[ИндексСтроки] * ЦенаИзЯчейки);
        Ячейка = Бланк85.Область(Номер, 4);
        Если Не Ячейка.СодержитЗначение Или ТипЗнч(Ячейка.Значение) <> Тип("Число")
            Или Ячейка.Значение <> Количества[ИндексСтроки] * ЦенаИзЯчейки Тогда
            ВызватьИсключение "Own actual output cell после пересчета не подтверждена";
        КонецЕсли;
        Сумма = Сумма + Ячейка.Значение;
    КонецЦикла;
    ЗаписатьСвоюЧисловуюЯчейку85(6, 4, Сумма);
    ЯчейкаИтога = Бланк85.Область(6, 4);
    Если Не ЯчейкаИтога.СодержитЗначение Или ТипЗнч(ЯчейкаИтога.Значение) <> Тип("Число") Или ЯчейкаИтога.Значение <> Сумма Тогда
        ВызватьИсключение "Итог actual табличного документа не подтвержден чтением";
    КонецЕсли;
    Возврат ЯчейкаИтога.Значение;
КонецФункции

Процедура ЗаписатьСвоюЧисловуюЯчейку85(Номер, Колонка, Значение)
    Ячейка = Бланк85.Область(Номер, Колонка);
    Ячейка.СодержитЗначение = Истина;
    Ячейка.ТипЗначения = Новый ОписаниеТипов("Число");
    Ячейка.Значение = Значение;
КонецПроцедуры

Процедура ПроверитьКоллекциюСвоихРедакторов85()
    ПроверитьСвойOrdinaryБланк85(МеткаОпыта);
    Если Подготовлено85 <> Истина Или ПоляКоличества85 = Неопределено Тогда
        ВызватьИсключение "Сначала собственная одноразовая подготовка, не unknown caller-provided collection";
    КонецЕсли;
    Если ПоляКоличества85.Количество() <> 3 Тогда
        ВызватьИсключение "Нужны ровно три actual own созданных редактора";
    КонецЕсли;
    Дополнительных = 3;
    Если Подсказка85 <> Неопределено Тогда
        Дополнительных = Дополнительных + 1;
    КонецЕсли;
    Если ЭтаФорма.ЭлементыФормы.Количество() <> ИсходноеКоличество85 + Дополнительных Тогда
        ВызватьИсключение "Количество Controls основной собственной формы изменено вне процесса";
    КонецЕсли;
    Имена = ПолучитьИменаСвоихРедакторов85();
    Для ИндексПоля = 0 По 2 Цикл
        ПолеКоличества = ПоляКоличества85[ИндексПоля];
        ИндексЭлемента = ЭтаФорма.ЭлементыФормы.Индекс(ПолеКоличества);
        Если ТипЗнч(ПолеКоличества) <> Тип("ПолеВвода") Или ЭтаФорма.ЭлементыФормы.Найти(Имена[ИндексПоля]) <> ПолеКоличества
            Или ИндексЭлемента < 0 Или ИндексЭлемента >= ЭтаФорма.ЭлементыФормы.Количество()
            Или ЭтаФорма.ЭлементыФормы.Получить(ИндексЭлемента) <> ПолеКоличества
            Или Не ПолеКоличества.ВстроенВЯчейку Или ПолеКоличества.ВыводитьНаПечать Тогда
            ВызватьИсключение "Native Find/Index/Get/embedded identity собственного поля не совпал";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ПроверитьСвоюКнопку85(Элемент, Имя)
    ПроверитьСвойOrdinaryБланк85(МеткаОпыта);
    Если Согласен85 <> Истина Тогда
        ВызватьИсключение "Подтвердите опыт только со своей новой ordinary формой";
    КонецЕсли;
    Если ТипЗнч(Элемент) <> Тип("Кнопка") Или ЭтаФорма.ЭлементыФормы.Найти(Имя) <> Элемент Тогда
        ВызватьИсключение "Нужно настоящее событие своей prepared ordinary кнопки, не fake event или чужой control";
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьИменаСвоихРедакторов85()
    Имена = Новый Массив;
    Имена.Добавить("Уч85КоличествоПакета");
    Имена.Добавить("Уч85КоличествоПапки");
    Имена.Добавить("Уч85КоличествоМаркера");
    Возврат Имена;
КонецФункции

Функция ПолучитьСвоиТовары85()
    Товары = Новый Массив;
    Товары.Добавить("Пакет");
    Товары.Добавить("Папка");
    Товары.Добавить("Маркер");
    Возврат Товары;
КонецФункции

Функция ПолучитьСвоиЦены85()
    Цены = Новый Массив;
    Цены.Добавить(100);
    Цены.Добавить(200);
    Цены.Добавить(10);
    Возврат Цены;
КонецФункции

Процедура ПроверитьСвойOrdinaryБланк85(МеткаОпыта)
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ПроверитьСвойПустойСтенд();
    UUIDМетки = Новый УникальныйИдентификатор(МеткаОпыта);
    Если МеткаОпыта <> Строка(UUIDМетки) Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Нужен canonical nonzero marker собственного каталога, не UUID самой базы или реального пользователя ИБ";
    КонецЕсли;
    Соединение = "File=""C:\1c-labs\Уч85Бланк_" + МеткаОпыта + "\ИБ\"";";
    Если СтрокаСоединенияИнформационнойБазы() <> Соединение Или ПривилегированныйРежим() Тогда
        ВызватьИсключение "Только своя новая FileIB и собственный непривилегированный сеанс; пути/connection string не печатаются";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен один настоящий собственный пользователь ИБ";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Текущий.Имя <> "Уч85Бланк_" + МеткаОпыта Или Метаданные.ОбщиеФормы.Количество() <> 2
        Или Метаданные.ОбщиеФормы.Бланк85.Имя <> "Бланк85" Или Метаданные.ОбщиеФормы.Служебная85.Имя <> "Служебная85"
        Или Метаданные.Боты.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0 Тогда
        ВызватьИсключение "Паспорт own host/двух ordinary форм/реального пользователя ИБ не совпал";
    КонецЕсли;
#Иначе
    ВызватьИсключение "Коллекция Controls и spreadsheet-field extension здесь доступны только thick ordinary, не FormItems managed";
#КонецЕсли
КонецПроцедуры

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

Собственная CF → Общие → Общие формы → Служебная85 → Модуль.

Только fresh own ordinary common form Служебная85, actual native Form factory и parent основная Форма, не input/table owner.

Процедура ПроверитьСвоиСлужебныеЭлементы85() Экспорт
    ПроверитьСвойOrdinaryБланк85(МеткаОпыта);
    Надпись = ЭтаФорма.ЭлементыФормы.Найти("Уч85СлужебнаяНадпись");
    Ввод = ЭтаФорма.ЭлементыФормы.Найти("Уч85СлужебныйВвод");
    Если Надпись = Неопределено Или Ввод = Неопределено Или ТипЗнч(Надпись) <> Тип("Надпись")
        Или ТипЗнч(Ввод) <> Тип("ПолеВвода") Или Ввод.Данные <> "СлужебноеКоличество85" Тогда
        ВызватьИсключение "Нужны собственные prepared scratch controls и реальная связь с own typed attribute";
    КонецЕсли;
    Если ТипЗнч(СлужебноеКоличество85) <> Тип("Число") Или СлужебноеКоличество85 <> 7
        Или ТипЗнч(Ввод.Значение) <> Тип("Число") Или Ввод.Значение <> 7 Тогда
        ВызватьИсключение "В собственном служебном экземпляре должно быть фактическое число7 из своего атрибута";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвойOrdinaryБланк85(МеткаОпыта)
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ПроверитьСвойПустойСтенд();
    UUIDМетки = Новый УникальныйИдентификатор(МеткаОпыта);
    Если МеткаОпыта <> Строка(UUIDМетки) Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Нужен canonical nonzero marker собственного каталога, не UUID самой базы или реального пользователя ИБ";
    КонецЕсли;
    Соединение = "File=""C:\1c-labs\Уч85Бланк_" + МеткаОпыта + "\ИБ\"";";
    Если СтрокаСоединенияИнформационнойБазы() <> Соединение Или ПривилегированныйРежим() Тогда
        ВызватьИсключение "Только своя новая FileIB и собственный непривилегированный сеанс; пути/connection string не печатаются";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен один настоящий собственный пользователь ИБ";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Текущий.Имя <> "Уч85Бланк_" + МеткаОпыта Или Метаданные.ОбщиеФормы.Количество() <> 2
        Или Метаданные.ОбщиеФормы.Бланк85.Имя <> "Бланк85" Или Метаданные.ОбщиеФормы.Служебная85.Имя <> "Служебная85"
        Или Метаданные.Боты.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0 Тогда
        ВызватьИсключение "Паспорт own host/двух ordinary форм/реального пользователя ИБ не совпал";
    КонецЕсли;
#Иначе
    ВызватьИсключение "Коллекция Controls и spreadsheet-field extension здесь доступны только thick ordinary, не FormItems managed";
#КонецЕсли
КонецПроцедуры

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

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

Обычный модуль приложения своей пустой CF, native OnStart0, exact guarded ordinary thick source. Не managed application module.

Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователь = Неопределено Или Не СтрНачинаетсяС(Пользователь.Имя, "Уч85Бланк_") Тогда
        ВызватьИсключение "Запустите собственную новую FileIB настоящим единственным учебным пользователем";
    КонецЕсли;
    Метка = Сред(Пользователь.Имя, СтрДлина("Уч85Бланк_") + 1);
    ПроверитьСвойOrdinaryБланк85(Метка);
    СвояФорма = ПолучитьОбщуюФорму("Бланк85", , Строка(Новый УникальныйИдентификатор));
    Если ТипЗнч(СвояФорма) <> Тип("Форма") Тогда
        ВызватьИсключение "Native GetCommonForm не создал собственную ordinary форму";
    КонецЕсли;
    СвояФорма.МеткаОпыта = Метка;
    СвояФорма.Согласен85 = Ложь;
    СвояФорма.Открыть();
    Если Не СвояФорма.Открыта() Тогда
        ВызватьИсключение "Открытие своей основной ordinary формы не подтверждено native IsOpen";
    КонецЕсли;
#Иначе
    ВызватьИсключение "Запуск только Windows thick ordinary. Native collection Controls не managed FormItems";
#КонецЕсли
КонецПроцедуры

Процедура ПроверитьСвойOrdinaryБланк85(МеткаОпыта)
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ПроверитьСвойПустойСтенд();
    UUIDМетки = Новый УникальныйИдентификатор(МеткаОпыта);
    Если МеткаОпыта <> Строка(UUIDМетки) Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Нужен canonical nonzero marker собственного каталога, не UUID самой базы или реального пользователя ИБ";
    КонецЕсли;
    Соединение = "File=""C:\1c-labs\Уч85Бланк_" + МеткаОпыта + "\ИБ\"";";
    Если СтрокаСоединенияИнформационнойБазы() <> Соединение Или ПривилегированныйРежим() Тогда
        ВызватьИсключение "Только своя новая FileIB и собственный непривилегированный сеанс; пути/connection string не печатаются";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен один настоящий собственный пользователь ИБ";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Текущий.Имя <> "Уч85Бланк_" + МеткаОпыта Или Метаданные.ОбщиеФормы.Количество() <> 2
        Или Метаданные.ОбщиеФормы.Бланк85.Имя <> "Бланк85" Или Метаданные.ОбщиеФормы.Служебная85.Имя <> "Служебная85"
        Или Метаданные.Боты.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0 Тогда
        ВызватьИсключение "Паспорт own host/двух ordinary форм/реального пользователя ИБ не совпал";
    КонецЕсли;
#Иначе
    ВызватьИсключение "Коллекция Controls и spreadsheet-field extension здесь доступны только thick ordinary, не FormItems managed";
#КонецЕсли
КонецПроцедуры

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

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

  1. Настоящий own APPLICATION guard проверяет Windows thick ordinary/FileIB/currentrealuser/empty metadata и получает собственную Форма. Это source коллекции Controls, а не одноименный managed alias.

  2. Реальные пять ordinary кнопок имеют native событие Нажатие с первым extension Элемент. Guard сверяет actual initiating Кнопка с собственной named коллекцией и согласие до изменений.

  3. До Add проверены отсутствие own имен и actual prepared ПолеТабличногоДокумента с Data=Бланк85. Count baseline берется из реальной основной коллекции; новые4 controls принадлежат only native fourthowner field.

  4. Три input controls получают actual owncellrange через Расположить, embedded true/numeric values/print exclusion с readback. Own overlay не embedded и располагается в документе по подтвержденным millimeter coordinates.

  5. Stored returned objects сверяются native Find/Index/Get identity; count допускает только baseline+4 или после удаления help baseline+3. Индекс=-1 никогда не используется как индекс последнего элемента.

  6. Пересчет предварительно читает/валидирует все actual editor values. Только затем записывает/читает own numeric output cells и итог; подготовленные2/3/5 дают850, ручные1/2/3 дают530.

  7. Режим просмотра меняет actual Visibility и подтверждает сохранение числового итога. Print=False относится к контролам и не вызывает принтер/preview/export.

  8. Удаление помощи касается ровно сохраненной ownAdd надписи; Count/Find и оставшиеся actual objects проверяются после Delete. Чужие objects не ищутся для восстановительного удаления.

  9. Clear получает только stored freshown scratch Форма.ЭлементыФормы, проверенную по реальной metadata подготовке/marker/whitelist/order/typed input. Только ее whole collection удаляется; основной бланк не очищается.

  10. Actual source/native/static проверки отделены от ручного runtime протокола. Авторство не запускало1С/UI/файлы/БД/сеть/COM/печать, backup0.

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

  1. Actual native collection proof: readonly ordinary ЭтаФорма → ЭлементыФормы (Controls catalog56), не catalog1649 managed FormItems. No invented collection/extension constructor.

  2. После Add реально baseline+4 controls, после ownHelp Delete baseline+3; Find/Get/Index сверяют те же фактические возвращенные объекты.

  3. Own input edit2/3/5 с prices100/200/10 дает850; manual1/2/3 дает530 после завершения ввода. Actual numeric cell readback, а не заданный итог/строковая конвертация.

  4. Embedded properties/Own overlay geometry millimeters/Visibility/print exclusion проверены отдельным readback. Data-only Value не применяется к Надпись.

  5. Служебная коллекция очищается до0 только после exact whole-own whitelist/order; main collection/count/three editors остаются. Дополнительные scratch elements запрещают Clear.

  6. Все five native checkers/rawHBK/blocks статические. Ручная metadata подготовка/компиляция/реальные события/визуальный результат и печать автором не выполнялись.

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

При ручной успешной собственной metadata подготовке ordinary форма дает редактируемый бланк: actual исходные количества2/3/5 подтверждают850, ручные1/2/3 подтверждают530. Собственные редакторы можно скрыть, own help удалить, fresh отдельную whole-owned служебную форму очистить и закрыть без изменения основного бланка. Здесь authored source/static checks; actual1С/UI/DB/files/network/COM/print0.

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

  1. Controls ordinary и FormItems managed — разные native источники. Suffix @Controls нужен только registry, это не текст для Тип("...") и не managedproperty формы.

  2. Дополнительный spreadsheet-field extension появляется у реального control, помещенного в actual ПолеТабличногоДокумента через native Add fourthowner. Не создается Новый Extension и не доказывается совпадением имени переменной.

  3. Readonly ЭтаФорма/ЭлементыФормы/Панель не заменяют присваиванием. У коллекции допустимы native mutations только для собственных объектов/целой freshown scratch по этому процессу.

  4. Если владельцем формы назначен input/table control, native extension свойства недоступны. Здесь parent scratch только собственная Форма, а main не имеет такого владельца.

  5. Input Value допустимо для data-capable ПолеВвода, не для overlay Надпись. Typed cell/ОграничениеТипа и actual number readback не являются гарантиями произвольной чужой UI metadata.

  6. ВстроенВЯчейку=True и Расположить используют native область своего spreadsheet field. Геометрию встроенных редакторов нельзя смешивать с free overlay millimeter geometry.

  7. Не путайте millimeters document-relative с координатами обычной формы. Readback допускает только0.2mm округления, не произвольное молчаливое размещение.

  8. Native ordinary Button Click0 получает дополнительный first Элемент от form extension. Каждый handler реально привязывается в metadata и не вызывается руками как доказательство UI события.

  9. Все actual quantity значения валидируются до первых result writes. Неверный ввод не превращается в значение initial source или530; partial ошибки не исправляются blind retry.

  10. Index returns-1 для отсутствующего control. Сначала range/identity, затем Get/Delete; изменение коллекции при обходе текущего enumerator здесь не используется.

  11. Полное Clear удаляет все элементы только той формы. Поэтому main neverClear; own scratch must be whole-owned/exact whitelisted/order verified, дополнительных элементов быть не может.

  12. Native root panel membership не угадывается. Реальный readonly Панель сравнивается по object identity/Index; при наличии ожидается индекс0/name, после нее только two prepared owncontrols.

  13. Visibility=False только скрывает editor, не стирает Value. Print=False задает native исключение контроля из печати, но здесь ни принтер, ни preview/экспорт не запускались.

  14. Загрузка/сохранение настроек/файлов, COM/ActiveX и рабочая база не нужны. ДобавитьActiveX намеренно не покрывается выдуманным ProgID или установкой стороннего компонента.

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

Обычный клиент: показать счет75, принять предпросмотр50 или отменить

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

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

Windows8.5.1.1343, только собственный новый File-стенд: ordinary либо managed толстый клиент. Фактических runtime/UI/DB действий не было.

Подготовка

  1. Здесь только исходники будущего опыта. 1С, создание CF, UI, база, сеть и файлы не запускались. Рабочие конфигурации не используйте. Вручную создайте новую пустую File-базу строго C:\1c-labs\OwnDisplayValues85_75a4c79f-9402-42d3-8c08-90f7bedde32f\IB; UUID обозначает свой каталог, не идентификатор информационной базы.

  2. Конфигурация УчебныйПоказСчета85, Windows платформа8.5.1.1343, РежимСовместимости=НеИспользовать, поддерживаемые режимы Управляемое приложение и обычное приложение, ОсновнойРежимЗапуска=ОбычноеПриложение. РежимИспользованияМодальности=Использовать задайте явно: обычный опыт намеренно изучает разрешенные модальные вызовы. Для управляемого опыта выберите интерфейсТакси и запускайте именно толстый управляемый клиент, не тонкий/веб/мобильный.

  3. Своя одна учебная роль с полными правами и один собственный пользователь Показ85Ученик. Никаких документов, справочников, констант, регистров, отчетов, обработок, расширений базы/сеанса, подписок и фоновых заданий. Не загружайте чужую CF. Этот счет — три числа в памяти, не объект базы.

  4. ОбщийМодуль СтендПоказа85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеДа, СерверНет, ВызовСервераНет, ВнешнееСоединениеНет. Полный GUARD_MODULE в его модуль. Препроцессор разрешает его проверку metadata только двум толстым клиентам; остальные ветви отказывают без вызовов чужих контекстов.

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

  6. СчетОбычный85: ORDINARY_MODULE в ОбщиеФормы.СчетОбычный85.Модуль. Реквизиты Количество85 Число10,0; Цена85 Число12,2; ИсходнаяСумма85 и Предпросмотр85 Число15,2; Состояние85 Строка2000. Для всех полей установите ТолькоПросмотрДа. Кнопки Показать75 и ИзменитьКоличество85: Нажатие→одноименный handler(Элемент). События формы ПриОткрытии()0 и ПередЗакрытием(Отказ,СтандартнаяОбработка)2.

  7. Количество85: CHILD_MODULE в ОбщиеФормы.Количество85.Модуль. Реквизит НовоеКоличество85 Число10,0 редактируемый; Цена85 Число12,2 ТолькоПросмотрДа. Кнопки Принять85/Отменить85: Нажатие→одноименный handler(Элемент). Событие ПередОткрытием(Отказ,СтандартнаяОбработка)2. Export Подготовить85(Создатель,Счет) вызывается пультом до открытия и только один раз для свежей собственной формы.

  8. ORDINARY_APP целиком в Конфигурация.МодульОбычногоПриложения: native ПриНачалеРаботыСистемы()0. После ручного обновления CF запустите толстый обычный клиент своей File-базы; пульт открывается штатным native событием, старое меню не предполагается.

  9. Обычный опыт: сначала исходные поля3/25/75 и предпросмотр75. Показать75 передает собственную текстовую строку в ОткрытьЗначение, не ссылку чужого объекта. Вид диалога зависит от типа значения; точный вид/кнопки и успешный показ здесь не проверены. После возврата вызова снова сверяются исходные числовые поля.

  10. Нажмите ИзменитьКоличество85. Пульт получает настоящую новую обычную форму Количество85 с владельцем ЭтаФорма и собственным UUID-ключом, проверяет владельца/ключ и подготавливает ее. Глобальный ОткрытьФормуМодально использует native вариант По форме с одним actual объектом формы, не подменяется Форма.ОткрытьМодально.

  11. В дочерней форме введите количество2 и нажмите Принять85. Она считает2×25=50 и передает фиксированную структуру через native Закрыть(Ответ). Пульт проверяет все три типа/числа и только затем меняет свой числовой предпросмотр на50. Исходные3/25/75 остаются неизменными.

  12. Повторите открытие дочерней формы и нажмите собственную Отменить85. Она явно закрывается с Неопределено; пульт сохраняет прежний предпросмотр50 (при отмене первого открытия останется75). Любое Неопределено рассматривается как отмена, другое неподходящее значение — отказ. Поведение системного крестика отдельно не обещается без ручной проверки.

  13. СчетТакси85: MANAGED_MODULE в ОбщиеФормы.СчетТакси85.Модуль. Реквизиты Количество85 Число10,0; Цена85 Число12,2; ИсходнаяСумма85 Число15,2; Состояние85 Строка2000. Поля ТолькоПросмотрДа. Добавьте декорацию-надпись Показать75, заголовок Показать счет75, ГиперссылкаДа; Нажатие→Показать75Нажатие(Элемент). Native декорация Click483 имеет0 собственных параметров, managed общий event525 добавляет первый Элемент: итог1, не команда формы.

  14. Управляемая форма: native ПриОткрытии(Отказ)1, ПередЗакрытием(Отказ,ЗавершениеРаботы,ТекстПредупреждения,СтандартнаяОбработка)4. ПослеПоказа85(ДополнительныеПараметры) Экспорт1 — callback ПоказатьЗначение, не событие кнопки и не двухаргументный callback Закрыть формы. Блок Перем и все процедуры этой формы явно &НаКлиенте; окно/модуль оповещения не читаются на сервере.

  15. MANAGED_APP в Конфигурация.МодульУправляемогоПриложения: ПриНачалеРаботыСистемы()0. Завершите обычный запуск и вручную запустите ту же свою CF толстым управляемым клиентом Такси. Он получает именно ОбщаяФорма.СчетТакси85 через ПолучитьФорму с УникальностьИстина и проверяет тип до открытия.

  16. В управляемом пульте нажмите свою гиперссылку. Только здесь АктивноеОкно должно дать окно этой формы: сначала считывается readonly ЭтотОбъект.Окно, проверяется тип и равенство текущему активному окну. В обычном режиме АктивноеОкно дает Неопределено; этот обычный getter не выдаем за получение окна.

  17. ПоказатьЗначение получает ОписаниеОповещения(ПослеПоказа85,ЭтотОбъект,ДанныеШага) и текст75. ЭтотОбъект — реальная managed форма, допустимый MODULE ctor190, не обычная Форма. Метод не ждет закрытия, повтор блокируется Занят85 до настоящего экспортного callback. ДанныеШага хранят копию чисел, идентификатор данного шага и ссылку на фактическое собственное окно.

  18. После закрытия окна показа платформа вызывает callback только с ДополнительныеПараметры. Проверяются тип/номер собственного шага/окно и все три сохраненных числа75, затем занятость снимается. Callback не сообщает выбор/принятие/отмену и не изменяет счет: такого результата не выдумываем. Окно хранится для сравнения идентичности, не объявляется неизменяемой копией renderer.

  19. При отказе/исключении выставляетсяСТОП, автоматического retry и предположения отката нет. Пока показ ожидается, обычное закрытие host-формы отклоняется; принудительный выход приложения может завершить ее вопреки предупреждению, callback при этом не обещается. Отмена модального изменения — штатная ветвь, не ошибка и не успех изменения.

  20. Числовой протокол ручной проверки: оба исходных счета3×25=75; обычный Принять2 дает предпросмотр50 и сохраняет source75; Отменить сохраняет прежний75/50; managed показ+callback оставляет75. Записи документов/констант/файлов нет. Статические проверки не являются компиляцией CF или доказательством UI/runtime.

Перем Счет85, Остановка85, Занят85;

Процедура ПриОткрытии()
    Если Остановка85 <> Неопределено Тогда
        Возврат;
    КонецЕсли;
    Остановка85 = Истина;
    Занят85 = Ложь;
    СтендПоказа85.ПроверитьСтенд85();
    Счет85 = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", 3, 25, 3 * 25);
    Количество85 = 3;
    Цена85 = 25;
    ИсходнаяСумма85 = Количество85 * Цена85;
    Предпросмотр85 = ИсходнаяСумма85;
    ПроверитьИсточник85();
    Состояние85 = "Исходный счет3×25=75. Изменяется только предпросмотр в памяти.";
    Остановка85 = Ложь;
КонецПроцедуры

Процедура ПроверитьИсточник85()
    СтендПоказа85.ПроверитьСтенд85();
    СтендПоказа85.ПроверитьСчет85(Счет85);
    Если ТипЗнч(Количество85) <> Тип("Число") Или Количество85 <> Счет85.Количество
        Или ТипЗнч(Цена85) <> Тип("Число") Или Цена85 <> Счет85.Цена
        Или ТипЗнч(ИсходнаяСумма85) <> Тип("Число") Или ИсходнаяСумма85 <> Счет85.Сумма Тогда
        ВызватьИсключение "Изменены исходные числовые реквизиты собственной формы";
    КонецЕсли;
КонецПроцедуры

Процедура Показать75(Элемент)
    Если Элемент <> ЭлементыФормы.Показать75 Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
        ВызватьИсключение "Нужна собственная готовая кнопка показа счета";
    КонецЕсли;
    Попытка
        ПроверитьИсточник85();
        Занят85 = Истина;
        ОткрытьЗначение("Учебный счет:3×25=" + Строка(Счет85.Сумма));
        ПроверитьИсточник85();
        Занят85 = Ложь;
        Состояние85 = "ОткрытьЗначение вызван с текстом собственного счета. Исходная сумма75 сохранена.";
    Исключение
        Занят85 = Ложь;
        Остановка85 = Истина;
        Состояние85 = "СТОП: показ не подтверждает изменение счета; повтор этой формой запрещен.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ИзменитьКоличество85(Элемент)
    Если Элемент <> ЭлементыФормы.ИзменитьКоличество85 Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
        ВызватьИсключение "Нужна собственная готовая кнопка изменения предпросмотра";
    КонецЕсли;
    Попытка
        ПроверитьИсточник85();
        СтарыйПредпросмотр = Предпросмотр85;
        Занят85 = Истина;
        Ключ = Новый УникальныйИдентификатор;
        Кандидат = ПолучитьОбщуюФорму("Количество85", ЭтаФорма, Ключ);
        Если ТипЗнч(Кандидат) <> Тип("Форма") Или Кандидат.ВладелецФормы <> ЭтаФорма Или Кандидат.КлючУникальности <> Ключ Тогда
            ВызватьИсключение "Фабрика не вернула собственную новую дочернюю форму";
        КонецЕсли;
        Кандидат.Подготовить85(ЭтаФорма, Счет85);
        Результат = ОткрытьФормуМодально(Кандидат);
        ПроверитьИсточник85();
        Если Результат = Неопределено Тогда
            Если Предпросмотр85 <> СтарыйПредпросмотр Тогда
                ВызватьИсключение "Отмена не должна менять прежний предпросмотр";
            КонецЕсли;
            Состояние85 = "Отмена: сохранен прежний предпросмотр " + Строка(СтарыйПредпросмотр) + "; исходный счет75 не изменен.";
        Иначе
            Если ТипЗнч(Результат) <> Тип("ФиксированнаяСтруктура") Или Результат.Количество() <> 3
                Или ТипЗнч(Результат.Количество) <> Тип("Число") Или Результат.Количество <> 2
                Или ТипЗнч(Результат.Цена) <> Тип("Число") Или Результат.Цена <> Счет85.Цена
                Или ТипЗнч(Результат.Сумма) <> Тип("Число") Или Результат.Сумма <> Результат.Количество * Результат.Цена Или Результат.Сумма <> 50 Тогда
                ВызватьИсключение "Дочерняя форма должна вернуть только собственный расчет2×25=50";
            КонецЕсли;
            Предпросмотр85 = Результат.Сумма;
            Если ТипЗнч(Предпросмотр85) <> Тип("Число") Или Предпросмотр85 <> 50 Тогда
                ВызватьИсключение "Не совпал числовой предпросмотр собственной формы";
            КонецЕсли;
            Состояние85 = "Принято: предпросмотр2×25=50. Исходный счет3×25=75 остался прежним; записи нет.";
        КонецЕсли;
        ПроверитьИсточник85();
        Занят85 = Ложь;
    Исключение
        Занят85 = Ложь;
        Остановка85 = Истина;
        Состояние85 = "СТОП: неожиданный результат или частичная ошибка. Успех и откат не предполагаются.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    Если Занят85 = Истина Тогда
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры
СтендПоказа85

ОбщиеМодули.СтендПоказа85.Модуль

ClientOrdinaryДа/ClientManagedДа, ServerНет; guard только два thick desktop режима.

Процедура ПроверитьСтенд85() Экспорт
    #Если ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
        Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnDisplayValues85_75a4c79f-9402-42d3-8c08-90f7bedde32f\IB"";" Тогда
            ВызватьИсключение "Откройте только свою новую учебную File-базу показа значений";
        КонецЕсли;
        Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.РежимИспользованияМодальности <> Метаданные.СвойстваОбъектов.РежимИспользованияМодальности.Использовать Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0 Или Метаданные.ОбщиеФормы.Количество() <> 3 Или Метаданные.ОбщиеФормы.Найти("СчетОбычный85") = Неопределено Или Метаданные.ОбщиеФормы.Найти("Количество85") = Неопределено Или Метаданные.ОбщиеФормы.Найти("СчетТакси85") = Неопределено Тогда
            ВызватьИсключение "Не совпадает отдельная учебная конфигурация или разрешенный режим модальности";
        КонецЕсли;
        Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0 Тогда
            ВызватьИсключение "Расширения базы на этом стенде не используются";
        КонецЕсли;
    #Иначе
        ВызватьИсключение "Этот учебный опыт только для двух режимов толстого клиента Windows";
    #КонецЕсли
КонецПроцедуры

Процедура ПроверитьСчет85(Счет) Экспорт
    Если ТипЗнч(Счет) <> Тип("ФиксированнаяСтруктура") Или Счет.Количество() <> 3
        Или ТипЗнч(Счет.Количество) <> Тип("Число") Или Счет.Количество <> 3
        Или ТипЗнч(Счет.Цена) <> Тип("Число") Или Счет.Цена <> 25
        Или ТипЗнч(Счет.Сумма) <> Тип("Число") Или Счет.Сумма <> Счет.Количество * Счет.Цена Или Счет.Сумма <> 75 Тогда
        ВызватьИсключение "Исходный счет должен оставаться неизменяемым расчетом3×25=75";
    КонецЕсли;
КонецПроцедуры
СчетОбычный85

ОбщиеФормы.СчетОбычный85.Модуль

Толстый обычный клиент, native Button0+event104Element1.

Перем Счет85, Остановка85, Занят85;

Процедура ПриОткрытии()
    Если Остановка85 <> Неопределено Тогда
        Возврат;
    КонецЕсли;
    Остановка85 = Истина;
    Занят85 = Ложь;
    СтендПоказа85.ПроверитьСтенд85();
    Счет85 = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", 3, 25, 3 * 25);
    Количество85 = 3;
    Цена85 = 25;
    ИсходнаяСумма85 = Количество85 * Цена85;
    Предпросмотр85 = ИсходнаяСумма85;
    ПроверитьИсточник85();
    Состояние85 = "Исходный счет3×25=75. Изменяется только предпросмотр в памяти.";
    Остановка85 = Ложь;
КонецПроцедуры

Процедура ПроверитьИсточник85()
    СтендПоказа85.ПроверитьСтенд85();
    СтендПоказа85.ПроверитьСчет85(Счет85);
    Если ТипЗнч(Количество85) <> Тип("Число") Или Количество85 <> Счет85.Количество
        Или ТипЗнч(Цена85) <> Тип("Число") Или Цена85 <> Счет85.Цена
        Или ТипЗнч(ИсходнаяСумма85) <> Тип("Число") Или ИсходнаяСумма85 <> Счет85.Сумма Тогда
        ВызватьИсключение "Изменены исходные числовые реквизиты собственной формы";
    КонецЕсли;
КонецПроцедуры

Процедура Показать75(Элемент)
    Если Элемент <> ЭлементыФормы.Показать75 Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
        ВызватьИсключение "Нужна собственная готовая кнопка показа счета";
    КонецЕсли;
    Попытка
        ПроверитьИсточник85();
        Занят85 = Истина;
        ОткрытьЗначение("Учебный счет:3×25=" + Строка(Счет85.Сумма));
        ПроверитьИсточник85();
        Занят85 = Ложь;
        Состояние85 = "ОткрытьЗначение вызван с текстом собственного счета. Исходная сумма75 сохранена.";
    Исключение
        Занят85 = Ложь;
        Остановка85 = Истина;
        Состояние85 = "СТОП: показ не подтверждает изменение счета; повтор этой формой запрещен.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ИзменитьКоличество85(Элемент)
    Если Элемент <> ЭлементыФормы.ИзменитьКоличество85 Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
        ВызватьИсключение "Нужна собственная готовая кнопка изменения предпросмотра";
    КонецЕсли;
    Попытка
        ПроверитьИсточник85();
        СтарыйПредпросмотр = Предпросмотр85;
        Занят85 = Истина;
        Ключ = Новый УникальныйИдентификатор;
        Кандидат = ПолучитьОбщуюФорму("Количество85", ЭтаФорма, Ключ);
        Если ТипЗнч(Кандидат) <> Тип("Форма") Или Кандидат.ВладелецФормы <> ЭтаФорма Или Кандидат.КлючУникальности <> Ключ Тогда
            ВызватьИсключение "Фабрика не вернула собственную новую дочернюю форму";
        КонецЕсли;
        Кандидат.Подготовить85(ЭтаФорма, Счет85);
        Результат = ОткрытьФормуМодально(Кандидат);
        ПроверитьИсточник85();
        Если Результат = Неопределено Тогда
            Если Предпросмотр85 <> СтарыйПредпросмотр Тогда
                ВызватьИсключение "Отмена не должна менять прежний предпросмотр";
            КонецЕсли;
            Состояние85 = "Отмена: сохранен прежний предпросмотр " + Строка(СтарыйПредпросмотр) + "; исходный счет75 не изменен.";
        Иначе
            Если ТипЗнч(Результат) <> Тип("ФиксированнаяСтруктура") Или Результат.Количество() <> 3
                Или ТипЗнч(Результат.Количество) <> Тип("Число") Или Результат.Количество <> 2
                Или ТипЗнч(Результат.Цена) <> Тип("Число") Или Результат.Цена <> Счет85.Цена
                Или ТипЗнч(Результат.Сумма) <> Тип("Число") Или Результат.Сумма <> Результат.Количество * Результат.Цена Или Результат.Сумма <> 50 Тогда
                ВызватьИсключение "Дочерняя форма должна вернуть только собственный расчет2×25=50";
            КонецЕсли;
            Предпросмотр85 = Результат.Сумма;
            Если ТипЗнч(Предпросмотр85) <> Тип("Число") Или Предпросмотр85 <> 50 Тогда
                ВызватьИсключение "Не совпал числовой предпросмотр собственной формы";
            КонецЕсли;
            Состояние85 = "Принято: предпросмотр2×25=50. Исходный счет3×25=75 остался прежним; записи нет.";
        КонецЕсли;
        ПроверитьИсточник85();
        Занят85 = Ложь;
    Исключение
        Занят85 = Ложь;
        Остановка85 = Истина;
        Состояние85 = "СТОП: неожиданный результат или частичная ошибка. Успех и откат не предполагаются.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    Если Занят85 = Истина Тогда
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры
Количество85

ОбщиеФормы.Количество85.Модуль

Толстый обычный клиент; реальный владелец/подготовка/Close(result).

Перем Счет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);
        Если ТипЗнч(НовоеКоличество85) <> Тип("Число") Или НовоеКоличество85 <> 2
            Или ТипЗнч(Цена85) <> Тип("Число") Или Цена85 <> Счет85.Цена Тогда
            ВызватьИсключение "В этом учебном шаге введите количество2, цена остается25";
        КонецЕсли;
        Ответ = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", НовоеКоличество85, Цена85, НовоеКоличество85 * Цена85);
        Если Ответ.Сумма <> 50 Тогда
            ВызватьИсключение "Не совпал самостоятельный расчет2×25=50";
        КонецЕсли;
        ЭтаФорма.Закрыть(Ответ);
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

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

ОбщиеФормы.СчетТакси85.Модуль

Толстый managed клиент Такси; все процедуры &НаКлиенте, native notification callback1.

&НаКлиенте
Перем Счет85, Остановка85, Занят85, Шаг85;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если Остановка85 <> Неопределено Тогда
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    Остановка85 = Истина;
    Занят85 = Ложь;
    Попытка
        СтендПоказа85.ПроверитьСтенд85();
        Счет85 = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", 3, 25, 3 * 25);
        Количество85 = 3;
        Цена85 = 25;
        ИсходнаяСумма85 = Количество85 * Цена85;
        ПроверитьИсточник85();
        Состояние85 = "Счет3×25=75 в памяти. Нажмите ссылку Показать75.";
        Остановка85 = Ложь;
    Исключение
        Отказ = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПослеПоказа85(ДополнительныеПараметры) Экспорт
    Попытка
        Если Остановка85 <> Ложь Или Занят85 <> Истина
            Или ТипЗнч(ДополнительныеПараметры) <> Тип("ФиксированнаяСтруктура") Или ДополнительныеПараметры.Количество() <> 3
            Или ТипЗнч(ДополнительныеПараметры.Шаг) <> Тип("УникальныйИдентификатор") Или ДополнительныеПараметры.Шаг <> Шаг85
            Или ТипЗнч(ДополнительныеПараметры.Окно) <> Тип("ОкноКлиентскогоПриложения") Или ДополнительныеПараметры.Окно <> ЭтотОбъект.Окно Тогда
            ВызватьИсключение "Не совпало настоящее завершение собственного ожидаемого шага";
        КонецЕсли;
        СтендПоказа85.ПроверитьСчет85(ДополнительныеПараметры.Счет);
        ПроверитьИсточник85();
        Если ДополнительныеПараметры.Счет.Количество <> Счет85.Количество
            Или ДополнительныеПараметры.Счет.Цена <> Счет85.Цена Или ДополнительныеПараметры.Счет.Сумма <> Счет85.Сумма Тогда
            ВызватьИсключение "Изменены числовые значения собственного исходного счета75";
        КонецЕсли;
        Занят85 = Ложь;
        Состояние85 = "Получен настоящий callback закрытия показа. Исходный счет3×25=75 остался прежним.";
    Исключение
        Занят85 = Ложь;
        Остановка85 = Истина;
        Состояние85 = "СТОП: callback или исходные значения не совпали; повтор не выполняется.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если Занят85 = Истина Тогда
        Отказ = Истина;
        ТекстПредупреждения = "Показ собственного счета еще не завершен. При принудительном выходе callback не обещается.";
    КонецЕсли;
КонецПроцедуры
ОбычноеПриложение

Конфигурация.МодульОбычногоПриложения

ПриНачалеРаботыСистемы0, запуск собственного ordinary пульта.

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

Конфигурация.МодульУправляемогоПриложения

ПриНачалеРаботыСистемы0, получение настоящего managed пульта.

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

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

  1. Обычный и управляемый маршруты разделены полными модулями и запускаются вручную в соответствующем толстом клиенте одной собственной CF.

  2. Обычный пульт передает actual дочернюю форму с проверенным владельцем в глобальный модальный метод и разбирает typed ответ50 либо Undefinedcancel.

  3. Управляемый пульт получает actual окно только на клиенте; ОписаниеОповещения связано с его собственным ЭтотОбъект и экспортным callback1.

  4. Каждый маршрут сверяет исходные три числовых поля и fixed снимок75; повтор до завершения блокируется, callback вручную не вызывается.

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

  1. Обычный Принять2: предпросмотр50 при неизменном исходном75; Отменить сохраняет прежний предпросмотр.

  2. Managed показ: фактическое собственное активное окно и закрытие показа через native callback, без выдуманного результата выбора.

  3. Не выполнялись1С/CFcompiler/UI/DB/network/files/OS; runtimeVerifiedFalse.

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

Ожидаемый будущий ручной результат: source75 не меняется; ordinary предпросмотр50 только после принятия, отмена без изменения; managed callback оставляет75. Все данные счета в памяти, записи базы не нужны.

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

  1. АктивноеОкно в обычном режиме возвращаетUndefined; переносить managed окно в обычную форму нельзя.

  2. Обычная Форма отсутствует в MODULE ctor190. Notification получает только actual managed ЭтотОбъект; callback ShowValue имеет1 параметр, не2.

  3. Метаданные модальностиreadonly; Использовать задается вручную в конфигурации, не присваивается во время работы.

  4. Системный диалог зависит от типа значения, точный внешний вид и renderer не проверены. Никакая работа с базой или авторизация чужого объекта из этих чисел не следует.

  5. STOP не сбрасывается повторным initializer/open; частичные UI-изменения не объявляются атомарными. При принудительном завершении callback не гарантирован.

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

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

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

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

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