В процессе разработки на платформе 1С:Предприятие часто возникает задача программного взаимодействия с буфером обмена — для этого подойдут инструменты автоматизации работы с буфером обмена 1С. Это может быть копирование сформированного JSON, ссылки на объект, артикула товара или любого другого текстового результата. Однако способы реализации этой задачи существенно различаются в зависимости от версии используемой платформы и режима работы клиента (тонкий, веб-клиент или терминальный доступ). Рассмотрим подробнее все доступные методы, разберем их преимущества и недостатки.
Этот метод часто используется на старых версиях платформы (ниже 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 и только в толстом или тонком клиенте. В веб-клиенте (через браузер) этот код вызовет ошибку.
Если нам нужно скопировать текст в фоне, не заставляя пользователя видеть процесс выделения текста в поле, мы можем воспользоваться другим COM-объектом — htmlfile. Этот способ более элегантен, так как он напрямую обращается к API буфера обмена через объект браузера Internet Explorer, встроенный в Windows.
Выясним, как это реализовать программно:
&НаКлиенте
Процедура КопироватьЧерезHTML(ТекстДляКопирования)
Попытка
HTMLДокумент = Новый COMОбъект("htmlfile");
// Метод setData позволяет напрямую поместить текст в буфер
HTMLДокумент.ParentWindow.ClipboardData.SetData("Text", ТекстДляКопирования);
ПоказатьОповещениеПользователя("Успех", , "Текст успешно скопирован в буфер обмена");
Исключение
Сообщить("Ошибка доступа к буферу обмена через COM.");
КонецПопытки;
КонецПроцедуры
Этот метод считается более надежным, так как он не зависит от фокуса на форме и не имитирует физические нажатия клавиш. Однако у него есть свои ограничения: он также работает только под Windows и зависит от настроек безопасности системы (иногда доступ к буферу может быть заблокирован политиками IE).
Начиная с версии платформы 8.3.24, фирма «1С» добавила долгожданный объект СредстваБуфераОбмена. Это решение является кроссплатформенным, то есть работает и на Windows, и на Linux, и на macOS. Более того, оно поддерживается в веб-клиенте.
Рассмотрим, как выглядит современный подход к решению задачи:
&НаКлиенте
Асинхронная Процедура КопироватьНативно(Команда)
Текст = "Пример данных для буфера";
// Создаем объект содержимого буфера
Содержимое = Новый СодержимоеБуфераОбмена;
Содержимое.УстановитьТекст(Текст);
// Помещаем данные в системный буфер обмена
Ждать СредстваБуфераОбмена.УстановитьСодержимоеАсинх (Содержимое);
ПоказатьОповещениеПользователя("Готово", , "Данные скопированы!");
КонецПроцедуры
Важный момент: Обратите внимание на использование ключевого слова Асинхронная и Ждать. Работа с буфером обмена в современных версиях платформы реализована через асинхронные вызовы. Это необходимо для того, чтобы не блокировать интерфейс пользователя и корректно обрабатывать разрешения в браузерах (в веб-клиенте браузер может запросить разрешение на доступ к буферу).
Если ваша платформа ниже 8.3.24, а использование COM-объектов невозможно (например, вы работаете на Linux или в 64-битном клиенте, где есть сложности с регистрацией 32-битных библиотек), единственным надежным вариантом остается использование внешних компонент. Разберем, в чем их преимущество.
Внешние компоненты, написанные на Native API, позволяют:
SendKeys).Обычно использование компоненты сводится к её загрузке и вызову метода Копировать(), куда передается нужная строка.
Проанализируем ситуацию и выберем оптимальный путь:
СредстваБуфераОбмена. Это самый стабильный и поддерживаемый вендором способ. Не забудьте, что он работает независимо от установленного режима совместимости конфигурации (главное — версия самой платформы).htmlfile.ПолеHTMLДокумента и выполнять JavaScript-код navigator.clipboard.writeText().Использование Wscript.Shell с методом SendKeys стоит оставить на крайний случай, когда другие варианты недоступны, так как этот метод наименее стабилен и сильно зависит от фокуса интерфейса и состояния системы пользователя.