Как добавить и корректно настроить работу с изображениями в документах 1С 8.2 на обычных формах?

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

Работа с изображениями — частое требование при автоматизации бизнес-процессов. Будь то скан-копия чека в «Расходном кассовом ордере», фото товара или подписанная накладная, программисту важно не только «прикрепить» файл, но и обеспечить его правильное хранение, отображение и удаление. В рамках этой статьи мы разберем основные проблемы, с которыми сталкиваются разработчики на обычных формах 1С 8.2, и найдем эффективные способы их решения.

Организация хранения изображения

Для начала проанализируем структуру данных. Чтобы хранить картинку непосредственно в документе, необходимо создать реквизит объекта. Назовем его Фото и установим тип данных ХранилищеЗначения. Использование этого типа позволяет помещать внутрь любые двоичные данные, включая сжатые изображения.

Важно помнить, что ХранилищеЗначения не отображается на форме напрямую. Для визуализации нам потребуется элемент управления Поле картинки, который мы назовем ОсновноеИзображение.

Программное добавление изображения

Разберем процедуру выбора файла с диска и помещения его в базу данных. Для этого нам понадобится диалоговое окно выбора файла. Рассмотрим код кнопки добавления изображения:


Процедура КоманднаяПанельДобавитьИзображение(Кнопка)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите изображение чека";
    Диалог.ПредварительныйПросмотр = Истина;
    Диалог.Фильтр = "Изображения (*.jpg;*.png)|*.jpg;*.png";

    Если Диалог.Выбрать() Тогда
        // Читаем файл в двоичные данные
        Данные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
        
        // Помещаем данные в реквизит "Фото" с максимальным сжатием
        Фото = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9));
        
        // Отображаем картинку на форме
        ЭлементыФормы.ОсновноеИзображение.Картинка = Новый Картинка(Данные);
        
        // Сообщаем форме, что документ изменен
        ЭтаФорма.Модифицированность = Истина;
    Иначе
        Сообщить("Картинка не выбрана");
    КонецЕсли;
КонецПроцедуры

В этом примере мы используем объект ДвоичныеДанные для чтения файла и СжатиеДанных(9) для экономии места в базе данных. Обратите внимание на установку свойства Модифицированность — это критически важно, чтобы система предложила сохранить документ после добавления фото.

Отображение картинки при открытии формы

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


Процедура ПриОткрытии()
    // Получаем содержимое из хранилища
    СодержимоеХранилища = Фото.Получить();
    
    // Проверяем, что в хранилище действительно лежат двоичные данные
    Если ТипЗнч(СодержимоеХранилища) = Тип("ДвоичныеДанные") Тогда
        НоваяКартинка = Новый Картинка(СодержимоеХранилища);
        ЭлементыФормы.ОсновноеИзображение.Картинка = НоваяКартинка;
    ИначеЕсли ТипЗнч(СодержимоеХранилища) = Тип("Картинка") Тогда
        // На случай, если в хранилище уже записан объект Картинка
        ЭлементыФормы.ОсновноеИзображение.Картинка = СодержимоеХранилища;
    КонецЕсли;
КонецПроцедуры

Именно проверка типа через ТипЗнч позволяет избежать ошибки «Несоответствие типов», если реквизит пуст или содержит некорректные данные.

Корректное удаление изображения

Проанализируем ситуацию: пользователь нажимает «Удалить», картинка исчезает с экрана, но после переоткрытия документа она появляется снова. Почему это происходит? Ошибка в том, что очищается только элемент формы (ЭлементыФормы.ОсновноеИзображение.Картинка), а сам реквизит документа Фото остается нетронутым.

Рассмотрим правильный алгоритм удаления:


Процедура КоманднаяПанельОчистить(Кнопка)
    // 1. Очищаем реквизит объекта
    Фото = Неопределено; 
    
    // 2. Очищаем визуальный элемент на форме
    ЭлементыФормы.ОсновноеИзображение.Картинка = Новый Картинка;
    
    // 3. Фиксируем изменение документа
    ЭтаФорма.Модифицированность = Истина;
КонецПроцедуры

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

Решение проблемы с размером (масштабирование)

Часто программисты сталкиваются с тем, что большие фотографии не помещаются в отведенную область или отображаются лишь частично. Чтобы не заставлять пользователя предварительно менять размер фото в графических редакторах, воспользуемся встроенными возможностями платформы 1С.

Посмотрим на свойства элемента формы Поле картинки. Нам нужно свойство РазмерКартинки (в палитре свойств или в коде). У него есть несколько режимов:

  1. Авто — автоматическая настройка.
  2. Реальный размер — картинка отображается «как есть», часто выходя за границы.
  3. Растянуть — картинка заполняет все поле, но пропорции могут исказиться.
  4. Пропорционально — оптимальный вариант. Картинка вписывается в поле, сохраняя свои пропорции.

Мы рекомендуем установить это свойство в значение Пропорционально прямо в конфигураторе или программно в процедуре ПриОткрытии:

ЭлементыФормы.ОсновноеИзображение.РазмерКартинки = РежимРазмераКартинки.Пропорционально;

Оптимизация хранения: уменьшаем размер базы

Если пользователи будут загружать необработанные фото чеков высокого разрешения (по 5-10 Мб каждое), размер базы данных начнет стремительно расти. Выясним, как программно уменьшить объем данных. Перед записью в ХранилищеЗначения мы можем преобразовать картинку в формат JPEG и ограничить ее размер.

Рассмотрим пример продвинутой загрузки:


Если Диалог.Выбрать() Тогда
    КартинкаОригинал = Новый Картинка(Диалог.ПолноеИмяФайла);
    
    // Если версия платформы позволяет использовать ОбработкуКартинок (8.3.6+)
    // Или используем метод Преобразовать для изменения формата
    ДанныеДляХранения = КартинкаОригинал.Преобразовать(ФорматКартинки.JPEG);
    
    Фото = Новый ХранилищеЗначения(ДанныеДляХранения, Новый СжатиеДанных(9));
    ЭлементыФормы.ОсновноеИзображение.Картинка = КартинкаОригинал;
    ЭтаФорма.Модифицированность = Истина;
КонецЕсли;

Использование формата JPEG вместо BMP или PNG (в случае тяжелых сканов) может сократить объем занимаемого места в несколько раз без потери читаемости текста на чеке.

Итоги совместной работы

Мы пошагово разобрали процесс внедрения функционала работы с изображениями. Подведем итог: для стабильной работы необходимо всегда проверять тип извлекаемых данных из ХранилищеЗначения, не забывать очищать сам реквизит при удалении и использовать режим Пропорционально для корректного отображения. Эти несложные правила сделают ваш интерфейс удобным, а работу программы — надежной.

← На главную