Поступил запрос на то, чтобы добавить кнопку копирования табличного документа изображением в буфер обмена, чтобы быстренько отправить его в whatsapp - можно отправлять счет на оплату как изображение в ICQ, Телеграм, WHATSAPP. Компонента x32 написана на delphi с использованием бывшей бесплатной библиотеки 1CNativeLib от 2011 года //infostart.ru/public/88060/ и проверена на платформе 1С:Предприятие 8.3 (8.3.10.2580) в обычном режиме.
Решение было сделано "франкенштейном" (но всё делается по одной кнопке):
- Сохраняем печатную форму, как pdf
- Запускаем командную строку преобразования pdf в jpg (ghostscript и imagemagick)
- Компонента копирует файл с Jpeg в буфер обмена
Работает так:
1. Эта процедура подключает возможность: создает в папке временных файлов папку conv и извлекает туда программы для конвертации. Эту процедуру нужно бы запускать при запуске клиентской 1С - в событии ПередНачаломРаботыСистемы или ПриНачалеРаботыСистемы.
Перем глКомпонентаКопированияФайлаJPEGвБуферОбмена;
Перем глПутьКПрограммеКонвертирования;
Процедура ПодключитьКопированиеВБуферОбмена() Экспорт
// Извлекаем программу конвертирования
глПутьКПрограммеКонвертирования= КаталогВременныхФайлов() + "conv\";
МассивПапок = НайтиФайлы(КаталогВременныхФайлов(), "conv");
Если МассивПапок.Количество() = 0 ИЛИ Не МассивПапок.Получить(0).ЭтоКаталог() Тогда
СоздатьКаталог(глПутьКПрограммеКонвертирования);
ДвоичныеДанные = ПолучитьОбщийМакет("ConvertPDFtoPNG");
ЧтениеZIP = Новый ЧтениеZipФайла(ДвоичныеДанные.ОткрытьПотокДляЧтения());
ЧтениеZIP.ИзвлечьВсе(глПутьКПрограммеКонвертирования);
ЧтениеZIP.Закрыть();
КонецЕсли;
// Подключаем компоненту копирования в буфер обмена
Если глКомпонентаКопированияФайлаJPEGвБуферОбмена = Неопределено Тогда
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаКопированияФайлаJPEGвБуферОбмена", "CopyFromFileJPEGtoClipboard", ТипВнешнейКомпоненты.Native);
глКомпонентаКопированияФайлаJPEGвБуферОбмена = Новый("AddIn.CopyFromFileJPEGtoClipboard.JPEGtoClipboard");
КонецЕсли;
КонецПроцедуры
2. Эта процедура копирует табличный документ в буфер обмена
Процедура СкопироватьТабличныйДокументВБуферОбмена(ТабДок) Экспорт
ИмяВременногоФайлаPDF = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяВременногоФайлаPDF, ТипФайлаТабличногоДокумента.PDF);
// Конвертируем
ИмяВременногоФайлаJPEG = ПолучитьИмяВременногоФайла("jpg");
КодВозврата = Неопределено;
ЗапуститьПриложение(глПутьКПрограммеКонвертирования+ "convert.exe -density 150 -depth 8 -quality 80 -trim """ + ИмяВременногоФайлаPDF + """ """ + ИмяВременногоФайлаJPEG + """",, Истина, КодВозврата);
// Копируем в буфер обмена
глКомпонентаКопированияФайлаJPEGвБуферОбмена.ПоместитьJPEGвБуферОбмена(ИмяВременногоФайлаJPEG);
// Удаляем файлы
УдалитьФайлы(ИмяВременногоФайлаJPEG);
УдалитьФайлы(ИмяВременногоФайлаPDF);
КонецПроцедуры
3. А это пример, как можно отправлять в буфер обмена только выделенную область табличного документа
ВыделеннаяОбласть = ЭлементыФормы.ТабличныйДокумент.ТекущаяОбласть;
ТабДок = Новый ТабличныйДокумент;
ОбластьПриемник = ТабДок.Область(1, 1, ВыделеннаяОбласть.Низ - ВыделеннаяОбласть.Верх + 1, ВыделеннаяОбласть.Право - ВыделеннаяОбласть.Лево + 1);
ТабДок.ВставитьОбласть(ВыделеннаяОбласть, ОбластьПриемник);
Для Счетчик = 1 По ОбластьПриемник.Право - ОбластьПриемник.Лево + 1 Цикл
ТабДок.Область(1, Счетчик, ОбластьПриемник.Низ, Счетчик).ШиринаКолонки = ЭлементыФормы.ТабличныйДокумент.Область(, ВыделеннаяОбласть.Лево + Счетчик - 1, , ВыделеннаяОбласть.Лево + Счетчик - 1).ШиринаКолонки;
КонецЦикла;
СкопироватьТабличныйДокументВБуферОбмена(ТабДок);