Как в 1С реализовать собственный обработчик копирования и вставки объектов

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

При разработке интерфейсов в 1С:Предприятии часто возникает задача сделать работу пользователя более эффективной. Одной из таких задач является кастомизация стандартных операций Copy (Копировать) и Paste (Вставить). По умолчанию платформа 1С при нажатии Ctrl+C в поле ввода копирует только текст, а при вставке — пытается интерпретировать этот текст. Однако для повышения юзабилити часто требуется передавать между формами или даже базами полноценные ссылки на объекты, структуры данных или строки табличных частей.

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

Почему нельзя просто перехватить событие платформы?

Выясним причину: платформа 1С:Предприятие жестко резервирует сочетания клавиш Ctrl+C и Ctrl+V для системных нужд работы с текстовыми данными. На уровне обычного управляемого приложения у разработчика нет стандартного события вроде ПриНажатииКнопкиКопировать. Тем не менее, существуют «обходные пути», которые позволяют добиться нужного результата без нарушения логики работы системы.

Метод 1: Создание собственных команд формы с горячими клавишами

Это самый надежный и часто используемый метод. Мы можем «перекрыть» системное действие своей командой. Разберем по шагам, как это сделать:

  1. Создадим в форме новую команду, например, КопироватьСсылку.
  2. В свойствах команды в поле Сочетание клавиш укажем Ctrl+C.
  3. Аналогично создадим команду ВставитьСсылку с сочетанием Ctrl+V.

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

Рассмотрим пример кода для команды копирования, которая помещает в буфер обмена навигационную ссылку:


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

Метод 2: Работа с буфером обмена через COM-объект htmlfile

Так как в 1С (в тонком клиенте под Windows) нет встроенного объекта «БуферОбмена», программисты часто используют возможности Internet Explorer через COM. Это позволяет программно считывать и записывать текстовые данные.

Проанализируем функцию для получения данных из буфера:


&НаКлиенте
Функция ПолучитьИзБуфераОбмена()
    Попытка
        ОбъектHTML = Новый COMОбъект("htmlfile");
        Возврат ОбъектHTML.parentWindow.clipboardData.getData("Text");
    Исключение
        Возврат "";
    КонецПопытки;
КонецФункции

Использование htmlfile позволяет нам реализовать вставку. Например, если пользователь скопировал навигационную ссылку типа e1cib/data/Справочник.Номенклатура?ref=..., мы можем перехватить её при нажатии нашей команды Ctrl+V и преобразовать обратно в ссылку 1С.

Метод 3: Сериализация данных и внутренний буфер

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

  1. При нажатии Ctrl+C мы сериализуем объект в XDTO или ЗначениеВСтрокуВнутр.
  2. Помещаем полученную строку в системный буфер (чтобы можно было передать в другое окно) или сохраняем во временную переменную на сервере.
  3. При нажатии Ctrl+V в целевой форме считываем данные и десериализуем их.

Пример преобразования навигационной ссылки в объект при вставке:


&НаКлиенте
Процедура ВставитьСсылку(Команда)
    ТекстИзБуфера = ПолучитьИзБуфераОбмена();
    Если ЭтоНавигационнаяСсылка(ТекстИзБуфера) Тогда
        СсылкаНаОбъект = ПолучитьСсылкуИзНавигационной(ТекстИзБуфера);
        Если СсылкаНаОбъект <> Неопределено Тогда
            // Заполняем реквизит формы
            Объект.Контрагент = СсылкаНаОбъект;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСсылкуИзНавигационной(Знач НавСсылка)
    Возврат ПолучитьСсылкуПоНавигационнойСсылке(НавСсылка);
КонецФункции

Метод 4: Использование внешних компонент (VK)

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

Хотя разработка собственной ВК трудозатратна, использование готовых библиотек позволяет существенно расширить возможности Drag-and-Drop и Copy-Paste.

Сравнение с Drag-and-Drop

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

Рекомендации по юзабилити

Разберем важный момент: стоит ли игра свеч? Как отмечалось в обсуждении, автоматизация вставки ссылки может сэкономить пользователю всего несколько секунд. Однако в масштабах крупного предприятия, где оператор вводит сотни документов в день, суммарная экономия времени и снижение количества ошибок (за счет исключения ручного поиска) оправдывают затраты на разработку кастомного обработчика.

Подведем итоги: для реализации своего обработчика Copy/Paste в 1С используйте сочетание собственных команд формы, COM-объекта для доступа к буферу и механизмов сериализации ссылок. Это позволит создать бесшовный интерфейс, удобный для профессиональной работы пользователей.

← На главную