NativeDraw: Компонента рисования для 1С [V2.6.2]



Рисуйте в формах 1С, также предлагается небольшое количество нерисовальных функций

Возможности и характеристики

  1. Данная внешняя компонента сделана по технологии NativeAPI, можно подключать прямо из макета и лишних регистраций
  2. Отрисовка происходит в памяти, результат получаем в виде двоичных данных, которые можно преобразовать в картинку и встроить куда угодно: на форму или даже на кнопку
  3. Возможность рисования с учётом полупрозрачности
  4. Работа с изображениями и буфером обмена
  5. Возможность задания собственного таймера отрисовки. Будет приходить внешнее событие
  6. Работа с клавиатурой, мышкой, окнами
  7. Компонента работает как со старой платформой 8.2.x-8.3.5, так и с новой 8.3.6
  8. Доступны открытые исходники, сама отрисовка сделана через библиотеку GDI+, всё структурировано, и можно легко добавлять свои методы
  9. Visual Studio 2024 / C++
Описание методов

[Число ФорматВыводимойКартинки]
0 - BMP
1 - PNG
2 - GIF
3 - JPG
4 - TIFF
5 - ICO

[Строка БуферОбмена]
БуферОбмена

[Строка Цвет]
Красный
Оранжевый
Жёлтый
Зелёный
Синий
Феолетовый
Серый
Белый
Чёрный

[Строка Координаты]
Последовательность из |%04X:%04X|,
где %04X - 4 знаковое HEX число. То есть:
|0001:0002||0064:0064||0100:0101| это
1. X = 1 / Y = 2
2. X = 100 / Y = 100
3. X = 256 / Y = 257


[Число Выравнивание]
0 - Лево / Верх
1 - Центр
2 - Право / Низ

[Строка Шрифт]
Arial
Tahoma
Times New Roman
и др.

[Число СтильШрифта]
0 - Нет
1 - Жирный
2 - Курсив
3 - Жирный + Курсив
4 - Подчёркнутый
8 - Зачёркнутый

[Строка ДействиеКлавиши]
НажатиеКлавиши
ПовторКлавиши
ОтпусканиеКлавиши

[Строка ДействиеМыши]
ДвижениеМыши
НажатиеЛевойКнопкиМыши
ОтпусканиеЛевойКнопкиМыши
ДвойнойКликЛевойКнопкиМыши
НажатиеПравойКнопкиМыши
ОтпусканиеПравойКнопкиМыши
ДвойнойКликПравойКнопкиМыши
НажатиеСреднейКнопкиМыши
ОтпусканиеСреднейКнопкиМыши
ДвойнойКликСреднейКнопкиМыши
НажатиеXКнопкиМыши
ОтпусканиеXКнопкиМыши
ДвойнойКликXКнопкиМыши
ДвижениеКолесаМыши

[Строка СобытиеОкна]
ОкноИзменено
ОкноРазвёрнуто
ОкноСвёрнуто
ОкноВосстановлено

[Число СовместноНажатыеСМышьюКнопки]
1 - Левая кнопка мыши
2 - Правая кнопка мыши
4 - SHIFT
8 - CTRL
16 - Средняя кнопка мыши
32 - Кнопка мыши X1
64 - Кнопка мыши X2

//Холст (Canvas)

[Строка Холст]
Холст_Создать(Число Ширина, Число Высота, Число ФорматВыводимойКартинки);

[ДвоичныеДанные Картинка]
Холст_ДвоичныеДанные(Строка Холст);

[ДвоичныеДанные Картинка]
Холст_УчастокДвоичныеДанные(Строка Холст, Число X, Число Y, Число W, Число H);

[Булево Результат]
Холст_Удалить(Строка Холст);

//Изображение (Image)

[Строка Изображение]
Изображение_Создать(Строка Холст_Изображение_БуферОбмена_ПутьКФайлу);

[Булево Результат]
Изображение_ИзменитьРазмер(Строка Изображение, Число Ширина, Число Высота);

[Булево Результат]
Изображение_Повернуть(Строка Изображение, Число Угол, Булево ИзменятьРазрешение);

[Булево Результат]
Изображение_Отразить(Строка Изображение, Булево X, Булево Y);

[Булево Результат]
Изображение_Обрезать(Строка Изображение, Число X, Число Y, Число W, Число H);

[Булево Результат]
Изображение_ВБуферОбмена(Строка Изображение);

[Число Ширина]
Изображение_ПолучитьШирину(Строка Изображение);

[Число Высота]
Изображение_ПолучитьВысоту(Строка Изображение);

[ДвоичныеДанные Картинка]
Изображение_ДвоичныеДанные(Строка Изображение, Число ФорматВыводимойКартинки);

[ДвоичныеДанные Картинка]
Изображение_УчастокДвоичныеДанные(Строка Изображение, Число ФорматВыводимойКартинки, Число X, Число Y, Число W, Число H);

[Булево Результат]
Изображение_Удалить(Строка Изображение);

//Рисование (Draw)

[Строка Цвет]
Рисование_ПолучитьЦвет(Число A, Число R, Число G, Число B);

[Строка Координаты]
Рисование_ДобавитьТочки(Строка Координаты, Число X, Число Y);

[Процедура]
Рисование_Точка(Строка Холст, Число X, Число Y, Строка Цвет);

[Процедура]
Рисование_Линия(Строка Холст, Число X1, Число Y1, Число X2, Число Y2, Число Толщина, Строка Цвет);

[Процедура]
Рисование_Эллипс(Строка Холст, Число X, Число Y, Число W, Число H, Число Толщина, Строка Цвет);

[Процедура]
Рисование_ЗаполненныйЭллипс(Строка Холст, Число X, Число Y, Число W, Число H, Строка Цвет);

