Как вывести картинку из БиблиотекиКартинок в шапку внешнего отчета на управляемых формах 1С 8.3?

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

При разработке внешних отчетов в системе 1С:Предприятие 8.3, особенно на управляемых формах, часто возникает необходимость добавить графические элементы, например, логотип компании, в шапку или подвал отчета. Мы сталкиваемся с задачей программного размещения и заполнения этих изображений. Нередко разработчики сталкиваются с тем, что, несмотря на, казалось бы, правильный код, картинка не выводится, а вместо нее остается пустое место. В этом материале мы подробно разберем, как корректно вставлять и отображать изображения из БиблиотекиКартинок в табличные документы 1С, рассмотрим распространенные ошибки и предложим эффективные решения.

Понимание работы с изображениями в табличных документах 1С

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

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

В 1С существует два основных подхода к размещению рисунков в макетах:

  1. Предварительное размещение элемента "Рисунок" в макете: Мы заранее создаем элемент управления "Рисунок" в нужной области макета, даем ему имя и затем программно заполняем его свойство Картинка. Этот подход наиболее часто используется для фиксированных элементов, таких как логотипы в шапках или подвалах.
  2. Динамическое создание рисунка программно: Мы не создаем элемент "Рисунок" в макете заранее, а полностью формируем его программно, указывая все его геометрические параметры (положение, размер). Этот метод удобен, когда количество и расположение изображений может меняться в зависимости от данных отчета.

Давайте выясним, почему в первоначальном подходе, когда мы пытались использовать область.Рисунки.Вставить("Картинка1") без предварительного создания элемента, картинка не отображалась.

Распространенные ошибки при выводе изображений

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

Кроме того, распространенные ошибки включают:

  1. Неправильное имя картинки: Убедитесь, что имя, по которому вы обращаетесь к изображению в БиблиотекеКартинок.Получить("ИмяКартинки"), точно совпадает с именем картинки в библиотеке. Регистр символов может иметь значение. Всегда полезно проверить, возвращает ли Получить() что-либо, кроме Неопределено.
  2. Отсутствие вывода области: После заполнения всех параметров области макета, необходимо вызвать метод ТабличныйДокумент.Вывести(область), чтобы эта область была фактически добавлена в табличный документ.
  3. Контекст выполнения: БиблиотекаКартинок доступна как на клиенте, так и на сервере. Однако, если вы выполняете код на клиенте, а картинка большая, это может повлиять на производительность. Для получения и передачи картинки в табличный документ, который потом выводится на клиенте, обычно нет проблем с контекстом.

Решение 1: Заполнение существующего элемента "Рисунок" в макете

Этот подход является наиболее предпочтительным для фиксированных элементов, таких как логотипы в шапке отчета. Он предполагает, что вы заранее разместите элемент "Рисунок" в вашем макете, зададите ему имя и необходимые размеры. Затем программно будете обращаться к этому элементу по его имени.

Шаг 1: Подготовка макета

Прежде всего, откройте макет вашего отчета в конфигураторе:

  1. Создайте область в макете (например, назовите ее "Заголовок").
  2. Внутри этой области разместите элемент управления "Рисунок". Для этого выберите инструмент "Рисунок" на панели инструментов макета и нарисуйте его в нужной позиции и с нужными размерами.
  3. В свойствах созданного элемента "Рисунок" обязательно укажите его имя, например, "КартинкаЛоготип". Именно по этому имени мы будем к нему обращаться из кода.
  4. При необходимости, задайте начальные размеры и привязки элемента "Рисунок" в макете. Они будут использоваться по умолчанию, если вы не измените их программно.

Шаг 2: Программное заполнение рисунка

Теперь мы можем написать код, который будет получать область макета, находить в ней наш заранее созданный элемент "Рисунок" по имени и заполнять его свойство Картинка.

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

&НаСервере Функция СформироватьОтчетНаСервере() // Создаем табличный документ, куда будет выводиться отчет ТабличныйДокумент = Новый ТабличныйДокумент; // Получаем макет отчета Макет = ПолучитьМакет("МакетОтчета"); // "МакетОтчета" - имя макета в конфигурации // Получаем область макета, содержащую заголовок и рисунок ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок"); // Проверяем, существует ли картинка в БиблиотекеКартинок // Имя "ЛоготипПредприятия" должно точно соответствовать имени в БиблиотекеКартинок КартинкаИзБиблиотеки = БиблиотекаКартинок.Получить("ЛоготипПредприятия"); Если КартинкаИзБиблиотеки <> Неопределено Тогда // Обращаемся к элементу "Рисунок" в области макета по его имени "КартинкаЛоготип" // Это имя мы задали в свойствах элемента "Рисунок" в конфигураторе ОбластьЗаголовок.Рисунки.КартинкаЛоготип.Картинка = КартинкаИзБиблиотеки; // Дополнительно можно настроить режим отображения картинки ОбластьЗаголовок.Рисунки.КартинкаЛоготип.РазмерКартинки = РазмерКартинки.АвтоРазмер; // Возможные значения: // РазмерКартинки.АвтоРазмер - картинка будет отображена в исходном размере, // но не больше размеров элемента рисунка. // РазмерКартинки.Пропорционально - картинка будет пропорционально масштабирована по ширине/высоте // для заполнения элемента рисунка. // РазмерКартинки.ПоРазмеру - картинка будет масштабирована точно по размеру элемента рисунка. // РазмерКартинки.ПоВертикали - масштабирование по вертикали // РазмерКартинки.ПоГоризонтали - масштабирование по горизонтали // РазмерКартинки.Обрезать - картинка обрезается по размерам элемента рисунка. Иначе // Можно вывести сообщение об ошибке или оставить пустое место Сообщить("Картинка 'ЛоготипПредприятия' не найдена в БиблиотекеКартинок.", СтатусСообщения.Важное); КонецЕсли; // Выводим заполненную область в табличный документ ТабличныйДокумент.Вывести(ОбластьЗаголовок); Возврат ТабличныйДокумент; КонецФункции ```

В этом коде мы сначала получаем область макета, затем обращаемся к коллекции Рисунки этой области по имени элемента "КартинкаЛоготип", который мы заранее создали в макете. Только после этого мы присваиваем свойству Картинка нашего элемента нужную картинку из БиблиотекиКартинок. Этот подход обеспечивает правильное позиционирование и отображение изображения, так как его геометрия уже задана в макете.

Решение 2: Динамическое создание и размещение рисунка программно

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

Шаг 1: Подготовка макета (опционально)

Для этого подхода не требуется заранее создавать элемент "Рисунок" в макете. Вы можете иметь пустую область, в которую будете вставлять рисунки. Однако, если вам нужно, чтобы рисунок располагался относительно других элементов в области, вы можете использовать пустые ячейки или другие элементы для ориентира.

Шаг 2: Программное создание и размещение рисунка

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

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

&НаСервере Функция СформироватьОтчетНаСервереДинамически() ТабличныйДокумент = Новый ТабличныйДокумент; Макет = ПолучитьМакет("МакетОтчета"); ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("ДетальныеЗаписи"); // Предположим, у нас есть область для детальных записей // Получаем картинку из библиотеки КартинкаИзБиблиотеки = БиблиотекаКартинок.Получить("ЛоготипПредприятия"); Если КартинкаИзБиблиотеки <> Неопределено Тогда // Создаем новый рисунок в коллекции Рисунки области // Важно: в этом случае мы не указываем имя, если не планируем к нему обращаться позже // Также можно сразу указать ТипРисункаТабличногоДокумента.Картинка Рисунок = ОбластьДетальныхЗаписей.Рисунки.Вставить(ТипРисункаТабличногоДокумента.Картинка); // Устанавливаем его геометрию: положение и размеры // Координаты (Верх, Лево) отсчитываются от верхнего левого угла области макета. // Ширина и Высота указываются в миллиметрах. Рисунок.Верх = 2; // Отступ 2 мм сверху от начала области Рисунок.Лево = 2; // Отступ 2 мм слева от начала области Рисунок.Ширина = 40; // Ширина рисунка 40 мм Рисунок.Высота = 20; // Высота рисунка 20 мм // Присваиваем картинку Рисунок.Картинка = КартинкаИзБиблиотеки; // Настраиваем режим отображения картинки Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально; // Дополнительные свойства, которые могут быть полезны: // Рисунок.ГраницаСверху = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Тонкая); // Рисунок.ГраницаСнизу = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Тонкая); // Рисунок.ГраницаСлева = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Тонкая); // Рисунок.ГраницаСправа = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Тонкая); // Рисунок.Расположение = РасположениеКартинки.Растянуть; // Другие варианты: ВВерхнемЛевомУглу, ВВерхнемПравомУглу и т.д. Иначе Сообщить("Картинка не найдена в БиблиотекеКартинок."); КонецЕсли; // Выводим область ТабличныйДокумент.Вывести(ОбластьДетальныхЗаписей); Возврат ТабличныйДокумент; КонецФункции ```

