Тип: ВидКартинки. Содержит вид картинки.
Полное описание, параметры и ограничения
Картинка.Вид (Picture.Type)
Картинка (Picture)
Вид (Type)
Доступен, начиная с версии 8.0.
Использование:
Только чтение.
Описание:
Тип: ВидКартинки.
Содержит вид картинки.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Объединить количество, цену и сумму в группу колонок
Две учебные строки дают итог 780. Переключаем обычное и компактное оформление расчётной группы, меняем источник шапки и проверяем восстановление всех 12 её свойств. Подготовка базы вынесена в отдельный модуль; основная задача находится в модуле формы.
Где и как запускать
Полный модуль своей управляемой формы внешней обработки УчебныеГруппыКолонок85. Серверные процедуры работают только с реквизитами и элементами этой формы; не запускались.
Подготовка
Для будущего ручного запуска создайте НОВУЮ пустую учебную базу на платформе 8.5.1.1343. Имя конфигурации — УчебныеГруппыКолонок85; бизнес-объектов, расширений, подписок и регламентных заданий нет. Не используйте УТ, КА, УНФ или БП с рабочими данными. Здесь база и форма не создавались, код в 1С не выполнялся: runtimeVerifiedScenarios=0.
Создайте общий модуль УчебныеГруппы85: Сервер=Да, Клиент=Нет, Глобальный=Нет, Вызов сервера=Нет. Вставьте целиком отдельный модуль проверки стенда из блока ниже; его экспортную процедуру вызывает только сервер формы.
Создайте свою внешнюю обработку УчебныеГруппыКолонок85 и управляемую форму Форма. Добавьте реквизит Книги типа ТаблицаЗначений с колонками Название (Строка,100), Количество (Число,3,0,неотрицательное), Цена (Число,9,2,неотрицательное), Сумма (Число,12,2,неотрицательное). Добавьте реквизиты Всего (Число,12,2,неотрицательное) и ЗаголовокРасчета (Строка,80). Это реквизиты этой формы, не таблицы базы.
На форме разместите таблицу ТаблицаКниг с ПутьКДанным=Книги. Колонку Название свяжите с Книги.Название. Прямо внутри ТаблицаКниг создайте группу ГруппаРасчет: Вид=ГруппаКолонок, Заголовок=Расчет. Внутри неё разместите поля Количество, Цена, Сумма с путями Книги.Количество, Книги.Цена, Книги.Сумма. Не вкладывайте группу в другую группу. Включите шапку таблицы. В ходе урока не меняйте порядок строк.
Создайте команды ОбычныйВид, КомпактныйВид, ПроверитьВосстановление и кнопки для них. Назначьте одноимённые обработчики, а событию формы ПриСозданииНаСервере — одноимённую процедуру. Вставьте полный основной код в модуль формы, на верхний уровень, не внутрь другого обработчика. Проверьте 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 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
ПриСозданииНаСервере создаёт только две строки в памяти формы: Книга — 3 × 250 = 750; Ручка — 1 × 30 = 30. Всего=780. Таблица становится доступной только для просмотра, чтобы оформление не смешивалось с редактированием данных.
ПолучитьСвоюГруппу берёт конкретный элемент Элементы.ГруппаРасчет, проверяет ВидГруппыФормы.ГруппаКолонок и его непосредственного родителя — ТаблицаКниг. Расширение не создают через Новый: его свойства принадлежат уже подготовленной группе колонок.
ОбычныйВид задаёт горизонтальную группировку, выравнивание по центру, показ группы в шапке и карточке, отсутствие фиксации в таблице. Источник текста шапки — числовой реквизит Всего; ЧДЦ=2 задаёт два знака после десятичного разделителя. КартинкаШапки получает Новый Картинка — это осознанное отсутствие значка, без загрузки файлов.
ОтображатьЗаголовок, ОтображатьЗаголовокВКарточке и ФиксироватьВКарточке получают Неопределено: платформа выбирает поведение автоматически. Это не Ложь. КомпактныйВид показывает явные Булево-значения и другую группировку: вертикально, фиксация слева, выравнивание влево, без группы в шапке, с заголовком и фиксацией в мобильной карточке.
КомпактныйВид меняет ПутьКДаннымШапки на свой строковый реквизит ЗаголовокРасчета и сбрасывает числовой формат. Но ОтображатьВШапке=Ложь скрывает эту часть шапки: для отдельного опыта включите это свойство в компактном профиле, тогда строковый источник станет видимым. Изменения пути, группировки и фиксации выполняются на сервере.
ЦветФонаЗаголовка получает абсолютные RGB-цвета: 232/242/255 и 255/244/220. Проверка сравнивает составляющие, а не строковое представление или идентичность объектов. Пустые картинки сравниваются по виду; это проверка только данного учебного случая, не любых библиотечных картинок.
ПроверитьВосстановление сохраняет текущее состояние этой формы, применяет оба профиля и возвращает все 12 свойств. При ошибке тоже выполняется восстановление и повторно передаётся исключение. Данные двух строк и итог сверяются при получении группы; успешная проверка свойств не заменяет проверку внешнего вида.
Как проверить результат
В будущем ручном запуске сверяйте обе строки целиком: Книга/3/250/750 и Ручка/1/30/30; итог 780. После каждой команды данные должны остаться прежними. Никаких записей справочников или документов урок не создаёт.
Сначала выберите КомпактныйВид, затем ПроверитьВосстановление: после проверки остаётся компактный профиль. Повторите из ОбычныйВид: остаётся обычный. Неопределено в трёх автоматических свойствах должно сохраниться именно как Неопределено, а не стать Ложь.
Для проверки обнаружения ошибки на копии учебного модуля вставьте в ВыбратьПрофильНаСервере после ПрименитьПрофиль(Профиль), перед ПроверитьПрофиль(Профиль): Элементы.ГруппаРасчет.ФорматШапки = "ошибка";. Запустите ПроверитьВосстановление: сравнение должно вызвать исключение, после которого сохранённые 12 свойств восстанавливаются. Не меняйте ожидание и код восстановления; затем удалите только вставленную строку.
ОтображатьВКарточке, ОтображатьЗаголовокВКарточке и ФиксироватьВКарточке имеют визуальный смысл для мобильного приложения в интерфейсе Версия 8.5. На настольном клиенте можно сверить их значения, но нельзя подтвердить вид мобильной карточки. При будущем отдельном мобильном тесте дополнительно проверьте скрытие группы через ОтображатьВКарточке=Ложь.
Для наглядной проверки фиксации подготовьте достаточно узкую таблицу с горизонтальной прокруткой. Настольный и мобильный внешний вид, формат числа и восстановление в живой форме здесь не проверены.
Ожидаемый результат
Подготовлен полный учебный модуль формы и отдельный модуль проверки пустого стенда. Ожидаются два варианта оформления одной расчётной группы и восстановление её 12 свойств без изменения двух строк. Это описание ожидаемого поведения, не протокол запуска в 1С.
На что обратить внимание
ПутьКДаннымШапки доступен только на сервере. Не переносите применение или снятие профиля в клиентский цикл.
Программно допустимы картинки вида Пустая и ИзБиблиотеки. Здесь используется только Пустая; снимок не обещает восстановление произвольных файловых картинок или библиотечных ресурсов.
Снимок рассчитан на эту собственную форму, пустую картинку и абсолютный цвет. Он не является глубоким клонированием произвольного объекта. Для относительных цветов RGB могут быть -1 — такой исходный профиль проверка отклоняет до изменений.
ФиксацияВТаблице=Лево/Право может поднять вложенную группу на верхний уровень таблицы. Поэтому ГруппаРасчет изначально является прямым дочерним элементом таблицы; Родитель только читается, не переприсваивается.
Скрытие группы в шапке не удаляет её данные и не означает скрытие мобильной карточки. Управление шапкой, карточкой, заголовком и фиксацией — разные настройки.
Запись и чтение свойства не гарантируют его визуального применения конкретным интерфейсом. Не выдавайте статическую проверку за испытание клиента или мобильного приложения.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Настроить собственное окно до открытия и восстановить профиль
Обычное окно и прикреплённая панель получают разные размеры, положения и разрешения. Полный пульт проверяет 17 скалярных свойств до открытия, а значок и стиль задаёт отдельно собственными пустыми значениями.
Где и как запускать
Полный модуль собственной обычной формы Пульт; настраивает только ещё закрытую Панель. Толстый клиент, не запускался.
Подготовка
Создайте НОВУЮ пустую конфигурацию УчебныеОкна85 на платформе 8.5.1.1343, без бизнес-объектов, расширений, подписок и регламентных заданий. Уроки относятся только к обычным формам толстого клиента, не к управляемой форме, тонкому или веб-клиенту. Ничего в рабочих УТ, КА, УНФ или БП не изменяйте. Здесь база, формы и код в 1С не запускались: runtimeVerifiedScenarios=0.
Создайте общий модуль УчебныеОкна85: Клиент (обычное приложение)=Да, Сервер=Нет, Глобальный=Нет, Вызов сервера=Нет. Вставьте полный отдельный модуль проверки стенда из блока ниже. Он проверяет собственную пустую конфигурацию.
Добавьте только свою обработку УчебнаяПанель85 с обычными формами Пульт и Панель. Пульт — основная форма. Панель: реквизит ТекстПанели (Строка,80), поле ввода и кнопки ПоказатьТекст/ЗакрытьПанель. Кнопка ПоказатьТекст — кнопка по умолчанию; она только выводит текст, не закрывает окно. Размер панели в редакторе сделайте не больше 120×90 логических единиц.
Назначьте одноимённые действия кнопок и событие ПриОткрытии обеих форм. Вставьте отдельно полный основной модуль Пульта и полный модуль Панели ниже. Код нельзя перенести в модуль управляемой формы. Проверьте F7.
В Пульт добавьте кнопки ОбычноеОкно, ПрикрепленнаяПанель, ПроверитьВосстановление, ЗакрытьСвоюПанель и одноимённые обработчики. Каждую новую видимую панель сначала закрывайте своей кнопкой; модуль отказывается менять профиль уже открытого окна.
Перем Окно;
Процедура ПриОткрытии()
УчебныеОкна85.ПроверитьСвойПустойСтенд();
Если Метаданные.Обработки.Количество() <> 1 Или Метаданные.Обработки[0].Имя <> "УчебнаяПанель85" Тогда
ВызватьИсключение "Подготовьте только собственную обработку УчебнаяПанель85";
КонецЕсли;
Окно = Неопределено;
КонецПроцедуры
Функция СоздатьЗакрытоеОкно()
Если Окно <> Неопределено И Окно.Открыта() Тогда
ВызватьИсключение "Сначала закройте только свою учебную панель";
КонецЕсли;
Идентификатор = Новый УникальныйИдентификатор;
Окно = Обработки.УчебнаяПанель85.ПолучитьФорму("Панель", ЭтаФорма, Идентификатор);
Если ТипЗнч(Окно) <> Тип("Форма") Или Окно.Открыта() Тогда
ВызватьИсключение "Нужна собственная ещё не открытая обычная форма Панель";
КонецЕсли;
Окно.КлючСохраненияПоложенияОкна = "УчебнаяПанель85.НовыйОпыт." + Строка(Идентификатор);
Окно.КартинкаЗаголовка = Новый Картинка;
Окно.Стиль = Новый Стиль;
Если ТипЗнч(Окно.КартинкаЗаголовка) <> Тип("Картинка") Или Окно.КартинкаЗаголовка.Вид <> ВидКартинки.Пустая
Или ТипЗнч(Окно.Стиль) <> Тип("Стиль") Тогда
ВызватьИсключение "Для своего опыта нужен пустой значок и стиль Авто";
КонецЕсли;
Возврат Окно;
КонецФункции
Функция СоздатьПрофиль(Прикрепленный)
Если Прикрепленный Тогда
Возврат Новый Структура("Ширина,Высота,ИзменениеРазмера,ПоложениеОкна,СостояниеОкна,СпособОтображенияОкна,ИзменятьСпособОтображенияОкна,СоединяемоеОкно,РежимРабочегоСтола,ПоложениеПрикрепленногоОкна,РазрешитьСоединятьОкно,РазрешитьСостояниеОбычное,РазрешитьСостояниеПрикрепленное,РазрешитьСостояниеПрячущееся,РазрешитьСостояниеСвободное,РазрешитьЗакрытие,ПоведениеКлавишиEnter",
160, 110, ИзменениеРазмераОкна.НеИзменять, ВариантПоложенияОкна.НеПерекрыватьВладельца,
ВариантСостоянияОкна.Прикрепленное, ВариантСпособаОтображенияОкна.Нормальное,
ИзменениеСпособаОтображенияОкна.Запретить, Истина, Ложь, ВариантПрикрепленияОкна.Лево,
Истина, Истина, Истина, Истина, Истина, Истина, ТипПоведенияКлавишиEnter.КнопкаПоУмолчанию);
Иначе
Возврат Новый Структура("Ширина,Высота,ИзменениеРазмера,ПоложениеОкна,СостояниеОкна,СпособОтображенияОкна,ИзменятьСпособОтображенияОкна,СоединяемоеОкно,РежимРабочегоСтола,ПоложениеПрикрепленногоОкна,РазрешитьСоединятьОкно,РазрешитьСостояниеОбычное,РазрешитьСостояниеПрикрепленное,РазрешитьСостояниеПрячущееся,РазрешитьСостояниеСвободное,РазрешитьЗакрытие,ПоведениеКлавишиEnter",
220, 150, ИзменениеРазмераОкна.Изменять, ВариантПоложенияОкна.Центрировать,
ВариантСостоянияОкна.Обычное, ВариантСпособаОтображенияОкна.Нормальное,
ИзменениеСпособаОтображенияОкна.Разрешить, Ложь, Ложь, ВариантПрикрепленияОкна.Право,
Ложь, Истина, Ложь, Ложь, Ложь, Истина, ТипПоведенияКлавишиEnter.ПереходПоЭлементамФормы);
КонецЕсли;
КонецФункции
Процедура ПрименитьПрофиль(ФормаПанели, Профиль)
ПроверитьЗакрытоеОкно(ФормаПанели);
ФормаПанели.Ширина = Профиль.Ширина;
ФормаПанели.Высота = Профиль.Высота;
ФормаПанели.ИзменениеРазмера = Профиль.ИзменениеРазмера;
ФормаПанели.ПоложениеОкна = Профиль.ПоложениеОкна;
ФормаПанели.СостояниеОкна = Профиль.СостояниеОкна;
ФормаПанели.СпособОтображенияОкна = Профиль.СпособОтображенияОкна;
ФормаПанели.ИзменятьСпособОтображенияОкна = Профиль.ИзменятьСпособОтображенияОкна;
ФормаПанели.СоединяемоеОкно = Профиль.СоединяемоеОкно;
ФормаПанели.РежимРабочегоСтола = Профиль.РежимРабочегоСтола;
ФормаПанели.ПоложениеПрикрепленногоОкна = Профиль.ПоложениеПрикрепленногоОкна;
ФормаПанели.РазрешитьСоединятьОкно = Профиль.РазрешитьСоединятьОкно;
ФормаПанели.РазрешитьСостояниеОбычное = Профиль.РазрешитьСостояниеОбычное;
ФормаПанели.РазрешитьСостояниеПрикрепленное = Профиль.РазрешитьСостояниеПрикрепленное;
ФормаПанели.РазрешитьСостояниеПрячущееся = Профиль.РазрешитьСостояниеПрячущееся;
ФормаПанели.РазрешитьСостояниеСвободное = Профиль.РазрешитьСостояниеСвободное;
ФормаПанели.РазрешитьЗакрытие = Профиль.РазрешитьЗакрытие;
ФормаПанели.ПоведениеКлавишиEnter = Профиль.ПоведениеКлавишиEnter;
КонецПроцедуры
Функция СнятьПрофиль(ФормаПанели)
ПроверитьЗакрытоеОкно(ФормаПанели);
Возврат Новый Структура("Ширина,Высота,ИзменениеРазмера,ПоложениеОкна,СостояниеОкна,СпособОтображенияОкна,ИзменятьСпособОтображенияОкна,СоединяемоеОкно,РежимРабочегоСтола,ПоложениеПрикрепленногоОкна,РазрешитьСоединятьОкно,РазрешитьСостояниеОбычное,РазрешитьСостояниеПрикрепленное,РазрешитьСостояниеПрячущееся,РазрешитьСостояниеСвободное,РазрешитьЗакрытие,ПоведениеКлавишиEnter",
ФормаПанели.Ширина, ФормаПанели.Высота, ФормаПанели.ИзменениеРазмера,
ФормаПанели.ПоложениеОкна, ФормаПанели.СостояниеОкна, ФормаПанели.СпособОтображенияОкна,
ФормаПанели.ИзменятьСпособОтображенияОкна, ФормаПанели.СоединяемоеОкно, ФормаПанели.РежимРабочегоСтола,
ФормаПанели.ПоложениеПрикрепленногоОкна, ФормаПанели.РазрешитьСоединятьОкно, ФормаПанели.РазрешитьСостояниеОбычное,
ФормаПанели.РазрешитьСостояниеПрикрепленное, ФормаПанели.РазрешитьСостояниеПрячущееся, ФормаПанели.РазрешитьСостояниеСвободное,
ФормаПанели.РазрешитьЗакрытие, ФормаПанели.ПоведениеКлавишиEnter);
КонецФункции
Процедура ОбычноеОкно(Кнопка)
ФормаПанели = СоздатьЗакрытоеОкно();
Профиль = СоздатьПрофиль(Ложь);
ПрименитьПрофиль(ФормаПанели, Профиль);
ПроверитьПрофиль(ФормаПанели, Профиль);
ФормаПанели.Открыть();
КонецПроцедуры
Процедура ПрикрепленнаяПанель(Кнопка)
ФормаПанели = СоздатьЗакрытоеОкно();
Профиль = СоздатьПрофиль(Истина);
ПрименитьПрофиль(ФормаПанели, Профиль);
ПроверитьПрофиль(ФормаПанели, Профиль);
ФормаПанели.Открыть();
КонецПроцедуры
Процедура ПроверитьВосстановление(Кнопка)
ФормаПанели = СоздатьЗакрытоеОкно();
ПрименитьПрофиль(ФормаПанели, СоздатьПрофиль(Ложь));
Снимок = СнятьПрофиль(ФормаПанели);
Попытка
Профиль = СоздатьПрофиль(Истина);
ПрименитьПрофиль(ФормаПанели, Профиль);
ПроверитьПрофиль(ФормаПанели, Профиль);
Исключение
ПрименитьПрофиль(ФормаПанели, Снимок);
ПроверитьПрофиль(ФормаПанели, Снимок);
ВызватьИсключение;
КонецПопытки;
ПрименитьПрофиль(ФормаПанели, Снимок);
ПроверитьПрофиль(ФормаПанели, Снимок);
Сообщить("17 скалярных настроек восстановлены до открытия окна");
КонецПроцедуры
Процедура ЗакрытьСвоюПанель(Кнопка)
Если Окно <> Неопределено И Окно.Открыта() Тогда
Окно.Закрыть();
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьЗакрытоеОкно(ФормаПанели)
Если ТипЗнч(ФормаПанели) <> Тип("Форма") Или ФормаПанели.Открыта() Тогда
ВызватьИсключение "Профиль задаётся только своей закрытой форме";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьПрофиль(ФормаПанели, Ожидание)
Факт = СнятьПрофиль(ФормаПанели);
Если Факт.Количество() <> 17 Или Ожидание.Количество() <> 17 Тогда
ВызватьИсключение "Проверяются все 17 скалярных настроек";
КонецЕсли;
Для Каждого Пара Из Ожидание Цикл
Если ТипЗнч(Факт[Пара.Ключ]) <> ТипЗнч(Пара.Значение) Или Факт[Пара.Ключ] <> Пара.Значение Тогда
ВызватьИсключение "Не совпала настройка " + Пара.Ключ;
КонецЕсли;
КонецЦикла;
КонецПроцедурыУчебнаяПанель85.Панель
Своя обработка УчебнаяПанель85 → Формы → Панель → Модуль
Полный отдельный модуль обычной формы Панель, не вставлять внутрь модуля Пульта; не выполнялся.
Процедура ПриОткрытии()
УчебныеОкна85.ПроверитьСвойПустойСтенд();
ТекстПанели = "Собственная учебная панель";
КонецПроцедуры
Процедура ПоказатьТекст(Кнопка)
Сообщить(ТекстПанели);
КонецПроцедуры
Процедура ЗакрытьПанель(Кнопка)
ЭтаФорма.Закрыть();
КонецПроцедурыУчебныеОкна85.ПроверкаСтенда
Своя конфигурация УчебныеОкна85 → Общие → Общие модули → УчебныеОкна85
Полный общий модуль только обычного клиента; не выполнялся.
Процедура ПроверитьСвойПустойСтенд() Экспорт
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
СоздатьЗакрытоеОкно получает только свою Панель с новым UUID. Уникальный ключ сохранения снижает влияние старого пользовательского расположения на новый опыт; последующие открытия могут сохранять внутренние параметры этого окна. Это не очистка чужих профилей.
Ширина/Высота — логические единицы, не пиксели. Обычный профиль 220×150 разрешает изменение размера; прикреплённый 160×110 запрещает. Свойства проверяются до показа; действительный размер экрана и ограничения интерфейса проверяются отдельно.
ПоложениеОкна относится к обычному/свободному состоянию, ПоложениеПрикрепленногоОкна — к прикреплённому/прячущемуся. СостояниеОкна и СпособОтображенияОкна — разные перечисления. Оба профиля открываются нормально, не минимизированно.
РазрешитьСостояние... задают допустимые переключения, но сами по себе не переводят окно в состояние. СоединяемоеОкно и РазрешитьСоединятьОкно также не равны друг другу. Эти настройки, положение и состояние задаются только перед Открыть.
РежимРабочегоСтола=Ложь и РазрешитьЗакрытие=Истина заданы явно: учебная панель не перекрывает системные панели и её можно закрыть. Для отдельного ручного опыта поменяйте только эти флаги в копии профиля; программная кнопка ЗакрытьПанель остаётся доступным способом выхода.
ПоведениеКлавишиEnter сравнивает переход по полям с нажатием безопасной кнопки ПоказатьТекст. КартинкаЗаголовка=Новый Картинка убирает значок; Стиль=Новый Стиль задаёт Авто. Эти два объекта не входят в скалярный снимок и не изменяются при цикле.
ПроверитьВосстановление снимает состояние после собственного обычного профиля, применяет прикреплённый, проверяет типы/значения и возвращает 17 полей. При исключении тоже восстанавливает их и передаёт ошибку дальше; окно в цикле вообще не открывается.
Как проверить результат
В будущем ручном запуске сначала проверьте закрытый цикл. Затем по отдельности ОбычноеОкно и ПрикрепленнаяПанель: положение, размер, разрешённые переключения и Enter нужно сверить глазами, не только через свойства.
Если сохранённый профиль или ограничение экрана меняет видимое положение, не объявляйте успех по присвоенным значениям. Положение, СостояниеОкна и соединение применяются только при отсутствии ранее сохранённых параметров; здесь используются отдельные новые ключи.
Для проверки обнаружения ошибки на копии модуля в цикле после ПрименитьПрофиль(ФормаПанели, Профиль), до ПроверитьПрофиль вставьте ФормаПанели.ПоведениеКлавишиEnter = ТипПоведенияКлавишиEnter.ПереходПоЭлементамФормы;. Сравнение должно отказать и восстановить исходные 17 полей. Не меняйте ожидание или восстановление.
Свободное и прячущееся состояния дополнительно испытайте в копии прикреплённого профиля, сохранив разрешающие флаги. Для РежимРабочегоСтола=Истина свободная или модальная форма может перекрыть системные панели Windows; делайте это только на своём стенде и с рабочей кнопкой выхода. Здесь таких окон не было.
Ожидаемый результат
Подготовлены полный модуль Пульта, полный модуль Панели и проверка пустого стенда. Ожидается настройка двух оконных профилей и восстановление 17 скалярных полей до открытия. runtimeVerifiedScenarios=0.
На что обратить внимание
Не задавайте свойства, отмеченные «до открытия», в ПриОткрытии самой Панели: их устанавливает Пульт до Открыть.
Оконный профиль может сохраняться платформой. Уникальные собственные ключи не доказывают отсутствие внутренних записей и не удаляют их.
Стиль Авто и пустая картинка — отдельные неизменяемые значения в этом опыте; урок не обещает глубокое клонирование любых стилей и картинок.
Положение НеПерекрыватьВладельца ограничено доступным пространством родительского окна. Разрешения и считанные значения не являются доказательством внешнего вида.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.