Синтаксис и применение ОбработкаКартинок.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.
Синтаксис
Новый ОбработкаКартинокПолное описание, параметры и ограничения
ОбработкаКартинок.По умолчанию
ОбработкаКартинок (PictureProcessor)
По умолчанию
Синтаксис:
Новый ОбработкаКартинок
Методическая информация
Практические примеры
Обрезать белые поля учебного маркера, повернуть его и записать превью в память
Рабочая задача подготовки изображения для документа без файла, принтера и сети. Здесь разобран старый API ОбработкаКартинок, сохранённый в 8.5.1.1343; с 8.3.14 рекомендуется ОбрабатываемаяКартинка. Для нового проекта выбирайте рекомендуемый API, а этот урок нужен для чтения и сопровождения старого кода.
Где и как запускать
Основной код — полный серверный неглобальный общий модуль УчебнаяОбработкаКартинок85. Поддерживающий полный модуль своей управляемой формы вызывает его на сервере и показывает только строку. Runtime не проверен.
Подготовка
Создайте отдельную новую файловую базу на Windows 8.5.1.1343 без рабочих данных: C:\1c-labs\OwnPicturePreview85_56af88ce-720b-405f-b53c-1101a368e6ed\IB. Имя конфигурации УчебнаяКонфигурацияСинтаксиса; основной режим Управляемое приложение, совместимость Не использовать. Подготовка ручная, здесь не выполнялась.
Общие → Общие модули → Добавить: УчебнаяОбработкаКартинок85. Флаги Сервер=Да, Глобальный=Нет, Вызов сервера=Нет, Привилегированный=Нет; повторное использование возвращаемых значений Не использовать. Вставьте основной код целиком в модуль, не внутрь другой процедуры.
Обработки → Добавить: УчебныйМаркер85. Создайте одну управляемую форму. В её редакторе создайте команду ПроверитьМаркер85, назначьте действие ПроверитьМаркер85 и добавьте связанную кнопку. Полный модуль формы приведён отдельным блоком.
Откройте свою обработку вручную в тонком клиенте через Функции для технического специалиста → Обработки → УчебныйМаркер85. Нажмите ПроверитьМаркер85. Требуется право своего учебного пользователя на открытие обработки; доставку команды и реальный запуск здесь не проверяли.
Изображение полностью задано в коде: собственный RGB PNG 96×64, белый фон и синий прямоугольный маркер x=24..71/y=16..47, 175 байтов. Это не настоящая подпись и не печать организации. Конструктор получает собственные двоичные данные, не путь к чужому файлу.
Результат — реальные размеры и строки Base64 из собственных локальных картинок. Base64Строка использует MIME-переносы CR/LF. Не считайте Base64 рисунком на форме; для визуального просмотра потребуется отдельный явно настроенный элемент картинки.
Функция ПодготовитьУчебныйМаркер85() Экспорт
ДанныеИсточника = Base64Значение("iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAdklEQVR42u3aQQ0AMAgEQVRUF4bQTg0Q3k06m1Mw74vWWiAABAgQIECAAAESIECAAAECBGjsZD01QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAOVABAgQIECBAgAAJECBAgAABAvQZ0AWDUh92PWgWiAAAAABJRU5ErkJggg==");
Если ТипЗнч(ДанныеИсточника) <> Тип("ДвоичныеДанные")
Или ДанныеИсточника.Размер() <> 175 Тогда
ВызватьИсключение "СТОП: исходник должен быть собственным фиксированным PNG";
КонецЕсли;
Исходная = Новый Картинка(ДанныеИсточника);
ПроверитьРазмеры85(Исходная, 96, 64);
ИсходныйСнимок = Base64Строка(Исходная.ПолучитьДвоичныеДанные());
Обработчик = Новый ОбработкаКартинок;
Если ТипЗнч(Обработчик) <> Тип("ОбработкаКартинок") Тогда
ВызватьИсключение "СТОП: требуется настоящий ОбработкаКартинок";
КонецЕсли;
Чувствительность = 5;
Угол = 90;
Если Чувствительность < 1 Или Чувствительность > 10
Или Угол % 90 <> 0 Тогда
ВызватьИсключение "СТОП: чувствительность 1–10, угол кратен 90";
КонецЕсли;
Обрезанная = Обработчик.ВыделитьЗначимуюЧасть(Исходная, Чувствительность);
Если ТипЗнч(Обрезанная) <> Тип("Картинка") Тогда
ВызватьИсключение "СТОП: не получена значимая часть собственной картинки";
КонецЕсли;
ШиринаОбрезанной = Обрезанная.Ширина();
ВысотаОбрезанной = Обрезанная.Высота();
Если ТипЗнч(ШиринаОбрезанной) <> Тип("Число")
Или ТипЗнч(ВысотаОбрезанной) <> Тип("Число")
Или ШиринаОбрезанной <= 0 Или ВысотаОбрезанной <= 0 Тогда
ВызватьИсключение "СТОП: фактические размеры значимой части не определены";
КонецЕсли;
СнимокОбрезанной = Base64Строка(Обрезанная.ПолучитьДвоичныеДанные());
Повернутая = Обработчик.Повернуть(Исходная, Угол);
ПроверитьРазмеры85(Повернутая, 64, 96);
Если Base64Строка(Исходная.ПолучитьДвоичныеДанные()) <> ИсходныйСнимок Тогда
ВызватьИсключение "СТОП: исходная картинка изменилась; успех не объявляется";
КонецЕсли;
Поток = Новый ПотокВПамяти();
НужноЗакрыть = Истина;
Попытка
Повернутая.Записать(Поток, Ложь);
НужноЗакрыть = Ложь;
ДанныеПревью = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Исключение
ПервичнаяОшибка = ОписаниеОшибки();
Если НужноЗакрыть Тогда
НужноЗакрыть = Ложь;
Попытка
Поток.Закрыть();
Исключение
ПервичнаяОшибка = ПервичнаяОшибка + "; ошибка освобождения потока: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
ВызватьИсключение "СТОП: запись собственного превью не завершена: " + ПервичнаяОшибка;
КонецПопытки;
Если ТипЗнч(ДанныеПревью) <> Тип("ДвоичныеДанные")
Или ДанныеПревью.Размер() <= 0 Тогда
ВызватьИсключение "СТОП: нет реальных записанных данных картинки";
КонецЕсли;
Прочитанная = Новый Картинка(ДанныеПревью);
ПроверитьРазмеры85(Прочитанная, 64, 96);
Если Base64Строка(Прочитанная.ПолучитьДвоичныеДанные())
<> Base64Строка(Повернутая.ПолучитьДвоичныеДанные()) Тогда
ВызватьИсключение "СТОП: сериализованный снимок превью отличается после обратного чтения";
КонецЕсли;
Если Base64Строка(Исходная.ПолучитьДвоичныеДанные()) <> ИсходныйСнимок
Или Base64Строка(Обрезанная.ПолучитьДвоичныеДанные()) <> СнимокОбрезанной Тогда
ВызватьИсключение "СТОП: исходные локальные картинки изменились после записи";
КонецЕсли;
Возврат "Исходник: 96×64; после поворота: 64×96; обратное чтение: 64×96."
+ Символы.ПС + "Фактическая значимая часть: " + Строка(ШиринаОбрезанной) + "×" + Строка(ВысотаОбрезанной)
+ Символы.ПС + "Байтов в записанном превью: " + Строка(ДанныеПревью.Размер())
+ Символы.ПС + "Исходник и значимая часть не изменились; сериализованный снимок превью совпал."
+ Символы.ПС + "Значимая часть, Base64: " + СнимокОбрезанной
+ Символы.ПС + "Записанное превью, Base64: " + Base64Строка(ДанныеПревью);
КонецФункции
Процедура ПроверитьРазмеры85(Картинка, Ширина, Высота)
Если ТипЗнч(Картинка) <> Тип("Картинка")
Или ТипЗнч(Картинка.Ширина()) <> Тип("Число")
Или ТипЗнч(Картинка.Высота()) <> Тип("Число")
Или Картинка.Ширина() <> Ширина Или Картинка.Высота() <> Высота Тогда
ВызватьИсключение "СТОП: реальная картинка не имеет ожидаемых размеров";
КонецЕсли;
КонецПроцедурыПолный модуль своей управляемой формы УчебныйМаркер85
Обработки → УчебныйМаркер85 → Формы → своя управляемая форма → Модуль
Полный модуль собственной управляемой формы; команда на клиенте, отдельный серверный вызов без контекста.
&НаКлиенте
Процедура ПроверитьМаркер85(Команда)
Сообщить(ПодготовитьМаркерНаСервере85());
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПодготовитьМаркерНаСервере85()
Возврат УчебнаяОбработкаКартинок85.ПодготовитьУчебныйМаркер85();
КонецФункцииРазбор по шагам
Проверить имя собственной учебной конфигурации. Раскодировать свой фиксированный PNG и получить настоящий Картинка из ДвоичныеДанные. До обработки проверить 96×64 и сохранить сериализованный снимок.
Создать настоящий ОбработкаКартинок. При чувствительности 5 вызвать ВыделитьЗначимуюЧасть на собственном изображении. Прочитать и сообщить фактические положительные размеры результата; точную границу алгоритм справки не обещает.
Отдельно повернуть исходную картинку на 90 градусов, а не результат обрезки: так контрольные размеры однозначны — 64×96. Код проверяет допустимый угол до вызова и неизменность собственного исходного снимка после операций.
Передать настоящий ПотокВПамяти в вариант Картинка.Записать «В поток». Это метод без объявленного возвращаемого значения; его результат не присваивается. ЗакрытьИПолучитьДвоичныеДанные завершает поток и выдаёт реально записанные байты.
Из записанных байтов снова построить Картинка и проверить 64×96. Сравнить её сериализованные данные с данными повернутого объекта; совпадение — строгий критерий этого учебного маршрута, не документированная гарантия любого перекодирования.
Ещё раз сравнить исходник и обрезанный объект с их собственными снимками. Только после всех фактических проверок вернуть строковый отчёт клиенту. При сбое записи сохранить первичную ошибку, закрыть поток не более одного раза и не объявлять успех.
Как проверить результат
В учебном запуске ожидаются размеры исходника 96×64, повёрнутого изображения и обратного чтения 64×96. Для значимой части отображаются фактические размеры: точное значение заранее не выдумано.
Отчёт появляется только после проверки неизменности исходника/значимой части и совпадения сериализованного превью. Если реализация перекодирует данные иначе, код останавливается с настоящей причиной; это не доказательство неисправности платформы.
Для учебного изменения Угол=45 сработает собственная проверка до native Повернуть. Повреждение строки PNG не должно превращаться в успешный отчёт.
Код не пишет на диск, не печатает документ, не обращается к базе с записью и не отправляет Base64 в сеть. Ни один BSL-блок не запускался здесь в 1С.
Ожидаемый результат
Есть полноценная цепочка собственный PNG → значимая часть и поворот → реальная запись картинки в поток → обратное создание и проверка. Все размеры, байты и снимки берутся у настоящих объектов, а не у моделей или getter-обёртки.
На что обратить внимание
ОбработкаКартинок — не рекомендуемый API. Не заменяйте имя на ОбрабатываемаяКартинка без проверки другой сигнатуры: это разные объекты.
Алгоритм выделения значимой части не гарантирует заданные вручную ширину, высоту или рамку. На настоящих сканах нужен визуальный контроль результата; этот урок не распознаёт подпись и не проверяет её подлинность.
Картинка.Ширина/Высота и ПолучитьДвоичныеДанные могут вернуть Неопределено для некоторых видов картинок. Здесь используется собственный одновариантный PNG; типы результата проверяются.
Сравнение сериализованных байтов — не сравнение пикселей и не доказательство цвета, направления вращения или визуального качества. При несовпадении нельзя автоматически подменять данные ожидаемым ответом.
После ЗакрытьИПолучитьДвоичныеДанные поток не используется. Если само завершение не вернуло результат, повторное закрытие или фиктивное повторное чтение не выполняется.
Клиент получает только строку отчёта. ОбработкаКартинок выполняется на сервере, а не непосредственно в тонком клиенте; сохранённые двоичные данные не являются автоматически файлом.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.