Разработка и Конфигурация · 13 мин
Как работать с картинками в 1С
Как добавить, хранить и вывести картинки в 1С: присоединённые файлы, реквизиты типа ХранилищеЗначения, работа с ДвоичныеДанные, типичные ошибки и ограничения.
Картинки в 1С встречаются почти в каждой конфигурации: фотографии товаров в карточке номенклатуры, сканы документов, логотипы в печатных формах, аватары сотрудников. При этом платформа предлагает несколько принципиально разных способов хранения изображений, и выбор неправильного варианта приводит к раздутой базе, медленным формам и проблемам при обмене данными.
Основные подходы три: присоединённые файлы через механизм БСП (библиотека стандартных подсистем), реквизит объекта с типом «ХранилищеЗначения» и хранение файлов во внешнем каталоге с ссылкой в базе. У каждого способа есть свои сценарии применения, ограничения по объёму и влияние на производительность.
Ниже разобраны практические задачи: как добавить картинку к элементу справочника, вывести её на форму, вставить в печатную форму, обработать программно и не допустить типичных ошибок при хранении. Материал ориентирован на типовые конфигурации на управляемых формах (УТ, ERP, Бухгалтерия, ЗУП), но принципы применимы и к самописным решениям.
Какие способы хранения картинок существуют в 1С
Первый способ — присоединённые файлы. В типовых конфигурациях на базе БСП это стандартная кнопка со скрепкой на форме элемента справочника или документа. Файлы хранятся либо в информационной базе (в справочнике присоединённых файлов), либо в томах на диске — настройка выполняется администратором. Это рекомендуемый вариант для пользовательских изображений: фото товаров, сканов, актов.
Второй способ — реквизит с типом «ХранилищеЗначения». Картинка сохраняется прямо в реквизите объекта в виде двоичных данных, упакованных в хранилище. Так обычно делают в самописных конфигурациях или для служебных изображений, которых немного: печать организации, подпись руководителя. Минус — данные физически лежат в таблице объекта, и при большом количестве картинок таблица тяжелеет, замедляя выборки.
Третий способ — внешнее хранилище с ссылкой. В базе хранится только путь к файлу на сетевом ресурсе или URL. Подходит для очень больших архивов изображений, но требует контроля доступности каталога и не работает при обмене между базами без дополнительной синхронизации файлов.
Сравнение способов хранения
Подходит для пользовательских изображений в типовых конфигурациях; поддерживает тома на диске, версии и подписание. Ограничение — требует БСП в конфигурации.
Подходит для небольших служебных картинок в самописных решениях. Ограничение — рост таблицы объекта и замедление запросов при массовом использовании.
Подходит для больших архивов изображений. Ограничение — нужно следить за доступностью каталога и самостоятельно решать вопрос обмена и резервного копирования.
Как добавить картинку к товару или документу в типовой конфигурации
В типовых решениях (УТ 11, ERP, КА, БП 3.0) добавление изображения не требует программирования. Откройте карточку номенклатуры или документа, найдите на форме команду «Присоединённые файлы» (значок скрепки) или область предпросмотра изображения. Нажмите «Добавить» и выберите файл с диска — платформа поддерживает распространённые растровые форматы: JPEG, PNG, BMP, GIF.
Для номенклатуры в УТ и ERP первый добавленный файл изображения обычно автоматически становится основным и выводится в списке товаров, подборе в документы и на сайт при интеграции. Если картинок несколько, основную можно сменить в списке присоединённых файлов.
При массовой загрузке фотографий для каталога товаров удобнее использовать обработки загрузки из файлов по шаблону имени (например, «Артикул.jpg») — в типовых конфигурациях и на маркетплейсе решений такие обработки есть. Перед загрузкой проверьте, что имена файлов однозначно совпадают с артикулами или кодами, иначе получите картинки, привязанные не к тем товарам.
- 1Откройте карточку номенклатуры
- 2Нажмите «Присоединённые файлы» (скрепка) или кликните по области изображения
- 3Выберите «Добавить из файла» и укажите картинку на диске
- 4Убедитесь, что файл отобразился в списке и в области предпросмотра
- 5При нескольких изображениях проверьте, какое назначено основным
Как хранить картинку в реквизите объекта (для разработчика)
Если конфигурация самописная или механизм присоединённых файлов избыточен, добавьте объекту реквизит с типом «ХранилищеЗначения». В модуле формы запись картинки выполняется через помещение файла во временное хранилище и последующее сохранение двоичных данных:
&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
НачатьПомещениеФайла(Новый ОписаниеОповещения("ПослеПомещения", ЭтотОбъект),
, , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаСервере
Процедура СохранитьКартинку(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Объект.Картинка = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
КонецПроцедуры
Обратите внимание на второй параметр конструктора «ХранилищеЗначения» — сжатие данных. Оно уменьшает занимаемое место для несжатых форматов вроде BMP, но для JPEG и PNG эффект минимален, так как эти форматы уже сжаты. Чтение выполняется обратным вызовом: Объект.Картинка.Получить() возвращает двоичные данные, которые можно поместить во временное хранилище и вывести на форму.
Для вывода на управляемую форму добавьте реквизит формы типа «Строка» (адрес во временном хранилище) и элемент формы «Поле картинки». При чтении объекта на сервере заполните адрес: АдресКартинки = ПоместитьВоВременноеХранилище(Объект.Картинка.Получить(), УникальныйИдентификатор). Второй параметр привязывает хранилище к жизни формы — без него адрес станет недействительным после закрытия.
ДвоичныеДанные = Объект.Картинка.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецЕсли;Как вывести картинку в печатную форму
В табличном документе изображения выводятся через область-рисунок. В макете добавьте рисунок (меню «Таблица» — «Рисунки» — «Картинка»), задайте ему имя, а в коде перед выводом области подставьте двоичные данные:
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
Рисунок = ОбластьМакета.Рисунки.Найти("Логотип");
Если Рисунок <> Неопределено Тогда
Рисунок.Картинка = Новый Картинка(ДвоичныеДанныеЛоготипа);
КонецЕсли;
ТабДок.Вывести(ОбластьМакета);
Типичная задача — вывод логотипа организации в счетах и актах. Логотип обычно хранят в карточке организации как присоединённый файл или в константе. Учтите: картинка вставляется в табличный документ в исходном разрешении, поэтому файл в 3000×4000 пикселей раздует PDF и замедлит печать. Заранее приведите логотип к разумному размеру — для печати обычно достаточно ширины в несколько сотен пикселей.
Если рисунок не выводится, проверьте три вещи: совпадает ли имя рисунка в макете с именем в коде, не пусты ли двоичные данные и не находится ли рисунок в области, которая выводится условно и пропускается.
Как обработать картинку программно: размер, формат, сжатие
Встроенных средств ресайза в платформе 1С практически нет: объект «Картинка» позволяет получить двоичные данные, конвертировать формат (метод «Преобразовать») и получить размеры, но не изменить разрешение. Поэтому для уменьшения фотографий при массовой загрузке используют внешние инструменты: компоненты, вызов утилит командной строки на сервере или предварительную обработку файлов до загрузки в базу.
Практичный подход — сжимать изображения до загрузки. Пакетная обработка бесплатными утилитами (например, конвертеры командной строки) позволяет привести тысячи фото к единому размеру и весу. Как ориентир: для карточки товара обычно достаточно изображения с длинной стороной 800–1200 пикселей в JPEG с умеренным качеством — такой файл занимает сотни килобайт вместо мегабайт исходника с фотоаппарата.
Проверить формат файла перед загрузкой можно по сигнатуре (первым байтам) двоичных данных или просто попытавшись создать объект «Картинка» в попытке — неподдерживаемый формат вызовет исключение, которое нужно обработать и сообщить пользователю, какой файл не загрузился.
Как не допустить разрастания базы из-за картинок
Изображения — самая частая причина неконтролируемого роста файловых баз и увеличения времени резервного копирования. Сотня товаров с фото по 5 МБ добавляет базе полгигабайта; в файловом варианте это критично, так как весь файл базы участвует в копировании и при повреждении восстанавливается целиком.
Меры контроля: настройте хранение присоединённых файлов в томах на диске (в типовых конфигурациях — раздел администрирования, настройки работы с файлами), тогда файлы лежат отдельно от базы и бэкапятся файловыми средствами. Ограничьте максимальный размер загружаемого файла в настройках. Периодически проверяйте объём справочников присоединённых файлов и очищайте непривязанные файлы — они остаются после удаления элементов-владельцев, если очистка не настроена.
При обмене данными (РИБ, синхронизация с сайтом) помните: двоичные данные картинок передаются в сообщениях обмена и могут резко увеличить трафик. В планах обмена для справочников файлов имеет смысл настраивать фильтрацию или выгружать изображения отдельным механизмом.
Как проверить результат и типичные проблемы
После настройки хранения и загрузки изображений пройдите контрольные точки: картинка отображается на форме элемента, выводится в печатной форме, не пропадает после повторного открытия объекта, база не выросла непропорционально количеству загруженных файлов. Если используется хранение в томах, проверьте, что файлы физически появились в каталоге тома и доступны с рабочих мест пользователей.
Частые проблемы: картинка видна одному пользователю и не видна другому (файл лежит в локальном пути вместо сетевого тома), изображение пропадает после обмена (объект-владелец перенёсся, а присоединённый файл — нет), при открытии формы ошибка «Нарушена целостность структуры хранилища значений» (повреждены данные в реквизите — потребуется тестирование и исправление базы).
Как проверить результат
Картинка видна при повторном открытии объекта у всех пользователей
Изображение пропадает или видно только на одном компьютере
Картинка есть в табличном документе и в сохранённом PDF
Пустая рамка или область без изображения
Рост базы соответствует суммарному размеру файлов
База выросла кратно больше размера загруженных картинок
Файлы появляются в каталоге тома, а база растёт умеренно
Каталог тома пуст, весь объём ушёл в базу
Частые вопросы о работе с картинками в 1С
Какие форматы изображений поддерживает 1С?
Объект «Картинка» работает с распространёнными растровыми форматами: BMP, JPEG, PNG, GIF, TIFF и некоторыми другими — набор зависит от версии платформы и операционной системы. Для фотографий товаров практичнее JPEG, для логотипов с прозрачностью — PNG. Векторные форматы (SVG) платформа напрямую не отображает.
Почему картинка на форме отображается как красный крест или пустая рамка?
Чаще всего адрес во временном хранилище стал недействителен: данные поместили без привязки к уникальному идентификатору формы, и хранилище очистилось. Реже — двоичные данные в реквизите пусты или повреждены. Проверьте, что при чтении объекта адрес заполняется заново с передачей УникальныйИдентификатор формы.
Можно ли хранить картинки вне базы, но видеть их в карточке товара?
Да. В типовых конфигурациях для этого служат тома хранения присоединённых файлов: файлы лежат в указанном каталоге на диске, а в базе остаются только ссылки. В самописных решениях хранят путь к файлу в строковом реквизите и загружают изображение на форму по этому пути. Учтите, что каталог должен быть доступен всем пользователям и попадать в резервные копии.
Как массово загрузить фото для нескольких тысяч товаров?
Используйте обработку пакетной загрузки, сопоставляющую файлы товарам по имени (артикул или код в названии файла). Перед загрузкой уменьшите изображения внешними средствами до разумного размера, сделайте резервную копию базы и загружайте порциями, контролируя объём. После загрузки выборочно проверьте соответствие фото товарам — ошибки в именах файлов дают неверные привязки.
Почему база сильно выросла после загрузки картинок и что делать?
Изображения хранятся внутри базы, и их объём суммируется с данными. Проверьте, где хранятся присоединённые файлы: если в базе — перенастройте на тома и выполните перенос существующих файлов штатными средствами конфигурации. Для файловой базы после удаления лишних данных выполните сжатие через тестирование и исправление, иначе файл физически не уменьшится.
Как вывести разные картинки в печатной форме по условию?
Добавьте в макет рисунок, а в коде перед выводом области присвойте ему нужное изображение через «Новый Картинка(ДвоичныеДанные)» в зависимости от условия — например, логотип конкретной организации или пиктограмму статуса. Если по условию картинка не нужна, очистите рисунок, присвоив пустую картинку, либо выводите альтернативную область макета без рисунка.
Что важно запомнить
Для пользовательских изображений в типовых конфигурациях используйте присоединённые файлы с хранением в томах, для служебных картинок — реквизит «ХранилищеЗначения». Сжимайте фото до загрузки, выводите на форму через временное хранилище с привязкой к форме, а в печать — через рисунки макета. Контролируйте рост базы и делайте резервные копии перед массовой загрузкой.