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

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

Как сохранить картинку в файл в 1С

Как сохранить картинку из 1С в файл: методы Записать(), ПолучитьДвоичныеДанные, работа с картинками из хранилища значений и макетов. Примеры кода на встроенном языке.

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

Основной инструмент — объект типа Картинка с методом Записать(), а также работа с двоичными данными через ДвоичныеДанные и ПолучитьДвоичныеДанныеИзBase64Строки. Ниже разобраны все типовые сценарии: от картинки в реквизите справочника до изображения, лежащего в макете конфигурации.

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

Откуда может браться картинка в 1С

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

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

Сохранение картинки из хранилища значений

Самый частый сценарий — выгрузить изображение, прикреплённое к элементу справочника или документу. Реквизит с картинкой обычно имеет тип ХранилищеЗначения, и данные извлекаются методом Получить().

Типовой код выглядит так:

ДанныеКартинки = СсылкаНаОбъект.ФайлКартинки.Получить();

Если ДанныеКартинки = Неопределено Тогда

Сообщить("Картинка не заполнена");

Возврат;

КонецЕсли;

Если ТипЗнч(ДанныеКартинки) = Тип("Картинка") Тогда

ДанныеКартинки.Записать("C:\Temp\photo.jpg");

Иначе

// это двоичные данные

ДанныеКартинки.Записать("C:\Temp\photo.jpg");

КонецЕсли;

Обратите внимание на проверку типа. В разных конфигурациях в хранилище кладут разное: где-то объект Картинка, где-то ДвоичныеДанные. У обоих типов есть метод Записать(), поэтому код выглядит почти одинаково, но без проверки на Неопределено вы получите ошибку «Метод объекта не обнаружен» на пустых элементах.

Выгрузка картинок из присоединённых файлов (БСП)

В конфигурациях на Библиотеке стандартных подсистем (УТ 11, ERP, БП 3.0) фотографии товаров хранятся не в самом справочнике, а в подчинённом справочнике присоединённых файлов. Там работает готовый программный интерфейс:

МассивФайлов = Новый Массив;

РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(СсылкаНаТовар, МассивФайлов);

Для Каждого Файл Из МассивФайлов Цикл

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

