Для начала попробовал с условным оформлением. У меня была гипотеза, что если текущее поле скрыть и на его место поместить новое поле с номером, в котором с помощью оформления делать подмену текста на представление оригинального поля, то при его копировании в буфер обмена попадет истинное значение - номер. Но нет, копируется именно тот текст, который видит на форме пользователь.
===
Пора посмотреть, что там за новые мультиплатформенные возможности по работе с буфером обмена добавили в 1С с версии 8.3.24
🟡 обработчик события ПриВставкеИзБуфераОбмена (OnPasteFromClipboard) в каждой форме и один глобальный в модуле приложения, который срабатывает при попытке вставить картинку или файлы;
🟡 библиотека СредстваБуфераОбмена (ClipboardTools), в которой реализованы следующие методы:
➖ ИспользованиеДоступно (CanUse) - Проверка доступности использования буфера обмена;
➖ ПоддерживаетсяФорматДанных<ФорматДанных> (DataFormatSupported<DataFormat>) - Проверка поддержки указанного формата данных (помимо картинок и HTML, еще могут быть MIME-типы);
➖ СодержитДанныеАсинх<ФорматДанных> (ContainsDataAsync<DataFormat>) - Проверка наличия в буфере обмена данных указанного формата;
➖ ПолучитьДанныеАсинх<ФорматДанных> (GetDataAsync<DataFormat>) - Получение из буфера обмена данных указанного формата;
➖ ПоместитьДанныеАсинх (PutDataAsync) - Помещение данные в буфер обмена.
Сразу бросается в глаза, что нет возможности установить событие помещения значения в буфер обмена. Мы можем повесить обработчик ожидания при открытии формы, который будет проверять содержимое буфера, а при его изменении считывать текущую строку табличной части и добавлять в буфер номер текущего документа. Но этот костыль явно будет работать нестабильно (при коротком ожидании все будет подвисать, при длинном можем не успеть добавить новое значение), а если при открытой 1С решат покопипастить в Word или еще где-то, то вообще получим полный хаос.
Вторая претензия - нет очистки из буфера существующих элементов, которые могут мешать. По умолчанию в Windows журнал буфера обмена содержит 25 элементов, из которых происходит вставка по запросу значений требуемого типа. Следовательно есть вероятность, что внешняя программа, куда копируют значения, может отдать приоритет для вставки значениям вместо обычного текста тому типу, под которым помещено представление документа. И еще не забываем, что копирование в буфер из 1С является асинхронным и следовательно порядок размещения в памяти не строго предопределен.
===
Новые возможности 1С позволили мне сделать на форме новую команду, которая успешно копировала в буфер только номер выбранного документа. Но как теперь ее удобно "подсунуть" пользователю?
Попробовал переопределить Ctrl+C для ее вызова и не получилось - комбинация системного копирования имеет приоритет выше чем у команд на форме. Ладно, тогда повесил вызов на похожую комбинацию Alt+C и дополнительно добавил ее в контекстное меню для любителей кликать мышкой.
Такая реализация с дополнительной комбинацией клавиш заказчикам даже больше понравилось чем их изначальное требование, так как теперь у них есть выбор копировать полное представление документа или только его номер.
#1С #рабочиебудни
