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

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

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

Проблема стандартных методов вывода

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

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

Решение 1: Использование метода ВвестиСтроку и ВвестиЗначение

Одним из самых простых и эффективных обходных путей является использование функций диалога ввода. Несмотря на то, что они предназначены для получения данных от пользователя, их можно адаптировать для вывода информации. Разберем этот метод подробнее.

Функции ВвестиСтроку() или ВвестиЗначение() создают модальное (или блокирующее весь интерфейс) окно в самом центре экрана. Главное преимущество здесь в том, что поле ввода позволяет взаимодействовать с текстом.

Посмотрим на пример кода, который можно использовать в обработчике:


ТекстДляКопирования = "Это важное сообщение, которое можно скопировать!";
ВвестиСтроку(ТекстДляКопирования, "Информационное сообщение (текст ниже можно выделить и скопировать)", , Истина);

В данном примере мы передаем текст сообщения в качестве начального значения переменной. Пользователь увидит окно, где в поле ввода уже подставлен ваш текст. Его можно выделить сочетанием клавиш Ctrl+A и скопировать Ctrl+C. Параметр Истина в конце функции (если используется в обычном приложении) или использование асинхронного вызова в управляемых формах позволяет сделать это окно удобным для чтения.

Решение 2: Привязка сообщения к реквизитам формы (Облако сообщений)

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

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

Проанализируем пример реализации:


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

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

Решение 3: Использование системных COM-объектов (Windows Script Host)

Для продвинутых сценариев, когда штатных средств 1С недостаточно, можно обратиться к возможностям операционной системы Windows через механизм COM-соединения. Рассмотрим использование объекта WScript.Shell, который позволяет вызывать системные диалоговые окна.

Выясним, как это работает на практике. Метод Popup этого объекта создает окно, которое очень похоже на стандартное 1С-предупреждение, но имеет свои особенности управления. Посмотрим на пример кода:


Диалог = Новый COMОбъект("WScript.Shell");
// Параметры: Текст, ВремяОжидания (0 - бесконечно), Заголовок, ТипКнопки
Диалог.Popup("Текст сообщения, который появится в системном окне", 0, "Внимание", 64);

Хотя текст в самом системном Popup напрямую выделить мышкой тоже бывает сложно, здесь работает стандартный "чит" Windows. Если нажать Ctrl+C, когда такое окно активно, Windows скопирует все содержимое окна (заголовок, текст и названия кнопок) в буфер обмена в текстовом формате. Это работает и для обычного метода Предупреждение() в 1С! В качестве альтернативного решения для интеграции с операционной системой можно использовать инструмент для вывода сообщений в центр уведомлений Windows непосредственно из клиента 1С.

Решение 4: Копирование в буфер через htmlfile

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

Проанализируем следующий алгоритм:

  1. Создаем невидимый COM-объект для работы с HTML.
  2. Используем его внутренние механизмы для записи строки в Clipboard.
  3. Выводим стандартное окно Предупреждение(), сообщая пользователю, что текст уже скопирован.

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


ТекстДляКопирования = "Нужный текст сообщения";
Попытка
    ОбъектКопирования = Новый COMОбъект("htmlfile");
    ОбъектКопирования.ParentWindow.ClipboardData.SetData("Text", ТекстДляКопирования);
    Предупреждение(ТекстДляКопирования + " (Текст уже скопирован в буфер обмена!)");
Исключение
    Предупреждение(ТекстДляКопирования);
КонецПопытки;

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

Решение 5: Использование внешних обработок (EPF)

Если ваша конфигурация "Итилиум" позволяет запускать внешние обработки, это открывает неограниченные возможности. Вы можете создать простую обработку с одной формой, на которой размещено большое текстовое поле в режиме "Только просмотр".

Разберем по шагам, как это реализовать:

  1. Создаем новую внешнюю обработку в Конфигураторе (или скачиваем готовую "болванку").
  2. Добавляем форму, на форме размещаем поле с типом Текст или ПолеТекстовогоДокумента.
  3. В модуле формы прописываем заполнение этого поля из параметров открытия.
  4. В основном коде (в Итилиуме) вызываем открытие этой обработки:

ПараметрыФормы = Новый Структура("ТекстСообщения", "Ваш очень длинный текст...");
ОткрытьФорму("ВнешняяОбработка.МоеСообщение.Форма.Форма", ПараметрыФормы);

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

Итоги и рекомендации

Мы проанализировали различные методы вывода сообщений в центр экрана с возможностью копирования текста. Подведем итоги:

Выбор конкретного метода зависит от того, насколько часто пользователю нужно копировать эти данные и какие права доступа у него есть в системе. В большинстве случаев комбинация ВвестиСтроку и программного заполнения буфера обмена через COM-объекты закрывает 99% потребностей бизнеса без необходимости вносить изменения в структуру метаданных конфигурации.

← На главную