При ежедневной работе пользователи часто сталкиваются с неудобством: если скопировать значение ячейки в Microsoft Excel сочетанием клавиш Ctrl+C, а затем вставить его в окно поиска 1С (через Ctrl+F), поиск не находит нужный элемент. Выясним причину такого поведения, проанализируем ограничения платформы 1С:Предприятие и рассмотрим практические варианты решения задачи.
Разберем механику проблемы: когда мы выделяем ячейку в таблице Excel и нажимаем Ctrl+C, табличный процессор помещает данные в буфер обмена не как простой текст, а как фрагмент таблицы. В конце такого значения всегда присутствуют служебные невидимые символы — возврат каретки и перевод строки (CRLF). При вставке в стандартное окно поиска по номеру или коду этот скрытый перенос строки добавляется к искомой строке, из-за чего точное совпадение не срабатывает.
Прежде чем переходить к реализации, проанализируем, почему решить этот вопрос непосредственно в коде стандартной формы списка затруднительно:
Ctrl+F) является платформенным элементом. У разработчика конфигурации нет прямого программного доступа к его полям и событиям вставки текста в момент нажатия Ctrl+V. Вставка обрабатывается на уровне операционной системы.ПриВставкеИзБуфераОбмена ориентирован на вставку файлов и изображений, а стандартная вставка текста в строковые элементы управления осуществляется напрямую системным контролом.Рассмотрим самое надежное решение на уровне операционной системы, которое не требует изменения типовой конфигурации 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. Скрипт получает текущее строковое содержимое системного буфера, обрезает концевые пробелы и символы переноса с помощью регулярного выражения, обновляет буфер и отправляет команду вставки в активное поле ввода.
Если задача заключается во вставке очищенных данных не в платформенное окно поиска, а в специально разработанную форму или панель фильтрации, разберем программный способ чтения содержимого буфера средствами платформы.
Посмотрим на классический способ чтения текстового буфера обмена на стороне клиента через объект Internet Explorer / HTML:
Попытка
КОбъект = Новый COMОбъект("htmlfile");
ДанныеБуфера = КОбъект.ParentWindow.ClipboardData.GetData("Text");
// Очищаем полученную строку от переносов и пробелов
Если ЗначениеЗаполнено(ДанныеБуфера) Тогда
ДанныеБуфера = СокрЛП(ДанныеБуфера);
ДанныеБуфера = СтрЗаменить(ДанныеБуфера, Символы.ПС, "");
ДанныеБуфера = СтрЗаменить(ДанныеБуфера, Символы.ВК, "");
ДанныеБуфера = СтрЗаменить(ДанныеБуфера, Символы.Таб, "");
КонецЕсли;
Исключение
ДанныеБуфера = "";
КонецПопытки;
В современных версиях платформы (начиная с релиза 8.3.24) для работы с буфером обмена рекомендуется использовать штатный асинхронный менеджер СредстваБуфераОбмена и метод ПолучитьДанныеАсинх(), что позволяет избавиться от устаревших COM-объектов.
Если политика безопасности компании запрещает запуск сторонних утилит или внесение изменений в типовые конфигурации, разберем простые пользовательские способы обхода проблемы:
Ctrl+C достаточно нажать клавишу F2 на ячейке Excel, выделить текст и скопировать его. В этом случае Excel не формирует структуру строки таблицы и в буфер попадает только чистый текст без завершающего CRLF.Ctrl+Shift+C). Макрос считывает значение текущей ячейки и записывает в буфер Windows очищенную строку, готовую для вставки в строку поиска 1С.