Как скопировать данные в системный буфер обмена Windows в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Решение 1. Использование внешней компоненты 1С++ (объект «БуферОбмена»)

Наиболее стабильным и производительным способом работы с буфером обмена в 1С 7.7 является использование возможностей популярной внешней компоненты 1С++. Она предоставляет готовый класс для чтения и записи строковых данных.

Рассмотрим пример кода:


Буфер = СоздатьОбъект("БуферОбмена");
Буфер.УстановитьТекст("Тестовая строка для вставки");
// Для получения текста обратно из буфера:
ТекстИзБуфера = Буфер.ПолучитьТекст();
Сообщить("В буфере: " + ТекстИзБуфера);

Разберем типичную проблему, с которой сталкиваются разработчики: платформа выдает ошибку при вызове СоздатьОбъект("БуферОбмена"). Причина заключается в используемой версии библиотеки 1cpp.dll:

  1. В старых сборках (например, в релизе 2.5.0.5) данный класс еще не был зарегистрирован или имел внутренние ошибки инициализации.
  2. Начиная с релиза 2.5.0.7 и выше, класс БуферОбмена инициализируется штатно и функционирует без нареканий.
  3. Рекомендуется переходить на актуальные стабильные версии ветки 3.2.x (например, 3.2.4.3). Переход на ветку 3.2 сохраняет обратную совместимость для прикладного кода, поэтому переписывать существующие модули, использующие 1С++, не потребуется.

Решение 2. Использование системного COM-объекта «htmlfile»

Если в информационной базе не используется внешняя компонента 1С++ и нет возможности зарегистрировать сторонние DLL, можно воспользоваться встроенным COM-сервером Microsoft HTML Document (htmlfile). Этот объект предоставляет доступ к объекту окна и интерфейсу clipboardData.

Посмотрим на пример записи данных в буфер:


ClipBrd = СоздатьОбъект("htmlfile");
ТекстДляБуфера = СокрЛП(Номенклатура.Артикул);
ClipBrd.ParentWindow.ClipboardData.SetData("Text", ТекстДляБуфера);

Выясним причину, почему этот метод может не срабатывать или возвращать пустое значение при чтении (GetData("Text")):

  1. Политики безопасности Internet Explorer и Windows. Обращение к ClipboardData жестко регламентируется политиками безопасности зон операционной системы. Если параметр «Разрешить программный доступ к буферу обмена» (Allow programmatic clipboard access) отключен или переведен в режим запроса подтверждения, COM-объект блокирует вызов, поскольку не может отобразить диалоговое окно пользователю. В серверных ОС с включенным режимом усиленной безопасности (IE ESC) этот механизм по умолчанию полностью заблокирован.
  2. Неполная инициализация DOM. В некоторых версиях Windows для корректной работы перед вызовом интерфейса окна документу требуется инициализация потока вызовом ClipBrd.Open() или первичной записью пустой разметки.

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

Проанализируем ситуации, когда COM-объект htmlfile заблокирован политиками безопасности, а установка 1С++ невозможна. В таких случаях можно применить штатные утилиты операционной системы.

1. Использование системной утилиты clip.exe (только для записи):

В состав Windows входит консольная программа clip.exe, позволяющая перенаправить вывод потока прямо в системный буфер. Чтобы избежать проблем с длинными строками, спецсимволами и кодировками, текст сохраняют во временный файл, а затем передают его утилите:


ВремФайл = КаталогВременныхФайлов() + "clip_temp.txt";
Т = СоздатьОбъект("Текст");
Т.ДобавитьСтроку(СокрЛП(РеквизитДляВставки));
Т.Записать(ВремФайл);

КомандаСистемы("cmd /c clip < """ + ВремФайл + """");
ФС.УдалитьФайл(ВремФайл);

Главное ограничение этого метода — он работает только на запись. Прочитать данные обратно из буфера утилита clip.exe не позволяет.

2. Использование PowerShell (чтение и запись):

Через вызов PowerShell можно осуществлять полноценное двустороннее взаимодействие с буфером обмена. Например, для записи текста применяется командлет Set-Clipboard или прямой вызов метода [System.Windows.Forms.Clipboard]::SetText(), а для чтения — командлет Get-Clipboard с перенаправлением результата во временный текстовый файл для последующей загрузки объектом Текст в 1С.

Очистка HTML-разметки от тегов (в 1С 7.7 и 1С 8)

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

  1. В платформе 1С 7.7: достаточно загрузить HTML-строку в объект htmlfile и прочитать свойство innerText тела документа:
    
    DocHTML = СоздатьОбъект("htmlfile");
    DocHTML.Open();
    DocHTML.Write(ИсходныйHTMLТекст);
    DocHTML.Close();
    ЧистыйТекст = DocHTML.Body.InnerText;
    
  2. В платформе 1С 8: для удаления тегов предусмотрены штатные методы — процедура ИзвлечьТекст(), объект ЧтениеHTML или чтение свойства текстового содержимого через ПостроительDOM. Начиная с версии платформы 8.3.24, для прямой работы с буфером появился специализированный асинхронный объект БуферОбменаДанными, не требующий использования COM-объектов операционной системы.
← На главную