Показать метки из коллекции с разными значением и подписью

Учебные задачи

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

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

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

Подготовка

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

  2. Не добавляйте вручную реквизит Метки, поле ПолеМеток и команду УчебноеДействие: их создаст код.

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

  4. Сохраните учебную EPF и откройте через Файл → Открыть в тонком или толстом клиенте Windows. Рабочие данные не читаются и не записываются.

  5. Картинка 32×32 полностью включена в код через Base64. Не нужны файл макета, скачивание или доступ к каталогу картинок.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    Новые.Добавить(Новый РеквизитФормы("Метки", Новый ОписаниеТипов("ТаблицаЗначений")));
    Новые.Добавить(Новый РеквизитФормы("Значение", Новый ОписаниеТипов("Строка"), "Метки"));
    Новые.Добавить(Новый РеквизитФормы("Представление", Новый ОписаниеТипов("Строка"), "Метки"));
    Новые.Добавить(Новый РеквизитФормы("Картинка", Новый ОписаниеТипов("Картинка"), "Метки"));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка"));
    Байты = Base64Значение("iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAArklEQVR4nO3VOxKAIAxF0SzEtbgk99/FRhuE8F4+0lCkc3LPCDOIqsrKWRrfADfguE7tTSlgFI1iSuIMoiyOIkrjD8BE/BE3/0R5/AWMEFXn/om7Ae0SbxwGWOcYiY8QMGCGIL7jAMhyNO4GTC4We0w+QC/GxsOANsrGIQCLiMTDACaeDmDjFCDrPZjFTUAmwmqYgKSHSUKACALZDQE8CHQvDEAwnl0uQOZsgKwG3AxgSxA9ZssYAAAAAElFTkSuQmCC");
    УчебнаяКартинка = Новый Картинка(Байты);
    Метка = Данные.Добавить();
    Метка.Значение = "book";
    Метка.Представление = "Книга";
    Метка.Картинка = УчебнаяКартинка;
    Метка = Данные.Добавить();
    Метка.Значение = "pen";
    Метка.Представление = "Ручка";
    Метка.Картинка = УчебнаяКартинка;
    ЭтаФорма.ЗначениеВРеквизитФормы(Данные, "Метки");
    Поле = Элементы.Добавить("ПолеМеток", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "Метки";
    Поле.Заголовок = "Две собственные метки";
    Поле.ПутьКДаннымЗначенияМножественногоЗначения = "Метки.Значение";
    Поле.ПутьКДаннымПредставленияМножественногоЗначения = "Метки.Представление";
    Поле.ПутьКДаннымКартинкиМножественногоЗначения = "Метки.Картинка";
    Поле.РасширенноеРедактированиеМножественныхЗначений = Ложь;
    Поле.ГиперссылкаМножественныхЗначений = Ложь;
    Поле.ЦветТекстаМножественныхЗначений = Новый Цвет(24, 40, 60);
    Поле.ЦветФонаМножественныхЗначений = Новый Цвет(235, 244, 255);
    Поле.ШрифтМножественныхЗначений = Новый Шрифт(Поле.ШрифтМножественныхЗначений, , 11, Ложь);
    Поле.Ширина = 60;

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

&НаКлиенте
Процедура УчебноеДействие(Команда)
    Если Метки.Количество() <> 2 Тогда
        ВызватьИсключение "Ожидались две собственные метки";
    КонецЕсли;
    Книга = Метки[0];
    Ручка = Метки[1];
    Сообщить(Книга.Значение = "book" И Книга.Представление = "Книга");
    Сообщить(Ручка.Значение = "pen" И Ручка.Представление = "Ручка");
    Сообщить(ТипЗнч(Книга.Картинка) = Тип("Картинка"));
    Поле = Элементы.ПолеМеток;
    Сообщить("Размер картинки из настройки: " + Строка(Поле.РазмерКартинкиМножественногоЗначения));
    Сообщить("Фигура картинки из настройки: " + Строка(Поле.ФигураКартинкиМножественногоЗначения));
    Идентификаторы = Новый Массив;
    Идентификаторы.Добавить(Книга.ПолучитьИдентификатор());
    Поле.УстановитьВыделенныеМножественныеЗначения(Идентификаторы);
    Выделенные = Поле.ПолучитьВыделенныеМножественныеЗначения();
    Сообщить(Выделенные.Количество() = 1 И Выделенные.Найти(Книга.ПолучитьИдентификатор()) <> Неопределено);
    Сообщить(Метки.Количество() = 2);
КонецПроцедуры

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

  1. Сервер создаёт ТаблицаЗначений с колонками Значение, Представление и Картинка и переносит её в реквизит формы.

  2. В клиентском модуле реквизит представлен ДанныеФормыКоллекция. Пути ко всем трём колонкам задаются на сервере.

  3. Картинки находятся непосредственно в колонке типа Картинка: здесь нет индексов в наборе картинок и сетевых адресов.

  4. РасширенноеРедактированиеМножественныхЗначений выключено: для коллекции строки показываются без интерактивного редактирования через поле.

  5. Цвета относятся к оформлению. РазмерКартинкиМножественногоЗначения и ФигураКартинкиМножественногоЗначения только читаются: установленная справка не разрешает программную запись.

  6. ШрифтМножественныхЗначений и РазмерКартинкиМножественногоЗначения не применяются в интерфейсе Версия 8.5.

  7. После проверки двух строк выбираем Книга по идентификатору строки формы, не по её индексу.

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

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

  2. Подписи Книга/Ручка отличаются от значений book/pen. Фактический внешний вид проверьте в своей теме клиента.

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

Разделены источник коллекции, значение метки, представление, картинка и выделение.

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

  1. Индекс 0 используется только после проверки количества для получения известной собственной строки; в метод выделения передаётся её идентификатор.

  2. Пути множественных значений доступны на сервере; не присваивайте их в клиентской команде.

  3. Не присваивайте значения свойствам размера и фигуры картинки: для этих свойств документировано только чтение.

  4. Установка шрифта не подтверждает, что он будет применён в интерфейсе 8.5 или любой теме.

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

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

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

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

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