Расширение элементов управления, расположенных в форме.<Имя события>

События · <Event name>

У всех событий элементов управления, расположенных в форме, присутствует общий первый параметр.

Синтаксис

<Имя события>(<Элемент>, <...>)
Полное описание, параметры и ограничения

Расширение элементов управления, расположенных в форме.<Имя события> (Extension for controls located in a form.<Event name>)

Расширение элементов управления, расположенных в форме (Extension for controls located in a form)

<Имя события> (<Event name>)

Доступен, начиная с версии 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 или установкой стороннего компонента.

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

Свой ordinary просмотрщик120×8: прокрутка, защищенные960 чисел, выбор ячейки, блокировка и точное восстановление оформления

Реальный own spreadsheet-field из подготовленной ordinary формы, а не getter wrapper/managed alias. Самостоятельная рассчитанная матрица читается и проверяется целиком; восемь actual исходных свойств сохраняются typed copies, режимы меняются только при exact expected-own-state и восстанавливаются без blind rollback после ошибок.

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

MAIN FORM только модуль own ordinary общей формы Просмотр85 новой пустой CF УчебныйПросмотрТабДок85. Windows thick ОбычноеПриложение/FileIB/currentownuser. Native actual ПолеТабличногоДокумента catalog56 from Form.Controls, не managedalias. APPLICATION отдельно ordinary application module.

