К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как из двоичных данных получить картинку

Как в 1С получить картинку из двоичных данных: методы ПолучитьДвоичныеДанныеИзСтроки, Новый Картинка, вывод на форму и в табличный документ, типичные ошибки.

Во многих конфигурациях 1С изображения хранятся не как файлы, а как двоичные данные — в реквизитах типа «ХранилищеЗначения», в регистрах сведений или приходят извне через веб-сервисы в формате Base64. Чтобы показать такую картинку пользователю или вставить её в печатную форму, нужно правильно преобразовать двоичные данные в объект типа «Картинка».

Платформа 1С:Предприятие предоставляет для этого встроенные средства: конструктор Новый Картинка(), методы работы с двоичными данными и Base64, а также временное хранилище для передачи изображения на форму. Набор действий зависит от того, где лежат данные — в базе, в файле или в строке Base64.

Ниже разобраны основные сценарии: получение картинки из хранилища значений, из строки Base64, вывод на управляемую форму, вставка в табличный документ и типичные ошибки, из-за которых картинка не отображается.

Где в 1С хранятся картинки в виде двоичных данных

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

Первый — реквизит объекта с типом «ХранилищеЗначения», в который двоичные данные помещены через Новый ХранилищеЗначения(ДвоичныеДанные). Так хранятся, например, фотографии товаров и сотрудников в типовых конфигурациях. Второй — реквизит или ресурс регистра сведений с типом «ДвоичныеДанные» напрямую, без обёртки хранилища. Третий — файл на диске или во временном хранилище, из которого данные читаются через Новый ДвоичныеДанные(ИмяФайла). Четвёртый — строка Base64, полученная из HTTP-сервиса, JSON или XML при обмене с внешними системами.

Тип значения легко проверить в отладчике или через функцию ТипЗнч(): для хранилища это будет «ХранилищеЗначения», для готовых данных — «ДвоичныеДанные», для закодированной строки — «Строка».

Базовый способ: конструктор Новый Картинка

Основной инструмент преобразования — конструктор объекта «Картинка», который принимает двоичные данные первым параметром:

ДвоичныеДанные = ХранилищеКартинки.Получить(); // если реквизит типа ХранилищеЗначения

Картинка = Новый Картинка(ДвоичныеДанные);

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

Полученный объект «Картинка» можно вставить в табличный документ, сохранить в файл методом Записать(ИмяФайла) или преобразовать обратно в двоичные данные методом ПолучитьДвоичныеДанные(). Напрямую присвоить его реквизиту управляемой формы нельзя — для отображения на форме используется временное хранилище, о чём ниже.

Картинка из строки Base64

При обмене через HTTP, JSON или XML изображения почти всегда передаются в кодировке Base64. Платформа умеет преобразовывать такую строку в двоичные данные функцией Base64Значение():

ДвоичныеДанные = Base64Значение(СтрокаBase64);

Картинка = Новый Картинка(ДвоичныеДанные);

Обратное преобразование выполняется функцией Base64Строка(ДвоичныеДанные) — она нужна, когда картинку из базы требуется отдать наружу через сервис. Учтите, что в некоторых источниках строка Base64 содержит префикс вида data:image/png;base64, — его нужно отрезать до двоеточия и запятой, иначе преобразование даст повреждённые данные.

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

Вывод картинки на управляемую форму

Объект «Картинка» нельзя напрямую показать в элементе управляемой формы. Стандартный приём — поместить двоичные данные во временное хранилище и отобразить их через реквизит формы типа «Строка», содержащий адрес хранилища.

Порядок вывода картинки на форму
  1. 1
    Добавьте реквизит формы типа Строка, например АдресКартинки
  2. 2
    Перетащите реквизит на форму и установите вид поля — Поле картинки
  3. 3
    Получите двоичные данные из хранилища значений или Base64
  4. 4
    Вызовите ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор)
  5. 5
    Присвойте полученный адрес реквизиту АдресКартинки
  6. 6
    Проверьте отображение при открытии формы

Типовой код в серверной процедуре формы выглядит так:

&НаСервере

Процедура ЗагрузитьКартинкуНаСервере()

ДвоичныеДанные = Объект.ХранилищеКартинки.Получить();

Если ДвоичныеДанные = Неопределено Тогда

АдресКартинки = "";

Возврат;

КонецЕсли;

АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);

КонецПроцедуры

Передача УникальныйИдентификатор формы вторым параметром привязывает хранилище к времени жизни формы — адрес останется валидным, пока форма открыта. Без этого параметра данные удалятся после окончания серверного вызова, и картинка не отобразится.

