Возникла потребность создания документа в 1С для регистрации ошибок работы программ у пользователей.
На первый взгляд задача тривиальная, сделать документ, с красивым полем форматированного документа, ответственным, датой обращения, темой и все такое.
Камнем преткновения стала возможность работы с буфером обмена. Как оказалось, штатных способов работы с буфером и нет.
А ведь было бы прикольно, нажать ctrl+prtscr (alt+prtscr), и вставлять содержимое из буфера в нужную позицию документа, где находится курсор.
После изучения определенного количества неплохих, но достаточно старых публикаций, сделал вывод что штатная вставка ctrl+v для картинов не работает,
методы, типа
хОбъект = Новый COMОбъект(«htmlfile»);
Результат = хОбъект.ParentWindow.ClipboardData.Getdata(«Text»);
работают только с текстом,
варианты с подключением к эксель, копипастом в него, и сохранением в файл - ресурсоемки, да и не везде эксель доступен.
Остались варианты с внешними компонентами.
компонент тоже немного, давным давно (в 2009), пользователь gudun_ku выложил компоненту clipboard.dll для этой цели.
на основе которой, было сделано некоторое количество обработок к разным конфигурациям..
Но несмотря на все усилия, мне не удалось все это запустить уже на современной конфигурации, под win7. Все попытки подключения компоненты, приводят к исключению.
когда, уже почти опустились руки, - решил покопаться в типовых. И к радости обнаружил что фирма 1С уже позаботилась об этом, и в конфигурации Документооборот уже присутствует такая компонента, и данный функционал всего-лишь необходимо использовать.
Собственно этими знаниями и решил поделится, дабы облегчить жизнь тем, кто столкнется с подобной задачей.
Итак:
Сама компонента находится в общих макетах, макет называется - ОбщиеМакеты.КомпонентаПолученияКартинкиИзБуфера
Далее нам понадобится модуль
ОбщийМодуль.РаботаСКартинкамиКлиент
там всего несколько процедур и функций, по установке, и инициализации компоненты.
// Устанавливает компоненту сканирования
Процедура УстановитьКомпоненту(ОбработчикРезультата) Экспорт
// Продолжение установки компоненты
Процедура НачатьУстановкуВнешнейКомпонентыПродолжение(ПараметрыВыполнения) Экспорт// Продолжение установки компоненты
Процедура НачатьПодключениеВнешнейКомпонентыПродолжение(Подключена, ПараметрыВыполнения) Экспорт
// Проинициализировать компоненту сканирования
Функция ПроинициализироватьКомпоненту() Экспорт
// Вернет версию компоненты сканирования
Функция ВерсияКомпоненты() Экспорт
Также нужно не забыть про глобальную переменную
которая объявлена в модуле управляемого приложения
Перем КомпонентаПолученияКартинкиИзБуфера Экспорт; // компонента получения картинки из буфера обмена
Собственно, это и все что нам нужно для работы.
Далее рисуем наш документ, размещаем на форме форматированный документ, и не забываем про реквизит типа "ХранилищеЗначений", для того чтобы нам картинки в базе хранить.
Делаем команду, вставка из буфера, и прописываем код
&НаКлиенте
Процедура ВставитьИзБуфера(Команда)
КомпонентаУстановлена = РаботаСКартинкамиКлиент.ПроинициализироватьКомпоненту();
Если Не КомпонентаУстановлена Тогда
Обработчик = Новый ОписаниеОповещения("ВставитьКартинкуИзБуфераЗавершение", ЭтотОбъект);
РаботаСКартинкамиКлиент.УстановитьКомпоненту(Обработчик);
Возврат;
КонецЕсли;
ВставитьКартинкуИзБуфераЗавершение(Истина, Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ВставитьКартинкуИзБуфераЗавершение(Результат, ПараметрыВыполнения) Экспорт
Если Результат = Истина Тогда
ПутьКФайлу = КомпонентаПолученияКартинкиИзБуфера.ПолучитьКартинкуИзБуфера();
Если Не ПустаяСтрока(ПутьКФайлу) Тогда
Картинко = Новый Картинка(ПутьКФайлу);
УдалитьФайлы(ПутьКФайлу);
ПозицияНачала = 0;
ПозицияОкончания = 0;
Элементы.Описание.ПолучитьГраницыВыделения(ПозицияНачала,ПозицияОкончания);
Начало = ФорматированныйДокумент.ПолучитьПозициюПоЗакладке(ПозицияНачала);
ВставитьКартинкуВФорматированныйДокумент(Картинко,Начало);
Иначе
ПоказатьПредупреждение(,НСтр("ru = 'Буфер обмена не содержит картинки'"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Так как метод вставки картинки доступен только на сервере, то там и выполняем
&НаСервере
Процедура ВставитьКартинкуВФорматированныйДокумент(Кар,Позиция)
Закладка = ФорматированныйДокумент.ПолучитьЗакладкуПоПозиции(Позиция);
ФорматированныйДокумент.Вставить(Закладка,Кар, Тип("КартинкаФорматированногоДокумента"));
КонецПроцедуры
Результат достигнут, все работает.
Лишний раз убедился, что для успешной работы нет нужды каждый раз изобретать велосипед, а необходимо регулярно изучать имеющиеся подсистемы, и пользоваться по максимуму ими.
---
для ленивых прикладываю cf-файл с примером работы
---
При подготовке была использована информация из публикаций
//infostart.ru/public/19872/ - компонента
//infostart.ru/public/280022/ - через эксель
//infostart.ru/public/81133/ - труды Поручика
//infostart.ru/public/74958/ - про форматированный документ
//infostart.ru/public/601828/ - доп.информация