Подготовка

  1. Только отдельная собственная Windows VM, платформа8.5.1.1343, толстый клиент в режиме ОбычноеПриложение. Native ПолеТабличногоДокумента catalog56 является visual ТабличныйДокумент со свойствами/методами последнего. Managed ПолеФормы/форма клиента не подменяют этот native type.

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

  3. Marker каталога/actualuser имени не UUID ИБ или UUID реального пользователя. Native currentuser UUID сверяется с единственным actual пользователем; реальный UUID самой базы не измеряется. Не рабочая/типовая база, другой пользователь или чужой просмотрщик.

  4. Собственная CF пуста: нет справочников/документов/регистров/общих реквизитов/разделителей/ботов/констант/подписок/заданий/внешних данных/расширений. Создайте только ordinary общую форму Просмотр85. Runtime работает только с новым собственным TabDoc в памяти, без DBread/write.

  5. Конфигуратор → Общие → Общие формы → Просмотр85: Обычная форма. Реквизиты: МеткаОпыта Строка36; Согласен85 Булево; Результат85 ТабличныйДокумент; Состояние85 Строка500. Флажок связан с Согласен85, readonly текстовое поле/надпись статуса — с Состояние85. Marker/False consent назначаются own app перед открытием.

  6. Разместите собственное ПолеТабличногоДокумента Уч85Просмотр, Данные=Результат85. Окно/поле должно быть меньше полного содержимого121строка×8колонок для ручной проверки вертикальной/горизонтальной прокрутки; остальные кнопки/согласие/статус размещайте ВНЕ этого поля, чтобы блокировка не отключила их.

  7. Три ordinary кнопки: Подготовить85, Блокировка85, Восстановить85. В свойствах → События → Нажатие явно назначьте соответственно ПодготовитьПросмотр85, ПереключитьДоступность85, ВосстановитьОформление85. Native Button.Нажатие() плюс ordinary form extension firstЭлемент дают handler(Элемент), не managed Команда и не zeroarg handler.

  8. У Уч85Просмотр в свойствах → События → Выбор назначьте Уч85ПросмотрВыбор. Base native Выбор(Область,СтандартнаяОбработка) плюс ordinary form extension firstЭлемент дают ровно3args. Событие вызывается двойным щелчком/Enter; не вручную для имитации UI proof. Область от native события связана с actual initiating своим field.

  9. Вставьте FORM целиком исключительно в модуль этой own ordinary общей формы. Readonly ЭтаФорма.ЭлементыФормы.Найти дает actual own field; проверяется native type/точный Data. Нет Новый ПолеТабличногоДокумента/неизвестного входного объекта или присваивания readonly коллекции.

  10. В обычный модуль приложения своей CF вставьте APPLICATION полностью: real native OnStart0 получает marker из имени настоящего currentuser, выполняет полный guard и native GetCommonForm fresh UUIDkey, назначает own marker/False consent и открывает. Button/Selection события вручную не вызываются.

  11. Вручную проверьте исходники конфигуратором и запустите только эту собственную ИБ actual пользователем. Автор не создавал/компилировал CF/формы и не запускал1С/UI/файлы/БД/сеть/печать. Подтвердите Согласен85 и нажмите Подготовить85 один раз. После ошибки закрывайте только этот свой экземпляр вручную, не делайте blind recovery.

  12. Своя numeric матрица содержит header row1 и data rows2..121, колонки1..8, значения(row-1)*column. Есть960 числовых cells. Все header/data области защищены Защита=True и ТабДок.ТолькоПросмотр=True. OnlyView само по себе не абсолютный запрет: native документация ограничивает редактирование именно защищенных cells/рисунков. Это UI protection, не security boundary.

  13. Перед каждым viewer setter процесс заново проверяет same actual field/data binding, обе shape121×8 и OnlyView, все8header/protection и все960actual field/object numeric/protected cells. Сумма читается из фактических cells:261360=120*121/2 *8*9/2. Формула проверяет, но не подставляет источник вместо испорченного cell.

  14. Baseline восьми native getter values снимается после своего создания/проверки данных, но ДО изменения viewer props. Scrollbars/Enabled/DND — Boolean, ShowSelection — ТипОтображенияВыделенияТабличногоДокумента, Border/Color — реальные типы Рамка/Цвет. Значения по умолчанию/стиля не угадываются.

  15. Frame/Color baseline копируются native XDTO через string-only writer/reader с explicit type, exact typed roundtrip и signature сравнение. Это только свои два допустимых UI value types из getter/own constructor; не user XML/файл/schema/объект данных. Style/auto сохранены, не превращены в guessed RGB. Deprecated ValueToStringInternal не используется.

  16. Подготовленный desired plan строится ДО setters: обе scrollbar=True, enabled=True, selection Всегда, оба DND=False, double рамка толщиной2logicalunits и абсолютный RGB30/72/102. Цвет рамки native игнорируется у Выпуклая/Вдавленная, поэтому здесь Двойная. Border thickness logical units не миллиметры previous overlay урока.

  17. State gating сравнивает все8current props с последним exact ожидаемым своим состоянием. НеЗавершено=True ставится до первого setter; только full desired readback и повторная data проверка позволяют записать новый expected state/снять флаг. Если setter/roundtrip/readback неудачен, flag остается, дальнейшие команды/rollback запрещены; нельзя объявить любой current afterstate своим.

  18. Прокрутите только свой бланк по обеим осям. Двойной щелчок одной numeric cell, например row121/col8, должен показать actual960 в Состояние85; row2/col1 —1. Header/multi-cell/вне диапазона не считают numeric selection; проверки firstElement/area bounds/ContainsValue/Number/ownfield readback не заменяются подписью.

  19. Блокировка85 переключает только own desired Enabled, при fullsamefield/fullgrid/currentstate guard. False запрещает доступ к полю и его controls по native контракту, а buttons вне поля остаются доступны. Повторная команда вернетTrue. Данные/checksum/Frame/Color/scroll/selection/DND сохраняются exact desired state.

  20. Восстановить85 возвращает именно реальные baseline8props, включая исходные style/auto/Boolean/enum, только после exact expected-own-state. Не reset-to-known-defaults и не автоматический rollback по Exception. Если свой current state изменен извне, данные испорчены или flagfailed — отказ, никакого blind overwrite.

  21. После successful restoration новые setters этого экземпляра запрещены; закрывайте свою форму вручную. Baseline DND/Enabled могут иметь другие значения: они возвращены как параметры, но protected свой data остаются. DND flags/UI protection не абсолютная sandbox/data security и не подтвержденная печать/экспорт/визуальная pixel correctness.

  22. Ручные negative проверки только на отдельном новом собственном экземпляре: без согласия — отказ; повторная подготовка — отказ; изменение header/numeric cell/protection или viewer prop вне известного состояния — отказ до новых setters. Partialfailure не чинится принудительным restore, неизвестные поля/формы/состояния не используются.

Перем НачатаПодготовка85;
Перем Подготовлено85;
Перем НеЗавершено85;
Перем Восстановлено85;
Перем СвоеПоле85;
Перем ИсходноеСостояние85;
Перем ОжидаемоеСостояние85;

