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

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

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

Ограничения на перехват нажатий клавиш клавиатуры

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

  1. Пользователь копирует нужную информацию в буфер обмена средствами операционной системы.
  2. Переходит в интерфейс 1С и открывает нужный документ.
  3. Нажимает специально выведенную кнопку (например, ЗагрузитьИзБуфераОбмена) или использует системное сочетание клавиш для вставки.
  4. Система перехватывает содержимое буфера и прикрепляет его вложенным файлом к документу.

Решение для старых версий платформы: использование внешних компонент

До версии 8.3.24 платформа не умела полноценно работать с двоичными данными из буфера обмена без применения "костылей". Выясним причину: встроенные методы позволяли работать только с текстом. Для решения задачи разработчики использовали внешние компоненты, такие как Addin.Clipboard, или COM-объекты.

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


Объект = Новый("Addin.Clipboard");
Нечто = Объект.ПолучитьИзБуфераОбмена(); // Получаем буфер обмена

// Если формат (1) - jpg, (2) - bmp
Если ТипЗнч(Нечто) <> Тип("Картинка") Тогда
    Сообщить("В буфере обмена нет нужных данных!", СтатусСообщения.Важное);
    Возврат;
Иначе
    Сообщить("Данные успешно получены!");
    // Далее код сохранения "Нечто" в присоединенные файлы
КонецЕсли;

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

Нативная поддержка буфера обмена (начиная с платформы 8.3.24)

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

Проанализируем новые возможности. В платформе появился глобальный контекст СредстваБуфераОбмена. Теперь мы можем штатными средствами извлекать не только текст, но и любые двоичные данные, HTML-документы и прочее.

В клиентское приложение и формы были добавлены новые асинхронные события. Разберем процесс на практике: теперь программист может использовать обработчик ПриВставкеИзБуфераОбмена() или асинхронную функцию ожидания.

Кроме того, в свежих релизах типовых конфигураций (например, в современных версиях ERP, Комплексной автоматизации или УТ 11) функционал вставки данных из буфера в справочник "Присоединенные файлы" уже встроен "из коробки". Пользователю достаточно скопировать информацию, открыть список присоединенных файлов документа и нажать стандартную кнопку добавления из буфера — система автоматически конвертирует данные в файл и прикрепит его к объекту.

← На главную