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

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

При обновлении технологической платформы 1С с более ранних версий (например, 8.3.13) на версию 8.3.15 и выше многие специалисты сталкиваются с неприятным поведением системы при работе с почтовым клиентом. В конфигурациях, активно использующих встроенную почту (таких как «1С:Документооборот»), при попытке вставить скопированные данные из буфера обмена (через комбинацию клавиш Ctrl+V) в тело электронного письма вместо ожидаемого контента отображается лишь небольшая заглушка с вопросительным знаком. При этом адресат получает абсолютно пустое письмо без вложений.

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

Выясняем причину: почему ломается вставка из буфера обмена?

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

  1. Смена движка отображения HTML: До версии 8.3.15 встроенное поле форматированного документа базировалось на системных библиотеках Microsoft Internet Explorer (движок MSHTML). Этот устаревший компонент автоматически перехватывал «сырые» данные из буфера обмена Windows и конвертировал их в стандартную строку формата Base64 (вида data:image/png;base64,...) либо корректно сохранял во временную директорию локального компьютера в виде отдельного файла.
  2. Переход на WebKit: Начиная с версии 8.3.15, разработчики 1С полностью перевели платформу на современный кроссплатформенный движок WebKit (Chromium). Новая реализация имеет иную модель безопасности и другие механизмы обработки системного буфера обмена. При попытке прямой вставки WebKit пытается представить полученные двоичные данные в виде локальной ссылки на бинарный объект (так называемый blob:...-адрес).
  3. Несовместимость парсера 1С с локальными ссылками: Платформа 1С при сохранении форматированного документа не может корректно разрешить и упаковать внешнюю ссылку формата blob. В результате парсинга HTML-кода платформа заменяет неопознанный объект стандартной заглушкой (знаком вопроса). При отправке такого сообщения почтовый сервер или почтовый клиент получателя (например, Microsoft Outlook) не имеют доступа к локальной памяти отправителя, из-за чего на месте вставленного элемента отображается пустота.

Таким образом, мы имеем дело с несовместимостью нового встроенного браузера WebKit и механизмов сериализации двоичных данных в платформе 1С.

Анализируем поведение буфера обмена и промежуточных программ

Рассмотрим интересный нюанс, который часто замечают пользователи: если скопировать данные экрана напрямую (нажатием клавиши Print Screen) и вставить в 1С — отображается знак вопроса. Однако, если сначала вставить эти же данные в простейший редактор (например, MS Paint), повторно выделить их там, скопировать через Ctrl+C и уже затем вставить в 1С — все отображается корректно.

Давайте разберем по шагам, почему так происходит:

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

Решение 1. Программное исправление средствами современного API 1С (для платформы 8.3.24 и выше)

Если у вас есть возможность обновить технологическую платформу до современных релизов (ветка 8.3.24 и выше), то проблему можно решить наиболее элегантным и штатным способом. Начиная с версии 8.3.24, в платформе появился специализированный объект СредстваБуфераОбмена, предоставляющий асинхронный доступ к буферу операционной системы на уровне кода 1С.

Проанализируем пример кода, который позволяет перехватить данные из буфера обмена и корректно интегрировать их в документ без привлечения сторонних утилит:


&НаКлиенте
Асинх Процедура ОбработатьВставкуИзБуфераОбмена()
    
    // Проверяем, содержатся ли в буфере обмена двоичные данные нужного формата
    Если СредстваБуфераОбмена.СодержитДанные(СтандартныйФорматДанныхБуфераОбмена.Картинка) Тогда
        
        // Асинхронно извлекаем объект из буфера обмена
        ОбъектДанных = Ожидать СредстваБуфераОбмена.ПолучитьДанныеАсинх(СтандартныйФорматДанныхБуфераОбмена.Картинка);
        
        Если ОбъектДанных <> Неопределено Тогда
            // Вызываем процедуру интеграции полученного двоичного объекта в форматированный документ
            ИнтегрироватьОбъектВДокумент(ОбъектДанных);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Использование этого механизма полностью исключает посредничество WebKit при чтении буфера обмена. Платформа самостоятельно забирает двоичные данные, преобразует их в объект конфигурации и встраивает в HTML-код письма с корректной кодировкой Base64.

Решение 2. Использование механизмов БСП (для платформ версий 8.3.15 – 8.3.23)

Если оперативно обновить платформу до версии 8.3.24 невозможно, нам придется использовать обходные программные пути, заложенные разработчиками конфигураций. В Библиотеке стандартных подсистем (БСП), на которой построен «1С:Документооборот», предусмотрен специальный механизм интеграции внешних двоичных данных через низкоуровневые компоненты.

Давайте посмотрим, как проверить и активировать этот функционал:

  1. В конфигурации присутствует специальный макет, представляющий собой внешнюю компоненту для работы с системным буфером обмена (обычно она называется КомпонентаПолученияКартинкиИзБуфера или аналогично в зависимости от версии БСП).
  2. Эта компонента перехватывает сочетание клавиш Ctrl+V в поле ввода, обращается к буферу на уровне операционной системы, сохраняет его содержимое во временный файл на диске компьютера пользователя и возвращает путь к этому файлу в 1С.
  3. После этого программный код БСП заменяет временный локальный путь на валидное встроенное вложение в теле письма.

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

Решение 3. Использование программного перехвата событий HTML на стороне клиента

Для опытных разработчиков существует еще один способ обойти ограничения WebKit на старых версиях платформы 8.3.15 – 8.3.17. Мы можем программнодривить содержимое HTML-документа, добавив в него JavaScript-перехватчик события вставки (onpaste).

Рассмотрим логику этого процесса:

Мы можем внедрить в текст HTML-документа скрипт, который будет отслеживать событие вставки, считывать данные и передавать их обратно в 1С через механизм Комментарий или через специальное событие формы. Посмотрим на пример концептуальной схемы такого обработчика:


// Пример JS-кода, внедряемого в HTML-поле форматированного документа
document.onpaste = function (event) {
    var items = (event.clipboardData || event.originalEvent.clipboardData).items;
    for (var i = 0 ; i < items.length ; i++) {
        var item = items[i];
        if (item.kind === 'file') {
            var blob = item.getAsFile();
            var reader = new FileReader();
            reader.onload = function(event) {
                // Получаем Base64-строку двоичного объекта
                var base64Data = event.target.result;
                // Передаем эту строку обратно в платформу 1С через системный вызов
                window.external.Notification(base64Data);
            };
            reader.readAsDataURL(blob);
        }
    }
};

Этот способ требует глубокого понимания взаимодействия встроенного браузера и платформы, однако он позволяет полностью автоматизировать процесс вставки на любых версиях платформы, начиная с 8.3.15, без необходимости обновления и без использования внешних компонент.

Решение 4. Настройка альтернативных утилит на рабочих местах пользователей

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

Вместо стандартного инструмента создания снимков экрана Windows, который помещает в буфер обмена неформатированные «сырые» данные, порекомендуйте пользователям установить специализированные бесплатные утилиты для захвата экрана (например, ShareX, Lightshot или PicPick).

В настройках этих программ можно задать автоматическое действие при создании снимка: вместо простого копирования растра в буфер обмена утилита будет сохранять файл во временную папку и помещать в буфер обмена уже полностью сформированный файл в формате PNG. При вставке такого объекта WebKit внутри 1С отработает корректно, так как он будет иметь дело не с «сырыми» байтами памяти, а с полноценной структурой файла.

Резюме и рекомендации

Подводя итоги нашего анализа, выделим ключевые рекомендации для устранения проблемы отображения объектов из буфера обмена в 1С:

← На главную