Как преобразовать графические данные из Форматированного документа в двоичные данные при вставке из буфера обмена

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с объектом ФорматированныйДокумент разработчики часто сталкиваются с ситуацией, когда при программном получении содержимого стандартными методами, такими как ПолучитьHTML(), структура вложений оказывается пустой. Это происходит потому, что современные браузеры и компоненты платформы при вставке данных из буфера обмена преобразуют графическую информацию непосредственно в формат Data URI. В этом случае бинарные данные внедряются прямо в текст HTML-кода в виде строки Base64.

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

Анализ структуры данных в Форматированном документе

Проанализируем ситуацию, когда мы пытаемся извлечь элементы из документа. Рассмотрим метод ПолучитьЭлементы(), который возвращает коллекцию объектов. Если среди них встречается КартинкаФорматированногоДокумента, мы можем обратиться к её свойству Картинка. В стандартной ситуации это объект, но при вставке из буфера там может оказаться длинная строка, начинающаяся с префикса data:image/png;base64,....

Выясним причину, по которой обычная конвертация этой строки выдает ошибку или создает поврежденный файл. Стандарт Base64URL (RFC 4648) отличается от классического Base64 использованием символов - (минус) вместо + (плюс) и _ (подчеркивание) вместо / (слеш). Кроме того, в URL-варианте часто опускаются завершающие символы выравнивания =.

Алгоритм подготовки строки для функции Base64Значение

Рассмотрим подробнее процесс трансформации «неправильной» строки в формат, пригодный для обработки платформой 1С. Нам необходимо выполнить три основных действия:

  1. Очистка от префикса: Удалить техническую информацию data:...;base64,, оставив только полезную нагрузку.
  2. Замена алфавита: Вернуть стандартные символы + и /.
  3. Выравнивание длины: Длина строки Base64 обязательно должна быть кратна четырем. Если это условие не соблюдено, функция 1С вернет пустой результат или Неопределено.

Разберем, как это реализовать программно. Посмотрим на пример кода, который выполняет эти преобразования:


// Предположим, что Стр - это элемент коллекции, полученный через ПолучитьЭлементы()
Если ТипЗнч(Стр) = Тип("КартинкаФорматированногоДокумента") Тогда
    СтрокаДанных = Стр.Картинка; // Здесь может быть строка Data URI
    
    // Проверим, содержит ли строка данные в формате base64
    ПозицияBase64 = Найти(СтрокаДанных, "base64,");
    Если ПозицияBase64 > 0 Тогда
        
        // Извлекаем только саму закодированную часть
        ЧистаяСтрока = Сред(СтрокаДанных, ПозицияBase64 + СтрДлина("base64,"));
        
        // Выполняем замену символов Base64URL на стандартные
        ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, "-", "+");
        ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, "_", "/");
        
        // Дополняем строку символами "=" до кратности 4
        ОстатокОтДеления = СтрДлина(ЧистаяСтрока) % 4;
        Если ОстатокОтДеления > 0 Тогда
            ЧистаяСтрока = ЧистаяСтрока + Лев("===", 4 - ОстатокОтДеления);
        КонецЕсли;
        
        // Теперь платформа сможет корректно распознать двоичные данные
        Попытка
            РезультатБинар = Base64Значение(ЧистаяСтрока);
            // Далее можно записать данные в файл или использовать в объекте Картинка
        Исключение
            Сообщить("Ошибка при декодировании данных");
        КонецПопытки;
        
    КонецЕсли;
КонецЕсли;

Разбор по шагам: почему важно выравнивание

Проанализируем подробнее математическую сторону вопроса. Кодирование Base64 разбивает каждые 3 байта входных данных на 4 символа текста (по 6 бит на символ). Если исходные данные не делятся на 3 без остатка, в конце строки появляются символы-заполнители =. Многие современные веб-сервисы экономят трафик и отбрасывают эти символы, так как их количество можно вычислить на основе длины строки. Однако встроенные механизмы 1С требуют строгого соблюдения стандарта, поэтому мы вручную добавляем недостающие знаки равенства.

Выясним, как правильно определить расширение файла. В строке Data URI перед точкой с запятой обычно указан MIME-тип, например image/png или image/jpeg. Проанализируем ситуацию: если мы хотим сохранить данные на диск, нам нужно извлечь подстроку между image/ и ;.


НачалоТипа = Найти(СтрокаДанных, "image/") + 6;
КонецТипа  = Найти(СтрокаДанных, ";");
Расширение = Сред(СтрокаДанных, НачалоТипа, КонецТипа - НачалоТипа);
// Для "image/png" расширение будет "png"

Нюансы работы в разных клиентах 1С

Посмотрим на различия в поведении платформы. В тонком клиенте под управлением ОС Windows «Форматированный документ» может использовать движок, который по-разному обрабатывает вставку объектов. Если вы работаете в веб-клиенте через браузеры Chrome или Safari, вероятность встретить именно Base64URL значительно выше. Это связано с тем, как движок WebKit/Chromium обрабатывает бинарный контент в буфере обмена. Для решения аналогичной задачи в более новых версиях платформы можно использовать встроенные механизмы работы с буфером обмена в 1С 8.3.24.

Также стоит помнить о производительности. Поскольку строки Base64 примерно на 33% больше по объему, чем исходные бинарные данные, обработка очень больших документов с множеством внедренных элементов может потребовать значительных ресурсов оперативной памяти. Рекомендуется выполнять такие операции на стороне сервера, чтобы минимизировать нагрузку на клиентское приложение.

Совместная работа с объектом ДвоичныеДанные после успешного декодирования позволяет нам не только сохранять результат во временные файлы, но и помещать его в хранилище значений или прикреплять к справочникам в виде файлов-объектов. Таким образом, мы полностью обходим проблему «пустых вложений» в методе ПолучитьHTML(), самостоятельно управляя контентом документа.

Заключение

Мы рассмотрели эффективный способ извлечения информации из ФорматированногоДокумента, когда стандартные вложения не заполняются. Использование алгоритма замены спецсимволов и принудительного выравнивания строки позволяет интегрировать визуальный контент, вставленный пользователями «на лету», в любые другие механизмы системы 1С:Предприятие, такие как печатные формы или почтовые рассылки. При необходимости реализовать другой интерактивный сценарий добавления файлов пользователем можно использовать инструмент для переноса картинок на форму методом Drag & Drop.

← На главную