ВсеЭлементыФормы.Найти

Методы · Find

Осуществляет поиск элемента управления с заданным именем.

Синтаксис

Найти(<Имя>)

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

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

ВсеЭлементыФормы.Найти (FormAllItems.Find)

ВсеЭлементыФормы (FormAllItems)

Найти (Find)

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

Синтаксис:
Найти(<Имя>)
Параметры:

<Имя> (обязательный)
Тип: Строка.
Имя элемента формы.
Возвращаемое значение:
Тип: Элемент управления, Неопределено.
Элемент управления в форме. Если элемент не найден, то возвращается значение Неопределено.
Описание:

Осуществляет поиск элемента управления с заданным именем.

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

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

Пример:

Процедура АктивизироватьРеквизитВФорме(ФормаДокумента) Экспорт
// Структура - порядок активизации реквизитов.

// Активизируется первый не заполненный.

СтруктураРеквизитов = Новый Структура;

СтруктураРеквизитов.Вставить("Дата");
СтруктураРеквизитов.Вставить("Номер");
СтруктураРеквизитов.Вставить("Организация");
СтруктураРеквизитов.Вставить("Касса");
СтруктураРеквизитов.Вставить("БанковскийСчет");
СтруктураРеквизитов.Вставить("Склад");
СтруктураРеквизитов.Вставить("Контрагент");
СтруктураРеквизитов.Вставить("Получатель");
СтруктураРеквизитов.Вставить("Плательщик");
СтруктураРеквизитов.Вставить("ФизЛицо");

Для каждого Элемент Из СтруктураРеквизитов Цикл
// Определим, есть ли ЭУ с таким именем.

ЭУ = ВсеЭлементыФормы.Найти(Элемент.Ключ);
Если ЭУ <> Неопределено Тогда
// есть такой элемент

Если Не ЗначениеЗаполнено(ЭУ.Значение) Тогда
// Нашли не заполненный ЭУ.

// Делаем его текущим и прекращаем цикл.

ФормаДокумента.ТекущийЭлемент = ЭУ;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

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

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

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

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

Объединить количество, цену и сумму в группу колонок

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

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

Полный модуль своей управляемой формы внешней обработки УчебныеГруппыКолонок85. Серверные процедуры работают только с реквизитами и элементами этой формы; не запускались.

Подготовка

  1. Для будущего ручного запуска создайте НОВУЮ пустую учебную базу на платформе 8.5.1.1343. Имя конфигурации — УчебныеГруппыКолонок85; бизнес-объектов, расширений, подписок и регламентных заданий нет. Не используйте УТ, КА, УНФ или БП с рабочими данными. Здесь база и форма не создавались, код в 1С не выполнялся: runtimeVerifiedScenarios=0.

  2. Создайте общий модуль УчебныеГруппы85: Сервер=Да, Клиент=Нет, Глобальный=Нет, Вызов сервера=Нет. Вставьте целиком отдельный модуль проверки стенда из блока ниже; его экспортную процедуру вызывает только сервер формы.

  3. Создайте свою внешнюю обработку УчебныеГруппыКолонок85 и управляемую форму Форма. Добавьте реквизит Книги типа ТаблицаЗначений с колонками Название (Строка,100), Количество (Число,3,0,неотрицательное), Цена (Число,9,2,неотрицательное), Сумма (Число,12,2,неотрицательное). Добавьте реквизиты Всего (Число,12,2,неотрицательное) и ЗаголовокРасчета (Строка,80). Это реквизиты этой формы, не таблицы базы.

  4. На форме разместите таблицу ТаблицаКниг с ПутьКДанным=Книги. Колонку Название свяжите с Книги.Название. Прямо внутри ТаблицаКниг создайте группу ГруппаРасчет: Вид=ГруппаКолонок, Заголовок=Расчет. Внутри неё разместите поля Количество, Цена, Сумма с путями Книги.Количество, Книги.Цена, Книги.Сумма. Не вкладывайте группу в другую группу. Включите шапку таблицы. В ходе урока не меняйте порядок строк.

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    УчебныеГруппы85.ПроверитьСвойПустойСтенд();
    Книги.Очистить();
    ДобавитьСтроку("Книга", 3, 250);
    ДобавитьСтроку("Ручка", 1, 30);
    Всего = Книги[0].Сумма + Книги[1].Сумма;
    ЗаголовокРасчета = "Расчет стоимости";
    Элементы.ТаблицаКниг.ТолькоПросмотр = Истина;
    ПрименитьПрофиль(СоздатьПрофиль(Истина));