Вставка картинки в табличный документ и печатную форму

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

Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);

Рисунок.Верх = 5; Рисунок.Лево = 5;

Рисунок.Высота = 20; Рисунок.Ширина = 30;

Размеры задаются в миллиметрах. Если картинка не помещается в выделенную область, она обрезается, поэтому для фотографий разного формата полезно заранее вычислять пропорции или задавать область с запасом. Альтернатива — заранее подготовить в макете область с рисунком-заполнителем и подменять его содержимое при формировании.

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

Проверка результата и частые ошибки

После преобразования убедитесь, что картинка действительно получилась. У объекта «Картинка» есть методы Ширина() и Высота() — если они возвращают осмысленные значения, данные корректны. Пустая картинка или исключение при создании означают проблему с исходными данными.

Типичные ошибки
01
Передача в конструктор ХранилищеЗначения вместо результата Получить() — возникает ошибка несоответствия типов
02
Обрезанная или испорченная строка Base64 — конструктор создаёт пустую картинку без сообщения об ошибке
03
Помещение во временное хранилище без УникальныйИдентификатор формы — адрес устаревает, и картинка пропадает
04
Получение данных на клиенте из реквизита, доступного только на сервере — ошибка контекста
05
Попытка открыть как картинку данные другого формата (PDF, архив) — исключение при создании объекта

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

Контрольные точки

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

Создание объекта Картинка
Норма

Конструктор отработал, Ширина() и Высота() больше нуля

Тревожный признак

Исключение или нулевые размеры — данные повреждены

Отображение на форме
Норма

Картинка видна сразу после открытия и после перезаписи объекта

Тревожный признак

Пустое поле или картинка пропадает после обновления

Печатная форма
Норма

Изображение в предпросмотре не искажено и не обрезано

Тревожный признак

Рисунок растянут, обрезан или отсутствует

Альтернативные подходы и ограничения

Не всегда нужно создавать объект «Картинка». Если цель — просто отдать изображение пользователю, достаточно записать двоичные данные в файл методом Записать(ИмяФайла) и открыть его штатными средствами ОС. А если картинка хранится в стандартном реквизите «Картинка» справочника (как у файлов в БСП), платформа покажет её без дополнительного кода.

При обмене с веб-сервисами иногда удобнее вообще не материализовать картинку на стороне 1С, а передавать Base64-строку дальше по цепочке. Это экономит память сервера при больших объёмах. Учитывайте также, что размер двоичных данных в базе влияет на скорость выборок — крупные изображения рекомендуется хранить в отдельном регистре сведений или в томах файлов, а не в основной таблице объекта.

Итог

Что важно запомнить

Преобразование двоичных данных в картинку выполняется конструктором Новый Картинка(ДвоичныеДанные). Из ХранилищеЗначения данные извлекают методом Получить(), из Base64 — функцией Base64Значение(). Для формы используют временное хранилище с привязкой к УникальныйИдентификатор, для печати — коллекцию Рисунки табличного документа. Всегда проверяйте, что данные не Неопределено и действительно содержат изображение.

Частые вопросы

Почему Новый Картинка() создаёт пустую картинку без ошибки?

Чаще всего причина — повреждённые или неполные данные: обрезанная строка Base64, незавершённая загрузка файла или данные другого формата. Проверьте размер двоичных данных и попробуйте записать их в файл и открыть в графическом редакторе — так видно, целый ли это файл изображения.

Как узнать формат картинки в двоичных данных?

Надёжного встроенного метода нет, но формат можно определить по первым байтам файла (сигнатуре): JPEG начинается с FF D8, PNG — с 89 50 4E 47. На практике проще хранить формат отдельным реквизитом при загрузке изображения в базу.

Можно ли показать картинку на форме без временного хранилища?

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

Как получить картинку из двоичных данных в обычных формах?

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

Что делать, если при обмене приходит слишком большая строка Base64?

Обрабатывайте данные на сервере и по возможности потоково, избегая лишних копий строки в памяти. Если объёмы регулярно велики, рассмотрите передачу файла через HTTP multipart или промежуточное файловое хранилище вместо встраивания изображения в тело JSON.

Можно ли изменить размер картинки средствами 1С?

Встроенных функций масштабирования у объекта «Картинка» нет. Варианты: задать нужные размеры при выводе в табличный документ, использовать внешние компоненты или обрабатывать изображение на стороне сервиса, который отдаёт данные.