Как программно сохранить данные в буфер обмена в 1С

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

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

Способ 1. Использование COM-объекта htmlfile (универсальный для Windows)

Этот метод считается классическим для приложений на Windows. Мы создаем невидимый объект браузерного движка, который имеет доступ к системному объекту ClipboardData. Рассмотрим, как это реализовать в коде:


// Пример для управляемых и обычных форм (Windows)
ОбъектКопирования = Новый COMОбъект("htmlfile");
ОбъектКопирования.ParentWindow.ClipboardData.SetData("Text", "Ваш текст для копирования");

Проанализируем этот код: мы инициализируем COM-объект htmlfile, который предоставляет доступ к программному интерфейсу Internet Explorer. Метод SetData принимает два параметра: формат данных (в данном случае "Text") и саму строку. Этот способ отлично работает в тонком и толстом клиенте под управлением ОС Windows.

Если нам нужно решить обратную задачу — получить данные из буфера, мы можем использовать метод GetData:


Объект = Новый COMОбъект("htmlfile");
ТекстИзБуфера = Объект.ParentWindow.ClipboardData.GetData("Text");

Способ 2. Работа через системную утилиту clip.exe и WScript.Shell

В ситуациях, когда работа с COM-объектом htmlfile ограничена политиками безопасности или настройками Internet Explorer (например, в среде RDP), можно воспользоваться встроенной в Windows консольной утилитой clip. Рассмотрим вариант реализации с использованием временного файла, который позволяет избежать проблем с кодировкой и спецсимволами:


ТекстДляКопирования = "Пример текста";
ПутьВременногоФайла = ПолучитьИмяВременногоФайла("txt");

// Записываем текст во временный файл в кодировке OEM (для корректной работы clip)
Тд = Новый ТекстовыйДокумент;
Тд.УстановитьТекст(ТекстДляКопирования);
Тд.Записать(ПутьВременногоФайла, КодировкаТекста.OEM);

// Выполняем команду через оболочку Windows
КомОбъект = Новый COMОбъект("WScript.Shell");
// Команда объединяет чтение файла и его передачу в clip, затем удаление файла
Команда = "%comspec% /c type """ + ПутьВременногоФайла + """ | clip & del """ + ПутьВременногоФайла + """";
КомОбъект.Run(Команда, 0, Истина);

Важный момент: использование конструкции %comspec% /c позволяет запустить командный интерпретатор, а символ | (pipe) перенаправляет поток вывода команды type на вход утилиты clip. Этот метод надежен, так как не зависит от настроек безопасности браузера.

Способ 3. Использование штатного Менеджера буфера обмена (платформа 8.3.18+)

Проанализируем современный подход. Начиная с версии платформы 8.3.18, разработчики 1С добавили встроенный механизм для работы с буфером обмена, который является кроссплатформенным и работает в том числе в веб-клиенте. Теперь нам не нужно использовать внешние COM-объекты.

Работа с буфером в новых версиях выполняется асинхронно, что соответствует современным стандартам разработки. Выясним, как это выглядит на практике:


// Помещение текста в буфер обмена
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияВБуфер", ЭтотОбъект);
ТекстДляКопирования = "Данные для буфера";
Менеджеры.БуферОбмена.НачатьПомещениеВБуферОбмена(ОписаниеОповещения, ТекстДляКопирования);

// Процедура обратного вызова
&НаКлиенте
Процедура ПослеПомещенияВБуфер(ДополнительныеПараметры) Экспорт
    // Здесь можно уведомить пользователя об успехе
КонецПроцедуры

Этот способ является рекомендуемым для всех современных конфигураций (включая задачи, где задействован распаковщик и запаковщик файлов). Основные преимущества:

  1. Поддержка в веб-клиенте, где также актуален алхимический способ выполнения произвольного кода (браузер может запросить разрешение у пользователя).
  2. Кроссплатформенность (будет работать на Linux и macOS).
  3. Безопасность и отсутствие зависимости от сторонних библиотек, обеспечивая алхимический способ работы с двоичными данными.

Способ 4. Копирование из Табличного документа

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


// Предположим, у нас есть сформированный ТабличныйДокумент
ТабДок.Показать(); // Документ должен быть доступен
ТабДок.Область("R1C1:R10C5").Выбрать(); // Выделяем нужную область
ТабДок.КопироватьВБуферОбмена();

Метод КопироватьВБуферОбмена() помещает данные в буфер в формате, который понимают офисные приложения (подробнее про форматированный документ), что значительно упрощает жизнь пользователям, работающим с отчетами.

Особенности и ограничения

Проанализируем несколько критических ситуаций, с которыми вы можете столкнуться:

Подводя итог, для старых версий платформы и Windows-клиентов оптимально использовать COMОбъект("htmlfile"), а для новых систем и обеспечения максимальной совместимости — штатный асинхронный МенеджерБуфераОбмена.

← На главную