Как программно прочитать данные из буфера обмена в 1С:Предприятие?

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

В процессе разработки в среде 1С часто возникает задача автоматизации ввода данных, когда пользователю удобнее всего скопировать информацию из внешнего источника и нажать одну кнопку в программе. Однако стандартные методы чтения из буфера обмена в операционных системах семейства Windows Server или в современных версиях платформы могут сталкиваться с ограничениями безопасности или особенностями архитектуры. В этой статье мы подробно разберем, почему старые способы через COMОбъект("htmlfile") могут возвращать пустую строку, и рассмотрим современные, стабильные альтернативы.

Метод 1. Использование штатных асинхронных функций платформы (8.3.18+)

Начиная с версии платформы 8.3.18, разработчики 1С добавили механизмы, которые позволяют работать с буфером обмена напрямую, без использования сторонних библиотек и небезопасных COM-объектов. Это наиболее правильный и рекомендуемый способ для современных конфигураций. Рассмотрим, как реализовать чтение текста из буфера обмена асинхронно.

Для начала проанализируем структуру работы. Вместо синхронного вызова, который блокирует интерфейс, мы используем метод ПолучитьСодержимоеБуфераОбменаАсинх(). Он возвращает обещание (Promise), которое при завершении предоставляет объект типа СодержимоеБуфераОбмена.

Пример программного кода для реализации этой задачи:


&НаКлиенте
Асинх Процедура ПрочитатьИзБуфераНажатие(Команда)
    
    // Получаем содержимое буфера обмена
    СодержимоеБуфера = Ждать ПолучитьСодержимоеБуфераОбменаАсинх();
    
    // Проверяем, есть ли в буфере текстовые данные
    Если СодержимоеБуфера.СодержитТекст() Тогда
        ТекстИзБуфера = Ждать СодержимоеБуфера.ПолучитьТекстАсинх();
        Сообщить("Данные из буфера: " + ТекстИзБуфера);
    Иначе
        Сообщить("Буфер обмена не содержит текстовых данных.");
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: Данные методы работают на стороне клиента (Тонкий клиент, Веб-клиент). В веб-клиенте браузер может запросить разрешение у пользователя на доступ к буферу обмена — это стандартная мера безопасности Permissions API. Программный вызов должен быть инициирован непосредственным действием пользователя (например, нажатием на кнопку).

Метод 2. Использование внешней компоненты (VanessaExt)

Если ваша платформа ниже версии 8.3.18 или штатные методы по какой-то причине не подходят, эффективным решением является использование внешних компонент. Одной из самых популярных и надежных является библиотека VanessaExt. Она позволяет взаимодействовать с системными функциями Windows напрямую, минуя ограничения движка Internet Explorer.

Рассмотрим алгоритм подключения и использования такой компоненты. Сначала библиотеку (например, VanessaExtWin64.dll) необходимо подключить в сессии 1С.


&НаКлиенте
Процедура ПрочитатьЧерезВнешнююКомпоненту()
    
    ПутьКФайлу = "C:\Libs\VanessaExtWin64.dll"; // Путь к библиотеке
    РезультатПодключения = ПодключитьВнешнююКомпоненту(ПутьКФайлу, "Vanessa", ТипВнешнейКомпоненты.Native);
    
    Если РезультатПодключения Тогда
        Компонента = Новый("AddIn.Vanessa.VanessaExt");
        // Предположим, метод компоненты называется ПолучитьТекстБуфераОбмена
        Текст = Компонента.ПолучитьТекстБуфераОбмена();
        Сообщить("Результат: " + Текст);
    КонецЕсли;
    
КонецПроцедуры

Использование Native-компонент является более стабильным решением, чем работа через COMОбъект, так как они работают быстрее и имеют меньше зависимостей от настроек безопасности браузера в операционной системе.

Метод 3. Исправление работы через htmlfile (настройки безопасности)

Если вы все же решили использовать классический способ через COMОбъект("htmlfile"), который часто встречается в старых примерах кода, важно понимать, почему он может возвращать пустую строку. Проблема заключается в том, что объект htmlfile использует движок Internet Explorer, в котором по умолчанию (особенно на Windows Server 2012/2016/2019) включена «Конфигурация усиленной безопасности».

Для исправления ситуации выполним следующие шаги:

  1. Откройте Панель управления -> Свойства обозревателя (Internet Options).
  2. Перейдите на вкладку Безопасность.
  3. Выберите зону (обычно это «Надежные сайты» или «Локальная интрасеть») и нажмите кнопку Другой.
  4. В списке параметров найдите раздел Сценарии.
  5. Установите значение «Включить» для параметра «Разрешить программный доступ к буферу обмена» (Allow programmatic clipboard access).

После изменения этих настроек старый код должен начать работать:


хтмл = Новый COMОбъект("htmlfile");
СтрокаБуфера = хтмл.parentWindow.clipboardData.getData("text");
Сообщить(СтрокаБуфера);

Метод 4. Вызов PowerShell для получения данных

В системных средах, где запрещена регистрация сторонних DLL и заблокированы COM-объекты браузера, можно воспользоваться мощью PowerShell, который интегрирован в Windows Server 2012 R2. Этот метод позволяет получить текст из буфера обмена через командную строку.

Разберем, как реализовать это в 1С:

  1. Сформируем команду PowerShell Get-Clipboard.
  2. Запустим ее через ЗапуститьПриложение с перенаправлением вывода в текстовый файл.
  3. Прочитаем файл средствами 1С и удалим его.

&НаКлиенте
Функция ПолучитьТекстИзPowerShell()
    
    ИмяФайла = КаталогВременныхФайлов() + "clipboard_data.txt";
    Команда = "powershell -command ""Get-Clipboard | Out-File -FilePath '" + ИмяФайла + "' -Encoding utf8""";
    
    // Запускаем процесс и ждем завершения (код 0 - успех)
    ЗапуститьПриложение(Команда, , Истина);
    
    ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
    Результат = ЧтениеТекста.Прочитать();
    ЧтениеТекста.Закрыть();
    
    УдалитьФайлы(ИмяФайла);
    
    Возврат Результат;
    
КонецФункции

Особенности работы в RDP-сессиях

Проанализируем ситуацию, когда код написан верно, но буфер все равно пуст при работе через удаленный рабочий стол (RDP). За синхронизацию буфера между вашим локальным компьютером и сервером отвечает процесс rdpclip.exe. Если этот процесс зависнет в сессии пользователя на сервере, программный доступ к буферу перестанет работать, хотя визуально «Копировать-Вставить» может продолжать функционировать частично.

Рекомендация: Если вы столкнулись с нестабильной работой кода на сервере, попробуйте перезапустить rdpclip.exe через диспетчер задач пользователя или проверьте групповые политики (GPO) на предмет запрета перенаправления буфера обмена (Do not allow Clipboard redirection).

Подводя итог, можно сказать: для современных систем (платформа 8.3.18 и выше) всегда выбирайте штатные асинхронные методы. Это гарантирует кроссплатформенность и соответствие стандартам безопасности. Для старых систем использование внешних компонент (Native API) является наиболее надежной и производительной альтернативой.

← На главную