При обновлении технологической платформы 1С с более ранних версий (например, 8.3.13) на версию 8.3.15 и выше многие специалисты сталкиваются с неприятным поведением системы при работе с почтовым клиентом. В конфигурациях, активно использующих встроенную почту (таких как «1С:Документооборот»), при попытке вставить скопированные данные из буфера обмена (через комбинацию клавиш Ctrl+V) в тело электронного письма вместо ожидаемого контента отображается лишь небольшая заглушка с вопросительным знаком. При этом адресат получает абсолютно пустое письмо без вложений.
В рамках этой статьи мы подробно проанализируем технические причины возникновения этой неполадки, разберем физику процесса взаимодействия платформы с буфером обмена операционной системы и предложим несколько вариантов решения этой задачи — от простых пользовательских обходных путей до системного программного исправления на уровне кода платформы.
Для того чтобы понять, почему в более старых версиях платформы вставка содержимого экрана работала корректно, а начиная с версии 8.3.15 начала давать сбой, проанализируем внутренние изменения в архитектуре системы 1С:
data:image/png;base64,...) либо корректно сохранял во временную директорию локального компьютера в виде отдельного файла.blob:...-адрес).blob. В результате парсинга HTML-кода платформа заменяет неопознанный объект стандартной заглушкой (знаком вопроса). При отправке такого сообщения почтовый сервер или почтовый клиент получателя (например, Microsoft Outlook) не имеют доступа к локальной памяти отправителя, из-за чего на месте вставленного элемента отображается пустота.Таким образом, мы имеем дело с несовместимостью нового встроенного браузера WebKit и механизмов сериализации двоичных данных в платформе 1С.
Рассмотрим интересный нюанс, который часто замечают пользователи: если скопировать данные экрана напрямую (нажатием клавиши Print Screen) и вставить в 1С — отображается знак вопроса. Однако, если сначала вставить эти же данные в простейший редактор (например, MS Paint), повторно выделить их там, скопировать через Ctrl+C и уже затем вставить в 1С — все отображается корректно.
Давайте разберем по шагам, почему так происходит:
CF_DIB или CF_BITMAP), не имеющие четко структурированной файловой обертки.ФорматированныйДокумент.Безусловно, ручное использование сторонних редакторов — это лишь временный костыль, усложняющий работу конечных пользователей. Перейдем к разбору системных методов решения проблемы.
Если у вас есть возможность обновить технологическую платформу до современных релизов (ветка 8.3.24 и выше), то проблему можно решить наиболее элегантным и штатным способом. Начиная с версии 8.3.24, в платформе появился специализированный объект СредстваБуфераОбмена, предоставляющий асинхронный доступ к буферу операционной системы на уровне кода 1С.
Проанализируем пример кода, который позволяет перехватить данные из буфера обмена и корректно интегрировать их в документ без привлечения сторонних утилит:
&НаКлиенте
Асинх Процедура ОбработатьВставкуИзБуфераОбмена()
// Проверяем, содержатся ли в буфере обмена двоичные данные нужного формата
Если СредстваБуфераОбмена.СодержитДанные(СтандартныйФорматДанныхБуфераОбмена.Картинка) Тогда
// Асинхронно извлекаем объект из буфера обмена
ОбъектДанных = Ожидать СредстваБуфераОбмена.ПолучитьДанныеАсинх(СтандартныйФорматДанныхБуфераОбмена.Картинка);
Если ОбъектДанных <> Неопределено Тогда
// Вызываем процедуру интеграции полученного двоичного объекта в форматированный документ
ИнтегрироватьОбъектВДокумент(ОбъектДанных);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование этого механизма полностью исключает посредничество WebKit при чтении буфера обмена. Платформа самостоятельно забирает двоичные данные, преобразует их в объект конфигурации и встраивает в HTML-код письма с корректной кодировкой Base64.
Если оперативно обновить платформу до версии 8.3.24 невозможно, нам придется использовать обходные программные пути, заложенные разработчиками конфигураций. В Библиотеке стандартных подсистем (БСП), на которой построен «1С:Документооборот», предусмотрен специальный механизм интеграции внешних двоичных данных через низкоуровневые компоненты.
Давайте посмотрим, как проверить и активировать этот функционал:
КомпонентаПолученияКартинкиИзБуфера или аналогично в зависимости от версии БСП).Что нужно сделать разработчику: Проверьте, не отключена ли данная компонента в настройках вашей информационной базы (например, в персональных настройках пользователя или в общих настройках работы с файлами). Если при обновлении конфигурации или платформы этот обработчик «слетел», необходимо восстановить привязку событий формы письма к методам этой внешней компоненты.
Для опытных разработчиков существует еще один способ обойти ограничения 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, без необходимости обновления и без использования внешних компонент.
Если программное вмешательство в код конфигурации временно заблокировано (например, база находится на строгой поддержке), мы можем оптимизировать работу пользователей за счет настройки операционной системы.
Вместо стандартного инструмента создания снимков экрана Windows, который помещает в буфер обмена неформатированные «сырые» данные, порекомендуйте пользователям установить специализированные бесплатные утилиты для захвата экрана (например, ShareX, Lightshot или PicPick).
В настройках этих программ можно задать автоматическое действие при создании снимка: вместо простого копирования растра в буфер обмена утилита будет сохранять файл во временную папку и помещать в буфер обмена уже полностью сформированный файл в формате PNG. При вставке такого объекта WebKit внутри 1С отработает корректно, так как он будет иметь дело не с «сырыми» байтами памяти, а с полноценной структурой файла.
Подводя итоги нашего анализа, выделим ключевые рекомендации для устранения проблемы отображения объектов из буфера обмена в 1С: