В процессе разработки прикладных решений на платформе 1С:Предприятие 8 часто возникает задача: сгенерировать ссылку, уникальный идентификатор, путь к файлу или иной служебный текст и предоставить его пользователю так, чтобы он мог легко скопировать эти данные в буфер обмена и использовать вне системы (например, отправить в мессенджере или вставить в сторонний документ).
Стандартный метод Сообщить() далеко не всегда удовлетворяет требованиям юзабилити (UX). Панель сообщений внизу экрана не всем очевидна, а копирование из нее требует вызова контекстного меню правой кнопкой мыши, что усложняет жизнь рядовому пользователю. В этой статье мы подробно разберем, как решить эту задачу изящно и современно, используя различные подходы в управляемых формах.
---
Если вы работаете на современных версиях платформы 1С (начиная с релиза 8.3.24), вам больше не нужно заставлять пользователя вручную выделять и копировать текст. Разработчики платформы добавили штатный и безопасный асинхронный механизм работы с буфером обмена операционной системы.
Для реализации автокопирования используется глобальный контекст СредстваБуфераОбмена. Давайте рассмотрим практический пример реализации этой процедуры на клиенте:
&НаКлиенте
Асинх Процедура ПолучитьСсылкуИКопировать(Команда)
// Формируем текст ссылки или сообщения
ТекстСсылки = "https://my-1c-server.ru/base/e1cib/data/Документ.РеализацияТоваровУслуг?ref=80eb00155d012a0711e1111111";
// Проверяем, доступна ли работа с буфером в текущей сессии
Если СредстваБуфераОбмена.ИспользованиеДоступно() Тогда
// Создаем объект элемента буфера обмена с типом "Текст"
ДанныеДляЗаписи = Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст, ТекстСсылки);
// Записываем данные в буфер асинхронно
Ждать СредстваБуфераОбмена.ПоместитьДанныеАсинх(ДанныеДляЗаписи);
// Информируем пользователя красивым всплывающим оповещением
ПоказатьОповещениеПользователя("Успешно!", , "Ссылка скопирована в буфер обмена.");
Иначе
// Резервный вариант, если буфер заблокирован браузером или политиками безопасности
ПоказатьПредупреждение(, "Не удалось скопировать автоматически. Скопируйте вручную: " + ТекстСсылки);
КонецЕсли;
КонецПроцедуры
Преимущества метода: Работает в одно нажатие кнопки, не требует от пользователя никаких лишних действий. Метод полностью кроссплатформенный (работает в тонком клиенте на Windows/Linux и в веб-клиенте в современных браузерах).
---
Если у вас нет необходимости выводить отдельное модальное окно, отличным решением будет разместить поле вывода непосредственно на текущей форме рядом с кнопкой генерации ссылки. Это исключает появление лишних окон и делает интерфейс лаконичным.
Разберем по шагам, как настроить такое поле, чтобы пользователю было максимально удобно копировать из него данные:
Строка (например, ИмяРеквизита: СсылкаДляКопирования).Истина (это предотвратит случайное изменение или удаление ссылки пользователем);Истина (как только пользователь кликнет по полю мышкой, весь текст ссылки автоматически выделится — останется нажать Ctrl+C);Ложь (чтобы случайно не сбросить значение).В коде генерации ссылки вам достаточно просто присвоить значение реквизиту формы:
&НаКлиенте
Процедура ПриНажатииКнопкиПолучитьСсылку(Команда)
// Генерация ссылки
Объект.СсылкаДляКопирования = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
КонецПроцедуры
---
Когда ссылку нужно выводить из разных документов или справочников, наиболее правильным архитектурным решением будет создание одной универсальной вспомогательной формы. Это позволит вам не загромождать основные экраны лишними реквизитами и не снимать типовые объекты с поддержки.
Проанализируем процесс реализации этого подхода:
Шаг 1. Создание общей формы в конфигураторе
Создайте новую Общую форму (назовем ее КопированиеТекста). Добавьте на форму строковый реквизит ТекстДляОтображения с неограниченной длиной и выведите его на форму как Поле текстового документа или многострочное Поле ввода. Настройте для этого поля свойство Только просмотр.
Для удобства добавьте на форму стандартную кнопку "Закрыть" или "Скопировать и закрыть".
В модуле общей формы напишите код для обработки переданных параметров при создании формы на сервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем переданный текст из параметров открытия формы
Если Параметры.Свойство("ТекстДляКопирования") Тогда
ЭтаФорма.ТекстДляОтображения = Параметры.ТекстДляКопирования;
КонецЕсли;
// Можно динамически менять заголовок окна в зависимости от переданного контекста
Если Параметры.Свойство("ЗаголовокОкна") Тогда
ЭтаФорма.Заголовок = Параметры.ЗаголовокОкна;
Иначе
ЭтаФорма.Заголовок = "Скопируйте полученную ссылку";
КонецЕсли;
КонецПроцедуры
Шаг 2. Вызов общей формы из любого места конфигурации
Теперь из любой формы вашей базы данных вы можете вызвать это вспомогательное окно буквально парой строк кода:
&НаКлиенте
Процедура СформироватьИПоказатьСсылку(Команда)
СсылкаНаОбъект = "https://my-cloud-1c.ru/base/#" + ПолучитьНавигационнуюСсылку(Объект.Ссылка);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ТекстДляКопирования", СсылкаНаОбъект);
ПараметрыОткрытия.Вставить("ЗаголовокОкна", "Ваша персональная ссылка");
ОткрытьФорму("ОбщаяФорма.КопированиеТекста", ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
Пользователь увидит аккуратное модальное или блокирующее окно, где текст уже будет готов к копированию обычным сочетанием клавиш Ctrl + C.
---
Если вы работаете на платформе версии ниже 8.3.24, у вас нет возможности использовать современное свойство СредстваБуфераОбмена, а веб-клиент вами не используется (все пользователи работают исключительно в Тонком или Толстом клиенте под операционной системой Windows), можно прибегнуть к проверенному методу работы через COM-интерфейс операционной системы.
Для этого используется обращение к возможностям библиотеки htmlfile. Этот код гораздо компактнее и безопаснее, чем динамическое создание и удаление элементов формы через HTML-документы:
#Если Клиент И Windows Тогда
&НаКлиенте
Процедура СкопироватьВБуферЧерезCOM(ТекстДляЗаписи)
Попытка
ОбъектБуфера = Новый COMОбъект("htmlfile");
ОбъектБуфера.ParentWindow.ClipboardData.SetData("Text", ТекстДляЗаписи);
ПоказатьОповещениеПользователя("Ссылка успешно скопирована!");
Исключение
// Если в системе ограничены права на запуск COM-объектов
ПоказатьПредупреждение(, "Не удалось автоматически скопировать текст в буфер обмена.");
КонецПопытки;
КонецПроцедуры
#КонецЕсли
Важное предупреждение: Данный метод не будет работать на операционных системах Linux, macOS, а также в веб-клиенте (через браузеры Chrome, Safari, Firefox). Используйте его только как временную меру для локальных Windows-сетей на старых релизах платформы.
---
Начинающие разработчики часто путают системный буфер обмена операционной системы с механизмами Библиотеки Стандартных Подсистем (БСП), а именно с функцией ОбщегоНазначения.СкопироватьВБуферОбмена().
Помните: внутренний буфер БСП сохраняет данные в параметрах сеанса 1С. Он предназначен исключительно для обмена данными внутри самой программы 1С (например, для копирования строк табличной части из одного документа для последующей вставки в другой документ той же базы). Скопированная таким образом ссылка не попадет в системный буфер Windows, и пользователь не сможет вставить её в мессенджер Telegram, WhatsApp или отправить по электронной почте.
---
Подводя итог нашему анализу, выберем оптимальную стратегию в зависимости от вашей текущей ситуации:
СредстваБуфераОбмена). Это стандарт разработки завтрашнего дня: быстро, надежно, кроссплатформенно.