В процессе разработки конфигураций на платформе 1С:Предприятие часто возникает задача программного помещения данных в буфер обмена. Это может быть результат сложного расчета, артикул товара, ссылка на объект или любой другой текст, который пользователь должен иметь возможность быстро «вставить» в стороннее приложение (Excel, браузер или текстовый редактор). Несмотря на то, что долгое время в платформе не было прямого метода для этой операции, существует несколько надежных способов реализации этой задачи. Разберем по шагам наиболее эффективные подходы для разных условий работы.
Этот метод считается классическим для приложений на Windows. Мы создаем невидимый объект браузерного движка, который имеет доступ к системному объекту ClipboardData. Рассмотрим, как это реализовать в коде:
// Пример для управляемых и обычных форм (Windows)
ОбъектКопирования = Новый COMОбъект("htmlfile");
ОбъектКопирования.ParentWindow.ClipboardData.SetData("Text", "Ваш текст для копирования");
Проанализируем этот код: мы инициализируем COM-объект htmlfile, который предоставляет доступ к программному интерфейсу Internet Explorer. Метод SetData принимает два параметра: формат данных (в данном случае "Text") и саму строку. Этот способ отлично работает в тонком и толстом клиенте под управлением ОС Windows.
Если нам нужно решить обратную задачу — получить данные из буфера, мы можем использовать метод GetData:
Объект = Новый COMОбъект("htmlfile");
ТекстИзБуфера = Объект.ParentWindow.ClipboardData.GetData("Text");
В ситуациях, когда работа с 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. Этот метод надежен, так как не зависит от настроек безопасности браузера.
Проанализируем современный подход. Начиная с версии платформы 8.3.18, разработчики 1С добавили встроенный механизм для работы с буфером обмена, который является кроссплатформенным и работает в том числе в веб-клиенте. Теперь нам не нужно использовать внешние COM-объекты.
Работа с буфером в новых версиях выполняется асинхронно, что соответствует современным стандартам разработки. Выясним, как это выглядит на практике:
// Помещение текста в буфер обмена
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияВБуфер", ЭтотОбъект);
ТекстДляКопирования = "Данные для буфера";
Менеджеры.БуферОбмена.НачатьПомещениеВБуферОбмена(ОписаниеОповещения, ТекстДляКопирования);
// Процедура обратного вызова
&НаКлиенте
Процедура ПослеПомещенияВБуфер(ДополнительныеПараметры) Экспорт
// Здесь можно уведомить пользователя об успехе
КонецПроцедуры
Этот способ является рекомендуемым для всех современных конфигураций (включая задачи, где задействован распаковщик и запаковщик файлов). Основные преимущества:
Если вашей задачей является копирование не просто строки, а целой области ячеек с сохранением форматирования (цвета, шрифты, границы) для последующей вставки, например, в Excel, следует использовать штатный метод объекта ТабличныйДокумент. Посмотрим на этот пример:
// Предположим, у нас есть сформированный ТабличныйДокумент
ТабДок.Показать(); // Документ должен быть доступен
ТабДок.Область("R1C1:R10C5").Выбрать(); // Выделяем нужную область
ТабДок.КопироватьВБуферОбмена();
Метод КопироватьВБуферОбмена() помещает данные в буфер в формате, который понимают офисные приложения (подробнее про форматированный документ), что значительно упрощает жизнь пользователям, работающим с отчетами.
Проанализируем несколько критических ситуаций, с которыми вы можете столкнуться:
echo | clip, помните, что такие символы как &, |, ^ требуют экранирования. Именно поэтому метод с временным файлом более универсален.rdpclip.exe. Если программный код отрабатывает без ошибок, но данные в буфере не появляются, проблема может быть на уровне настроек сервера или клиента RDP.Подводя итог, для старых версий платформы и Windows-клиентов оптимально использовать COMОбъект("htmlfile"), а для новых систем и обеспечения максимальной совместимости — штатный асинхронный МенеджерБуфераОбмена.