Разработка и Конфигурация · 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Добавьте реквизит формы типа Строка, например АдресКартинки
- 2Перетащите реквизит на форму и установите вид поля — Поле картинки
- 3Получите двоичные данные из хранилища значений или Base64
- 4Вызовите ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор)
- 5Присвойте полученный адрес реквизиту АдресКартинки
- 6Проверьте отображение при открытии формы
Типовой код в серверной процедуре формы выглядит так:
&НаСервере
Процедура ЗагрузитьКартинкуНаСервере()
ДвоичныеДанные = Объект.ХранилищеКартинки.Получить();
Если ДвоичныеДанные = Неопределено Тогда
АдресКартинки = "";
Возврат;
КонецЕсли;
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецПроцедуры
Передача УникальныйИдентификатор формы вторым параметром привязывает хранилище к времени жизни формы — адрес останется валидным, пока форма открыта. Без этого параметра данные удалятся после окончания серверного вызова, и картинка не отобразится.
Вставка картинки в табличный документ и печатную форму
Для печатных форм преобразование в объект «Картинка» обязательно: табличный документ принимает именно его. Изображение добавляется через коллекцию рисунков:
Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);
Рисунок.Верх = 5; Рисунок.Лево = 5;
Рисунок.Высота = 20; Рисунок.Ширина = 30;
Размеры задаются в миллиметрах. Если картинка не помещается в выделенную область, она обрезается, поэтому для фотографий разного формата полезно заранее вычислять пропорции или задавать область с запасом. Альтернатива — заранее подготовить в макете область с рисунком-заполнителем и подменять его содержимое при формировании.
Для вывода логотипа в шапку типовой печатной формы часто достаточно существующих механизмов конфигурации (например, логотип организации из её карточки) — проверьте, не дублируете ли вы готовый функционал.
Проверка результата и частые ошибки
После преобразования убедитесь, что картинка действительно получилась. У объекта «Картинка» есть методы Ширина() и Высота() — если они возвращают осмысленные значения, данные корректны. Пустая картинка или исключение при создании означают проблему с исходными данными.
Отдельная группа проблем — производительность. Если картинок много (например, вывод фотографий в списке товаров), загрузка всех двоичных данных в цикле заметно замедляет форму. В таких случаях используют ленивую загрузку по требованию или хранят уменьшенные превью отдельно от полноразмерных изображений.
Как проверить результат
Конструктор отработал, Ширина() и Высота() больше нуля
Исключение или нулевые размеры — данные повреждены
Картинка видна сразу после открытия и после перезаписи объекта
Пустое поле или картинка пропадает после обновления
Изображение в предпросмотре не искажено и не обрезано
Рисунок растянут, обрезан или отсутствует
Альтернативные подходы и ограничения
Не всегда нужно создавать объект «Картинка». Если цель — просто отдать изображение пользователю, достаточно записать двоичные данные в файл методом Записать(ИмяФайла) и открыть его штатными средствами ОС. А если картинка хранится в стандартном реквизите «Картинка» справочника (как у файлов в БСП), платформа покажет её без дополнительного кода.
При обмене с веб-сервисами иногда удобнее вообще не материализовать картинку на стороне 1С, а передавать Base64-строку дальше по цепочке. Это экономит память сервера при больших объёмах. Учитывайте также, что размер двоичных данных в базе влияет на скорость выборок — крупные изображения рекомендуется хранить в отдельном регистре сведений или в томах файлов, а не в основной таблице объекта.
Что важно запомнить
Преобразование двоичных данных в картинку выполняется конструктором Новый Картинка(ДвоичныеДанные). Из ХранилищеЗначения данные извлекают методом Получить(), из Base64 — функцией Base64Значение(). Для формы используют временное хранилище с привязкой к УникальныйИдентификатор, для печати — коллекцию Рисунки табличного документа. Всегда проверяйте, что данные не Неопределено и действительно содержат изображение.
Частые вопросы
Почему Новый Картинка() создаёт пустую картинку без ошибки?
Чаще всего причина — повреждённые или неполные данные: обрезанная строка Base64, незавершённая загрузка файла или данные другого формата. Проверьте размер двоичных данных и попробуйте записать их в файл и открыть в графическом редакторе — так видно, целый ли это файл изображения.
Как узнать формат картинки в двоичных данных?
Надёжного встроенного метода нет, но формат можно определить по первым байтам файла (сигнатуре): JPEG начинается с FF D8, PNG — с 89 50 4E 47. На практике проще хранить формат отдельным реквизитом при загрузке изображения в базу.
Можно ли показать картинку на форме без временного хранилища?
Для динамических данных — практически нет, адрес временного хранилища является штатным механизмом. Исключение: если картинка хранится в реквизите объекта, который платформа умеет показывать сама (например, в присоединённых файлах БСП), форма отобразит её стандартными средствами.
Как получить картинку из двоичных данных в обычных формах?
В обычном приложении всё проще: элемент формы «Поле картинки» имеет свойство «Картинка», которому можно напрямую присвоить объект, созданный через Новый Картинка(ДвоичныеДанные), без временного хранилища.
Что делать, если при обмене приходит слишком большая строка Base64?
Обрабатывайте данные на сервере и по возможности потоково, избегая лишних копий строки в памяти. Если объёмы регулярно велики, рассмотрите передачу файла через HTTP multipart или промежуточное файловое хранилище вместо встраивания изображения в тело JSON.
Можно ли изменить размер картинки средствами 1С?
Встроенных функций масштабирования у объекта «Картинка» нет. Варианты: задать нужные размеры при выводе в табличный документ, использовать внешние компоненты или обрабатывать изображение на стороне сервиса, который отдаёт данные.