Картинку из буфера обмена 1с документооборот
Вставка картинки из буфера обмена с помощью JavaScript в поле HTML в web-клиенте, с помощью внешней компоненты в тонком/толстом клиенте и путем преобразования данных картинки формата Base64 из поля HTML в любом клиенте, начиная с платформы 8.3.16. Механизм протестирован на платформах 8.2 и 8.3 Для запуска опубликованной конфигурации требуется платформа релиза не ниже 8.3.14.
Сразу оговорюсь, реализация не моя, публикую на правах заказчика и идейного вдохновителя (скромно так).
Позже будет выложена ссылка на гитхаб с исходниками внешней компоненты (как только разработчик выложит).
И так, для своей разработки Тикеты - система учета задач/Service Desk в 1С (интеграция с Trello, Мобильное приложение) необходимо было реализовать вставку картинки из буфера.
Задача была получать картинку по нажатию Ctrl+V в поле HTML.
Глядя как приложения браузеров ловко кушают эти самые скриншоты, подумалось, почему же в 1С поле HTML не сможет так же !
Оказалось, что может, но лишь наполовину - в web-клиенте, а в тонком/толстом данных картинки JavaScript не выдает (ну или плохо просили).
Для тонкого/толстого пришлось писать компоненту.
Обновлено 10.02.2021: начиная с версии платформы 8.3.16, картинка из буфера вставляется в поле HTLM по Ctrl+V в любом клиенте на любых формах (управляемые, обычные), ниже код перевода данных картинки из Base64 в двоичные данные из поля HTLM (необходимо обрабатывать событие "При нажатии" и проверять содержимое поля):
Код поля HTML для получения картинки в web-клиенте:
В файле для скачивания конфигурация с внешней компонентой и реализацией методами внешней компоненты и JS в вэб-клиенте.
В статье рассмотрен вопрос о доработанной вставки картинки из буфера обмена способом из компоненты Документооборота. Способ существенно доработан - код унифицирован, и подготовлен для вставки в модуль. Также доработана вставка в поле HTML в управляемых и обычных Формах. Для HTML поля добавлена функция вставки HTML после курсора (используется для вставки картинки в тонком и толстом клиентах в обычном и управляемом приложении).
В статье рассмотрен вопрос о доработанной вставки картинки из буфера обмена через компоненту Документооборота. Рассмотрим вопросы касаемо 2-х типов приложений: Управляемое - Через Форматированный Документ, для Обычных Форм касаемо
- Вставка в Поле HTML осуществляем в 2 этапа:
- Картинку из Буфера обмена будем получать при помощи метода документооборота.
- Вставку в код HTML будем осуществлять непосредственно на Javascript, поскольку в отличие от Форматированного документа нужного функционала по определению курсора нету. Поэтому для этого используем вставку полностью на основе вызова Функции JS.
При этом последний функционал необходимо полностью доработать до возможности использования в Общем модуле, из которого будем вызывать экспортную процедуру с Формы (Управляемой или Обычной). Хотя есть уже до этого публикация Вставка снимка экрана (screenshot) в форматированный документ, тем не менее не очень удобно переносить 3 процедуры в каждую форму.
Предлагаю модернизированный вариант этого способа, и ещё применительно к обычным формам. Тестировалось на платформах 8.3.14 - 8.3.16.
Вставка картинки в HTML поле положения курсора при помощи JavaScript.
Рассмотрим следующие режимы:
Для Обычного приложения код выглядит так:
Однако, применяемая функция JavaScript может быть использована для вставки не только картинок после курсора - а в целом любого HTML в документе после курсора.
Для управляемых форм код не будет особо отличаться, и в целом будет похож на предыдущий случай. И будет выглядеть таким образом.
Таким образом, код для 2-х режимов является достаточно похожим. Единственное исключение - Web Клиент, но там вставка осуществляется полностью за счет JavaScript (Это описано в статье - Вставка картинки из буфера обмена (на выбор: JavaScript / внешняя компонента / штатно)) или если платформа более старая - Java Апплет можно попробовать дополнить.
Вставка картинки в Форматированный Документ компонентой ДО в Управляемых Формах.
Форматированный Документ - это вариант HTML документа (потому что текст получается там HTML) со следующими особенностями, которые были выявлены в ходе работы над внутренней конфигурации:
- Не стабильно "форматирование документа", а поэтому стили не всегда работают.
- Нет возможности вызвать JavaScript.
- Нет доступа к Объекту Документ.
- Drag-Drop для картинок работает ужасно. Не возможно потом вытащить картинку.
Однако, взамен 1С дописала удобный для разработчиков интерфейс, благодаря чему можно обойтись без вызовов javascript, правда и расширить функционал можно только за счет внешних компонент. В данном случае код вставки будет выглядеть таким образом:
Следует отметить, что все процедуры, кроме ВставитьКартинкуВФорматированныйДокумент можно вставить в модуль и осуществить вызов из модуля, для этого последнюю достаточно сделать экспортной, и также необходимо добавить туда наименование какого-либо события, если вставку картинки в Форматированный Документ необходимо контролировать.
Итоговый код для упрощения процедуры вставки
если обе процедуры поместить в модуль, то код при переносе можно существенно сократить, и он будет выглядеть для различных режимов несколько по разному. Я приведу лишь код в самих формах, так как если его немного изменить - получим некоторые нюансы:
- Код для Форматированного Документа в УФ.
- Код для поля HTML в ОбычныхФормах. Код для Тонкого Клиента УФ я не привожу, так как он не сильно отличается.
Для Форматированного Документа:
Для HTML поля обычные Формы:
Как видно - код достаточно компактный, и легко переносить из одной формы в другую - не прибегая к излишествам. Излишества можно добавить по своему желанию.
Возникла потребность создания документа в 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С уже позаботилась об этом, и в конфигурации Документооборот уже присутствует такая компонента, и данный функционал всего-лишь необходимо использовать.
Собственно этими знаниями и решил поделится, дабы облегчить жизнь тем, кто столкнется с подобной задачей.
Сама компонента находится в общих макетах, макет называется - ОбщиеМакеты.КомпонентаПолученияКартинкиИзБуфера
Далее нам понадобится модуль
там всего несколько процедур и функций, по установке, и инициализации компоненты.
Также нужно не забыть про глобальную переменную
которая объявлена в модуле управляемого приложения
Собственно, это и все что нам нужно для работы.
Далее рисуем наш документ, размещаем на форме форматированный документ, и не забываем про реквизит типа "ХранилищеЗначений", для того чтобы нам картинки в базе хранить.
Делаем команду, вставка из буфера, и прописываем код
Так как метод вставки картинки доступен только на сервере, то там и выполняем
Результат достигнут, все работает.
Лишний раз убедился, что для успешной работы нет нужды каждый раз изобретать велосипед, а необходимо регулярно изучать имеющиеся подсистемы, и пользоваться по максимуму ими.
Читайте также: