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

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

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

Способ 1: Использование COM-объекта Wscript.Shell (эмуляция нажатия клавиш)

Этот метод часто используется на старых версиях платформы (ниже 8.3.24), где отсутствует встроенный объект для работы с буфером. Суть метода заключается в том, чтобы активизировать нужный элемент управления на форме, а затем программно отправить команды «Выделить все» (Ctrl+A) и «Копировать» (Ctrl+C). Проанализируем реализацию этого подхода.

Для корректной работы необходимо сначала убедиться, что текстовое поле, данные из которого мы хотим скопировать, доступно для редактирования или хотя бы для выделения, и на него установлен фокус. Посмотрим на пример кода:


&НаКлиенте
Процедура СформироватьИКопировать(Команда)
    // 1. Выполняем формирование данных (например, на сервере)
    СформироватьДанныеНаСервере();
    
    // 2. Устанавливаем фокус на элемент формы, где лежит результат
    ТекущийЭлемент = Элементы.РезультатТекст;
    
    // 3. Используем обработчик ожидания. 
    // Это критически важно, так как интерфейсу нужно время для завершения фокуса.
    ПодключитьОбработчикОжидания("ВыполнитьКопирование", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьКопирование()
    Попытка
        Shell = Новый COMОбъект("Wscript.Shell");
        // Эмулируем нажатие Ctrl+A (выделить все) и Ctrl+C (копировать)
        // Важно: в некоторых случаях требуется заглавная буква, например "^A"
        Shell.SendKeys("^a");
        Shell.SendKeys("^c");
    Исключение
        Сообщить("Не удалось обратиться к объекту Wscript.Shell. Возможно, ограничены права.");
    КонецПопытки;
КонецПроцедуры

Разберем важный нюанс: метод SendKeys крайне чувствителен к текущей раскладке клавиатуры пользователя. Если у пользователя включена русская раскладка, комбинация ^c может не сработать. Именно поэтому в обсуждениях часто рекомендуют пробовать разные регистры или проверять окружение. Кроме того, данный метод работает только в ОС Windows и только в толстом или тонком клиенте. В веб-клиенте (через браузер) этот код вызовет ошибку.

Способ 2: Использование объекта htmlfile (тихое копирование)

Если нам нужно скопировать текст в фоне, не заставляя пользователя видеть процесс выделения текста в поле, мы можем воспользоваться другим COM-объектом — htmlfile. Этот способ более элегантен, так как он напрямую обращается к API буфера обмена через объект браузера Internet Explorer, встроенный в Windows.

Выясним, как это реализовать программно:


&НаКлиенте
Процедура КопироватьЧерезHTML(ТекстДляКопирования)
    Попытка
        HTMLДокумент = Новый COMОбъект("htmlfile");
        // Метод setData позволяет напрямую поместить текст в буфер
        HTMLДокумент.ParentWindow.ClipboardData.SetData("Text", ТекстДляКопирования);
        ПоказатьОповещениеПользователя("Успех", , "Текст успешно скопирован в буфер обмена");
    Исключение
        Сообщить("Ошибка доступа к буферу обмена через COM.");
    КонецПопытки;
КонецПроцедуры

Этот метод считается более надежным, так как он не зависит от фокуса на форме и не имитирует физические нажатия клавиш. Однако у него есть свои ограничения: он также работает только под Windows и зависит от настроек безопасности системы (иногда доступ к буферу может быть заблокирован политиками IE).

Способ 3: Нативные средства платформы (версия 8.3.24 и выше)

Начиная с версии платформы 8.3.24, фирма «1С» добавила долгожданный объект СредстваБуфераОбмена. Это решение является кроссплатформенным, то есть работает и на Windows, и на Linux, и на macOS. Более того, оно поддерживается в веб-клиенте.

Рассмотрим, как выглядит современный подход к решению задачи:


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

КонецПроцедуры

Важный момент: Обратите внимание на использование ключевого слова Асинхронная и Ждать. Работа с буфером обмена в современных версиях платформы реализована через асинхронные вызовы. Это необходимо для того, чтобы не блокировать интерфейс пользователя и корректно обрабатывать разрешения в браузерах (в веб-клиенте браузер может запросить разрешение на доступ к буферу).

Способ 4: Внешние компоненты (Native API)

Если ваша платформа ниже 8.3.24, а использование COM-объектов невозможно (например, вы работаете на Linux или в 64-битном клиенте, где есть сложности с регистрацией 32-битных библиотек), единственным надежным вариантом остается использование внешних компонент. Разберем, в чем их преимущество.

Внешние компоненты, написанные на Native API, позволяют:

  1. Работать напрямую с системным API операционной системы.
  2. Избежать зависимости от раскладки клавиатуры (в отличие от SendKeys).
  3. Обеспечить работу в 64-битных приложениях 1С без дополнительных настроек.

Обычно использование компоненты сводится к её загрузке и вызову метода Копировать(), куда передается нужная строка.

Рекомендации по выбору метода

Проанализируем ситуацию и выберем оптимальный путь:

Использование Wscript.Shell с методом SendKeys стоит оставить на крайний случай, когда другие варианты недоступны, так как этот метод наименее стабилен и сильно зависит от фокуса интерфейса и состояния системы пользователя.

← На главную