В этом коде мы видим, что после создания объекта Рисунок через метод Вставить(), мы обязательно указываем его координаты Верх, Лево и размеры Ширина, Высота. Без этих свойств рисунок будет создан, но не будет иметь видимых размеров на печатной форме.

Важный нюанс: ТипРисункаТабличногоДокумента.Картинка является параметром метода Вставить(). Если его не указать, по умолчанию может быть создан рисунок другого типа, что тоже приведет к неверному отображению.

Особенности работы с БиблиотекойКартинок

БиблиотекаКартинок — это универсальный механизм для хранения изображений в конфигурации 1С. Доступ к картинкам из библиотеки осуществляется по их имени. Важно помнить, что имена картинок должны быть уникальными и точно соответствовать тем, что вы указываете в коде. Для управления картинками в библиотеке используется окно "Все картинки" в конфигураторе.

При получении картинки из БиблиотекиКартинок с помощью метода Получить() всегда проверяйте возвращаемое значение. Если картинка с указанным именем не найдена, метод вернет Неопределено, и попытка присвоить это значение свойству Картинка вызовет ошибку или приведет к отсутствию изображения.

Дополнительные возможности и советы

  1. Масштабирование изображений: Свойство РазмерКартинки объекта Рисунок играет ключевую роль в том, как изображение будет вписываться в отведенную ему область. Экспериментируйте с различными значениями (АвтоРазмер, Пропорционально, ПоРазмеру), чтобы добиться желаемого вида.
  2. Границы рисунка: Вы можете добавить рамки к вашему рисунку с помощью свойств ГраницаСверху, ГраницаСнизу, ГраницаСлева, ГраницаСправа, присваивая им объект Линия с нужным типом и цветом.
  3. Вставка картинки из внешнего файла: Если картинка не хранится в БиблиотекеКартинок, а находится во внешнем файле, вы можете загрузить ее в объект Картинка с помощью Новый Картинка("ПутьКФайлу") и затем использовать этот объект так же, как и картинку из библиотеки. Это актуально для загрузки изображений, которые пользователь выбирает самостоятельно.
  4. Оптимизация размера файлов изображений: Для повышения производительности и уменьшения размера печатных форм, особенно при большом количестве изображений, рекомендуется использовать оптимизированные изображения. Большие по размеру файлы изображений могут значительно замедлять формирование и вывод отчета.
  5. Тестирование: Всегда тщательно тестируйте вывод изображений, особенно на разных принтерах и с разными настройками масштабирования печати, чтобы убедиться, что они отображаются корректно.

Заключение

Мы подробно рассмотрели два основных способа вывода изображений в табличные документы 1С 8.3 на управляемых формах: заполнение заранее размещенного элемента "Рисунок" и динамическое создание рисунка. Ключевым моментом для успешного вывода является правильное управление коллекцией Рисунки области макета и, при динамическом создании, обязательное указание геометрических параметров рисунка. Надеемся, что это руководство поможет вам избежать распространенных ошибок и эффективно использовать графические элементы в ваших отчетах 1С.