Процедура ПодготовитьПросмотр85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Подготовить85");
    Если НачатаПодготовка85 = Истина Тогда
        ВызватьИсключение "Подготовка одноразовая. Ошибка/частичный setter не разрешают повторную подготовку или автоматический rollback";
    КонецЕсли;
    СвоеПоле85 = ЭтаФорма.ЭлементыФормы.Найти("Уч85Просмотр");
    Если СвоеПоле85 = Неопределено Или ТипЗнч(СвоеПоле85) <> Тип("ПолеТабличногоДокумента") Или СвоеПоле85.Данные <> "Результат85" Тогда
        ВызватьИсключение "Нужно actual own prepared spreadsheet field с Data=Результат85, не managed alias";
    КонецЕсли;
    НачатаПодготовка85 = Истина;
    НеЗавершено85 = Истина;
    Результат85 = Новый ТабличныйДокумент;
    Для Колонка = 1 По 8 Цикл
        Результат85.Область(1, Колонка).Текст = "Колонка" + Строка(Колонка);
        Для СтрокаДанных = 1 По 120 Цикл
            Ячейка = Результат85.Область(СтрокаДанных + 1, Колонка);
            Ячейка.СодержитЗначение = Истина;
            Ячейка.ТипЗначения = Новый ОписаниеТипов("Число");
            Ячейка.Значение = СтрокаДанных * Колонка;
        КонецЦикла;
    КонецЦикла;
    Результат85.Область(1, 1, 121, 8).Защита = Истина;
    Результат85.ТолькоПросмотр = Истина;
    ПроверитьСвоеПолеИВсюМатрицу85();
    ИсходноеСостояние85 = СнятьActualПаспортСвоегоПоля85();
    ОжидаемоеСостояние85 = ИсходноеСостояние85;
    План = Новый Структура(ИсходноеСостояние85);
    План.ВертикальнаяПолосаПрокрутки = Истина;
    План.ГоризонтальнаяПолосаПрокрутки = Истина;
    План.Доступность = Истина;
    План.ОтображатьВыделение = ТипОтображенияВыделенияТабличногоДокумента.Всегда;
    План.РазрешитьНачалоПеретаскивания = Ложь;
    План.РазрешитьПеретаскивание = Ложь;
    КопияРамки = КопияСвоегоОформления85(Новый Рамка(ТипРамкиЭлементаУправления.Двойная, 2));
    КопияЦвета = КопияСвоегоОформления85(Новый Цвет(30, 72, 102));
    План.Рамка = КопияРамки.Значение;
    План.XMLРамки = КопияРамки.XML;
    План.ЦветРамки = КопияЦвета.Значение;
    План.XMLЦвета = КопияЦвета.XML;
    Если План.Рамка.ТипРамки <> ТипРамкиЭлементаУправления.Двойная Или План.Рамка.Толщина <> 2
        Или План.ЦветРамки.Красный <> 30 Или План.ЦветРамки.Зеленый <> 72 Или План.ЦветРамки.Синий <> 102 Тогда
        ВызватьИсключение "Typed own absolute рамка/RGB план не подтвердился до setters";
    КонецЕсли;
    ПрименитьТочныйСвойПлан85(Новый ФиксированнаяСтруктура(План));
    Подготовлено85 = Истина;
    Восстановлено85 = Ложь;
    Состояние85 = "Матрица120×8 проверена:960 чисел, сумма261360. Прокрутите, затем дважды щелкните одну числовую ячейку.";
КонецПроцедуры

Процедура ПереключитьДоступность85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Блокировка85");
    ПроверитьГотовностьСвоегоПросмотра85();
    План = Новый Структура(ОжидаемоеСостояние85);
    План.Доступность = Не План.Доступность;
    ПрименитьТочныйСвойПлан85(Новый ФиксированнаяСтруктура(План));
    Состояние85 = "Доступность actual поля=" + Строка(ОжидаемоеСостояние85.Доступность) + "; own960cells/сумма сохранены. Кнопки вне поля доступны.";
КонецПроцедуры

