Как убрать перенос строки при вставке текста из Excel в поиск 1С

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

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

Разберем механику проблемы: когда мы выделяем ячейку в таблице Excel и нажимаем Ctrl+C, табличный процессор помещает данные в буфер обмена не как простой текст, а как фрагмент таблицы. В конце такого значения всегда присутствуют служебные невидимые символы — возврат каретки и перевод строки (CRLF). При вставке в стандартное окно поиска по номеру или коду этот скрытый перенос строки добавляется к искомой строке, из-за чего точное совпадение не срабатывает.

Ограничения платформы 1С при работе с буфером и стандартным поиском

Прежде чем переходить к реализации, проанализируем, почему решить этот вопрос непосредственно в коде стандартной формы списка затруднительно:

  1. Стандартное окно поиска 1С: диалог поиска динамического списка (вызываемый по Ctrl+F) является платформенным элементом. У разработчика конфигурации нет прямого программного доступа к его полям и событиям вставки текста в момент нажатия Ctrl+V. Вставка обрабатывается на уровне операционной системы.
  2. Отсутствие глобального события активации окна: в платформе 1С:Предприятие нет платформенного события, которое отслеживало бы получение фокуса приложением из внешней среды (например, при переключении из Excel в 1С). События форм срабатывают только при перемещении фокуса между окнами внутри самой 1С.
  3. События буфера обмена: штатный механизм платформы ПриВставкеИзБуфераОбмена ориентирован на вставку файлов и изображений, а стандартная вставка текста в строковые элементы управления осуществляется напрямую системным контролом.

Вариант 1. Перехват и очистка буфера через AutoHotkey

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

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


#Persistent
SendMode InputThenPlay
#SingleInstance force
#MaxThreadsPerHotkey 1
#Hotstring NoMouse
#KeyHistory 0
#NoEnv
SetBatchLines, -1
ListLines Off

paste=+{Ins}
ClipboardType0=empty
ClipboardType1=text
ClipboardType2=non-text
ClipboardCaptureOn = 1
ClipboardsCaptured = 0

Exit

#^v::
    paste=^v
#+Ins::
    ClipboardCaptureOn = 0
    Clipboard := ClipAcc
    Send, %paste%
    TrayTip, Paste, Capture buffer cleared
    ExitApp

OnClipboardChange:
    If ( A_EventInfo == 1 and ClipboardCaptureOn) {
        Critical 50
        If ClipboardsCaptured
            ClipAcc = %ClipAcc%`n%clipboard%
        Else
            ClipAcc = %clipboard%
        ClipboardsCaptured++
        Critical Off
    }
    TrayTip, Clipboard changed, % "ClipboardsCaptured: " . ClipboardsCaptured
return

Также можно использовать компактный скрипт AHK, который при активном окне 1С переопределяет комбинацию Ctrl+V. Скрипт получает текущее строковое содержимое системного буфера, обрезает концевые пробелы и символы переноса с помощью регулярного выражения, обновляет буфер и отправляет команду вставки в активное поле ввода.

Вариант 2. Программное чтение буфера в коде 1С через COM-объект

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

Посмотрим на классический способ чтения текстового буфера обмена на стороне клиента через объект Internet Explorer / HTML:


Попытка
    КОбъект = Новый COMОбъект("htmlfile");
    ДанныеБуфера = КОбъект.ParentWindow.ClipboardData.GetData("Text");
    
    // Очищаем полученную строку от переносов и пробелов
    Если ЗначениеЗаполнено(ДанныеБуфера) Тогда
        ДанныеБуфера = СокрЛП(ДанныеБуфера);
        ДанныеБуфера = СтрЗаменить(ДанныеБуфера, Символы.ПС, "");
        ДанныеБуфера = СтрЗаменить(ДанныеБуфера, Символы.ВК, "");
        ДанныеБуфера = СтрЗаменить(ДанныеБуфера, Символы.Таб, "");
    КонецЕсли;
Исключение
    ДанныеБуфера = "";
КонецПопытки;

В современных версиях платформы (начиная с релиза 8.3.24) для работы с буфером обмена рекомендуется использовать штатный асинхронный менеджер СредстваБуфераОбмена и метод ПолучитьДанныеАсинх(), что позволяет избавиться от устаревших COM-объектов.

Вариант 3. Пользовательские приемы без программирования

Если политика безопасности компании запрещает запуск сторонних утилит или внесение изменений в типовые конфигурации, разберем простые пользовательские способы обхода проблемы:

  1. Копирование через режим редактирования: вместо обычного выделения ячейки и нажатия Ctrl+C достаточно нажать клавишу F2 на ячейке Excel, выделить текст и скопировать его. В этом случае Excel не формирует структуру строки таблицы и в буфер попадает только чистый текст без завершающего CRLF.
  2. Копирование из строки формул: выделение значения непосредственно в верхней строке формул Excel также исключает попадание управляющих символов конца строки в буфер обмена.
  3. Макрос в Excel: можно создать макрос VBA в персональной книге макросов и назначить его на горячие клавиши (например, Ctrl+Shift+C). Макрос считывает значение текущей ячейки и записывает в буфер Windows очищенную строку, готовую для вставки в строку поиска 1С.
← На главную