Как вывести область макета с картинками в табличный документ на форме 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в 1С:Предприятие 8 часто возникает задача создания интерактивных карт, графических схем или сложных отчетов, которые должны отображаться непосредственно на форме. Одной из распространенных проблем является вывод области макета, содержащей графические объекты (рисунки), в реквизит формы типа ТабличныйДокумент. Зачастую разработчики сталкиваются с тем, что документ открывается в новом окне или область вовсе не отображается. В данной статье мы разберем, как правильно организовать этот процесс, обеспечив корректный вывод данных и графики.

Разбор типичных ошибок и постановка задачи

Рассмотрим ситуацию: на форме обработки или документа размещен реквизит Реквизит1 с типом ТабличныйДокумент. В макете создана область, в которой расположены различные графические элементы — например, схема расположения складов или карта. Нам необходимо, чтобы при выполнении определенной команды эта область «перекочевала» из макета в реквизит на форме.

Проанализируем основные ошибки, которые совершают разработчики на начальном этапе:

  1. Использование метода Показать(). Этот метод предназначен для открытия табличного документа в отдельном новом окне. Если ваша цель — отобразить данные внутри формы, этот метод использовать не нужно.
  2. Неправильное распределение кода между клиентом и сервером. Получение макета и формирование документа — это серверные операции, тогда как визуальное обновление формы происходит на клиенте.
  3. Проблемы с границами области. Если картинки в макете выходят за границы именованной области, они могут просто не попасть в итоговый документ при вызове метода ПолучитьОбласть().

Шаг 1. Подготовка макета и графических объектов

Прежде чем писать код, проанализируем структуру макета. Для того чтобы графические объекты (рисунки, диаграммы) корректно выводились вместе с областью, необходимо соблюдать следующие правила:

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

Именование области. В редакторе макета выделите нужные строки и колонки, затем через меню «Таблица — Имена — Назначить имя» задайте имя, например, ИнтерактивнаяКарта. Помните, что при написании кода 1С не всегда предлагает подсказку для имен областей, поэтому их нужно вводить вручную, соблюдая регистр.

Шаг 2. Формирование табличного документа на сервере

Работа с объектами метаданных, такими как макеты, возможна только на стороне сервера. Выясним, как правильно подготовить документ к передаче на клиент. Мы создадим функцию, которая будет собирать «сырые» данные из макета в объект ТабличныйДокумент.

Рассмотрим пример кода:


&НаСервере
Функция СформироватьКартуНаСервере()
    
    // Создаем новый экземпляр табличного документа
    ТабДок = Новый ТабличныйДокумент;
    
    // Получаем макет из метаданных (например, из обработки)
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетИнтерактивнойКарты");
    
    // Извлекаем нужную область по имени
    Область = Макет.ПолучитьОбласть("ИнтерактивнаяКарта");
    
    // Если в области есть параметры, заполняем их
    // Область.Параметры.Пункт1 = "Склад №1";
    
    // Выводим область в наш документ
    ТабДок.Вывести(Область);
    
    // Устанавливаем защиту, чтобы пользователь не мог случайно изменить карту
    ТабДок.ТолькоПросмотр = Истина;
    
    // Возвращаем сформированный объект на клиент
    Возврат ТабДок;
    
КонецФункции

В этом блоке кода мы используем метод Вывести(). Обратите внимание, что если вам нужно вывести несколько областей одну за другой, вы просто вызываете этот метод последовательно. Также важно установить свойство ТолькоПросмотр, так как это критично для работы механизмов расшифровки и интерактивности.

Шаг 3. Отображение сформированного документа на форме

Теперь разберем, как передать полученный результат в реквизит формы. На клиенте мы вызываем нашу серверную функцию и просто присваиваем результат реквизиту формы. Это самый эффективный способ обновления данных без открытия лишних окон.


&НаКлиенте
Процедура КомандаПоказатьКарту(Команда)
    
    // Очищаем реквизит перед заполнением, если это необходимо
    // Объект.Реквизит1.Очистить(); 
    
    // Получаем полностью сформированный документ с сервера
    РезультатФормирования = СформироватьКартуНаСервере();
    
    // Присваиваем результат реквизиту формы
    // Важно: Реквизит1 должен иметь тип "ТабличныйДокумент"
    Объект.Реквизит1 = РезультатФормирования;
    
КонецПроцедуры

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

Особенности работы с рисунками и Z-порядком

Проанализируем ситуацию, когда область выводится, но картинки в ней накладываются друг на друга некорректно или пропадают. В 1С рисунки в табличном документе имеют свойство Z-порядка. Если у вас есть фоновая картинка (например, подложка карты) и мелкие значки поверх неё, убедитесь в конфигураторе, что значки находятся на «переднем плане» (контекстное меню рисунка — Порядок — На передний план).

Также стоит учесть метод Рисунки у объекта ТабличныйДокумент. Если вам нужно программно добавить картинку, которой нет в макете, вы можете сделать это следующим образом:


КартинкаОбъект = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
КартинкаОбъект.Картинка = БиблиотекаКартинок.ВашаКартинка;
КартинкаОбъект.Расположить(Область.Область(1, 1, 5, 5)); // Указываем координаты ячеек

Интерактивность: обработка нажатий на карту

Поскольку мы обсуждаем «интерактивную карту», важно понимать, как сделать так, чтобы при нажатии на определенный пункт карты открывалась форма или выполнялось действие. Для этого используется механизм Расшифровки.

Пошаговый алгоритм настройки интерактивности:

  1. В макете выделите ячейку или рисунок.
  2. В палитре свойств найдите поле «Параметр расшифровки» и впишите туда имя переменной (например, ИдентификаторОбъекта).
  3. При формировании области на сервере заполните этот параметр: Область.Параметры.ИдентификаторОбъекта = "СкладЦентральный";.
  4. На форме для элемента управления «Табличный документ» создайте событие ОбработкаРасшифровки.

Рассмотрим пример обработчика расшифровки:


&НаКлиенте
Процедура Реквизит1ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    // Отменяем стандартное действие (открытие значения)
    СтандартнаяОбработка = Ложь;
    
    // Проверяем, что именно пришло в параметре расшифровки
    Если Расшифровка = "СкладЦентральный" Тогда
        // Выполняем нужное действие, например, открываем форму
        ОткрытьФорму("Справочник.Склады.ФормаОбъекта", Новый Структура("Ключ", СсылкаНаСклад));
    КонецЕсли;
    
КонецПроцедуры

Заключение

Мы подробно разобрали процесс вывода областей макета с графикой в табличный документ на форме. Ключ к успеху кроется в правильном разделении логики: на сервере мы формируем документ через ПолучитьОбласть() и Вывести(), а на клиенте просто обновляем реквизит формы. Не забывайте про свойства рисунков в макете и режим «Только просмотр», который необходим для работы интерактивных функций. Следуя этим инструкциям, вы сможете создавать удобные и наглядные графические интерфейсы внутри ваших решений на платформе 1С.

← На главную