Процедура ВосстановитьОформление85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Восстановить85");
    ПроверитьГотовностьСвоегоПросмотра85();
    ПрименитьТочныйСвойПлан85(ИсходноеСостояние85);
    Восстановлено85 = Истина;
    Состояние85 = "Все8 actual исходных свойств возвращены своей форме после expected-own-state проверки. Матрица осталась собственной/защищенной. Закройте этот учебный экземпляр вручную.";
КонецПроцедуры

Процедура Уч85ПросмотрВыбор(Элемент, Область, СтандартнаяОбработка)
    ПроверитьСвойOrdinaryПросмотр85(МеткаОпыта);
    СтандартнаяОбработка = Ложь;
    Если Подготовлено85 <> Истина Или НеЗавершено85 = Истина Тогда
        ВызватьИсключение "Частичный/неподготовленный viewer не подтверждает UI выбор";
    КонецЕсли;
    Если Элемент <> СвоеПоле85 Или ЭтаФорма.ЭлементыФормы.Найти("Уч85Просмотр") <> Элемент
        Или ТипЗнч(Элемент) <> Тип("ПолеТабличногоДокумента") Тогда
        ВызватьИсключение "Нужно actual native Selection своего field, не foreign инициатор/вручную вызванное событие";
    КонецЕсли;
    ПроверитьСвоеПолеИВсюМатрицу85();
    ПроверитьСовпадениеСвоихСостояний85(СнятьActualПаспортСвоегоПоля85(), ОжидаемоеСостояние85);
    Если ТипЗнч(Область) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
        ВызватьИсключение "Native Selection должна передать actual область, связанную с собственным событием";
    КонецЕсли;
    Если Область.Верх <> Область.Низ Или Область.Лево <> Область.Право
        Или Область.Верх < 2 Или Область.Верх > 121 Или Область.Лево < 1 Или Область.Лево > 8 Тогда
        Состояние85 = "Выберите двойным щелчком одну свою числовую ячейку: строки2..121, колонки1..8, не заголовок/область.";
        Возврат;
    КонецЕсли;
    СвояЯчейка = СвоеПоле85.Область(Область.Верх, Область.Лево);
    Если Не Область.СодержитЗначение Или Не СвояЯчейка.СодержитЗначение
        Или ТипЗнч(Область.Значение) <> Тип("Число") Или ТипЗнч(СвояЯчейка.Значение) <> Тип("Число")
        Или Область.Значение <> СвояЯчейка.Значение
        Или СвояЯчейка.Значение <> (Область.Верх - 1) * Область.Лево Тогда
        ВызватьИсключение "Actual native event area/current ownfield cell numeric readback не совпал";
    КонецЕсли;
    Состояние85 = "Собственный actual Selection: строка=" + Строка(Область.Верх) + "; колонка=" + Строка(Область.Лево) + "; число=" + Строка(СвояЯчейка.Значение);
КонецПроцедуры

Процедура ПрименитьТочныйСвойПлан85(План)
    ПроверитьСвоеПолеИВсюМатрицу85();
    ПроверитьСовпадениеСвоихСостояний85(СнятьActualПаспортСвоегоПоля85(), ОжидаемоеСостояние85);
    НеЗавершено85 = Истина;
    СвоеПоле85.ВертикальнаяПолосаПрокрутки = План.ВертикальнаяПолосаПрокрутки;
    СвоеПоле85.ГоризонтальнаяПолосаПрокрутки = План.ГоризонтальнаяПолосаПрокрутки;
    СвоеПоле85.Доступность = План.Доступность;
    СвоеПоле85.ОтображатьВыделение = План.ОтображатьВыделение;
    СвоеПоле85.РазрешитьНачалоПеретаскивания = План.РазрешитьНачалоПеретаскивания;
    СвоеПоле85.РазрешитьПеретаскивание = План.РазрешитьПеретаскивание;
    СвоеПоле85.Рамка = План.Рамка;
    СвоеПоле85.ЦветРамки = План.ЦветРамки;
    ПроверитьСовпадениеСвоихСостояний85(СнятьActualПаспортСвоегоПоля85(), План);
    ПроверитьСвоеПолеИВсюМатрицу85();
    ОжидаемоеСостояние85 = План;
    НеЗавершено85 = Ложь;
КонецПроцедуры

