Как вывести сообщение или ссылку пользователю в 1С для удобного копирования в буфер обмена?

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

В процессе разработки прикладных решений на платформе 1С:Предприятие 8 часто возникает задача: сгенерировать ссылку, уникальный идентификатор, путь к файлу или иной служебный текст и предоставить его пользователю так, чтобы он мог легко скопировать эти данные в буфер обмена и использовать вне системы (например, отправить в мессенджере или вставить в сторонний документ).

Стандартный метод Сообщить() далеко не всегда удовлетворяет требованиям юзабилити (UX). Панель сообщений внизу экрана не всем очевидна, а копирование из нее требует вызова контекстного меню правой кнопкой мыши, что усложняет жизнь рядовому пользователю. В этой статье мы подробно разберем, как решить эту задачу изящно и современно, используя различные подходы в управляемых формах.

---

Способ 1. Современное решение: прямое копирование в буфер обмена (для платформы 8.3.24 и выше)

Если вы работаете на современных версиях платформы 1С (начиная с релиза 8.3.24), вам больше не нужно заставлять пользователя вручную выделять и копировать текст. Разработчики платформы добавили штатный и безопасный асинхронный механизм работы с буфером обмена операционной системы.

Для реализации автокопирования используется глобальный контекст СредстваБуфераОбмена. Давайте рассмотрим практический пример реализации этой процедуры на клиенте:


&НаКлиенте
Асинх Процедура ПолучитьСсылкуИКопировать(Команда)
    
    // Формируем текст ссылки или сообщения
    ТекстСсылки = "https://my-1c-server.ru/base/e1cib/data/Документ.РеализацияТоваровУслуг?ref=80eb00155d012a0711e1111111"; 
    
    // Проверяем, доступна ли работа с буфером в текущей сессии
    Если СредстваБуфераОбмена.ИспользованиеДоступно() Тогда
        
        // Создаем объект элемента буфера обмена с типом "Текст"
        ДанныеДляЗаписи = Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст, ТекстСсылки);
        
        // Записываем данные в буфер асинхронно
        Ждать СредстваБуфераОбмена.ПоместитьДанныеАсинх(ДанныеДляЗаписи);
        
        // Информируем пользователя красивым всплывающим оповещением
        ПоказатьОповещениеПользователя("Успешно!", , "Ссылка скопирована в буфер обмена.");
        
    Иначе
        // Резервный вариант, если буфер заблокирован браузером или политиками безопасности
        ПоказатьПредупреждение(, "Не удалось скопировать автоматически. Скопируйте вручную: " + ТекстСсылки);
    КонецЕсли;
    
КонецПроцедуры

Преимущества метода: Работает в одно нажатие кнопки, не требует от пользователя никаких лишних действий. Метод полностью кроссплатформенный (работает в тонком клиенте на Windows/Linux и в веб-клиенте в современных браузерах).

---

Способ 2. Визуальное решение: поле ввода со специальным оформлением на текущей форме

Если у вас нет необходимости выводить отдельное модальное окно, отличным решением будет разместить поле вывода непосредственно на текущей форме рядом с кнопкой генерации ссылки. Это исключает появление лишних окон и делает интерфейс лаконичным.

Разберем по шагам, как настроить такое поле, чтобы пользователю было максимально удобно копировать из него данные:

  1. Создайте на управляемой форме новый реквизит с типом Строка (например, ИмяРеквизита: СсылкаДляКопирования).
  2. Перетащите его на форму, создав элемент управления Поле ввода.
  3. В свойствах созданного элемента формы установите следующие параметры:
    • Только просмотр = Истина (это предотвратит случайное изменение или удаление ссылки пользователем);
    • Выделять текст при входе = Истина (как только пользователь кликнет по полю мышкой, весь текст ссылки автоматически выделится — останется нажать Ctrl+C);
    • Кнопка очистки = Ложь (чтобы случайно не сбросить значение).
  4. Дополнительно в свойствах поля ввода в группе "Кнопки" можно добавить собственную кнопку (с изображением иконки копирования), при нажатии на которую будет срабатывать программный код копирования в буфер обмена из Способа 1.

В коде генерации ссылки вам достаточно просто присвоить значение реквизиту формы:


&НаКлиенте
Процедура ПриНажатииКнопкиПолучитьСсылку(Команда)
    // Генерация ссылки
    Объект.СсылкаДляКопирования = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
КонецПроцедуры

---

Способ 3. Универсальное решение: создание общей вспомогательной формы

Когда ссылку нужно выводить из разных документов или справочников, наиболее правильным архитектурным решением будет создание одной универсальной вспомогательной формы. Это позволит вам не загромождать основные экраны лишними реквизитами и не снимать типовые объекты с поддержки.

Проанализируем процесс реализации этого подхода:

Шаг 1. Создание общей формы в конфигураторе

Создайте новую Общую форму (назовем ее КопированиеТекста). Добавьте на форму строковый реквизит ТекстДляОтображения с неограниченной длиной и выведите его на форму как Поле текстового документа или многострочное Поле ввода. Настройте для этого поля свойство Только просмотр.

Для удобства добавьте на форму стандартную кнопку "Закрыть" или "Скопировать и закрыть".

В модуле общей формы напишите код для обработки переданных параметров при создании формы на сервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем переданный текст из параметров открытия формы
    Если Параметры.Свойство("ТекстДляКопирования") Тогда
        ЭтаФорма.ТекстДляОтображения = Параметры.ТекстДляКопирования;
    КонецЕсли;
    
    // Можно динамически менять заголовок окна в зависимости от переданного контекста
    Если Параметры.Свойство("ЗаголовокОкна") Тогда
        ЭтаФорма.Заголовок = Параметры.ЗаголовокОкна;
    Иначе
        ЭтаФорма.Заголовок = "Скопируйте полученную ссылку";
    КонецЕсли;
    
КонецПроцедуры

Шаг 2. Вызов общей формы из любого места конфигурации

Теперь из любой формы вашей базы данных вы можете вызвать это вспомогательное окно буквально парой строк кода:


&НаКлиенте
Процедура СформироватьИПоказатьСсылку(Команда)
    
    СсылкаНаОбъект = "https://my-cloud-1c.ru/base/#" + ПолучитьНавигационнуюСсылку(Объект.Ссылка);
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ТекстДляКопирования", СсылкаНаОбъект);
    ПараметрыОткрытия.Вставить("ЗаголовокОкна", "Ваша персональная ссылка");
    
    ОткрытьФорму("ОбщаяФорма.КопированиеТекста", ПараметрыОткрытия, ЭтотОбъект);
    
КонецПроцедуры

Пользователь увидит аккуратное модальное или блокирующее окно, где текст уже будет готов к копированию обычным сочетанием клавиш Ctrl + C.

---

Способ 4. Альтернативное решение для тонкого клиента Windows (через COM-объект)

Если вы работаете на платформе версии ниже 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 или отправить по электронной почте.

---

Резюме и рекомендации

Подводя итог нашему анализу, выберем оптимальную стратегию в зависимости от вашей текущей ситуации:

← На главную