КонецПроцедуры

&НаСервере
Процедура ДобавитьСтроку(Название, Количество, Цена)
    Строка = Книги.Добавить();
    Строка.Название = Название;
    Строка.Количество = Количество;
    Строка.Цена = Цена;
    Строка.Сумма = Количество * Цена;
КонецПроцедуры

&НаКлиенте
Процедура ОбычныйВид(Команда)
    ВыбратьПрофильНаСервере(Истина);
КонецПроцедуры

&НаКлиенте
Процедура КомпактныйВид(Команда)
    ВыбратьПрофильНаСервере(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьВосстановление(Команда)
    ПроверитьЦиклНаСервере();
    Сообщить("Оба профиля сверены; все 12 свойств восстановлены. Внешний вид проверяйте отдельно");
КонецПроцедуры

&НаСервере
Функция ПолучитьСвоюГруппу()
    УчебныеГруппы85.ПроверитьСвойПустойСтенд();
    Таблица = Элементы.Найти("ТаблицаКниг");
    Группа = Элементы.Найти("ГруппаРасчет");
    Если ТипЗнч(Таблица) <> Тип("ТаблицаФормы") Или Таблица.ПутьКДанным <> "Книги"
        Или Не Таблица.ТолькоПросмотр Или ТипЗнч(Группа) <> Тип("ГруппаФормы") Тогда
        ВызватьИсключение "Подготовьте свою таблицу Книги и группу ГруппаРасчет";
    КонецЕсли;
    Если Группа.Вид <> ВидГруппыФормы.ГруппаКолонок
        Или ТипЗнч(Группа.Родитель) <> Тип("ТаблицаФормы")
        Или Группа.Родитель.Имя <> Таблица.Имя Или Группа.Имя <> "ГруппаРасчет" Тогда
        ВызватьИсключение "Группа колонок должна находиться прямо внутри своей таблицы";
    КонецЕсли;
    Если Книги.Количество() <> 2 Или Всего <> 780 Или ЗаголовокРасчета <> "Расчет стоимости" Тогда
        ВызватьИсключение "Изменился собственный учебный набор или данные шапки";
    КонецЕсли;
    ПроверитьСтроку(Книги[0], "Книга", 3, 250, 750);
    ПроверитьСтроку(Книги[1], "Ручка", 1, 30, 30);
    Возврат Группа;
КонецФункции

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

&НаСервереБезКонтекста
Функция СоздатьПрофиль(Обычный)
    Если ТипЗнч(Обычный) <> Тип("Булево") Тогда
        ВызватьИсключение "Выберите обычный или компактный профиль";
    КонецЕсли;
    Если Обычный Тогда
        Возврат Новый Структура("ГоризонтальноеПоложениеВШапке,Группировка,КартинкаШапки,ОтображатьВКарточке,ОтображатьВШапке,ОтображатьЗаголовок,ОтображатьЗаголовокВКарточке,ПутьКДаннымШапки,ФиксацияВТаблице,ФиксироватьВКарточке,ФорматШапки,ЦветФонаЗаголовка",
            ГоризонтальноеПоложениеЭлемента.Центр, ГруппировкаКолонок.Горизонтальная, Новый Картинка,
            Истина, Истина, Неопределено, Неопределено, "Всего", ФиксацияВТаблице.Нет,
            Неопределено, "ЧДЦ=2", Новый Цвет(232, 242, 255));
    Иначе
        Возврат Новый Структура("ГоризонтальноеПоложениеВШапке,Группировка,КартинкаШапки,ОтображатьВКарточке,ОтображатьВШапке,ОтображатьЗаголовок,ОтображатьЗаголовокВКарточке,ПутьКДаннымШапки,ФиксацияВТаблице,ФиксироватьВКарточке,ФорматШапки,ЦветФонаЗаголовка",
            ГоризонтальноеПоложениеЭлемента.Лево, ГруппировкаКолонок.Вертикальная, Новый Картинка,
            Истина, Ложь, Ложь, Истина, "ЗаголовокРасчета", ФиксацияВТаблице.Лево,
            Истина, "", Новый Цвет(255, 244, 220));
    КонецЕсли;
КонецФункции

&НаСервере
Функция СнятьПрофиль()
    Группа = ПолучитьСвоюГруппу();
    Возврат Новый Структура("ГоризонтальноеПоложениеВШапке,Группировка,КартинкаШапки,ОтображатьВКарточке,ОтображатьВШапке,ОтображатьЗаголовок,ОтображатьЗаголовокВКарточке,ПутьКДаннымШапки,ФиксацияВТаблице,ФиксироватьВКарточке,ФорматШапки,ЦветФонаЗаголовка",
        Группа.ГоризонтальноеПоложениеВШапке, Группа.Группировка, Группа.КартинкаШапки,
        Группа.ОтображатьВКарточке, Группа.ОтображатьВШапке, Группа.ОтображатьЗаголовок,
        Группа.ОтображатьЗаголовокВКарточке, Группа.ПутьКДаннымШапки, Группа.ФиксацияВТаблице,
        Группа.ФиксироватьВКарточке, Группа.ФорматШапки, Группа.ЦветФонаЗаголовка);
КонецФункции

&НаСервере
Процедура ПрименитьПрофиль(Профиль)
    Группа = ПолучитьСвоюГруппу();
    Группа.ГоризонтальноеПоложениеВШапке = Профиль.ГоризонтальноеПоложениеВШапке;
    Группа.Группировка = Профиль.Группировка;
    Группа.КартинкаШапки = Профиль.КартинкаШапки;
    Группа.ОтображатьВКарточке = Профиль.ОтображатьВКарточке;
    Группа.ОтображатьВШапке = Профиль.ОтображатьВШапке;
    Группа.ОтображатьЗаголовок = Профиль.ОтображатьЗаголовок;
    Группа.ОтображатьЗаголовокВКарточке = Профиль.ОтображатьЗаголовокВКарточке;
    Группа.ПутьКДаннымШапки = Профиль.ПутьКДаннымШапки;
    Группа.ФиксацияВТаблице = Профиль.ФиксацияВТаблице;
    Группа.ФиксироватьВКарточке = Профиль.ФиксироватьВКарточке;
    Группа.ФорматШапки = Профиль.ФорматШапки;
    Группа.ЦветФонаЗаголовка = Профиль.ЦветФонаЗаголовка;
КонецПроцедуры

&НаСервере
Процедура ПроверитьПрофиль(Ожидание)
    Факт = СнятьПрофиль();
    Если Факт.Количество() <> 12 Или Ожидание.Количество() <> 12 Тогда
        ВызватьИсключение "Сверяются все 12 свойств группы колонок";
    КонецЕсли;
    Для Каждого Пара Из Ожидание Цикл
        Значение = Факт[Пара.Ключ];
        Если ТипЗнч(Значение) <> ТипЗнч(Пара.Значение) Тогда
            ВызватьИсключение "Не совпал тип свойства " + Пара.Ключ;
        КонецЕсли;
        Если Пара.Ключ = "КартинкаШапки" Тогда
            Если Значение.Вид <> ВидКартинки.Пустая Или Пара.Значение.Вид <> ВидКартинки.Пустая Тогда
                ВызватьИсключение "Этот урок использует только пустую картинку шапки";
            КонецЕсли;
        ИначеЕсли Пара.Ключ = "ЦветФонаЗаголовка" Тогда
            Если Значение.Красный <> Пара.Значение.Красный Или Значение.Зеленый <> Пара.Значение.Зеленый
                Или Значение.Синий <> Пара.Значение.Синий Тогда
                ВызватьИсключение "Не совпали три составляющие собственного цвета";
            КонецЕсли;
        ИначеЕсли Значение <> Пара.Значение Тогда
            ВызватьИсключение "Не совпало значение свойства " + Пара.Ключ;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ВыбратьПрофильНаСервере(Обычный)
    Профиль = СоздатьПрофиль(Обычный);
    ПрименитьПрофиль(Профиль);
    ПроверитьПрофиль(Профиль);
КонецПроцедуры

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

Своя пустая конфигурация УчебныеГруппыКолонок85 → Общие → Общие модули → УчебныеГруппы85

Полный серверный общий модуль, Сервер=Да, Вызов сервера=Нет. Подготовка отдельно от модуля формы; не выполнялась.

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

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

  1. ПриСозданииНаСервере создаёт только две строки в памяти формы: Книга — 3 × 250 = 750; Ручка — 1 × 30 = 30. Всего=780. Таблица становится доступной только для просмотра, чтобы оформление не смешивалось с редактированием данных.

  2. ПолучитьСвоюГруппу берёт конкретный элемент Элементы.ГруппаРасчет, проверяет ВидГруппыФормы.ГруппаКолонок и его непосредственного родителя — ТаблицаКниг. Расширение не создают через Новый: его свойства принадлежат уже подготовленной группе колонок.

  3. ОбычныйВид задаёт горизонтальную группировку, выравнивание по центру, показ группы в шапке и карточке, отсутствие фиксации в таблице. Источник текста шапки — числовой реквизит Всего; ЧДЦ=2 задаёт два знака после десятичного разделителя. КартинкаШапки получает Новый Картинка — это осознанное отсутствие значка, без загрузки файлов.

  4. ОтображатьЗаголовок, ОтображатьЗаголовокВКарточке и ФиксироватьВКарточке получают Неопределено: платформа выбирает поведение автоматически. Это не Ложь. КомпактныйВид показывает явные Булево-значения и другую группировку: вертикально, фиксация слева, выравнивание влево, без группы в шапке, с заголовком и фиксацией в мобильной карточке.

  5. КомпактныйВид меняет ПутьКДаннымШапки на свой строковый реквизит ЗаголовокРасчета и сбрасывает числовой формат. Но ОтображатьВШапке=Ложь скрывает эту часть шапки: для отдельного опыта включите это свойство в компактном профиле, тогда строковый источник станет видимым. Изменения пути, группировки и фиксации выполняются на сервере.

  6. ЦветФонаЗаголовка получает абсолютные RGB-цвета: 232/242/255 и 255/244/220. Проверка сравнивает составляющие, а не строковое представление или идентичность объектов. Пустые картинки сравниваются по виду; это проверка только данного учебного случая, не любых библиотечных картинок.

  7. ПроверитьВосстановление сохраняет текущее состояние этой формы, применяет оба профиля и возвращает все 12 свойств. При ошибке тоже выполняется восстановление и повторно передаётся исключение. Данные двух строк и итог сверяются при получении группы; успешная проверка свойств не заменяет проверку внешнего вида.

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

  1. В будущем ручном запуске сверяйте обе строки целиком: Книга/3/250/750 и Ручка/1/30/30; итог 780. После каждой команды данные должны остаться прежними. Никаких записей справочников или документов урок не создаёт.

  2. Сначала выберите КомпактныйВид, затем ПроверитьВосстановление: после проверки остаётся компактный профиль. Повторите из ОбычныйВид: остаётся обычный. Неопределено в трёх автоматических свойствах должно сохраниться именно как Неопределено, а не стать Ложь.

  3. Для проверки обнаружения ошибки на копии учебного модуля вставьте в ВыбратьПрофильНаСервере после ПрименитьПрофиль(Профиль), перед ПроверитьПрофиль(Профиль): Элементы.ГруппаРасчет.ФорматШапки = "ошибка";. Запустите ПроверитьВосстановление: сравнение должно вызвать исключение, после которого сохранённые 12 свойств восстанавливаются. Не меняйте ожидание и код восстановления; затем удалите только вставленную строку.

  4. ОтображатьВКарточке, ОтображатьЗаголовокВКарточке и ФиксироватьВКарточке имеют визуальный смысл для мобильного приложения в интерфейсе Версия 8.5. На настольном клиенте можно сверить их значения, но нельзя подтвердить вид мобильной карточки. При будущем отдельном мобильном тесте дополнительно проверьте скрытие группы через ОтображатьВКарточке=Ложь.

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

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

Подготовлен полный учебный модуль формы и отдельный модуль проверки пустого стенда. Ожидаются два варианта оформления одной расчётной группы и восстановление её 12 свойств без изменения двух строк. Это описание ожидаемого поведения, не протокол запуска в 1С.

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

  1. ПутьКДаннымШапки доступен только на сервере. Не переносите применение или снятие профиля в клиентский цикл.

  2. Программно допустимы картинки вида Пустая и ИзБиблиотеки. Здесь используется только Пустая; снимок не обещает восстановление произвольных файловых картинок или библиотечных ресурсов.

  3. Снимок рассчитан на эту собственную форму, пустую картинку и абсолютный цвет. Он не является глубоким клонированием произвольного объекта. Для относительных цветов RGB могут быть -1 — такой исходный профиль проверка отклоняет до изменений.

  4. ФиксацияВТаблице=Лево/Право может поднять вложенную группу на верхний уровень таблицы. Поэтому ГруппаРасчет изначально является прямым дочерним элементом таблицы; Родитель только читается, не переприсваивается.

  5. Скрытие группы в шапке не удаляет её данные и не означает скрытие мобильной карточки. Управление шапкой, карточкой, заголовком и фиксацией — разные настройки.

  6. Запись и чтение свойства не гарантируют его визуального применения конкретным интерфейсом. Не выдавайте статическую проверку за испытание клиента или мобильного приложения.

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

Строка поиска своего списка: два профиля размеров и оформления с полным восстановлением

Создаём форму собственного динамического списка Книга/Ручка/Чай/Вода. Настраиваем автоматическую строку поиска, переключаем широкий и компактный профили отдельными кнопками, проверяем шесть свойств и восстанавливаем исходное оформление. Отдельно объясняем, почему цвета и шрифт не применяются в интерфейсе «Версия 8.5».

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

Полный модуль своей управляемой формы внешней обработки УчебноеОформлениеПоиска85; клиентские кнопки вызывают серверные процедуры формы. В1С не запускался.

Подготовка

  1. НОВАЯ пустая отдельная учебная база платформы точно8.5.1.1343, конфигурация УчебноеОформлениеПоиска85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и фоновых заданий. Не открывайте этот опыт в рабочей базе. Общие модули не нужны, модули конфигурации вручную пустые.

  2. Создайте свою внешнюю обработку УчебноеОформлениеПоиска85 и пустую управляемую основную форму. Один реквизит Список типа ДинамическийСписок. Один элемент ТаблицаФормы с именем ТаблицаТоваров и ПутьКДанным=Список. Колонки и кнопки вручную не добавляйте: полный модуль создаёт пять колонок и три собственные команды.

  3. В событии формы ПриСозданииНаСервере выберите одноимённую процедуру из полного модуля. Вставьте весь модуль формы с директивами, не в тело другого обработчика. Новый клиентский сеанс и открытие своей обработки — только будущая ручная проверка; здесь форма не открывалась и BSL не выполнялся.

  4. Вместо справочника используется буквальный запрос из четырёх строк: Книга3×250, Ручка1×30, Чай2×150, Вода0×70. ОсновнаяТаблица пустая, ДинамическоеСчитываниеДанных=Ложь, ключ УчебныйНомер имеет уникальные значения1–4. Старые пользовательские настройки автоматически не сохраняются.

  5. Для сравнения оформления учитывайте режим интерфейса. В «Версия 8.5» свойства ЦветРамки, ЦветТекста, ЦветФона и Шрифт этой строки НЕ ПРИМЕНЯЮТСЯ. Для отдельного будущего визуального опыта можно выбрать поддерживаемый клиентом прежний интерфейс; платформа при этом остаётся8.5.1.1343. Здесь не менялся интерфейс и не доказывалась его поддержка конкретным клиентом.

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

    Список.ПоляКлюча = Новый ФиксированныйМассив(КлючевыеПоля);
    Список.ТекстЗапроса = "ВЫБРАТЬ
|    1 КАК УчебныйНомер,
|    ""Книга"" КАК Наименование,
|    ""Канцелярия"" КАК Категория,
|    3 КАК Количество,
|    250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70";
    Элементы.ТаблицаТоваров.ТолькоПросмотр = Истина;
    Таблица = Элементы.ТаблицаТоваров;
    Таблица.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.Верх;
    ДобавитьСвоюКомандуПоиска("ШирокийПоиск85", "Широкая строка", "ШирокийПоиск85");
    ДобавитьСвоюКомандуПоиска("КомпактныйПоиск85", "Компактная строка", "КомпактныйПоиск85");
    ДобавитьСвоюКомандуПоиска("ЦиклПоиска85", "Проверить восстановление", "ЦиклПоиска85");

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

&НаКлиенте
Процедура ШирокийПоиск85(Команда)
    ЗадатьСвойПрофильНаСервере(Истина);
    Сообщить("Свойства широкой строки сверены; это не доказательство применения цветов в интерфейсе8.5");
КонецПроцедуры

&НаКлиенте
Процедура КомпактныйПоиск85(Команда)
    ЗадатьСвойПрофильНаСервере(Ложь);
    Сообщить("Свойства компактной строки сверены; ширина задана в символах, не пикселях");
КонецПроцедуры

&НаКлиенте
Процедура ЦиклПоиска85(Команда)
    ПроверитьСвойЦиклНаСервере();
    Сообщить("Оба профиля проверены; восстановлены все шесть свойств именно этой формы");
КонецПроцедуры

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

&НаСервере
Процедура ПроверитьСвоюОсновуПоиска()
    ПроверитьСвойПустойСтенд();
    Если ТипЗнч(Список) <> Тип("ДинамическийСписок") Или Не Список.ПроизвольныйЗапрос
        Или Список.ОсновнаяТаблица <> "" Или Список.ДинамическоеСчитываниеДанных
        Или Не Список.АвтоЗаполнениеДоступныхПолей Или Список.АвтоматическоеСохранениеПользовательскихНастроек
        Или Список.ВидКлюча <> ВидКлючаДинамическогоСписка.ЗначениеПоля
        Или Список.ТекстЗапроса <> "ВЫБРАТЬ
|    1 КАК УчебныйНомер,
|    ""Книга"" КАК Наименование,
|    ""Канцелярия"" КАК Категория,
|    3 КАК Количество,
|    250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70" Тогда
        ВызватьИсключение "Изменился собственный буквальный источник или настройки чтения";
    КонецЕсли;
    Ключи = Список.ПоляКлюча;
    Если ТипЗнч(Ключи) <> Тип("ФиксированныйМассив") Или Ключи.Количество() <> 1
        Или Ключи[0] <> "УчебныйНомер" Тогда
        ВызватьИсключение "Нужен единственный собственный ключ УчебныйНомер";
    КонецЕсли;
    Таблица = Элементы.Найти("ТаблицаТоваров");
    Если ТипЗнч(Таблица) <> Тип("ТаблицаФормы") Или Таблица.ПутьКДанным <> "Список"
        Или Не Таблица.ТолькоПросмотр Или Таблица.ПоложениеСтрокиПоиска <> ПоложениеСтрокиПоиска.Верх Тогда
        ВызватьИсключение "Нужна собственная таблица списка с поиском сверху";
    КонецЕсли;
    Для Каждого Имя Из СтрРазделить("УчебныйНомер,Наименование,Категория,Количество,Цена", ",") Цикл
        Колонка = Элементы.Найти("Товары" + Имя);
        Если ТипЗнч(Колонка) <> Тип("ПолеФормы") Или Колонка.Вид <> ВидПоляФормы.ПолеВвода
            Или Колонка.ПутьКДанным <> "Список." + Имя Или Колонка.Заголовок <> Имя Тогда
            ВызватьИсключение "Не совпала одна из пяти собственных колонок списка";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

&НаСервере
Функция ПолучитьСвоеОформлениеПоиска()
    Поиск = ПолучитьСвойПоиск();
    Возврат Новый Структура("Ширина,РастягиватьПоГоризонтали,ЦветРамки,ЦветТекста,ЦветФона,Шрифт",
        Поиск.Ширина, Поиск.РастягиватьПоГоризонтали, Поиск.ЦветРамки, Поиск.ЦветТекста, Поиск.ЦветФона, Поиск.Шрифт);
КонецФункции

&НаСервереБезКонтекста
Функция СоздатьСвойПрофильПоиска(Широкий)
    Если ТипЗнч(Широкий) <> Тип("Булево") Тогда
        ВызватьИсключение "Профиль выбирается собственным логическим флагом";
    КонецЕсли;
    Если Широкий Тогда
        Возврат Новый Структура("Ширина,РастягиватьПоГоризонтали,ЦветРамки,ЦветТекста,ЦветФона,Шрифт",
            0, Истина, Новый Цвет(70, 110, 170), Новый Цвет(15, 36, 64), Новый Цвет(243, 248, 255),
            Новый Шрифт("Arial", 12, Ложь, Ложь, Ложь, Ложь, 100));
    Иначе
        Возврат Новый Структура("Ширина,РастягиватьПоГоризонтали,ЦветРамки,ЦветТекста,ЦветФона,Шрифт",
            24, Ложь, Новый Цвет(170, 125, 45), Новый Цвет(64, 42, 14), Новый Цвет(255, 247, 224),
            Новый Шрифт("Arial", 11, Истина, Ложь, Ложь, Ложь, 100));
    КонецЕсли;
КонецФункции

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

&НаСервере
Процедура ПрименитьСвоеОформлениеПоиска(Профиль)
    Поиск = ПолучитьСвойПоиск();
    Поиск.Ширина = Профиль.Ширина;
    Поиск.РастягиватьПоГоризонтали = Профиль.РастягиватьПоГоризонтали;
    Поиск.ЦветРамки = Профиль.ЦветРамки;
    Поиск.ЦветТекста = Профиль.ЦветТекста;
    Поиск.ЦветФона = Профиль.ЦветФона;
    Поиск.Шрифт = Профиль.Шрифт;
КонецПроцедуры

&НаСервере
Процедура ПроверитьСвоеОформлениеПоиска(Ожидание)
    Факт = ПолучитьСвоеОформлениеПоиска();
    Если Факт.Количество() <> 6 Или ТипЗнч(Факт.Ширина) <> Тип("Число")
        Или (ТипЗнч(Факт.РастягиватьПоГоризонтали) <> Тип("Булево") И Факт.РастягиватьПоГоризонтали <> Неопределено)
        Или ТипЗнч(Факт.ЦветРамки) <> Тип("Цвет") Или ТипЗнч(Факт.ЦветТекста) <> Тип("Цвет")
        Или ТипЗнч(Факт.ЦветФона) <> Тип("Цвет") Или ТипЗнч(Факт.Шрифт) <> Тип("Шрифт") Тогда
        ВызватьИсключение "Не совпали все шесть типов оформления собственной строки поиска";
    КонецЕсли;
    Если Факт.Ширина <> Ожидание.Ширина
        Или ТипЗнч(Факт.РастягиватьПоГоризонтали) <> ТипЗнч(Ожидание.РастягиватьПоГоризонтали)
        Или Факт.РастягиватьПоГоризонтали <> Ожидание.РастягиватьПоГоризонтали
        Или СвоеОформлениеВXML(Факт.ЦветРамки) <> СвоеОформлениеВXML(Ожидание.ЦветРамки)
        Или СвоеОформлениеВXML(Факт.ЦветТекста) <> СвоеОформлениеВXML(Ожидание.ЦветТекста)
        Или СвоеОформлениеВXML(Факт.ЦветФона) <> СвоеОформлениеВXML(Ожидание.ЦветФона)
        Или СвоеОформлениеВXML(Факт.Шрифт) <> СвоеОформлениеВXML(Ожидание.Шрифт) Тогда
        ВызватьИсключение "Не совпало полное описание собственных настроек поиска";
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗадатьСвойПрофильНаСервере(Широкий)
    Профиль = СоздатьСвойПрофильПоиска(Широкий);
    ПрименитьСвоеОформлениеПоиска(Профиль);
    ПроверитьСвоеОформлениеПоиска(Профиль);
КонецПроцедуры

&НаСервере
Процедура ПроверитьСвойЦиклНаСервере()
    Исходное = ПолучитьСвоеОформлениеПоиска();
    ПроверитьСвоеОформлениеПоиска(Исходное);
    Попытка
        Широкий = СоздатьСвойПрофильПоиска(Истина);
        ПрименитьСвоеОформлениеПоиска(Широкий);
        ПроверитьСвоеОформлениеПоиска(Широкий);
        Компактный = СоздатьСвойПрофильПоиска(Ложь);
        ПрименитьСвоеОформлениеПоиска(Компактный);
        ПроверитьСвоеОформлениеПоиска(Компактный);
    Исключение
        ПрименитьСвоеОформлениеПоиска(Исходное);
        ПроверитьСвоеОформлениеПоиска(Исходное);
        ВызватьИсключение;
    КонецПопытки;
    ПрименитьСвоеОформлениеПоиска(Исходное);
    ПроверитьСвоеОформлениеПоиска(Исходное);
КонецПроцедуры

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

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

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

  2. Получить readonly ТаблицаТоваров.ОтображениеСтрокиПоиска. Это ДополнениеЭлементаФормы с видом ОтображениеСтрокиПоиска. Его расширение предоставляет шесть свойств; отдельного конструктора расширения нет. Не менять Вид: справка предупреждает, что при смене вида все свойства расширения сбрасываются.

  3. Кнопка «Широкая строка» вызывает серверную процедуру с Истина: Ширина=0 означает автоматически, РастягиватьПоГоризонтали=Истина. Три абсолютных RGB-цвета и шрифт Arial12 заданы полностью. Изменения свойств на клиенте требуют сервера, поэтому присваивания выполняются на сервере формы.

  4. Кнопка «Компактная строка» передаёт Ложь: Ширина=24 символа, растягивание выключено, другие три RGB-цвета и Arial11 полужирный. Это две разные настройки, а не обещание точной ширины в пикселях или обязательной смены цветов в8.5.

  5. После каждого присваивания проверить типы всех шести свойств. Размер и растягивание сравниваются вместе с типом; Неопределено у растягивания сохраняется как Неопределено, не приравнивается к Ложь. Цвета и шрифт сравниваются по полному XML/XDTO-описанию, потому что исходное значение может быть ссылкой на стиль, а не абсолютным RGB.

  6. Кнопка «Проверить восстановление» снимает оформление, существующее непосредственно перед её нажатием. В одном серверном вызове проверяет широкий и компактный профили, затем возвращает все шесть исходных свойств и сверяет их. Если проверка профиля вызывает исключение, восстановление выполняется и в ветке ошибки; ошибка не скрывается.

  7. Промежуточные профили внутри проверки цикла не предъявляются как увиденные на экране: клиент получает результат одного завершённого серверного вызова. Для осмысленного визуального сравнения используйте две отдельные кнопки профилей и меняйте размер окна. Сохранение оформления не является доказательством успешного поиска или оформления в8.5.

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

  1. Будущий ручной контроль данных: до поиска видны четыре собственные строки1–4; в строке поиска введите Книга, ожидайте подходящую собственную строку, очистите поиск и сверяйте исходный список. Реальный результат поиска зависит от клиента/настроек и здесь не измерялся.

  2. Будущий контроль свойств: широкая строка0/Истина, компактная24/Ложь, каждое полное описание цвета/шрифта соответствует своему эталону. Проверьте восстановление после каждого профиля: должны вернуться именно настройки перед проверкой, а не предполагаемые значения по умолчанию.

  3. Будущий отрицательный контроль: в процедуре ПроверитьСвойЦиклНаСервере сразу после ПрименитьСвоеОформлениеПоиска(Компактный) и перед проверкой компактного профиля вставьте две строки: Поиск = ПолучитьСвойПоиск(); и Поиск.Ширина = 23;. Эталон24 в СоздатьСвойПрофильПоиска и общую процедуру присваивания/восстановления не меняйте. Проверка должна сообщить о несовпадении полного описания; исходные свойства восстанавливаются в ветке ошибки. Верните полный исходный код и откройте новый собственный сеанс.

  4. runtimeVerifiedScenarios=0. Ни один профиль, запрос, поиск, XDTO-вызов или форма в1С здесь не запускались. В интерфейсе «Версия 8.5» отсутствие изменения цветов/шрифта не является ошибкой поиска; установленная справка прямо запрещает обещать их визуальное применение. Если при ручном запуске обнаружится нормализация значения свойства, строгая сверка выявит её — не объявляйте визуальный успех по одному зелёному сообщению.

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

Полный самостоятельный модуль разделяет данные списка, автоматическое дополнение поиска, настройки размеров, сохранённое описание оформления и реальное применение интерфейсом.

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

  1. Не создавайте Новый РасширениеОтображенияСтрокиПоиска и не присваивайте новый объект readonly ОтображениеСтрокиПоиска. Свойства расширения доступны у действительного дополнения нужного вида, полученного от собственной таблицы.

  2. Ширина задаётся в символах, не пикселях;0 означает автоматический размер. РастягиватьПоГоризонтали имеет тип Булево или Неопределено. Они не изменяют количество товаров и не являются фильтром запроса.

  3. ЦветРамки, ЦветТекста, ЦветФона и Шрифт НЕ ПРИМЕНЯЮТСЯ в интерфейсе «Версия 8.5». Успешное присваивание/чтение описания не доказывает, что виджет использовал его. Шрифтовой файл Arial, его замена клиентом и активная тема также влияют на вид; здесь они не проверены.

  4. XML-писатель работает только со строкой памяти и только с конкретными значениями Цвет/Шрифт. Не передавайте объекты метаданных, записи или весь список: сериализация объектов данных может выгружать записи. Писатель закрывается в нормальной и ошибочной ветках.

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

  6. Это пример автоматической строки поиска таблицы, не НастройкиОтображенияДинамическогоСписка. Последнее содержит readonly РежимОтображенияСтрокиПоиска и здесь не конструируется и не привязывается к уроку без настоящего способа получения. Функциональность полномасштабного полнотекстового поиска и права доступа не выдумываются.

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

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

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

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

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