Функция СнятьActualПаспортСвоегоПоля85()
    Паспорт = Новый Структура;
    Паспорт.Вставить("ВертикальнаяПолосаПрокрутки", СвоеПоле85.ВертикальнаяПолосаПрокрутки);
    Паспорт.Вставить("ГоризонтальнаяПолосаПрокрутки", СвоеПоле85.ГоризонтальнаяПолосаПрокрутки);
    Паспорт.Вставить("Доступность", СвоеПоле85.Доступность);
    Паспорт.Вставить("ОтображатьВыделение", СвоеПоле85.ОтображатьВыделение);
    Паспорт.Вставить("РазрешитьНачалоПеретаскивания", СвоеПоле85.РазрешитьНачалоПеретаскивания);
    Паспорт.Вставить("РазрешитьПеретаскивание", СвоеПоле85.РазрешитьПеретаскивание);
    КопияРамки = КопияСвоегоОформления85(СвоеПоле85.Рамка);
    КопияЦвета = КопияСвоегоОформления85(СвоеПоле85.ЦветРамки);
    Паспорт.Вставить("Рамка", КопияРамки.Значение);
    Паспорт.Вставить("ЦветРамки", КопияЦвета.Значение);
    Паспорт.Вставить("XMLРамки", КопияРамки.XML);
    Паспорт.Вставить("XMLЦвета", КопияЦвета.XML);
    Если ТипЗнч(Паспорт.ВертикальнаяПолосаПрокрутки) <> Тип("Булево") Или ТипЗнч(Паспорт.ГоризонтальнаяПолосаПрокрутки) <> Тип("Булево")
        Или ТипЗнч(Паспорт.Доступность) <> Тип("Булево") Или ТипЗнч(Паспорт.РазрешитьНачалоПеретаскивания) <> Тип("Булево")
        Или ТипЗнч(Паспорт.РазрешитьПеретаскивание) <> Тип("Булево")
        Или ТипЗнч(Паспорт.ОтображатьВыделение) <> Тип("ТипОтображенияВыделенияТабличногоДокумента") Тогда
        ВызватьИсключение "Actual8 typed getter values не соответствуют native field контрактам";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура(Паспорт);
КонецФункции

Процедура ПроверитьСовпадениеСвоихСостояний85(Actual, Ожидаемое)
    Если Actual.ВертикальнаяПолосаПрокрутки <> Ожидаемое.ВертикальнаяПолосаПрокрутки
        Или Actual.ГоризонтальнаяПолосаПрокрутки <> Ожидаемое.ГоризонтальнаяПолосаПрокрутки
        Или Actual.Доступность <> Ожидаемое.Доступность Или Actual.ОтображатьВыделение <> Ожидаемое.ОтображатьВыделение
        Или Actual.РазрешитьНачалоПеретаскивания <> Ожидаемое.РазрешитьНачалоПеретаскивания
        Или Actual.РазрешитьПеретаскивание <> Ожидаемое.РазрешитьПеретаскивание
        Или Actual.XMLРамки <> Ожидаемое.XMLРамки Или Actual.XMLЦвета <> Ожидаемое.XMLЦвета Тогда
        ВызватьИсключение "Current exact8 ownstate не совпал с подготовленным планом. Нет blind restore/легализации partial/foreign state";
    КонецЕсли;
КонецПроцедуры

Функция КопияСвоегоОформления85(Значение)
    ТребуемыйТип = ТипЗнч(Значение);
    Если ТребуемыйТип <> Тип("Рамка") И ТребуемыйТип <> Тип("Цвет") Тогда
        ВызватьИсключение "In-memory XDTO копирование разрешено только своему actual native Frame/Color value, не объектам данных/клиентскому XML";
    КонецЕсли;
    XML = ЗаписатьСвойТипОформленияВСтроку85(Значение);
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(XML);
    Если Не Чтение.Прочитать() Или Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
        Чтение.Закрыть();
        ВызватьИсключение "Own generated XDTO root element отсутствует";
    КонецЕсли;
    Копия = СериализаторXDTO.ПрочитатьXML(Чтение, ТребуемыйТип);
    Чтение.Закрыть();
    Если ТипЗнч(Копия) <> ТребуемыйТип Или ЗаписатьСвойТипОформленияВСтроку85(Копия) <> XML Тогда
        ВызватьИсключение "Typed own Frame/Color XDTO roundtrip не сохранил exact value/style/default. UI setters не продолжаются";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура("Значение,XML", Копия, XML);
КонецФункции

Функция ЗаписатьСвойТипОформленияВСтроку85(Значение)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Значение, НазначениеТипаXML.Явное);
    Возврат Запись.Закрыть();
КонецФункции

Процедура ПроверитьСвоеПолеИВсюМатрицу85()
    ПроверитьСвойOrdinaryПросмотр85(МеткаОпыта);
    Если СвоеПоле85 = Неопределено Или ЭтаФорма.ЭлементыФормы.Найти("Уч85Просмотр") <> СвоеПоле85
        Или ТипЗнч(СвоеПоле85) <> Тип("ПолеТабличногоДокумента") Или СвоеПоле85.Данные <> "Результат85"
        Или ТипЗнч(Результат85) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "Source identity собственного real field/bound document изменена";
    КонецЕсли;
    Если Результат85.ВысотаТаблицы <> 121 Или Результат85.ШиринаТаблицы <> 8 Или Не Результат85.ТолькоПросмотр
        Или СвоеПоле85.ВысотаТаблицы <> 121 Или СвоеПоле85.ШиринаТаблицы <> 8 Или Не СвоеПоле85.ТолькоПросмотр Тогда
        ВызватьИсключение "Own bound native field/document shape/viewmode не совпали";
    КонецЕсли;
    Сумма = 0;
    Для Колонка = 1 По 8 Цикл
        Заголовок = СвоеПоле85.Область(1, Колонка);
        Если Заголовок.Текст <> "Колонка" + Строка(Колонка) Или Не Заголовок.Защита Тогда
            ВызватьИсключение "Own bound header/protection изменены";
        КонецЕсли;
        Для СтрокаДанных = 1 По 120 Цикл
            Ячейка = СвоеПоле85.Область(СтрокаДанных + 1, Колонка);
            ЯчейкаОбъекта = Результат85.Область(СтрокаДанных + 1, Колонка);
            Если Не Ячейка.СодержитЗначение Или Не ЯчейкаОбъекта.СодержитЗначение Или Не Ячейка.Защита Или Не ЯчейкаОбъекта.Защита
                Или ТипЗнч(Ячейка.Значение) <> Тип("Число") Или ТипЗнч(ЯчейкаОбъекта.Значение) <> Тип("Число")
                Или Ячейка.Значение <> СтрокаДанных * Колонка Или ЯчейкаОбъекта.Значение <> Ячейка.Значение Тогда
                ВызватьИсключение "Одна из own960 actual field/object numeric/protected cells изменена. Формула не используется как fallback";
            КонецЕсли;
            Сумма = Сумма + Ячейка.Значение;
        КонецЦикла;
    КонецЦикла;
    Если Сумма <> 261360 Или Сумма <> 120 * 121 / 2 * 8 * 9 / 2 Тогда
        ВызватьИсключение "Actual960 numeric cell checksum не равна261360";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьГотовностьСвоегоПросмотра85()
    Если Подготовлено85 <> Истина Или НеЗавершено85 = Истина Или Восстановлено85 = Истина Тогда
        ВызватьИсключение "Не подготовлено/failedsetter/уже восстановлено: новые setters/rollback не разрешены. Закройте только свой экземпляр вручную";
    КонецЕсли;
    ПроверитьСвоеПолеИВсюМатрицу85();
    ПроверитьСовпадениеСвоихСостояний85(СнятьActualПаспортСвоегоПоля85(), ОжидаемоеСостояние85);
КонецПроцедуры

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

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

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

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

Обычный модуль приложения своей CF, native OnStart0; только guarded WindowsThickOrdinary ownform factory, no fake UIevents.

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

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

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

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

  1. Own Windows thick ordinary/FileIB/actual user/empty CF guard выполняется перед native fresh common form и событиями. Source field получен из readonly own Form.Controls и real Data=Результат85.

  2. Generate121×8 own memory TabDoc, protect headers/data and use OnlyView. Fullboundfield/object numeric960cells checksum261360 проверен, не DBsource или getter wrapper.

  3. Восемь реальных исходных getter values сохранены typed immutable snapshot; Frame/Color copies имеют собственный in-memory XDTO exact roundtrip без файлов/user XML и сохраняют style/default semantics.

  4. Planned viewer state строится до изменения: Bool scrollbars/Enabled/DND, ShowSelection enum, actual Double2/RGB. Current state должен совпасть со своим last expected, а не arbitrary afterstate.

  5. Setter transaction здесь не симулируется: failflag до первого setter, запись expected только после fullplan readback и wholegrid. Ошибка означает stop this instance, никакого automatic rollback.

  6. Manualscroll/native Selection3args показывают actual own numeric cell через first-control/bounds/ContainsValue/Number/source equality. UI события не вызываются программно.

  7. Отключение/включение поля выполняет новый полный план на том же known ownfield, сохраняет матрицу и остальные настройки. Внешние buttons сохраняют доступность.

  8. Restoration применяет только original8 actual values при exact-own-state guard. По успешному readback экземпляр больше не меняет viewer props; закрывается вручную владельцем.

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

  1. Native field type/catalog56 source proof, связь Data и whole121×8actualfield/object matrix совпали. Все960numbers/protection/header checked, checksum261360 из actual values.

  2. Bool scrollbars не ScrollBarUse enum; ShowSelection genuine enum; Frame/Color native constructors/typed copy. RGB не объявлен работающим на ignored convex/concave frame.

  3. Baseline capturedbeforemode, style/auto preserved via own in-memory XDTO. All8current fieldprops match exact expected state before/after setters; foreign/partial state не легализуется.

  4. Native Selection firstЭлемент+2baseparams wired explicitly; actualrow121/col8=960, row2/col1=1. Нет прямого вызова события или неизвестного input object.

  5. Enabled toggle не меняет own960cells; successful restore вернул actualbaseline8, failed setters не инициируют blindrollback.

  6. Authoredsource/static/rawnative проверки — не actual1С/UI/компиляция/печать/DB/files/network. Runtime verified0.

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

При ручной успешной компиляции/подготовке своего ordinary стенда protected viewer показывает120×8actualnumeric values/checksum261360, дает ownscroll/native selectedcell, guardedEnabled toggle и возврат actual baseline8. Здесь только authoredsource/native/static verification: actual1С/UI/DB/files/network/COM/print/compile0.

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

  1. ПолеТабличногоДокумента ordinary/catalog56 не managed ПолеФормы. Native visual ТабДок наследует его свойства/методы, но source/type/Data проверяется реальным own form, не именем переменной.

  2. Обе scrollbar свойства native Boolean. ТипОтображенияВыделенияТабличногоДокумента имеет Всегда/ПриАктивности, не guessed cell/row selection mode.

  3. ТолькоПросмотр блокирует редактирование защищенных cells, не всей произвольной таблицы и не безопасность внешних действий. Поэтому own headers/data protected и проверяются повторно.

  4. У convex/concave BorderColor ignored; double absolute frame дает осмысленный цвет. Толщина рамки logical units, не mm spreadsheet overlay coordinates.

  5. Native Frame/Color maystyle/auto; baseline не заменяется current RGB/newDouble defaults. XDTO copies source только own values и их типы, не userprovided XML/objectdata.

  6. Copy XML signatures сравнивают same-version own serialized parameter values, не физическое rendering/pixels/cryptographic integrity. Roundtrip mismatch честно останавливает работу до setters.

  7. Failflag/expected snapshot не создают atomic UI transaction. После partialfailed setters нет blindrollback/auto retry/захвата any currentstate как нового correctexpected.

  8. Selection callback parameters связаны с native initiating field. FirstЭлемент добавлен ordinary extension; base событие2params. Manualcalls/bounds alone не являются доказательством UI event.

  9. Numeric selection читает ownactualfield/callbackrange; header/многоклеточная/внешняя область отклоняется. Источник/формула не превращаются в fake actual result.

  10. Data gate проверяет все960cells +8headers/protection и обе shapes перед каждымsetter. Один corrupted cell не скрывается coincidentally correct total.

  11. Enabled=False отключает весь spreadsheet field и его contained controls, поэтому buttons находятся вне него. Hidden/readonly/disabled не взаимозаменяемые API.

  12. Restoration только ownbaseline при known expectedstate. После успеха новые изменения запрещены; при ошибке владелец вручную закрывает только свое окно без force/foreign cleanup.

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

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

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

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

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