Возникает при запуске в режиме 1С:Предприятие после открытия главного окна. В процедуре-обработчике могут быть выполнены различные действия, необходимые при запуске программы, например, открыты некоторые формы.
Синтаксис
ПриНачалеРаботыСистемы()Полное описание, параметры и ограничения
Глобальный контекст.ПриНачалеРаботыСистемы (Global context.OnStart)
Глобальный контекст (Global context)
ПриНачалеРаботыСистемы (OnStart)
Доступен, начиная с версии 8.0.
Синтаксис:
ПриНачалеРаботыСистемы()
Описание:
Возникает при запуске в режиме 1С:Предприятие после открытия главного окна. В процедуре-обработчике могут быть выполнены различные действия, необходимые при запуске программы, например, открыты некоторые формы.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
См. также:
Глобальный контекст, событие ПередНачаломРаботыСистемы
Использование в версии:
Доступен, начиная с версии 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 в своих точных местах.
Подготовка
Только собственная отдельная Windows VM/платформа8.5.1.1343, толстый клиент в режиме ОбычноеПриложение. Не thin/web/managed Forms: здесь именно native ЭлементыФормы (Controls), registry owner ЭлементыФормы @Controls; одноименный managed FormItems имеет другую справку/factory/контекст.
Вручную создайте canonical nonzero UUID-marker и новую пустую FileIB C:\1c-labs\Уч85Бланк_<UUID>\ИБ\. Connection строго File="C:\1c-labs\Уч85Бланк_<UUID>\ИБ\";. Конфигурация УчебныйОбычныйБланк85. Marker пути/имени не UUID информационной базы или настоящего пользователя; реальный UUID базы не измеряется.
Создайте одного actual IBUser Уч85Бланк_<UUID> с правами этого своего стенда/чтения списка пользователей, без privileged mode. Native currentuser UUID сверяется с единственным настоящим пользователем, а marker извлекается из его actual имени. Не используйте типовую/рабочую конфигурацию или другого OS/1C-пользователя.
Собственная CF пуста: нет справочников/документов/регистров/общих реквизитов/разделителей/внешних данных/расширений/ботов/констант/подписок/регламентных заданий. Создайте только две ordinary общие формы Бланк85 и Служебная85 с модулями ниже; основной блок FORM вставляется исключительно в модуль собственной Бланк85.
Конфигуратор → Общие → Общие формы → Бланк85: тип Обычная форма. Реквизиты формы: МеткаОпыта Строка36, Согласен85 Булево с начальным Ложь, Бланк85 ТабличныйДокумент. Поле флажка связано с Согласен85. МеткаОпыта назначается настоящим app module перед открытием, вручную не подменяется.
На Бланк85 создайте ПолеТабличногоДокумента Уч85Бланк, Данные=Бланк85. Разместите его так, чтобы были видны четыре колонки/строки1..16; разрешите ввод в нем на собственном стенде. Не назначайте ни ПолеВвода, ни ТабличноеПоле владельцем этой формы: native spreadsheet-field extension тогда недоступно.
Создайте пять обычных кнопок с точными именами: Подготовить85, Пересчитать85, Просмотр85, УдалитьПодсказку85, ОчиститьСлужебную85. В свойствах каждой кнопки → События → Нажатие явно назначьте соответственно ПодготовитьБланк85, ПересчитатьБланк85, РежимПросмотра85, УдалитьПодсказку85, ЗавершитьСлужебнуюПроверку85. Имя кнопки само по себе не связывает событие с процедурой.
Все пять handlers имеют один параметр Элемент: исходное native Button.Нажатие() не содержит собственных параметров, но ordinary Расширение элементов управления, расположенных в форме добавляет первый Элемент. Это actual initiating Кнопка, а не managed Команда и не произвольный объект. Не вызывайте эти handlers вручную.
Полностью вставьте FORM в модуль Бланк85. Actual readonly ЭтаФорма типа Форма дает readonly ЭлементыФормы; их не создают через Новый и не присваивают другой коллекцией. Stored ПоляКоличества85/Подсказка85 — только реальные объекты, возвращенные own Controls.Добавить, не найденные чужие объекты.
Служебная85 — отдельная собственная ordinary общая форма. Реквизиты МеткаОпыта Строка36 и СлужебноеКоличество85 Число(2,0). Число7 назначает MAIN своему fresh экземпляру перед проверкой/открытием, а не выдуманное metadata initial-value свойство. Она не редактирует бланк и не содержит кнопок, подписок или сторонних элементов. Именно ее целая новая коллекция позже удаляется Clear.
Для Служебная85 сохраните/назовите native главную панель Уч85СлужебнаяПанель. Затем создайте строго в таком порядке Надпись Уч85СлужебнаяНадпись с текстом "Только свои служебные элементы" и ПолеВвода Уч85СлужебныйВвод, Данные=СлужебноеКоличество85, ТолькоПросмотр=Истина. Удалите все прочие elements только при собственной ручной подготовке этой новой формы.
Если native главная панель присутствует в Controls, она обязана быть индексом0 и actual объектом readonly Форма.Панель с точным собственным именем. За ней ожидаются только подготовленная надпись и ввод; если root panel не входит в коллекцию, ожидаются только два этих controls. Код проверяет actual Индекс/Получить identity и порядок, а не угадывает наличие панели по имени переменной.
Вставьте SCRATCH целиком в модуль собственной Служебная85. Ее export проверяет actual typed attribute7, data binding и реальное input.Value. MAIN получает только fresh native ПолучитьОбщуюФорму("Служебная85",ЭтаФорма,freshUUID), назначает own marker, проверяет и открывает этот экземпляр. Владельцем служит собственная Форма, не input/table control.
В обычный модуль приложения этой CF вставьте APPLICATION целиком. Реальное native ПриНачалеРаботыСистемы() получает actual ownuser marker, выполняет полный guard, затем получает fresh Бланк85 через GetCommonForm и открывает. Оно не запускает очистку, расчет, печать или искусственные button events.
Вручную проверьте модули конфигуратором и запустите только эту собственную новую ИБ actual пользователем. Автор не создавал ИБ/формы/файлы и не запускал1С/UI. В открытой Бланк85 отметьте Согласен85 и нажмите Подготовить85 один раз. При ошибке нет автоматического retry/сноса неизвестных controls; закройте только свои новые формы и исправьте own metadata вручную.
После подготовки три actual ПолеВвода созданы Add(Тип("ПолеВвода"),ownName,Истина,actual Уч85Бланк). Это документированный четвертый owner ПолеТабличногоДокумента. Расположить получает actual его область ячейки, ВстроенВЯчейку=True; numeric cells/ОграничениеТипа задают собственный Число, Value читается и проверяется. Для данных через форму Data неизвестная переменная редакторам не придумывается.
Начальные количества Пакет2/Папка3/Маркер5 и actual ячейки цен100/200/10 должны дать numeric850. Вручную введите1/2/3, завершите ввод уходом из редактора, нажмите Пересчитать85: actual значения и независимо прочитанные outputcells должны дать530. Нецелые/строки/0/100 и измененные ячейки цен отказывают до result writes; источник не используется как fallback.
Собственная overlay Надпись помещена в тот же spreadsheet field, но ВстроенВЯчейку=False. Ее Лево5/Верх42/Ширина80/Высота10 заданы именно в МИЛЛИМЕТРАХ от границы табличного документа, не в logical units обычной формы. Из-за разрешенного округления geometry readback имеет допуск0.2mm; embedded input geometry вручную не перезаписывается.
Просмотр85 сначала пересчитывает собственные числа, затем только скрывает/показывает редакторы и подсказку, значения не уничтожаются. ВыводитьНаПечать=False на каждом служебном control читается обратно; значения количества и сумм остаются числовыми в собственном бланке. Это настройка исключения controls из печати, не выполненная/проверенная печать и не обещание произвольного экспортного формата.
УдалитьПодсказку85 удаляет только actual сохраненную nativeAdd надпись после name/type/Index/Get/identity guard. Native Count уменьшается на1, Find возвращает Undefined, три input editors и исходные элементы остаются. Повторное удаление отказывает; unknown одноименный объект не подставляется.
Последней командой ОчиститьСлужебную85 удалите целую исключительно fresh собственную Служебная85. Не закрывайте ее вручную до этой команды: actual IsOpen проверяется, уже закрытая форма отказывает без восстановления. До Clear совпадают marker, native source, exact whitelist/order/identity, typed7 и count; дополнительный/измененный control означает отказ. Только эта коллекция становится0, затем закрывается только эта своя форма и IsOpen=False подтверждает закрытие; основная Controls должна сохранить count/identity.
Ручной 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 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Настоящий own APPLICATION guard проверяет Windows thick ordinary/FileIB/currentrealuser/empty metadata и получает собственную Форма. Это source коллекции Controls, а не одноименный managed alias.
Реальные пять ordinary кнопок имеют native событие Нажатие с первым extension Элемент. Guard сверяет actual initiating Кнопка с собственной named коллекцией и согласие до изменений.
До Add проверены отсутствие own имен и actual prepared ПолеТабличногоДокумента с Data=Бланк85. Count baseline берется из реальной основной коллекции; новые4 controls принадлежат only native fourthowner field.
Три input controls получают actual owncellrange через Расположить, embedded true/numeric values/print exclusion с readback. Own overlay не embedded и располагается в документе по подтвержденным millimeter coordinates.
Stored returned objects сверяются native Find/Index/Get identity; count допускает только baseline+4 или после удаления help baseline+3. Индекс=-1 никогда не используется как индекс последнего элемента.
Пересчет предварительно читает/валидирует все actual editor values. Только затем записывает/читает own numeric output cells и итог; подготовленные2/3/5 дают850, ручные1/2/3 дают530.
Режим просмотра меняет actual Visibility и подтверждает сохранение числового итога. Print=False относится к контролам и не вызывает принтер/preview/export.
Удаление помощи касается ровно сохраненной ownAdd надписи; Count/Find и оставшиеся actual objects проверяются после Delete. Чужие objects не ищутся для восстановительного удаления.
Clear получает только stored freshown scratch Форма.ЭлементыФормы, проверенную по реальной metadata подготовке/marker/whitelist/order/typed input. Только ее whole collection удаляется; основной бланк не очищается.
Actual source/native/static проверки отделены от ручного runtime протокола. Авторство не запускало1С/UI/файлы/БД/сеть/COM/печать, backup0.
Как проверить результат
Actual native collection proof: readonly ordinary ЭтаФорма → ЭлементыФормы (Controls catalog56), не catalog1649 managed FormItems. No invented collection/extension constructor.
После Add реально baseline+4 controls, после ownHelp Delete baseline+3; Find/Get/Index сверяют те же фактические возвращенные объекты.
Own input edit2/3/5 с prices100/200/10 дает850; manual1/2/3 дает530 после завершения ввода. Actual numeric cell readback, а не заданный итог/строковая конвертация.
Embedded properties/Own overlay geometry millimeters/Visibility/print exclusion проверены отдельным readback. Data-only Value не применяется к Надпись.
Служебная коллекция очищается до0 только после exact whole-own whitelist/order; main collection/count/three editors остаются. Дополнительные scratch elements запрещают Clear.
Все 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.
На что обратить внимание
Controls ordinary и FormItems managed — разные native источники. Suffix @Controls нужен только registry, это не текст для Тип("...") и не managedproperty формы.
Дополнительный spreadsheet-field extension появляется у реального control, помещенного в actual ПолеТабличногоДокумента через native Add fourthowner. Не создается Новый Extension и не доказывается совпадением имени переменной.
Readonly ЭтаФорма/ЭлементыФормы/Панель не заменяют присваиванием. У коллекции допустимы native mutations только для собственных объектов/целой freshown scratch по этому процессу.
Если владельцем формы назначен input/table control, native extension свойства недоступны. Здесь parent scratch только собственная Форма, а main не имеет такого владельца.
Input Value допустимо для data-capable ПолеВвода, не для overlay Надпись. Typed cell/ОграничениеТипа и actual number readback не являются гарантиями произвольной чужой UI metadata.
ВстроенВЯчейку=True и Расположить используют native область своего spreadsheet field. Геометрию встроенных редакторов нельзя смешивать с free overlay millimeter geometry.
Не путайте millimeters document-relative с координатами обычной формы. Readback допускает только0.2mm округления, не произвольное молчаливое размещение.
Native ordinary Button Click0 получает дополнительный first Элемент от form extension. Каждый handler реально привязывается в metadata и не вызывается руками как доказательство UI события.
Все actual quantity значения валидируются до первых result writes. Неверный ввод не превращается в значение initial source или530; partial ошибки не исправляются blind retry.
Index returns-1 для отсутствующего control. Сначала range/identity, затем Get/Delete; изменение коллекции при обходе текущего enumerator здесь не используется.
Полное Clear удаляет все элементы только той формы. Поэтому main neverClear; own scratch must be whole-owned/exact whitelisted/order verified, дополнительных элементов быть не может.
Native root panel membership не угадывается. Реальный readonly Панель сравнивается по object identity/Index; при наличии ожидается индекс0/name, после нее только two prepared owncontrols.
Visibility=False только скрывает editor, не стирает Value. Print=False задает native исключение контроля из печати, но здесь ни принтер, ни preview/экспорт не запускались.
Загрузка/сохранение настроек/файлов, 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.
Подготовка
Только отдельная собственная Windows VM, платформа8.5.1.1343, толстый клиент в режиме ОбычноеПриложение. Native ПолеТабличногоДокумента catalog56 является visual ТабличныйДокумент со свойствами/методами последнего. Managed ПолеФормы/форма клиента не подменяют этот native type.
Вручную создайте canonical nonzero UUID-marker и новую пустую FileIB C:\1c-labs\Уч85Просмотр_<UUID>\ИБ\; connection строго File="C:\1c-labs\Уч85Просмотр_<UUID>\ИБ\";. Конфигурация УчебныйПросмотрТабДок85, один actual IBUser Уч85Просмотр_<UUID> с собственными правами/чтением списка пользователей, без privileged mode.
Marker каталога/actualuser имени не UUID ИБ или UUID реального пользователя. Native currentuser UUID сверяется с единственным actual пользователем; реальный UUID самой базы не измеряется. Не рабочая/типовая база, другой пользователь или чужой просмотрщик.
Собственная CF пуста: нет справочников/документов/регистров/общих реквизитов/разделителей/ботов/констант/подписок/заданий/внешних данных/расширений. Создайте только ordinary общую форму Просмотр85. Runtime работает только с новым собственным TabDoc в памяти, без DBread/write.
Конфигуратор → Общие → Общие формы → Просмотр85: Обычная форма. Реквизиты: МеткаОпыта Строка36; Согласен85 Булево; Результат85 ТабличныйДокумент; Состояние85 Строка500. Флажок связан с Согласен85, readonly текстовое поле/надпись статуса — с Состояние85. Marker/False consent назначаются own app перед открытием.
Разместите собственное ПолеТабличногоДокумента Уч85Просмотр, Данные=Результат85. Окно/поле должно быть меньше полного содержимого121строка×8колонок для ручной проверки вертикальной/горизонтальной прокрутки; остальные кнопки/согласие/статус размещайте ВНЕ этого поля, чтобы блокировка не отключила их.
Три ordinary кнопки: Подготовить85, Блокировка85, Восстановить85. В свойствах → События → Нажатие явно назначьте соответственно ПодготовитьПросмотр85, ПереключитьДоступность85, ВосстановитьОформление85. Native Button.Нажатие() плюс ordinary form extension firstЭлемент дают handler(Элемент), не managed Команда и не zeroarg handler.
У Уч85Просмотр в свойствах → События → Выбор назначьте Уч85ПросмотрВыбор. Base native Выбор(Область,СтандартнаяОбработка) плюс ordinary form extension firstЭлемент дают ровно3args. Событие вызывается двойным щелчком/Enter; не вручную для имитации UI proof. Область от native события связана с actual initiating своим field.
Вставьте FORM целиком исключительно в модуль этой own ordinary общей формы. Readonly ЭтаФорма.ЭлементыФормы.Найти дает actual own field; проверяется native type/точный Data. Нет Новый ПолеТабличногоДокумента/неизвестного входного объекта или присваивания readonly коллекции.
В обычный модуль приложения своей CF вставьте APPLICATION полностью: real native OnStart0 получает marker из имени настоящего currentuser, выполняет полный guard и native GetCommonForm fresh UUIDkey, назначает own marker/False consent и открывает. Button/Selection события вручную не вызываются.
Вручную проверьте исходники конфигуратором и запустите только эту собственную ИБ actual пользователем. Автор не создавал/компилировал CF/формы и не запускал1С/UI/файлы/БД/сеть/печать. Подтвердите Согласен85 и нажмите Подготовить85 один раз. После ошибки закрывайте только этот свой экземпляр вручную, не делайте blind recovery.
Своя numeric матрица содержит header row1 и data rows2..121, колонки1..8, значения(row-1)*column. Есть960 числовых cells. Все header/data области защищены Защита=True и ТабДок.ТолькоПросмотр=True. OnlyView само по себе не абсолютный запрет: native документация ограничивает редактирование именно защищенных cells/рисунков. Это UI protection, не security boundary.
Перед каждым 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.
Baseline восьми native getter values снимается после своего создания/проверки данных, но ДО изменения viewer props. Scrollbars/Enabled/DND — Boolean, ShowSelection — ТипОтображенияВыделенияТабличногоДокумента, Border/Color — реальные типы Рамка/Цвет. Значения по умолчанию/стиля не угадываются.
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 не используется.
Подготовленный desired plan строится ДО setters: обе scrollbar=True, enabled=True, selection Всегда, оба DND=False, double рамка толщиной2logicalunits и абсолютный RGB30/72/102. Цвет рамки native игнорируется у Выпуклая/Вдавленная, поэтому здесь Двойная. Border thickness logical units не миллиметры previous overlay урока.
State gating сравнивает все8current props с последним exact ожидаемым своим состоянием. НеЗавершено=True ставится до первого setter; только full desired readback и повторная data проверка позволяют записать новый expected state/снять флаг. Если setter/roundtrip/readback неудачен, flag остается, дальнейшие команды/rollback запрещены; нельзя объявить любой current afterstate своим.
Прокрутите только свой бланк по обеим осям. Двойной щелчок одной numeric cell, например row121/col8, должен показать actual960 в Состояние85; row2/col1 —1. Header/multi-cell/вне диапазона не считают numeric selection; проверки firstElement/area bounds/ContainsValue/Number/ownfield readback не заменяются подписью.
Блокировка85 переключает только own desired Enabled, при fullsamefield/fullgrid/currentstate guard. False запрещает доступ к полю и его controls по native контракту, а buttons вне поля остаются доступны. Повторная команда вернетTrue. Данные/checksum/Frame/Color/scroll/selection/DND сохраняются exact desired state.
Восстановить85 возвращает именно реальные baseline8props, включая исходные style/auto/Boolean/enum, только после exact expected-own-state. Не reset-to-known-defaults и не автоматический rollback по Exception. Если свой current state изменен извне, данные испорчены или flagfailed — отказ, никакого blind overwrite.
После successful restoration новые setters этого экземпляра запрещены; закрывайте свою форму вручную. Baseline DND/Enabled могут иметь другие значения: они возвращены как параметры, но protected свой data остаются. DND flags/UI protection не абсолютная sandbox/data security и не подтвержденная печать/экспорт/визуальная pixel correctness.
Ручные 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 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Own Windows thick ordinary/FileIB/actual user/empty CF guard выполняется перед native fresh common form и событиями. Source field получен из readonly own Form.Controls и real Data=Результат85.
Generate121×8 own memory TabDoc, protect headers/data and use OnlyView. Fullboundfield/object numeric960cells checksum261360 проверен, не DBsource или getter wrapper.
Восемь реальных исходных getter values сохранены typed immutable snapshot; Frame/Color copies имеют собственный in-memory XDTO exact roundtrip без файлов/user XML и сохраняют style/default semantics.
Planned viewer state строится до изменения: Bool scrollbars/Enabled/DND, ShowSelection enum, actual Double2/RGB. Current state должен совпасть со своим last expected, а не arbitrary afterstate.
Setter transaction здесь не симулируется: failflag до первого setter, запись expected только после fullplan readback и wholegrid. Ошибка означает stop this instance, никакого automatic rollback.
Manualscroll/native Selection3args показывают actual own numeric cell через first-control/bounds/ContainsValue/Number/source equality. UI события не вызываются программно.
Отключение/включение поля выполняет новый полный план на том же known ownfield, сохраняет матрицу и остальные настройки. Внешние buttons сохраняют доступность.
Restoration применяет только original8 actual values при exact-own-state guard. По успешному readback экземпляр больше не меняет viewer props; закрывается вручную владельцем.
Как проверить результат
Native field type/catalog56 source proof, связь Data и whole121×8actualfield/object matrix совпали. Все960numbers/protection/header checked, checksum261360 из actual values.
Bool scrollbars не ScrollBarUse enum; ShowSelection genuine enum; Frame/Color native constructors/typed copy. RGB не объявлен работающим на ignored convex/concave frame.
Baseline capturedbeforemode, style/auto preserved via own in-memory XDTO. All8current fieldprops match exact expected state before/after setters; foreign/partial state не легализуется.
Native Selection firstЭлемент+2baseparams wired explicitly; actualrow121/col8=960, row2/col1=1. Нет прямого вызова события или неизвестного input object.
Enabled toggle не меняет own960cells; successful restore вернул actualbaseline8, failed setters не инициируют blindrollback.
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.
На что обратить внимание
ПолеТабличногоДокумента ordinary/catalog56 не managed ПолеФормы. Native visual ТабДок наследует его свойства/методы, но source/type/Data проверяется реальным own form, не именем переменной.
Обе scrollbar свойства native Boolean. ТипОтображенияВыделенияТабличногоДокумента имеет Всегда/ПриАктивности, не guessed cell/row selection mode.
ТолькоПросмотр блокирует редактирование защищенных cells, не всей произвольной таблицы и не безопасность внешних действий. Поэтому own headers/data protected и проверяются повторно.
У convex/concave BorderColor ignored; double absolute frame дает осмысленный цвет. Толщина рамки logical units, не mm spreadsheet overlay coordinates.
Native Frame/Color maystyle/auto; baseline не заменяется current RGB/newDouble defaults. XDTO copies source только own values и их типы, не userprovided XML/objectdata.
Copy XML signatures сравнивают same-version own serialized parameter values, не физическое rendering/pixels/cryptographic integrity. Roundtrip mismatch честно останавливает работу до setters.
Failflag/expected snapshot не создают atomic UI transaction. После partialfailed setters нет blindrollback/auto retry/захвата any currentstate как нового correctexpected.
Selection callback parameters связаны с native initiating field. FirstЭлемент добавлен ordinary extension; base событие2params. Manualcalls/bounds alone не являются доказательством UI event.
Numeric selection читает ownactualfield/callbackrange; header/многоклеточная/внешняя область отклоняется. Источник/формула не превращаются в fake actual result.
Data gate проверяет все960cells +8headers/protection и обе shapes перед каждымsetter. Один corrupted cell не скрывается coincidentally correct total.
Enabled=False отключает весь spreadsheet field и его contained controls, поэтому buttons находятся вне него. Hidden/readonly/disabled не взаимозаменяемые API.
Restoration только ownbaseline при known expectedstate. После успеха новые изменения запрещены; при ошибке владелец вручную закрывает только свое окно без force/foreign cleanup.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.