ДвоичныеДанные.Записать("C:\Temp\" + Файл.Наименование + "." + Файл.Расширение);

КонецЦикла;

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

Метод Записать() объекта Картинка и выбор формата

Если картинка загружена из файла или создана программно, её сохраняют методом Записать(). Метод имеет два варианта вызова: с одним параметром — именем файла, и с двумя — именем файла и форматом.

Картинка = Новый Картинка("C:\Исходники\logo.bmp");

// формат определится по расширению файла

Картинка.Записать("C:\Temp\logo.png");

// формат задан явно

Картинка.Записать("C:\Temp\logo.dat", ФорматКартинки.PNG);

Поддерживаемые форматы перечислены в системном перечислении ФорматКартинки: PNG, JPEG, GIF, BMP, TIFF, Icon и некоторые другие — состав зависит от версии платформы. Практическая рекомендация: для фотографий используйте JPEG (меньше размер), для логотипов и изображений с прозрачностью — PNG.

Порядок действий
  1. 1
    Определите, где хранится изображение: хранилище значений, присоединённый файл, макет или внешний источник
  2. 2
    Получите объект Картинка или ДвоичныеДанные соответствующим методом
  3. 3
    Проверьте, что результат не равен Неопределено
  4. 4
    Вызовите Записать() с полным путём к файлу, указав нужное расширение
  5. 5
    Откройте созданный файл и убедитесь, что изображение отображается корректно

Преобразование размера перед сохранением

Часто перед выгрузкой на сайт требуется уменьшить фотографию. У объекта Картинка есть метод Преобразовать() с параметрами ширины и высоты:

Картинка.Преобразовать(800, 600);

Картинка.Записать("C:\Temp\photo_small.jpg");

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

Сохранение картинки из макета и из Base64-строки

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

Картинка = ПолучитьОбщийМакет("ЛоготипКомпании");

Картинка.Записать("C:\Temp\logo.png");

С изображениями, пришедшими извне в виде Base64 (типично для REST API и веб-сервисов), работают через двоичные данные:

ДвоичныеДанные = ПолучитьДвоичныеДанныеИзBase64Строки(СтрокаBase64);

ДвоичныеДанные.Записать("C:\Temp\image.jpg");

Если Base64-строка содержит префикс вида data:image/jpeg;base64,, его нужно предварительно отрезать — функция ПолучитьДвоичныеДанныеИзBase64Строки такой префикс не обрабатывает и вернёт ошибку или повреждённые данные.

Перед записью Base64-данных полезно проверить первые символы строки на наличие префикса data:image. Найдите позицию запятой через СтрНайти() и возьмите подстроку после неё — это убережёт от битых файлов при интеграции с внешними сервисами.
ПЗ
Практическое замечание

Тонкий клиент, веб-клиент и разграничение клиент/сервер

Ключевой подводный камень — место выполнения кода. Метод Записать() сохраняет файл в файловую систему того компьютера, где выполняется код. Если код с директивой &НаСервере, файл появится на сервере 1С, а не у пользователя. Это самая частая причина жалоб «код отработал, а файла нет».

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

&НаКлиенте

Процедура СохранитьКартинку(Команда)

Адрес = ПолучитьАдресКартинкиНаСервере(СсылкаНаОбъект);

ПолучитьФайл(Адрес, "C:\Users\User\Pictures\photo.jpg", Истина);

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

В веб-клиенте прямой доступ к произвольным путям файловой системы ограничен браузером — пользователю будет предложен стандартный диалог сохранения. Жёстко прописанный путь C:\Temp в веб-клиенте работать не будет.

Типичные ошибки и проверка результата

Большинство проблем при сохранении картинок сводится к нескольким повторяющимся ошибкам. Знание их экономит часы отладки.

Типичные ошибки
01
Вызов Записать() без проверки на Неопределено — падение обработки на первом же элементе без картинки
02
Сохранение на сервере при ожидании файла на клиенте — файл 'теряется' на диске сервера
03
Запись Base64-строки с префиксом data:image — на выходе повреждённый файл, который не открывается
04
Неверное расширение файла при записи двоичных данных: JPEG сохранён как .png, и часть программ отказывается его открывать
05
Отсутствие прав на каталог назначения — ошибка доступа, особенно при записи в системные папки или на сетевой диск

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

Каталог = Новый Файл("C:\Temp\Images");

Если Не Каталог.Существует() Тогда

СоздатьКаталог("C:\Temp\Images");

КонецЕсли;

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

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

Файл создан в целевом каталоге
Норма

Файл присутствует, размер больше нуля

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

Файла нет — проверьте, на клиенте или сервере выполнялся код

Файл открывается
Норма

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

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

Ошибка открытия — возможны битые данные из Base64 или неверный формат

Содержимое соответствует оригиналу
Норма

Картинка совпадает с тем, что видно в карточке объекта 1С

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

Сохранён другой файл или пустая картинка — проверьте источник данных

Вопросы и ответы

Можно ли сохранить картинку без диалога выбора файла у пользователя?

На тонком клиенте — да, если код выполняется на клиенте и путь известен заранее. В веб-клиенте браузерные ограничения не позволяют писать в произвольный путь: пользователю всегда показывается диалог сохранения или файл попадает в стандартную папку загрузок.

Как сохранить сразу все картинки из справочника номенклатуры?

Напишите обработку с циклом по выборке из справочника: для каждого элемента получайте данные из хранилища или присоединённых файлов и записывайте с именем, сформированным из кода или артикула товара. Сначала протестируйте на 2–3 элементах и на копии базы.

Почему сохранённый файл не открывается, хотя код отработал без ошибок?

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

Как узнать формат картинки, хранящейся в базе?

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

Работает ли метод Записать() на Linux-сервере 1С?

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

Можно ли сохранить картинку из табличного документа, например штрихкод?

Табличный документ целиком сохраняется в форматы mxl, xlsx, pdf и другие через метод Записать() табличного документа. Если нужна именно картинка из области документа, извлеките рисунок из коллекции рисунков табличного документа и запишите его объект Картинка.

Итог

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

Сохранение картинки в файл сводится к получению объекта Картинка или ДвоичныеДанные и вызову метода Записать(). Ключевые моменты: проверяйте источник на Неопределено, помните о разнице между клиентом и сервером, следите за соответствием формата и расширения, а при работе с Base64 удаляйте служебный префикс. Массовую выгрузку всегда тестируйте на копии базы.