[Процедура]
Рисование_Прямоугольник(Строка Холст, Число X, Число Y, Число W, Число H, Число Толщина, Строка Цвет);

[Процедура]
Рисование_ЗаполненныйПрямоугольник(Строка Холст, Число X, Число Y, Число W, Число H, Строка Цвет);

[Процедура]
Рисование_Треугольник(Строка Холст, Число X1, Число Y1, Число X2, Число Y2, Число X3, Число Y3, Число Толщина, Строка Цвет);

[Процедура]
Рисование_ЗаполненныйТреугольник(Строка Холст, Число X1, Число Y1, Число X2, Число Y2, Число X3, Число Y3, Строка Цвет);

[Процедура]
Рисование_Многоугольник(Строка Холст, Строка Координаты, Число Толщина, Строка Цвет);

[Процедура]
Рисование_ЗаполненныйМногоугольник(Строка Холст, Строка Координаты, Строка Цвет);

[Процедура]
Рисование_Текст(Строка Холст, Строка Текст, Число X, Число Y, Число W, Число H, Число ВертикальноеВыравнивание, Число ГоризонтальноеВыравнивание, Строка Шрифт, Число РазмерШрифта, Число СтильШрифта, Строка Цвет);

[Процедура]
Рисование_Изображение(Строка Холст, Строка Изображение, Число X, Число Y, Число W, Число H, Число Угол, Булево Отразить_X, Булево Отразить_Y);

//Таймер (Timer)

[Строка Таймер]
Таймер_Запустить(Число Период);

[Булево Результат]
Таймер_Остановить(Строка Таймер);

//Перехват (Hook)

[Булево Результат]
Перехват_Установить();

[Булево Результат]
Перехват_Убрать();

[Булево Результат]
Перехват_Установлен();

//Ввод (Input)

[Булево Результат]
Ввод_АктивироватьПерехватКлавиатуры();

[Булево Результат]
Ввод_ЗадатьПерехватКлавиши(Число VK_KEY, Булево Блокировать);

[Булево Результат]
Ввод_УбратьПерехватКлавиши(Число VK_KEY);

[Булево Результат]
Ввод_ДеактивироватьПерехватКлавиатуры();

[Булево Результат]
Ввод_АктивироватьПерехватМыши();

[Булево Результат]
Ввод_ЗадатьПерехватДействияМыши(Строка ДействиеМыши, Булево Блокировать);

[Булево Результат]
Ввод_УбратьПерехватДействияМыши(Строка ДействиеМыши);

[Булево Результат]
Ввод_ДеактивироватьПерехватМыши();

// Окно (Window)

[Строка Окно]
Окно_Главное();

[Строка Окно]
Окно_ПолучитьПоЗаголовку(Строка Заголовок);

[Булево Результат]
Окно_Дочернее(Строка Окно);

[Булево Результат]
Окно_ПолучитьКоординаты(Строка Окно, Число X1, Число Y1, Число X2, Число Y2);

[Булево Результат]
Окно_ВОтносительныеКоординаты(Строка Окно, Число X, Число Y);

[Булево Результат]
Окно_Переместить(Строка Окно, Число X1, Число Y1, Число X2, Число Y2);

[Булево Результат]
Окно_АктивироватьПерехват();

[Булево Результат]
Окно_ЗадатьПерехват(Строка Окно);

[Булево Результат]
Окно_УбратьПерехват(Строка Окно);

[Булево Результат]
Окно_ДеактивироватьПерехват();

//Тест (Test)

[Булево Результат]
Тест_ВнешнееСобытие(Строка Источник, Строка Событие, Строка Данные);

// Внешние события

Источник
"NativeDraw"

[Таймер]
Cобытие
"СистемныйТаймер"
Данные
Таймер

[Клавиатура]
Cобытие
ДействиеКлавиши
Данные
Окно|0|0|КодКлавиши|0

[Мышь]
Cобытие
ДействиеМыши
Данные
Окно|X|Y|СовместноНажатыеСМышьюКнопки|ЗначениеКолесаМыши

[Окно]
Cобытие
СобытиеОкна
Данные
Окно

Примеры
Танк
Управление 
W — Вперёд / S — Назад / A — Влево / D — Вправо / F — Выстрел
 
Поворот изображения
 
Буфер обмена
Отрисовка примитивов
EAN-13
Отрисовка штрих-кода EAN13. Важно знать, сама компонента не генерирует изображение штрих-кода. Всё сделано средствами 1С, от компоненты было лишь рисование линий и текста
 
Ввод, Хуки, Окна
Выделение мышкой, отлов клавиш
В 
Проекты с использованием компоненты
История версий
  • 1.0 — Первая публичная версия
  • 1.1 — Адаптировано для новых платформ
  • 2.0 — Добавлена работа с изображениями, таймеры теперь не часть региона рисования, фиксы, переименование ф-ий
  • 2.1 — Фиксы, добавлена работа с буфером обмена (Изображения)
  • 2.2 — Добавлена ф-ия Изображение_ИзменитьРазмер(), в DLL-файле теперь прописана версия
  • 2.3 — Переделана работа с хуками, добавлена поддержка мыши, добавлены некоторые функции получения окон (для вычисления координат для мыши), переименованы события
  • 2.4 — Несколько проверок в коде, тестовая функция для внешнего события
  • 2.5 — Переделан немного вывод картинки, добавлено несколько форматов выводимой картинки, добавлены 2 функции для получения двоичных данных сразу с изображений
  • 2.5.1 — Фиксы
  • 2.6 — Переделана архитектура компоненты в части работы с хуками. Хуки теперь не часть ввода. Добавлены функции и события для отлова событий окон. (Пример: Ввод, Хуки, Окна)
  • 2.6.1 — Исправлены ошибки в ф-иях буфера обмена
  • 2.6.2 — Добавлена отрисовка многоугольников, перекомпиляция для работы с Windows 7
Внимание

В файлах-примерах внешняя компонента уже вшита, но не всегда последняя.
Последнюю версию можно скачать отдельным файлом или скомпилировать исходники.
В файлах-примерах внешняя компонента подгружается из макета, но 1С иногда это как-то
криво делает и может загрузить старую версию вместо новой (у компоненты есть свойство «Версия»).
Для устранения проблемы почистите кеш.

99 Comments

  1. ПерваяСистема

    Сделал небольшой примерчик, что можно будет делать с новой версией

    http://www.youtube.com/watch?v=7_thbqRG7AY

    Reply
  2. Steelvan

    Где видео ?

    Reply
  3. RomanBor

    Братан не фига ты заморочился 🙂

    Reply
  4. ПерваяСистема

    (2) Steelvan, видео в статье (http://www.youtube.com/watch?v=lSGjrKYnQuo). а то что было в комментах я удалил (ибо уже устарело)

    Reply
  5. AlexanderKai

    Танчики мегакруто! 🙂

    Reply
  6. Johny_v

    Добрый день.

    Интересная разработка. А в ней есть возможность открыть или вставить изображение из буфера обмена?

    Reply
  7. ПерваяСистема

    (6) Johny_v, хм, такого сейчас нет, но я думаю можно добавить без особо лишних телодвижений)

    Reply
  8. Johny_v

    (7)Было бы очень полезно, как и открытие изображение из файла.

    Буду ждать этих функций… Спасибо.

    Reply
  9. ПерваяСистема

    (8) Johny_v, да, попробуем сделать ..

    Reply
  10. ПерваяСистема

    (8) Johny_v, добавил, то что просили (даже видео сделал)

    Reply
  11. cool.vlad4

    по моему крутая штука, судя по комментариям. но даже плюс (не то что посмотреть публикацию) поставить не смог. «публикация была удалена»(

    Reply
  12. ПерваяСистема

    (11) cool.vlad4, да нет, наверное, просто вы попали в момент когда публикация была на модерации после обновления. Сейчас всё должно быть хорошо

    Reply
  13. Johny_v

    (10)

    Спасибо, посмотрим

    Reply
  14. ignor

    Очень приятное впечатление. Вдвойне приятно наличие исходников. Сам хотел заморочится в сторону черепашьей графики ибо дочке уже 8 лет и пора бы ей уже программировать и кодить.

    Reply
  15. ПерваяСистема

    (14) ignor, да вот жишь, иногда попадаются компоненты интересные, а что-то поправить в них уже не судьба.

    Reply
  16. гыук320

    Добрый день! Не могу получить координаты мыши на управляемых формах, игнорируется внешнее событие.

    &НаКлиенте
    Перем Драйвер, Мышь;
    
    //В форме в » ВнешнееСобытие» прописал
    &НаКлиенте
    Процедура ВнешнееСобытие(Источник, Событие, Данные)
    стр=1; //поставил точку останова что бы посмотреть «Данные» но в неё не заходить
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПриОткрытии()
    ПодключитьКомпоненту();
    КонецПроцедуры
    
    &НаСервере
    Процедура ПодключитьКомпоненту()
    Попытка
    Адрес = ПоместитьВоВременноеХранилище(Обработки.РедакторОконУФ.ПолучитьМакет(«NativeDraw_2_3»));
    Если ПодключитьВнешнююКомпоненту(Адрес, «КомпонентаРисования», ТипВнешнейКомпоненты.Native) Тогда
    Драйвер = Новый(«AddIn.КомпонентаРисования.NativeDraw»);
    Драйвер.Ввод_УстановитьПерехват();
    Драйвер.Ввод_АктивироватьПерехватМыши();
    Мышь = Новый СписокЗначений;
    Мышь.Добавить(«ДвижениеМыши»);
    Мышь.Добавить(«НажатиеЛевойКнопкиМыши»);
    Мышь.Добавить(«ОтпусканиеЛевойКнопкиМыши»);
    Для каждого Элемент Из Мышь Цикл
    Драйвер.Ввод_ЗадатьПерехватДействияМыши(Элемент.Значение, Ложь);
    КонецЦикла;
    Сообщить(Драйвер.Версия);  // сообщение выводится 
    Иначе
    Отказ   = Истина;
    КонецЕсли;
    Исключение
    Отказ   = Истина;
    КонецПопытки;
    
    КонецПроцедуры
    
    

    Показать

    Кто знает почему не срабатывает точка останова на УФ ? Второй день мучаюсь!!!

    С уважением, Андрей.

    Reply
  17. ПерваяСистема

    (16) гыук320, проверю

    Reply
  18. ПерваяСистема

    (16) гыук320, так беглым взглядом пробежался, объект Драйвер при завершении процедуры ПодключитьКомпоненту «разрушается» и соответственно срабатывает ф-ия деинициализации всего в компоненте. Т.е. в процедуре эта переменная как бы локальная у вас.

    Надо вам переменную драйвер хранить в другом месте. Позднее постараюсь сделать пример с управляемыми формами

    Reply
  19. ПерваяСистема

    (16) гыук320, я тут тыкал-тыкал, замучился, но решение оказалось простым, в твоём случае нужно процедуру ПодключитьКомпоненту() исполнять на клиенте

    вот так, как предлагаю:

    
    &НаКлиенте
    Перем Драйвер;
    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    
    Попытка
    
    Если ПодключитьВнешнююКомпоненту(«D:Developwin32FrameWork_1CNativeAPIindNativeDraw.dll», «КомпонентаРисования», ТипВнешнейКомпоненты.Native) Тогда
    
    Драйвер = Новый(«AddIn.КомпонентаРисования.NativeDraw»);
    
    Драйвер.Ввод_УстановитьПерехват();
    Драйвер.Ввод_АктивироватьПерехватМыши();
    
    Драйвер.Ввод_ЗадатьПерехватДействияМыши(«ДвижениеМыши», ЛОЖЬ);
    Драйвер.Ввод_ЗадатьПерехватДействияМыши(«НажатиеЛевойКнопкиМыши», ЛОЖЬ);
    Драйвер.Ввод_ЗадатьПерехватДействияМыши(«ОтпусканиеЛевойКнопкиМыши», ЛОЖЬ);
    
    КонецЕсли;
    
    
    Исключение
    
    Сообщить(ОписаниеОшибки());
    Отказ   = Истина;
    
    КонецПопытки;
    
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    Сообщить(Данные);
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПриЗакрытии()
    
    Драйвер.Ввод_УбратьПерехват();
    Драйвер = NULL;
    
    КонецПроцедуры
    
    
    

    Показать

    Reply
  20. Natalex95

    ДД. Библиотека огонь. Сама идея очень красивая.

    Но столкнулся в своей задаче (хотелке) с небольшой трудностью. Я хочу масштабировать графики в зависимости от изменения размера формы. Сможете подсказать как, это можно реализовать….

    можно конечно через задержки, но данное решение не красивое. Может имеет смысл к библиотеке дописать инструментарий, например вызов внешнего события при изменении размера формы…(если конечно такое возможно)

    Reply
  21. Xershi

    Забавная штука, кому то на курсовую сойдет, а может даже на диплом.

    Reply
  22. ПерваяСистема

    (20) Natalex95, ну вообще это возможно, но почему бы не сделать просто обработчик ожидания?

    Может быть сделаю, по внешнему событию)

    Reply
  23. Natalex95

    (22) Потому что с точки зрения объектного программирование это правильный подход. Произошло событие — вызове процедуру. Не нужно в каждой форме писать кучу одинакового кода по отлавливанию тех или иных событий, если нужно событие обработать оно просто вызывается.

    p.s. мне до сих пор не понятно, почему в 1С не делают некоторых событий у объектов. Иногда хочется сделать бантик для пользователя, а приходиться отказывать потому что нужно наворотить просто уйму сложного и не понятного кода.

    Reply
  24. ПерваяСистема

    (20) Natalex95, сделал такую штуку как отлов событий окон. Если окно переместилось или изменило размер, то придёт событие (предварительно вы должны установить перехват и указать какое окно вам нужно отслеживать).

    Reply
  25. ПерваяСистема
  26. kao_andi

    (1) Слушай блин, все отлично даже бы задонатил, но не хватает мануала, который бы описывал что какая метода делает и какие последствия. А так зачет.

    Reply
  27. ПерваяСистема

    (26) kao_andi, поэтому есть миллион примеров)

    Reply
  28. Steelvan

    Вариант использования, за который можно получить хоть какую-то копеечку ?

    Reply
  29. ПерваяСистема

    (28) Steelvan, используйте как хотите, только саму по себе компоненту не продавайте. Ну и не должно быть публикаций с вашей стороны, где вы как просто раздаёте компоненту, так и продаёте за $m c примером.

    А какую-нибудь полезную обработку, где вы используете компоненту — пожалуйста.

    Reply
  30. oleg_km

    Тоже делал библиотеку для рисования, но после того как подрубил к 1С .NET по методу Сергея Смирнова — просто пользую классы Grafics и Bitmap из 1С напрямую

    Reply
  31. ПерваяСистема

    (30) oleg_km, да видел, прикольно, круто и интересно. Но это нужен .NET и, на мой взгляд, как-то код выглядит не красиво. Кроме того, компонента ещё включает таймер, ввод, хуки, окна …

    Reply
  32. pvlunegov

    Большое спасибо за вашу огромную работу, которая пригодится мне лично для моей задачи.

    На рынке есть товарищи, которые сделали внешнюю компоненту для работы с графикой из 1с.

    НО! Они продают ее за деньги. БОЛЬШИЕ!

    Это неправильно не мой взгляд. Такая политика обречена.

    ПерваяСистема, я поддерживаю вашу политику. Открытость вашей внешней компоненты, возможность дополнять ее своими функциями.

    Мне пока перечисленных функций хватает.

    В скором времени планирую написать пару игрушек в 1с с помощью вашей компоненты.

    У меня предложение к вам. Пожалуйста, упакуйте ваши материалы в 1 архив и выложите. Пусть он будет условно за 5 sm. На мой взгляд, ваша работа стоит и больше.

    Внешнюю компоненту предлагаю выложить БЕСПЛАТНО.

    Кто хочет — пусть пользуют, Кому надо, скачают ваши примеры за sm.

    Reply
  33. pvlunegov

    Ни одна обработка не открывается в 1с.

    В попытке при подключении внешней компоненты происходит ошибка.

    Что делать?

    Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Попытка
    //Адрес = «D:Developwin32NativeDrawNativeAPIindNativeDraw.dll»;
    Адрес = ПоместитьВоВременноеХранилище(ПолучитьМакет(«NativeDraw_2_5»));
    Если ПодключитьВнешнююКомпоненту(Адрес, «КомпонентаРисования», ТипВнешнейКомпоненты.Native) Тогда
    ND = Новый(«AddIn.КомпонентаРисования.NativeDraw»);
    ЭлементыФормы.КоманднаяПанель.Кнопки.Версия.Текст = ND.Версия;
    Иначе
    Отказ   = Истина;
    Возврат;
    КонецЕсли;
    Исключение
    Отказ   = Истина;
    КонецПопытки;
    КонецПроцедуры

    Показать

    Reply
  34. pvlunegov

    Отключил попытку. Выскочило описание ошибки. Во всех обработках, при подключении внешней компоненты одна и та-же ошибка:

    {Форма.Форма.Форма(373)}: Ошибка при вызове метода контекста (ПодключитьВнешнююКомпоненту)

    Если ПодключитьВнешнююКомпоненту(Адрес, «КомпонентаРисования», ТипВнешнейКомпоненты.Native) Тогда

    по причине:

    Использование синхронных методов на клиенте запрещено!

    Reply
  35. ПерваяСистема

    (34) pvlunegov, если что, то все обработки-примеры под обычные формы. Но и на управляемых формах тоже всё работает

    Reply
  36. pvlunegov

    Открыл типовую конфигурацию БП 2.0 — все обработки запускаются нормально.

    В пустой тестовой конфигурации ни одна обработка не запускается.

    Автор, просьба объяснить странное поведение.

    Как я понимаю, в типовой конфигурации при старте какие-то типовые вещи что-то делают возможным подключение внешних компонент?

    Reply
  37. ПерваяСистема

    (36) pvlunegov, нет, просто надо переключить тестовую конфигурацию в режим запуска «Обычное приложение»

    Reply
  38. ПерваяСистема

    (36) pvlunegov, а не это новый прикол от 1С

    решается так

    в свойствах конфигурации в категории «Совместимость» нужно установить подходящее свойство для «режим использования синхронных вызовов».

    Ну или юзать НачатьПодключениеВнешнейКомпоненты

    Reply
  39. pvlunegov

    Я открывал ваши обработки в обычном режиме. Дело в том, что обработки заработали только в типовой конфигурации, в пустой ничего не запускается.

    ПерваяСистема, ваш совет по поводу синхронных вызовов сработал, заработало!

    Хорошо бы было в ваших обработках добавить управляемые формы, с дублированием функционала, но это так, плюшка.

    Самое главное, что все работает.

    НЕпонятное поведение — после запуска обработки «Буфер обмена», в которой более новая версия dll, обработка «Танк» перестала работать. Пишет ошибку

    «{Форма.Форма.Форма(465)}: Метод объекта не обнаружен (Ввод_УстановитьПерехват)

    ND.Ввод_УстановитьПерехват();

    »

    Пробовал прямо в обработке заменить файл dll на более свежую версию, не работает все равно.

    Помогает только очистка кеша.

    Просьба пояснить, как быть. Как использовать все функции всех обработок? Включены ли все эти функции в самую свежую версию dll?

    Или нужно использовать под каждую функцию свою версию dll ?

    Reply
  40. ПерваяСистема

    (39) pvlunegov, ну пример «Танк» самый винрарный, там все ф-ии под старую dll, которая вшита в обработку. Подключение компоненты из макета вот так вот глючит да. Для 1с это одна и та же компонента …

    Чтобы все примеры работали под новую компоненту, надо все старые переписать. Там изменений очень мало

    Reply
  41. pvlunegov

    Как понять, вшита в обработку?

    В обработке танк, используется макет, в котором двоичный файл dll.

    Если его заменить, будет другая версия dll «вшитая» в обработку. Верно?

    Таким образом, если заменить макет на файл новой версии dll, мы «обновим» версию dll «вшитую» в обработку. Верно?

    Или может, в обработке используется старый синтаксис функций, которые в новой версии dll либо отсутствуют, либо заменены?

    Как же вы пишите вашу dll, если новые версии не поддерживают старый синтаксис?

    А как же ключевое понятие совместимости версий, краеугольный камень всего здания поддержки dll ?

    Прошу вас ответить на мои вопросы и исправить эти косяки.

    Вы просите денег за вашу dll поэтому я, как потребитель, имею право требовать определенные базовые вещи.

    Reply
  42. ПерваяСистема
    Или может, в обработке используется старый синтаксис функций, которые в новой версии dll либо отсутствуют, либо заменены?

    — Да

    Как же вы пишите вашу dll, если новые версии не поддерживают старый синтаксис?

    А как же ключевое понятие совместимости версий, краеугольный камень всего здания поддержки dll ?

    — Понимаете, предыдущая версия мне показалась недостаточно логичной и с неверной архитектурой. Зачем мне обеспечивать обратную совместимость для небольшого числа человек, которые скачали компоненту. Ради нескольких людей я должен таскать старый и плохой код из версии в версию.

    Прошу вас ответить на мои вопросы и исправить эти косяки.

    Вы просите денег за вашу dll поэтому я, как потребитель, имею право требовать определенные базовые вещи.

    — Спасибо, посмеялся

    Reply
  43. Dvornik

    Отлично, надо скачать. Я так понял это единственное готовое решение для рисования работающее сразу и на управляемых формах и на толстых.

    .

    Reply
  44. ПерваяСистема

    (43) Dvornik, единственное или не единственное, подключение компонент на 8.2 и 8.3 не отличается.

    Единственное, в 8.3.6 они там что то сделали с памятью и я переделал. Но работает и там и там

    Reply
  45. Dvornik

    А Холст_Создать ( х, ,у, ФорматВыводимойКартинки) точно работает, при ФорматВыводимойКартинки=3 ?

    Делаю так:

     Холст   = Драйвер.Холст_Создать(300, 300, 3);
    Драйвер.Рисование_ЗаполненныйПрямоугольник(Холст, 0,0, 300,300, «Белый»);
    Драйвер.Рисование_ЗаполненныйПрямоугольник(Холст, 30,100, 100, 5, «Зеленый»);
    ЭлементыФормы.Холст.Картинка
    = Новый Картинка(Драйвер.Холст_ДвоичныеДанные(Холст));

    Жму на картинке «сохранить как» и выдает только Формат bmp

    Reply
  46. Dvornik

    У меня оказывается была не последняя версия (2_2). Скачал последнюю, теперь при подключении (ПодключитьВнешнююКомпоненту) вся база просто виснет.

    Reply
  47. monkbest

    А можете пояснить, 32 или 64 для Native надо отделять. И если да, то какая версия тут?

    Reply
  48. ПерваяСистема

    (46) Dvornik, хрен знает, проверю

    Reply
  49. ПерваяСистема

    (47) monkbest, ну компонента под x32, это означает что она работает как на x32 винде, так и на x64

    Reply
  50. monkbest

    Возник вопрос по буферу обмена. Если в буфере не картинка, то следующий код ломает буфер обмена, пока я 1С не закрою.

    Выглядит так:

    1. копирую строку из текстового редактора

    2. жму кнопку в 1С (код ниже)

    После этого я ни в одном приложении не могу ни ставить ту строчку из буфера, ни скопировать что-то новое.

    3. закрываю 1С Предприятие (не просто обработку, а предприятие полностью)

    Все опять работает

    Если же в буфере картинка, то работает на УРА

    Изобр = Драйвер.Изображение_Создать(«БуферОбмена»);
    Если СокрЛП(Изобр) = «» Тогда
    Возврат;
    КонецЕсли;
    Ширина = Драйвер.Изображение_ПолучитьШирину(Изобр);
    Высота = Драйвер.Изображение_ПолучитьВысоту(Изобр);
    Холст = Драйвер.Холст_Создать(Ширина, Высота, 0);
    Драйвер.Рисование_Изображение(Холст, Изобр, 0, 0, Ширина, Высота, 0, 0, 0);
    
    двоичныеДанные = Драйвер.Холст_ДвоичныеДанные(Холст);
    КартинкаИзБуфера = Новый Картинка(двоичныеДанные);
    изБуфера = ПоместитьВоВременноеХранилище(двоичныеДанные);
    
    Драйвер.Изображение_Удалить(Изобр);
    Драйвер.Холст_Удалить(Холст);
    

    Показать

    Драйвер — внешняя компонента

    изБуфера — переменная формы типа строка для отображения картинки на экране

    Reply
  51. monkbest

    (50) monkbest, собственно Ваша обработка (NativeDraw_БуферОбмена) тоже ломается, если в буфере не картинка

    Reply
  52. Dvornik

    Порылся в интернете, получается в управляемом приложении, нельзя загружать картинку в декорации!

    Можно только брать из библиотеки.

    Элементы.Декорация1.Картинка=БиблиотекаКартинок.БизнесПроцесс;

    Я так понял в управляемых формах , придется выводить картинку в табличный документ…

    Да, попробовал версии. 2_2 — работает. 2_6_1 намертво, вешает 1с. Может что-то надо установить?

    Reply
  53. ПерваяСистема

    (52) Dvornik, можно, берёшь картинку (не файл, а объект), кладёшь во временное хранилище, получаешь адрес, этот адрес приравниваешь к декорации (она строка)

    Reply
  54. ПерваяСистема

    (52) Dvornik, установить может и надо, распространяемые пакеты для VS2015

    Ибо у меня работает всё норм, ничего не падает

    Reply
  55. ПерваяСистема

    (51) monkbest, нормально всё, я взял обработку заменил компоненту на новую 2.6.1, при копировании текста ничего не ломается и не виснет, платформа 8.3.8

    Reply
  56. Dvornik

    (54) Не знаю даже, что мне поставить на сервер 1с теперь и скольки разрядное.

    Reply
  57. monkbest

    (55) не понял, а в каком из примеров какие версии библиотеки?

    было бы неплохо в именах файлов для скачивания написать версии dll

    я скачал Пример «Изображения: Буфер обмена» и Пример «Танк»

    собственно в первой ошибка проявляется, я сохранил макет на жесткий диск и в свойствах файла на закладке «подробно» увидел 2.5.0.0

    где взять 2.6.1?

    Reply
  58. monkbest

    Скачал dll отдельно, там был 2.6.1.

    Заменил в своей обработке (с 2.5 она в принципе работала, но падала, если в буфере обмена не картинка)

    При открытии стало зависать намертво, т.е. 2.6.1 не инициализируется, а 2.5 инициализируется в УФ на ура

    УФ, 1С:Предприятие 8.3 (8.3.7.1860)

    Прилепил саму обработку

    Вот код инициализации:

    &НаСервере
    Функция ПолучитьМакетСКомпонентой()
    Возврат ПолучитьОбщийМакет(«NativeDraw_2_6_1»);
    КонецФункции
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    Попытка
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
    ПутьККомпоненте = «ОбщийМакет.NativeDraw_2_6_1»;
    #Иначе
    Макет = ПолучитьМакетСКомпонентой();
    Каталог = КаталогВременныхФайлов();
    ПутьККомпоненте = Каталог + «NativeDraw_2_6_1.dll»;
    Макет.Записать(ПутьККомпоненте);
    #КонецЕсли
    //Макет = ПолучитьМакетСКомпонентой();
    //Адрес = ПоместитьВоВременноеХранилище(Макет);
    //УстановитьВнешнююКомпоненту(«ОбщийМакет.NativeDraw_2_5»);
    Если ПодключитьВнешнююКомпоненту(ПутьККомпоненте, «КомпонентаРисования», ТипВнешнейКомпоненты.Native) Тогда
    
    Драйвер    =    Новый(«AddIn.КомпонентаРисования.NativeDraw»);
    
    Иначе
    
    КонецЕсли;
    
    
    Исключение
    
    Сообщить(ОписаниеОшибки());
    Отказ            =    Истина;
    
    КонецПопытки;
    КонецПроцедуры
    

    Показать

    Reply
  59. monkbest

    (52) Dvornik, вот рабочий код по отображению картинки:

    на форме переменная формы строка неограниченной длины «изБуфера», которую я поместил на форму, у поля указал вид «полеКартинки»

    Все работает с dll 2.5, с 2.6.1 зависает при инициализации как у Вас

    Изобр = Драйвер.Изображение_Создать(«БуферОбмена»);
    Если СокрЛП(Изобр) = «» Тогда
    Сообщить(«не то»);
    Возврат;
    КонецЕсли;
    Ширина = Драйвер.Изображение_ПолучитьШирину(Изобр);
    Высота = Драйвер.Изображение_ПолучитьВысоту(Изобр);
    Холст = Драйвер.Холст_Создать(Ширина, Высота, 0);
    Драйвер.Рисование_Изображение(Холст, Изобр, 0, 0, Ширина, Высота, 0, 0, 0);
    
    двоичныеДанные = Драйвер.Холст_ДвоичныеДанные(Холст);
    изБуфера = ПоместитьВоВременноеХранилище(двоичныеДанные);
    
    Драйвер.Изображение_Удалить(Изобр);
    Драйвер.Холст_Удалить(Холст);

    Показать

    Reply
  60. ПерваяСистема

    Попробуйте поставить это

    https://www.microsoft.com/ru-ru/download/details.aspx?id=48145

    Reply
  61. monkbest

    (60) не помогло

    Reply
  62. ПерваяСистема

    вот, 2.6.1 запустился и работает …

    Reply
  63. Dvornik

    vc_redist.x64 Установил, не помогло.

    Можно мне 2.5 версию? Если она работает, мне бы хватило.

    Reply
  64. ПерваяСистема

    (63) Dvornik, у меня нет предыдущих версий …

    Reply
  65. ПерваяСистема

    (63) Dvornik, а какая операционка у вас?

    Reply
  66. Dvornik

    Использую 7. Хочу ещё сегодня обновить платформу 1с, может из-за неё.

    Reply
  67. monkbest

    (66) Dvornik, не знаю, кажется, что дело не в винде и не в платформе. Я пробовал на 8.3.5 8.3.6 и 8.3.7, win 7 и win 10, с установленным VS 2015 и без.

    Сдается мне, что проблема в разрядности. Автор писал, что она 32.

    В мануалах написано, что надо в архив класть файл манифеста и версии компонент разной разрядности и ОС.

    Еще в мануалах написано, что для работы Native в тонком клиенте (УФ) надо вызвать метод УстановитьВнешнююКомпоненту(…), этот метод материться, что компонента не та

    Пробовал исходники скомпилить по 64, но студия меня послал лесом с кучей errrr. Не силяен в этой IDE и не знаю, что надо переделать в проекте, чтобы сделать 64х компоненту для теста.

    Но эта версия не дает ответа на вопрос о том, почему 2.5 работает, в итоге 6sm$ выкинул на ветер, т.к. хотел реализовать в своей базе багтрекере вставку принтскринов. 2.5 плохо работает с буфером, 2.6.1 не работает

    Reply
  68. Dvornik

    А я попробовал и в файловом варианте и в 8.2, и в 8.3, и в серверном, и на разных компьютерах. К слову на всех 64-разрядная система. Ошибка, можно сказать, та же, «установка не выполнена.»

    Reply
  69. ПерваяСистема

    (67) monkbest, опишите какая винда какая конфигурация (или самописная?) какая платформа (желательно чтобы последняя) попробую у себя создать такие же условия

    Reply
  70. ПерваяСистема

    (68) Dvornik, (67) monkbest,

    серверная винда x64, серверная 1ска 8.3.8 (постгрес), пустая конфигурация, всё работает

    Reply
  71. ПерваяСистема

    вот буфер обмена под управляемые формы

    Reply
  72. monkbest

    (71) выложи пример, получишь лишние SM, а мы рабочий пример. Я не исключаю возможности, что я криво написал подключение.

    Reply
  73. sherbv

    (71) Добрый день!

    А можете выложить пример для управляемых форм.

    Пока на управляемых формах заработала компонента из примера «»Тест компоненты», да и то частично.

    объект создается, а на любую попытку нарисовать что-то программно ругается:

    {Форма.ФормаУпраляемая.Форма(36)}: Ошибка при вызове метода контекста (Рисование_Треугольник)

    Драйвер.Рисование_Треугольник(Холст, 170, 619, 81, 757, 262, 753, 1, Драйвер.Рисование_ПолучитьЦвет(200, 255, 0, 0));

    по причине:

    Неверный аргумент

    Reply
  74. sherbv

    А версия 2.6 действительно зависает при инициализации на управляемых формах

    Reply
  75. sherbv

    (63) Dvornik, Добрый день!

    Что-нибудь получилось с этой обработкой для управляемых форм?

    У меня пока не взлетает.

    Reply
  76. grinhan

    (71) а можно ли получить рисунок с прозрачным фоном? У холста нет свойства прозрачности, в незакрашенных местах он получается черным.

    Reply
  77. ПерваяСистема

    (76) grinhan, так, в данной реализации нет, но я посмотрю что можно сделать

    Reply
  78. grinhan

    (77) буду ждать, заранее спасибо!

    Reply
  79. newdigger

    Очень не хватает метода рисования залитых многоугольников. Можно ли будет добавить эту возможность?

    Reply
  80. newdigger

    Еще, при подключении компоненты версии 2.6.1 намертво виснет на ПодключитьВнешнююКомпоненту.

    Хотя при подключении компоненты, которая входит в макет обработки NativeDraw_ТестКомпоненты.epf — не виснет.

    ОС Windows Server 2008 R2 (под учеткой администратора)

    1C 8.3.8.1784

    Толстый клиент

    Режим: Серверный (сжатие: усиленное)

    На Windows 10 все нормально

    Reply
  81. Dvornik

    Добрый день.

    (79) newdigger, так вы рисуйте линии потолще, мне подошло.

    (75) sherbv, у меня версия 2.6 не взлетела, жду решения. Windows 10 поставить не могу.

    проблема, как заметил newdigger :

    при подключении компоненты версии 2.6.1 намертво виснет на ПодключитьВнешнююКомпоненту. (платформы пробовал 8.2 и 8.3)

    Reply
  82. newdigger

    Заметил еще одну неприятную особенность.

    Строка моего кода:

    ЭлементыФормы.Холст.Картинка = Новый Картинка(Драйвер.Холст_ДвоичныеДанные(Холст));

    Здесь возникает утечка памяти. Если постоянно перерисовывать картинку, то при каждом проходе этой строки выделяется память.

    Я думал, что что-то делаю не так. Но в примере с танком тоже идет утечка памяти.

    Reply
  83. ПерваяСистема

    (82) newdigger, та да, только это не утечка, но то есть это со стороны 1С такая фигня, но она полностью очищается если памяти не хватает (вызывается сборщик мусора), это всё на стороне платформы

    Reply
  84. newdigger

    (83)

    на счет многоугольников залитых: я уже добавил эту возможность самостоятельно. Спасибо Вам за структуированный код.

    Reply
  85. ПерваяСистема

    (84) newdigger, хорошо

    Reply
  86. newdigger

    (85) и все таки, у Вас есть какие-нибудь соображения по поводу того, что компонента не загружается на Windows Server 2008 R2?

    У меня, например, Visual Studio 2015 предлагает компиляцию только на две платформы — W8 И W10. Может быть с этим связано?

    Reply
  87. ПерваяСистема

    (86) newdigger, ага, ща попробовал на 7ке, действительно виснет, перекомпилил на Visual Studio 2015 — Windows XP (v140_xp) и вроде заработало, кстати сделал отрисовку многоугольников

    Reply
  88. newdigger

    (87) спасибо!

    Reply
  89. pvb2003

    (87) не заработала в режиме управляемого приложения.

    1С:Предприятие 8.3 (8.3.6.2237) Бухгалтерия предприятия, редакция 3.0 (3.0.42.37) Win 7 максимальная х64

    Вот одна из попыток запуска (Модуль управляемого приложения, ПриНачалеРаботыСистемы):

    АдресВнешнейКомпоненты = ПоместитьВоВременноеХранилище(«ОбщиеМакеты.NativeDraw_2_6″);
    Результат=ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты,»КомпонентаРисования»);
    #Если ТонкийКлиент Тогда
    Если Не Результат Тогда
    НачатьУстановкуВнешнейКомпоненты(,АдресВнешнейКомпоненты);
    Результат=ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты,»КомпонентаРисования»);
    КонецЕсли;
    #КонецЕсли
    

    Показать

    В этом варианте закинул dll в зип вместе с манифестом и загрузил в общий макет. Пляшу долго уже. При запуске в тонком клиенте выдает:

    «Установка внешней компоненты не выполнена. В процессе установки произошла ошибка. Возможно, отсутствует компонента для используемого клиентского приложения.»

    При запуске в толстом клиенте виснет намертво, а если подождать пару минут, так еще и конфигуратор зависает.

    Reply
  90. ПерваяСистема

    pvb2003, первым делом попробуйте поставить https://www.microsoft.com/ru-ru/download/details.aspx?id=48145 / vc_redist.x64.exe

    Для Windows 7 нужно использовать самую последнюю версию компоненты, т.е. 2.6.2

    Reply
  91. Dvornik

    У кого 2_6_2 на 7-ке не виснет?

    Reply
  92. ПерваяСистема

    (91) Dvornik, а у тебя виснет?

    Reply
  93. pvb2003

    (90) у меня vc_redist.x64 стоит версии 14.0.23.506 (твоя ссылка на более раннюю версию). Попробовал исходники компилировать, слишком много ошибок критических выдает 2_6_2. Жаль нет времени пока разбираться. Но я прям ОЧЕНЬ хочу этот продукт в рабочем виде xD

    Reply
  94. ПерваяСистема

    (93) pvb2003, а пример примитивы тоже виснет?

    Reply
  95. pvb2003

    (94) я их не качал, зачем тратить драгоценные денюшки, коле всё остальное не работает xD

    Качал танк и ввод, взлетел только танк в обычном приложении, ввод не взлетел ни в каком

    Reply
  96. ПерваяСистема

    (95) pvb2003, примитивы самые последние с библиотекой 2.6.2, они работают как и в обычном, так и в «необычном» приложении. Остальные старые версии, потом будут обновлены

    Reply
  97. newdigger

    У меня нет возможности проверить на Win 7.

    Я пробую на Windows Server 2008 R2. Тут вообще странная картина. Запускаю — работает. Закрываю 1С, открываю заного, открываю форму, где используется компонента — зависает. И так постоянно — то работает, то зависает. От чего зависит — не пойму. Работаю под учеткой админа.

    Хотя есть одна зависимость — запускаю 1С в режиме совместимости с Windows XPSP3. Если запускать без режима совместимости, то виснет всегда.

    Для надежности запускал на двух серверах — картина одинаковая.

    Reply
  98. ПерваяСистема

    (97) newdigger, сервер x64?

    Я не поленился и запустил на виртуалке Windows 7 (x32), потестировал пример «Примитивы». Просто установил голую Windows 7, установил 1С, открыл обработку как обычном приложении, так и в управляемом. Пробовал закрыть 1С, снова открыть, несколько раз переоткрыть. Всё работает, ничего не виснет, платформа 8.3.8, никаких доп драйвер и паков не устанавливал

    Reply
  99. newdigger

    (98)

    да, сервер x64.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *