ЭлементыФормы

Типы · FormItems

Содержит коллекцию подчиненных элементов формы клиентского приложения.

Полное описание, параметры и ограничения

ЭлементыФормы (FormItems)

ЭлементыФормы (FormItems)

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

Элементы коллекции:
ГруппаФормы, ДекорацияФормы, КнопкаФормы, ПолеФормы, ТаблицаФормы
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве аргумента передается имя элемента.

Свойства:
<Имя элемента управления> (<Control name>)

Методы:
Индекс (IndexOf)
Количество (Count)
Найти (Find)
Получить (Get)

Описание:

Содержит коллекцию подчиненных элементов формы клиентского приложения.

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

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

См. также:
ТаблицаФормы, свойство ПодчиненныеЭлементы
ГруппаФормы, свойство ПодчиненныеЭлементы
ФормаКлиентскогоПриложения, свойство ПодчиненныеЭлементы

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

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

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

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

Отделить заголовок таблицы, шапку колонок и встроенные группы команд

ПоложениеЗаголовка=Нет скрывает подпись всей таблицы, но оставляет шапку колонок. Встроенная командная панель и контекстное меню — группы, а не строки товаров.

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

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

Подготовка

  1. В учебной базе: Файл → Новый → Внешняя обработка. Создайте управляемую форму и назначьте её основной. Дайте обработке имя УчебнаяТаблица.

  2. Не добавляйте вручную реквизит Товары и одноимённые элементы: код создаст их при открытии. Модуль формы для этой задачи должен быть пустым.

  3. В свойствах формы → События свяжите ПриСозданииНаСервере с одноимённой процедурой. Сохраните отдельную учебную EPF и откройте через Файл → Открыть.

  4. Данные Книга/Ручка создаются в памяти формы. Справочники, документы и регистры вашей конфигурации не читаются и не записываются.

  5. Проверяйте в настольном тонком/толстом или веб-клиенте 8.5.1.1343, не в мобильном приложении. Для каждого урока отдельная учебная форма с пустым модулем.

  6. Изменение учебных строк остаётся только в открытой форме. При её новом открытии снова создаются Книга/3 и Ручка/1. Настройки таблицы не являются правами доступа к данным.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Товары", Новый ОписаниеТипов("ТаблицаЗначений")));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Код", Новый ОписаниеТипов("Строка"), "Товары", "Код"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Наименование", Новый ОписаниеТипов("Строка"), "Товары", "Название"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)), "Товары", "Количество"));
    ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)));

    СтрокаТовара = Данные.Добавить();
    СтрокаТовара.Код = "A-01";
    СтрокаТовара.Наименование = "Книга";
    СтрокаТовара.Количество = 3;
    СтрокаТовара = Данные.Добавить();
    СтрокаТовара.Код = "B-02";
    СтрокаТовара.Наименование = "Ручка";
    СтрокаТовара.Количество = 1;

    ЭтаФорма.ЗначениеВРеквизитФормы(Данные, "Товары");
    Таблица = ЭтаФорма.Элементы.Добавить("ТаблицаТоваров", Тип("ТаблицаФормы"));
    Таблица.ПутьКДанным = "Товары";
    Таблица.Заголовок = "Учебные товары";
    Таблица.Шапка = Истина;
    Таблица.АвтоВводНезаполненного = Ложь;
    Таблица.АвтоВводНовойСтроки = Ложь;
    Для Каждого ИмяКолонки Из СтрРазделить("Код,Наименование,Количество", ",") Цикл
        Колонка = Элементы.Добавить("Товары" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
        Колонка.Вид = ВидПоляФормы.ПолеВвода;
        Колонка.ПутьКДанным = "Товары." + ИмяКолонки;
        Колонка.Заголовок = ИмяКолонки;
    КонецЦикла;
    Таблица.Заголовок = "Учебные товары";
    Таблица.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
    Таблица.Шапка = Истина;
    Таблица.ОтображатьКоманднуюПанель = Истина;
    Сообщить(Таблица.Имя = "ТаблицаТоваров");
    Сообщить(Таблица.Родитель = ЭтаФорма);
    Сообщить(ТипЗнч(Таблица.КоманднаяПанель) = Тип("ГруппаФормы"));
    Сообщить(ТипЗнч(Таблица.КонтекстноеМеню) = Тип("ГруппаФормы"));
    Сообщить("Дочерних полей/групп таблицы: " + Строка(Таблица.ПодчиненныеЭлементы.Количество()));
КонецПроцедуры

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

  1. Заголовок хранит подпись, ПоложениеЗаголовка=Нет управляет её отсутствием в отображении.

  2. Пустая строка Заголовок не равнозначна Нет: может включать автоматическую подпись. Поэтому явно выбираем нужное положение.

  3. Шапка=Истина оставляет заголовки отдельных колонок Код, Наименование, Количество.

  4. Таблица добавлена непосредственно в форму, поэтому Родитель=ЭтаФорма. КоманднаяПанель/КонтекстноеМеню возвращают встроенные ГруппаФормы.

  5. ПодчиненныеЭлементы описывает элементы интерфейса. Их количество не равно Товары.Количество().

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

  1. Четыре логических сообщения дают Истина; надпись Учебные товары скрыта, шапка колонок видна.

  2. Данные остаются A-01/3 и B-02/1. Состав стандартных команд и вид панели сверяйте в выбранном клиенте.

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

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

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

  1. Не присваивайте новые значения свойствам КоманднаяПанель/КонтекстноеМеню: они доступны только для чтения.

  2. Не делайте вывод о количестве товаров из количества дочерних элементов интерфейса.

  3. Не используем ПоложениеКоманднойПанели: в интерфейсе Версия 8.5 оно не применяется.

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

Перенести свою группу из корня внутрь другой группы и обратно

Readonly ПодчиненныеЭлементы формы показывает текущий корневой состав, не все элементы рекурсивно. Настоящий серверный Переместить изменяет родителя собственной группы. До и после сравниваются членство конкретного подготовленного элемента и фактические значения Название/Количество; размер и порядок всей коллекции не выдумываются.

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

Полный основной модуль ОбщаяФорма.УчебнаяИерархияФормы85. Один supportingModule — полный отдельный запуск своей общей команды. Единственное изменение иерархии выполняется на сервере над своими группами; предметных данных нет.

Подготовка

  1. Создайте отдельную новую пустую учебную базу и отдельного нового пользователя платформы 8.5.1.1343 без переноса пользовательских настроек. Корневое имя конфигурации УчебнаяМастерскаяФорм85, язык встроенного языка Русский, ОсновнойРежимЗапуска=УправляемоеПриложение, режим совместимости Не использовать. Здесь 1С не запускалась; подготовку далее выполняйте самостоятельно только в своей новой базе.

  2. В свойствах корня конфигурации задайте точно РежимСовместимостиИнтерфейса=Версия8_5 и ВариантОткрытияОконКлиентскогоПриложения=ОткрыватьДанныеВДиалоговыхОкнах. Обновите только свой новый учебный стенд и запускайте тонкий либо толстый управляемый клиент Windows. Не изменяйте интерфейс или профиль рабочего пользователя.

  3. В каждом уроке используйте только перечисленные собственные общие управляемые формы с пустыми модулями. Все три урока независимы: не объединяйте их основные и поддерживающие модули. У всех этих форм АвтоматическоеСохранениеДанныхВНастройках оставьте НеИспользовать; пользовательское сохранение состава формы для опыта не используйте.

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

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

  6. Настройка метаданных и проверка перечисления не доказывают действующий вариант окон или фактический визуальный маршрут. В своём новом клиенте вручную убедитесь, что действует интерфейс Версия 8.5 и открытие данных в диалоговых окнах. Если используются вкладки, визуальный опыт третьего урока не подтверждён, даже когда свойство режима содержит нужный enum.

  7. Создайте собственную подсистему МастерскаяФорм85 и включайте общие команды без параметра в её командный интерфейс. Каждый отдельный блок запуска вставляется в Общие → Общие команды → указанное имя команды → Модуль команды. Не вставляйте его в модуль формы.

  8. Статические проверки сверяют установленное API 8.5.1.1343, но не компилируют и не запускают 1С. Доступность контролов, порядок событий, сохранность завершённого ввода, новая компоновка и размещение окон требуют ручных контрольных действий на подготовленном стенде.

  9. В Общие → Общие формы создайте отдельную управляемую УчебнаяИерархияФормы85. Полный основной код вставьте в Конфигуратор → Общие → Общие формы → УчебнаяИерархияФормы85 → Модуль формы. Событие ПриСозданииНаСервере свяжите с одноимённой процедурой. Другие формы предыдущего урока для этого опыта не используются.

  10. В этой форме создайте реквизиты Название типа Строка длиной 100, Количество с единственным типом Число длиной 3, точность 0, допустимый знак Неотрицательный, СостояниеУрока типа Строка длиной 300. Все три принадлежат самой форме, без объектного основного реквизита и предметных данных.

  11. Создайте в корне формы две обычные группы СведенияКниги и ДополнительныеПоля. Их точные имена обязательны; обе начально прямые дети формы, а не страницы другой группы. Группировка обеих вертикальная, заголовки Сведения книги и Дополнительные поля.

  12. Внутри СведенияКниги разместите поле ввода ПолеНазвания, ПутьКДанным=Название, заголовок Название. Внутри ДополнительныеПоля разместите поле ввода ПолеКоличества, ПутьКДанным=Количество, заголовок Количество. Оба доступны для редактирования. Сервер задаёт собственные Книга/3 и числовые границы 0–99.

  13. Вне обеих групп разместите ПолеСостоянияУрока с ПутьКДанным=СостояниеУрока, ТолькоПросмотр=Истина и кнопку команды ПеренестиГруппу с заголовком Перенести группу. Действие команды ПеренестиГруппу, ИзменяетСохраняемыеДанные=Ложь. Кнопка не переносится вместе с ДополнительныеПоля.

  14. Создайте общую команду ОткрытьИерархиюФормы85. Её отдельный полный блок запуска вставьте в Общие → Общие команды → ОткрытьИерархиюФормы85 → Модуль команды. Она открывает ОбщаяФорма.УчебнаяИерархияФормы85.

  15. Чтение ПодчиненныеЭлементы возвращает управляемую ЭлементыФормы @FormItems, не одноимённую коллекцию обычной формы @Controls. Свойство только читается. Изменение иерархии идёт через ВсеЭлементыФормы.Переместить в &НаСервере, а не через присваивание Родитель или очистку коллекции.

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() <> ВариантИнтерфейсаКлиентскогоПриложения.Версия8_5 Тогда
        ВызватьИсключение "В своём учебном стенде нужен интерфейс Версия 8.5";
    КонецЕсли;
    ЭтаФорма.Название = "Книга";
    ЭтаФорма.Количество = 3;
    ЭтаФорма.Элементы.ПолеКоличества.МинимальноеЗначение = 0;
    ЭтаФорма.Элементы.ПолеКоличества.МаксимальноеЗначение = 99;
    Если Не СодержитПодготовленныйЭлемент(ЭтаФорма.ПодчиненныеЭлементы, "СведенияКниги")
        Или Не СодержитПодготовленныйЭлемент(ЭтаФорма.ПодчиненныеЭлементы, "ДополнительныеПоля") Тогда
        ВызватьИсключение "Обе собственные группы должны начинать в корне формы";
    КонецЕсли;
    Если ЭтаФорма.Элементы.ДополнительныеПоля.Родитель <> ЭтаФорма Тогда
        ВызватьИсключение "ДополнительныеПоля должна быть собственной корневой группой";
    КонецЕсли;
    ЭтаФорма.СостояниеУрока = "ДополнительныеПоля в корне. Измените свои значения, завершите ввод и нажмите Перенести группу";
КонецПроцедуры

&НаКлиенте
Процедура ПеренестиГруппу(Команда)
    ПеренестиИПроверитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПеренестиИПроверитьНаСервере()
    НазваниеДоПереноса = ЭтаФорма.Название;
    КоличествоДоПереноса = ЭтаФорма.Количество;
    Сведения = ЭтаФорма.Элементы.СведенияКниги;
    Дополнительные = ЭтаФорма.Элементы.ДополнительныеПоля;
    Если Дополнительные.Родитель = ЭтаФорма Тогда
        Если Не СодержитПодготовленныйЭлемент(ЭтаФорма.ПодчиненныеЭлементы, "ДополнительныеПоля") Тогда
            ВызватьИсключение "Собственная корневая группа не найдена среди подчинённых элементов формы";
        КонецЕсли;
        ЭтаФорма.Элементы.Переместить(Дополнительные, Сведения);
        ОжидаетсяВКорне = Ложь;
    ИначеЕсли Дополнительные.Родитель = Сведения Тогда
        Если СодержитПодготовленныйЭлемент(ЭтаФорма.ПодчиненныеЭлементы, "ДополнительныеПоля") Тогда
            ВызватьИсключение "Вложенная группа неожиданно осталась членом корня";
        КонецЕсли;
        ЭтаФорма.Элементы.Переместить(Дополнительные, ЭтаФорма);
        ОжидаетсяВКорне = Истина;
    Иначе
        ВызватьИсключение "У своей группы обнаружен неподготовленный родитель";
    КонецЕсли;
    ЕстьВКорне = СодержитПодготовленныйЭлемент(ЭтаФорма.ПодчиненныеЭлементы, "ДополнительныеПоля");
    ЕстьВСведениях = СодержитПодготовленныйЭлемент(Сведения.ПодчиненныеЭлементы, "ДополнительныеПоля");
    Если ЕстьВКорне <> ОжидаетсяВКорне Или ЕстьВСведениях = ОжидаетсяВКорне Тогда
        ВызватьИсключение "Состав собственных корневых и вложенных элементов не совпал с переносом";
    КонецЕсли;
    Если ЭтаФорма.Название <> НазваниеДоПереноса Или ЭтаФорма.Количество <> КоличествоДоПереноса Тогда
        ВызватьИсключение "Перенос собственной группы изменил локальные данные";
    КонецЕсли;
    ЭтаФорма.СостояниеУрока = СтрШаблон("ДополнительныеПоля: в корне %1; внутри СведенияКниги %2. Название %3, количество %4 сохранились",
        ЕстьВКорне, ЕстьВСведениях, ЭтаФорма.Название, ЭтаФорма.Количество);
КонецПроцедуры

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

Конфигуратор → Общие → Общие команды → ОткрытьИерархиюФормы85 → Модуль команды

Полный отдельный модуль собственной общей команды; открывает только указанную собственную основную форму. Здесь 1С не запускалась.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ОткрытьФорму("ОбщаяФорма.УчебнаяИерархияФормы85");
КонецПроцедуры

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

  1. Откройте собственную форму. Сервер проверяет обе подготовленные группы среди прямых подчинённых элементов формы, задаёт Книга/3 и проверяет родителя ДополнительныеПоля. Не добавляет отсутствующие неизвестные элементы автоматически.

  2. Завершите ввод своих значений. Клиентская команда ПеренестиГруппу вызывает единственный контекстный серверный обработчик, который читает фактические Название и Количество до переноса.

  3. Если ДополнительныеПоля принадлежит корню, обработчик подтверждает её присутствие в ЭтаФорма.ПодчиненныеЭлементы и вызывает ЭтаФорма.Элементы.Переместить(Дополнительные, Сведения). Родитель меняется на реальную СведенияКниги.

  4. После переноса helper отдельно перебирает текущие ПодчиненныеЭлементы формы и СведенияКниги.ПодчиненныеЭлементы. Для своего имени должны получиться Ложь в корне и Истина внутри группы.

  5. Код сравнивает фактические Название и Количество со снимком до переноса. Успешная подпись о сохранности выводится только после проверки членства и данных. Визуально ПолеКоличества теперь ожидается внутри СведенияКниги.

  6. Нажмите Перенести группу снова. Родитель своей группы теперь СведенияКниги, поэтому сервер возвращает её в ЭтаФорма. Ожидаются Истина в корне и Ложь в составе СведенияКниги, значения сохранены.

  7. Повторите цикл после своей правки Учебная тетрадь/7 и затем с 0. Проверяется текущее завершённое значение, а не возврат начальной Книги/3. Ноль — реальное допустимое количество, не отсутствие группы.

  8. Возвращение к корню восстанавливает членство, но не исходную позицию: третий параметр МестоРасположения не передан, native переносит в конец соответствующей коллекции. Урок не обещает точный полный порядок или пиксельную раскладку.

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

  1. Первый перенос: ДополнительныеПоля в корне Ложь, внутри СведенияКниги Истина; наблюдайте фактическое размещение поля количества вручную.

  2. Второй перенос: в корне Истина, внутри СведенияКниги Ложь. Подписи Книга/3 либо ваши завершённые Учебная тетрадь/7 или 0 сохраняются после обоих переносов.

  3. Кнопка переноса и поле состояния остаются вне переносимой группы и доступны для обратного действия. ПолеНазвания не создаётся заново и не теряет введённое значение.

  4. Родитель не присваивается напрямую; readonly ПодчиненныеЭлементы не заменяется и не очищается. Все вызовы Переместить находятся только в серверной процедуре.

  5. Контроль не требует точного количества или порядка всех корневых элементов: штатная командная панель и другие элементы формы не превращаются в данные урока.

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

Реальная собственная группа обратимо меняет корневое/вложенное членство серверным методом, а фактические реквизиты сохраняются. Readonly коллекция служит проверкой структуры, а не командой переноса. Отрисовку новой компоновки ещё нужно проверить вручную.

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

  1. ВсеЭлементыФормы.Переместить доступен на сервере, не на настольном клиенте. Клиентская процедура только вызывает серверный обработчик; перенос в ней напрямую был бы неправильным.

  2. ПодчиненныеЭлементы формы и ВсеЭлементыФормы — разные коллекции: первая отражает подчинённый состав, вторая содержит элементы независимо от позиции в иерархии. Не делайте вывод о потере реквизита по отсутствию группы в корне.

  3. ГруппаФормы.Родитель readonly. Для переноса передаются реальные элементы этой же подготовленной формы; нельзя подставлять имена строками или элементы чужого окна.

  4. Возвращение без МестоРасположения помещает группу в конец коллекции. Это не восстановление точного порядка прежнего дерева; такой результат не обещается.

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

  6. Существующий widget-group-own-child-inventory-versus-data-count только перечисляет детей своей группы. Этот урок не повторяет его: проверяет корневую readonly коллекцию и реально перемещает свою группу туда/обратно.

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

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

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

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

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