При автоматизации рутинных операций в 1С 7.7 разработчики часто сталкиваются с задачей передачи сформированной строки в системный буфер обмена Windows (Clipboard). Это необходимо для быстрой вставки реквизитов документов, артикулов номенклатуры или комплексных текстовых блоков во внешние программы: текстовые редакторы, браузеры или мессенджеры. В платформе 1С 7.7 штатные средства прямого взаимодействия с буфером обмена операционной системы отсутствуют, поэтому приходится использовать внешние компоненты или системные механизмы. Разберем основные способы реализации этой задачи, возможные ошибки и пути их решения.
Наиболее стабильным и производительным способом работы с буфером обмена в 1С 7.7 является использование возможностей популярной внешней компоненты 1С++. Она предоставляет готовый класс для чтения и записи строковых данных.
Рассмотрим пример кода:
Буфер = СоздатьОбъект("БуферОбмена");
Буфер.УстановитьТекст("Тестовая строка для вставки");
// Для получения текста обратно из буфера:
ТекстИзБуфера = Буфер.ПолучитьТекст();
Сообщить("В буфере: " + ТекстИзБуфера);
Разберем типичную проблему, с которой сталкиваются разработчики: платформа выдает ошибку при вызове СоздатьОбъект("БуферОбмена"). Причина заключается в используемой версии библиотеки 1cpp.dll:
БуферОбмена инициализируется штатно и функционирует без нареканий.Если в информационной базе не используется внешняя компонента 1С++ и нет возможности зарегистрировать сторонние DLL, можно воспользоваться встроенным COM-сервером Microsoft HTML Document (htmlfile). Этот объект предоставляет доступ к объекту окна и интерфейсу clipboardData.
Посмотрим на пример записи данных в буфер:
ClipBrd = СоздатьОбъект("htmlfile");
ТекстДляБуфера = СокрЛП(Номенклатура.Артикул);
ClipBrd.ParentWindow.ClipboardData.SetData("Text", ТекстДляБуфера);
Выясним причину, почему этот метод может не срабатывать или возвращать пустое значение при чтении (GetData("Text")):
ClipboardData жестко регламентируется политиками безопасности зон операционной системы. Если параметр «Разрешить программный доступ к буферу обмена» (Allow programmatic clipboard access) отключен или переведен в режим запроса подтверждения, COM-объект блокирует вызов, поскольку не может отобразить диалоговое окно пользователю. В серверных ОС с включенным режимом усиленной безопасности (IE ESC) этот механизм по умолчанию полностью заблокирован.ClipBrd.Open() или первичной записью пустой разметки.Проанализируем ситуации, когда 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-текст и извлечь его чистым, без тегов. Разберем, как решить эту задачу правильно без манипуляций с буфером:
htmlfile и прочитать свойство innerText тела документа:
DocHTML = СоздатьОбъект("htmlfile");
DocHTML.Open();
DocHTML.Write(ИсходныйHTMLТекст);
DocHTML.Close();
ЧистыйТекст = DocHTML.Body.InnerText;
ИзвлечьТекст(), объект ЧтениеHTML или чтение свойства текстового содержимого через ПостроительDOM. Начиная с версии платформы 8.3.24, для прямой работы с буфером появился специализированный асинхронный объект БуферОбменаДанными, не требующий использования COM-объектов операционной системы.