Картинку из буфера обмена 1с документооборот
Возникла потребность создания документа в 1С для регистрации ошибок работы программ у пользователей.
На первый взгляд задача тривиальная, сделать документ, с красивым полем форматированного документа, ответственным, датой обращения, темой и все такое.
Камнем преткновения стала возможность работы с буфером обмена. Как оказалось, штатных способов работы с буфером и нет.
А ведь было бы прикольно, нажать ctrl+prtscr (alt+prtscr), и вставлять содержимое из буфера в нужную позицию документа, где находится курсор.
После изучения определенного количества неплохих, но достаточно старых публикаций, сделал вывод что штатная вставка ctrl+v для картинов не работает,
работают только с текстом,
варианты с подключением к эксель, копипастом в него, и сохранением в файл - ресурсоемки, да и не везде эксель доступен.
Остались варианты с внешними компонентами.
компонент тоже немного, давным давно (в 2009), пользователь gudun_ku выложил компоненту clipboard.dll для этой цели.
на основе которой, было сделано некоторое количество обработок к разным конфигурациям..
Но несмотря на все усилия, мне не удалось все это запустить уже на современной конфигурации, под win7. Все попытки подключения компоненты, приводят к исключению.
когда, уже почти опустились руки, - решил покопаться в типовых. И к радости обнаружил что фирма 1С уже позаботилась об этом, и в конфигурации Документооборот уже присутствует такая компонента, и данный функционал всего-лишь необходимо использовать.
Собственно этими знаниями и решил поделится, дабы облегчить жизнь тем, кто столкнется с подобной задачей.
Сама компонента находится в общих макетах, макет называется - ОбщиеМакеты.КомпонентаПолученияКартинкиИзБуфера
Далее нам понадобится модуль
там всего несколько процедур и функций, по установке, и инициализации компоненты.
Также нужно не забыть про глобальную переменную
которая объявлена в модуле управляемого приложения
Собственно, это и все что нам нужно для работы.
Далее рисуем наш документ, размещаем на форме форматированный документ, и не забываем про реквизит типа "ХранилищеЗначений", для того чтобы нам картинки в базе хранить.
Делаем команду, вставка из буфера, и прописываем код
Так как метод вставки картинки доступен только на сервере, то там и выполняем
Результат достигнут, все работает.
Лишний раз убедился, что для успешной работы нет нужды каждый раз изобретать велосипед, а необходимо регулярно изучать имеющиеся подсистемы, и пользоваться по максимуму ими.
Коллеги, предлагаю еще один вариант получения картинки из буфера обмена.
Несмотря на то, что на Инфостарте есть ряд разработок по этой теме,
возможно, кому-то пригодится данная обработка.
Поддерживается работа на платформе 8.3, в режимах толстого клиента обычного приложения, толстого/тонкого клиентов управляемого приложения. Клиенты x32/x64.
Несколько слов о реализации. В процессе разработки, сначала был подготовлен вариант с использованием временного файла. Т.е. картинка из буфера сохранялась на диск и уже потом загружалась в 1С. Всё работало без проблем. Но сама по себе схема, с использованием файловых операций, не вызывала особого восторга. Поэтому, была предпринята попытка отказаться от данного метода.
Вариант, с использованием потока, мне показался лучше. Но встал вопрос, о том, каким образом живые данные из потока переместить в 1С-й объект картинка? В одной из приведенных выше разработок это делалось с использованием 1С-й функции глобального контекста «Base64Значение(<Строка>)». Оставалось только загнать данные в Base64-строку. Откровенно говоря, писать свою собственную функцию для кодирования данных, совсем не хотелось. Более того, было понимание, что в самом движке 1С, эти функции уже реализованы. И это действительно так. В core83.dll есть несколько вариантов экспортной функции encode_base64 (аналог Base64Строка(<Значение>)). Таким образом, вызывая соответствующую функцию и передавая ей данные потока, мы получаем на выходе строку в кодировке Base64.
Дополнение: версия 2.
Во всей этой истории с использованием Base64-строки огорчало то, что для получения объекта "ДвоичныеДанные" выполнялась абсолютно не нужная работа по кодированию/раскодированию данных. В версии 2 данные потока прописываются напрямую в предварительно созданный объект "ДвоичныеДанные". Благодаря этому, мы получаем полноценный объект BinaryData с актуальными данными, без каких-либо дополнительных манипуляций.
Тут же: вместо PNG формата используется JPEG.
Дополнение: версия 3.
Добавлена поддержка Web-клиента x32/x64 (IE). Как показала практика, вариант с передачей данных через строку Base64, является наиболее универсальным. Код функции для кодирования данных в Base64, оказался не таким большим, как это виделось изначально. Буквально несколько десятков байт. Таким образом, это позволило отказаться от использования экспортной функции encode_base64 (версия 1), упростить код и в тоже самое время добавить поддержку web-клиента.
Тестирование проводилось выборочно на релизах начиная с 8.3.4.437 по 8.3.11.2924 (последний на момент публикации).
Возникла потребность создания документа в 1С для регистрации ошибок работы программ у пользователей.
На первый взгляд задача тривиальная, сделать документ, с красивым полем форматированного документа, ответственным, датой обращения, темой и все такое.
Камнем преткновения стала возможность работы с буфером обмена. Как оказалось, штатных способов работы с буфером и нет.
А ведь было бы прикольно, нажать ctrl+prtscr (alt+prtscr), и вставлять содержимое из буфера в нужную позицию документа, где находится курсор.
После изучения определенного количества неплохих, но достаточно старых публикаций, сделал вывод что штатная вставка ctrl+v для картинов не работает,
работают только с текстом,
варианты с подключением к эксель, копипастом в него, и сохранением в файл - ресурсоемки, да и не везде эксель доступен.
Остались варианты с внешними компонентами.
компонент тоже немного, давным давно (в 2009), пользователь gudun_ku выложил компоненту clipboard.dll для этой цели.
на основе которой, было сделано некоторое количество обработок к разным конфигурациям..
Но несмотря на все усилия, мне не удалось все это запустить уже на современной конфигурации, под win7. Все попытки подключения компоненты, приводят к исключению.
когда, уже почти опустились руки, - решил покопаться в типовых. И к радости обнаружил что фирма 1С уже позаботилась об этом, и в конфигурации Документооборот уже присутствует такая компонента, и данный функционал всего-лишь необходимо использовать.
Собственно этими знаниями и решил поделится, дабы облегчить жизнь тем, кто столкнется с подобной задачей.
Сама компонента находится в общих макетах, макет называется - ОбщиеМакеты.КомпонентаПолученияКартинкиИзБуфера
Далее нам понадобится модуль
там всего несколько процедур и функций, по установке, и инициализации компоненты.
Также нужно не забыть про глобальную переменную
которая объявлена в модуле управляемого приложения
Собственно, это и все что нам нужно для работы.
Далее рисуем наш документ, размещаем на форме форматированный документ, и не забываем про реквизит типа "ХранилищеЗначений", для того чтобы нам картинки в базе хранить.
Делаем команду, вставка из буфера, и прописываем код
Так как метод вставки картинки доступен только на сервере, то там и выполняем
Результат достигнут, все работает.
Лишний раз убедился, что для успешной работы нет нужды каждый раз изобретать велосипед, а необходимо регулярно изучать имеющиеся подсистемы, и пользоваться по максимуму ими.
Читайте также: