Как правильно вывести изображение в макет табличного документа 1С: Предприятие?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Торговля и дистрибуция
← К списку

При работе с отчетами, печатными формами или другими табличными документами в 1С:Предприятие часто возникает необходимость вывести изображения. Это могут быть логотипы компании, фотографии товаров, подписи и печати, штрих-коды и многое другое. В этой статье мы с вами подробно разберем, как эффективно решать эту задачу, используя различные подходы и методы.

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

Получение двоичных данных изображения

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

  1. Использование функции РаботаСФайлами.ДвоичныеДанныеФайла() (БСП)

    Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), то наиболее удобным способом является функция РаботаСФайлами.ДвоичныеДанныеФайла(). Она позволяет получить двоичные данные файла по его ссылке или пути.

    Посмотрим на пример из обсуждения на форуме:

    
    ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаФайл);
    

    Или с дополнительным параметром:

    
    ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(Файл, Ложь);
    

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

  2. Из реквизита типа "ХранилищеЗначения"

    Часто изображения хранятся непосредственно в базе данных в реквизитах типа ХранилищеЗначения. В этом случае получить двоичные данные очень просто:

    
    // Предположим, что КартинкаВХранилище - это реквизит типа ХранилищеЗначения
    ДвоичныеДанные = КартинкаВХранилище.Получить();
    
  3. Из файла на диске

    Если изображение находится на диске, вы можете создать объект Картинка напрямую, указав путь к файлу:

    
    КартинкаИзФайла = Новый Картинка("C:\Путь\К\ВашейКартинке.jpg");
    

    Однако, если вам нужны именно двоичные данные, можно использовать объект ДвоичныеДанные:

    
    ДвоичныеДанные = Новый ДвоичныеДанные("C:\Путь\К\ВашейКартинке.jpg");
    
  4. Из HTTP-ответа

    При взаимодействии с внешними веб-сервисами или API, изображение может приходить в теле HTTP-ответа. В таком случае мы можем получить двоичные данные следующим образом:

    
    // Предположим, что ОтветСервера - это объект HTTPОтвет
    ДвоичныеДанные = ОтветСервера.ПолучитьТелоКакДвоичныеДанные();
    

Пример функции для получения изображения товара

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


Функция ПолучитьИзображение (товар)

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    НоменклатураПрисоединенныеФайлы.ФайлХранилище КАК ФайлХранилище,
        |    НоменклатураПрисоединенныеФайлы.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
        |ГДЕ
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайла
        |    И НЕ НоменклатураПрисоединенныеФайлы.ПометкаУдаления";

    Запрос.УстановитьПараметр("ВладелецФайла", товар);

    РезультатЗапроса = Запрос.Выполнить();

    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();

        // Получаем двоичные данные файла через БСП
        ДвоичныеДанныеКартинки = РаботаСФайлами.ДвоичныеДанныеФайла(Выборка.Ссылка, Ложь);
        // Создаем объект Картинка из двоичных данных
        КартинкаНоменклатуры = Новый Картинка(ДвоичныеДанныеКартинки);
    Иначе
        // Если картинка не найдена, возвращаем пустой объект Картинка
        КартинкаНоменклатуры = Новый Картинка(); 
    КонецЕсли;

    Возврат  КартинкаНоменклатуры;

КонецФункции

Разберем эту функцию по шагам:

  1. Запрос к Справочник.НоменклатураПрисоединенныеФайлы: Мы формируем запрос к стандартному справочнику, который хранит присоединенные файлы для объектов конфигурации (в данном случае, для номенклатуры). Ищем первый попавшийся файл, который не помечен на удаление и владелец которого соответствует переданному товару.

  2. Установка параметра: Устанавливаем параметр &ВладелецФайла, передавая в него ссылку на объект Номенклатура.

  3. Выполнение запроса и проверка результата: Выполняем запрос и проверяем, найдены ли какие-либо присоединенные файлы. Если нет, функция вернет пустой объект Картинка.

  4. Получение двоичных данных: Если файл найден, мы получаем его двоичные данные, используя функцию РаботаСФайлами.ДвоичныеДанныеФайла(). Обратите внимание, что в выборке запроса мы получаем Выборка.Ссылка, которая является ссылкой на элемент справочника НоменклатураПрисоединенныеФайлы, а не на сам файл на диске.

  5. Создание объекта Картинка: Из полученных двоичных данных создаем новый объект Картинка. Это ключевой шаг, поскольку именно этот объект мы будем выводить в макет.

Способы вывода картинки в макет табличного документа

Теперь, когда у нас есть объект Картинка, давайте рассмотрим два основных способа вывода его в табличный документ.

1. Вручную в макете с последующей программной заменой

Этот способ удобен, когда расположение и размер картинки в макете фиксированы и заранее известны. Мы с вами определим место для картинки прямо в конфигураторе, а затем программно заполним его.

  1. Подготовка макета в конфигураторе:

    • Откройте нужный макет табличного документа в конфигураторе.
    • Вставьте в нужную область макета элемент "Рисунок" (через меню "Таблица" -> "Рисунки" -> "Картинка" или соответствующую кнопку на панели инструментов).
    • Присвойте этому элементу имя, например, РисунокЛоготип. Это имя мы будем использовать для программного доступа.
    • При необходимости настройте его размеры и положение.
  2. Программное заполнение элемента "Картинка":

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

    
    // Предположим, что Макет - это объект МакетТабличногоДокумента
    // и у нас есть ОбъектКартинка, полученный ранее
            
    ОбластьМакета = Макет.ПолучитьОбласть("ОбластьСКартинкой");
            
    // Обращаемся к рисунку по его имени, заданному в конфигураторе
    Если ОбластьМакета.Рисунки.Найти("РисунокЛоготип") <> Неопределено Тогда
        ОбластьМакета.Рисунки.РисунокЛоготип.Картинка = ОбъектКартинка;
        // Дополнительно можно настроить размер картинки внутри элемента
        ОбластьМакета.Рисунки.РисунокЛоготип.РазмерКартинки = ТипРазмераКартинки.АвтоРазмер; 
    КонецЕсли;
            
    ТабличныйДокумент.Вывести(ОбластьМакета);
    

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

2. Программное добавление картинки в область макета

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

  1. Получение области макета: Сначала получаем область, в которую хотим добавить картинку.

    
    ОбластьМакета = Макет.ПолучитьОбласть("ОбластьДляДинамическойКартинки");
    
  2. Создание нового объекта Рисунок: Создаем новый элемент рисунка с типом Картинка.

    
    НовыйРисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
    
  3. Установка свойств рисунка: Присваиваем свойства новому рисунку, включая само изображение и его позиционирование.

    
    НовыйРисунок.Картинка = ОбъектКартинка; // Наш объект Картинка
            
    // Позиционирование и размеры (можно настроить по необходимости)
    НовыйРисунок.Лево   = 1; // Координата X от левого края области
    НовыйРисунок.Верх   = 1; // Координата Y от верхнего края области
    НовыйРисунок.Ширина = 100; // Ширина в пикселях или единицах макета
    НовыйРисунок.Высота = 50;  // Высота в пикселях или единицах макета
            
    // Настройка масштабирования
    НовыйРисунок.РазмерКартинки = ТипРазмераКартинки.АвтоРазмер; 
            
    // Другие полезные свойства
    НовыйРисунок.Имя = "ДинамическаяКартинка"; // Можно задать имя для последующего доступа
    // НовыйРисунок.ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
    

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

  4. Вывод области:

    
    ТабличныйДокумент.Вывести(ОбластьМакета);
    

Важные свойства объекта Картинка и элемента Рисунок

При работе с изображениями в 1С мы часто сталкиваемся с настройкой их отображения. Давайте рассмотрим ключевые свойства, которые помогают нам в этом.

Свойства элемента Рисунок в табличном документе:

Особенности объекта Картинка:

Общие рекомендации и нюансы

  1. Хранение картинок: Для хранения изображений в базе данных 1С наиболее предпочтительным является тип ХранилищеЗначения. Это позволяет эффективно управлять данными и не нагружать файловую систему.

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

  3. Наличие БСП: Еще раз подчеркнем, что модуль РаботаСФайлами является частью Библиотеки Стандартных Подсистем. Если ваша конфигурация не включает БСП, вам потребуется реализовать функции получения двоичных данных файлов самостоятельно или использовать другие методы, например, создание объекта ДвоичныеДанные напрямую из пути к файлу.

  4. Отображение на форме: Если вам нужно не только вывести картинку в макет, но и отобразить ее на управляемой форме, вы можете поместить двоичные данные во временное хранилище, а затем адрес из этого хранилища присвоить строковому реквизиту формы, который связан с элементом управления "ПолеКартинки".

Мы с вами рассмотрели основные подходы к выводу изображений в макеты табличных документов 1С. Надеемся, что эта подробная инструкция поможет вам успешно решать подобные задачи в вашей работе!

← К списку