Добавляет элемент управления на форму.
Синтаксис
Добавить(<Тип>, <Имя>, <Видимость>, <ПоместитьНа>)Примеры платформы
ПолеРегистра = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"),
СтрокаТаблицы.Имя,
Истина,
ЭлементыФормы.ОсновнаяПанель);
ПолеРегистра.Данные = "ДокументОбъект.Движения." + СтрокаТаблицы.Имя;
Если НЕ ЭтоНовый() Тогда
ПолеРегистра.Значение.Прочитать();
КонецЕсли;
ПолеРегистра.Верх = 30;
ПолеРегистра.Лево = 6;
ПолеРегистра.Ширина = ЭлементыФормы.ОсновнаяПанель.Ширина - 14;
ПолеРегистра.Высота = ЭлементыФормы.ОсновнаяПанель.Высота - 56;
ПолеРегистра.ТолькоПросмотр = Ложь;
ПолеРегистра.ИзменятьПорядокСтрок = Истина;
ПолеРегистра.ИзменятьСоставСтрок = Истина;
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Верх,
КоманднаяПанельРегистра,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Право);
ПолеРегистра.СоздатьКолонки();
Если Метаданные.РегистрыНакопления[СтрокаТаблицы.Имя].ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
КолонкаВидДвижения = ПолеРегистра.Колонки.Вставить(1, "Вид движения");
КолонкаВидДвижения.Имя = "ВидДвиженияРегистраНакопления";
КолонкаВидДвижения.УстановитьЭлементУправления(Тип("ПолеВвода"));
КолонкаВидДвижения.Данные = "ВидДвижения";
КолонкаВидДвижения.ЭлементУправления.КнопкаВыбора = Истина;
КолонкаВидДвижения.ЭлементУправления.ВыбиратьТип = Ложь;
КонецЕсли;
ПолеРегистра.Колонки.Регистратор.Видимость = Ложь;
ПолеРегистра.Колонки.Период.Видимость = Ложь;
ПолеРегистра.Колонки.НомерСтроки.Видимость = Ложь;Полное описание, параметры и ограничения
ЭлементыФормы.Добавить (Controls.Add)
ЭлементыФормы (Controls)
Добавить (Add)
Доступен, начиная с версии 8.0.
Синтаксис:
Добавить(<Тип>, <Имя>, <Видимость>, <ПоместитьНа>)
Параметры:
<Тип> (обязательный)
Тип: Тип.
Тип добавляемого элемента управления:
Индикатор; ПолеКалендаря; Кнопка; КоманднаяПанель; Надпись; Панель; Переключатель; ПолеТабличногоДокумента; ПолеHTMLДокумента; ПолеТекстовогоДокумента; ПолеВвода; ПолеВыбора; ПолеСписка; ПолеКартинки; ПолосаРегулирования; Разделитель; РамкаГруппы; ТабличноеПоле; Флажок; ПолеГрафическойСхемы; ПолеГеографическойСхемы.
<Имя> (обязательный)
Тип: Строка.
Имя создаваемого элемента управления. Имя должно быть указано в соответствии с правилами написания имен системы 1С:Предприятие 8. В противном случае выполнение метода вызовет исключение.
<Видимость> (необязательный)
Тип: Булево.
Определяет, создавать новый элемент управления формы видимым или нет. Истина - элемент создается видимым.
Значение по умолчанию: Истина.
<ПоместитьНа> (необязательный)
Тип: Панель, ПолеТабличногоДокумента.
Определяет, какой панели формы или какому табличному документу принадлежит создаваемый элемент. Если указана панель, то добавляемый элемент размещается на текущей странице панели. Если не указан, создаваемый элемент будет принадлежать непосредственно форме.
Возвращаемое значение:
Элемент управления формы.
Описание:
Добавляет элемент управления на форму.
Доступность:
Толстый клиент.
Пример:
// Расположим на странице табличное поле
ПолеРегистра = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"),
СтрокаТаблицы.Имя,
Истина,
ЭлементыФормы.ОсновнаяПанель);
ПолеРегистра.Данные = "ДокументОбъект.Движения." + СтрокаТаблицы.Имя;
Если НЕ ЭтоНовый() Тогда
ПолеРегистра.Значение.Прочитать();
КонецЕсли;
ПолеРегистра.Верх = 30;
ПолеРегистра.Лево = 6;
ПолеРегистра.Ширина = ЭлементыФормы.ОсновнаяПанель.Ширина - 14;
ПолеРегистра.Высота = ЭлементыФормы.ОсновнаяПанель.Высота - 56;
ПолеРегистра.ТолькоПросмотр = Ложь;
ПолеРегистра.ИзменятьПорядокСтрок = Истина;
ПолеРегистра.ИзменятьСоставСтрок = Истина;
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Верх,
КоманднаяПанельРегистра,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Право);
ПолеРегистра.СоздатьКолонки();
Если Метаданные.РегистрыНакопления[СтрокаТаблицы.Имя].ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
КолонкаВидДвижения = ПолеРегистра.Колонки.Вставить(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 или установкой стороннего компонента.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.