ВК для 1С:Предприятие 8.2 NativeAPI на Delphi — доработанная

Доработанная версия: http://infostart.ru/public/88060/
Добавлено:
1. Альтернативная "пауза" — с практически нулевой загрузкой на процессор;
2. Счетчик бездействия (определение времени простоя сеанса, работает даже в терминале Citrix)
3. Важное сообщение (выводится в окне 1С сверху-справа красный прямоугольник сообщения);
4. ПолучитьИнформациюОСеансе() — расширенная информация о текущем сеансе 1С (то, чего платформа не умеет).

Рекомендую, если не хватает стандартного функционала платформы 1С Предприятие — обратиться к  Miracle Native v8 — по крайней мере, прежде, чем изобретать велосипед разрабатывать нечто своё…

 

Новые методы данной ВК: 

Пауза(мс)

Процедура (метод).

Альтернативная пауза, без нагрузки на ЦП, с нормальной прорисовкой и т.п., мс — число, время бездействия в миллисекундах (обязательный).

НаблюдениеВремениБездействияАктивно

Свойство (чтение и запись). Тип: Булево.

После установки в ИСТИНА начинается подсчет времени бездействия пользователя текущего сеанса. Перед закрытием 1С настоятельно рекомендуется установить данное свойство в ЛОЖЬ;

ВремяБездействияПользователя

Свойство (только чтение). Тип: Число.

Хранит в себе число миллисекунд простоя данного сеанса 1С. Удобно, чтобы автоматически закрывать «забытые» окна стандартными средствами 1С.

ФоновоеСообщение(Заголовок, ТекстСообщения)

Процедура (метод).

Показывает сообщение вверху формы 1С вот так:

 

УбратьФоновоеСообщение()

Процедура (метод).

Закрывает сообщение вверху формы (если оно открыто);

ПолучитьИнформациюОСеансе()

Функция (метод).  

Возвращает строку дополнительной информации о текущем сеансе.

В файле имеется обработка с демонстрацией всех перечисленных возможностей.

 

О Native API

Native API — это новая технология компонент, появившаяся в 1С Предприятие 8. Главные достоинства — не требует регистрации и административных прав, простота разработки.

Основные материалы по теме:

//infostart.ru/public/125913/Miracle Native v8 — мощная вещь! Умеет почти всё, что умеют данная и нижеприведенные ВК (графика, мультимедиа, много информации об ОС и терминальной сессии, закрытие терминальных сессий, пара полноценных игр, дополнение функционала платформы 1С, взаимодействие с главным окном 1С Предприятие и открытыми формами, обмен сообщениями между приложениями Windows и между запущенными сеансами 1С, работа с файловой системой, шустрое прямое чтение из XLS-файла, и еще много-много мелких но полезных функций).  

//infostart.ru/public/81644/ — исходники Delphi / Free pascal — основные шаблоны и модули для начала разработки ВК;

//infostart.ru/public/88060/ — исходники Delphi, компонента — основа для данной разработки.

//infostart.ru/public/144151/ —  Delphi, реализация доступа к сокетам. Кто не знает, что такое сокеты — воспользуйтесь интернет-поиском по теме «сокеты в delphi«

//infostart.ru/public/91306/ — Visual C++ 2010, Перехватчик клавиатуры (как я понимаю, глобальный (не только для текущего окна)?..);

//infostart.ru/public/137945/ — Альтернативная реализация функции Сигнал(Beep), ничего сложного, но может и пригодится;

//infostart.ru/public/168241/ — ВК для выполнение запросов SQL к базе данных Firebird

Делитесь ссылками в комментариях — буду пополнять безу компонент на Native API.

В данный момент хотелось бы реализацию утилиты Gold Parser, имеющуюся в Инструментах разработчика и в их мобильной версии.

Обновление от 11.01.2013: Исправлено описание (несправедливость по отношению к Miracle Native — ВК для V8, отмеченная в комментариях к публикации). Обновлена основная обработка тестирования ВК (в соответствии с комментарием 3, спасибо UncleVader).

 

 

 

33 Comments

  1. German

    Gold Parser еще и в Ei используется, но как и везде к сожалению только для x32. Сделать ВК там не сложно, просто нужно заняться и тогда будет счастье и на х64

    Reply
  2. German

    ВремяБездействияПользователя, а что именно считать бездействием? если документ проводится 3 мин это 3 минуты бездействия?

    Reply
  3. UncleVader

    Авансом +, но хочется иметь полноценную работу в управляемом режиме.

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

    Reply
  4. DrAku1a

    (2) Если за это время пользователь не разу не двинул мышью и не нажимал никаких клавиш на клавиатуре — то да!..

    Reply
  5. DrAku1a

    Реализация контроля «забытых» сеансов состоит из нескольких этапов:

    1. Периодический опрос времени бездействия;

    2. Вопрос пользователю: «ты тут вообще?» с автоответом «нет» через скажем 600 секунд;

    3. Завершение работы и запись в журнал регистрации события;

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

    Reply
  6. DrAku1a

    (3)Что не работает в УФ? Если честно, там почти не тестил — не возникло надобности. Но сделаю. Вот только ФоновоеСообщение() вряд ли будет там работать…

    (1) эх… хотя бы исходнички GoldParser.DLL добыть…

    Reply
  7. UncleVader

    (6)

    Вот только ФоновоеСообщение() вряд ли будет там работать

    Как раз вот это и заинтересовало, но только в УФ, жаль если не заработает.

    А исходники не планируется выкладывать?

    Reply
  8. DrAku1a

    (7) Да вроде выложил уже — в отдельном файле.

    Reply
  9. Abadonna
    Reply
  10. DrAku1a

    (9) ну да, согласен, недооценил! Прошу прощения! Дайте краткое описание — поправлюсь в статье.

    Reply
  11. Abadonna

    (10) Описание в архиве и тут http://dev.1tsm.ru/project/148 и на ИС также.

    Ваще-то она умеет практически все то, что заявлено у этой ВК + еще много чего 😉

    И давно уже умеет

    Reply
  12. DrAku1a

    (11) Перечитал весь перечень процедур в «MiracleNative ОПИСАНИЕ.doc» из архива на ИС. Впечатляюще!

    Хотя, что касается системы — по большей части плюшки из какой-нибудь «Базы знаний Delphi» типа DRKB или типа того, но ведь их действительно тупо нету в 1С. Но у Вас есть и то, что добыто явно личным упорным трудом — изучая внутренности платформы 1С. Кроме того, как я понимаю, всё работает и в обычном и в управляемом приложении… Круто! Очень круто!

    ВремяРаботыWindow():число – количество в минутах после запуска Windows

    это смаливает на опечатку в названии метода 😉

    Но все-же не нашлось:

    1. Методов СОН или ПАУЗА (я невнимательно читал?)

    2. Счетчика бездействия для контроля неактивного сеанса (хотя его можно организовать с помощью имеющихся методов отлова событий мыши и клавиатуры).

    И еще…

    При написании своей ВК, я старался как можно меньше непосредственно взаимодействовать с платформой 1С, в частности с главным окном — я стараюсь сохранить целостность и стабильность платформы (и без того шаткую). Однако,ПоказатьФоновоеСообщение выводит сообщение внутри окна 1С (просто за пределами MDI-фрейма) и использует таймер для позиционирования окна (внутренними средствами delphi).

    Ваша же компонента, как я понимаю, активно внедряется в интерфейсы окон 1С (а иначе такой функционал не реализовать) — а после этого система работает стабильно?..

    Reply
  13. DrAku1a

    (11) Кстати, а исходники, как я понимаю, закрыты? 😉

    Reply
  14. Abadonna

    (12)

    ПАУЗА

    Задержка(Время:число) – ненагружающая процессор задержка на указанное время, мс.

    ПоказатьФоновоеСообщение

    СообщениеТрейИконки(ТекстСообщения:строка,ВремяПоказа:число)

    Выводит трей- баллун с указанным сообщение на определенное время, сек.

    Если ВремяПоказа=0 — на 60 сек.

    Оповещение (ТекстЗаголовка,ТекстСообщения,ИмяФайлаКартинки:строка,ВремяПоказа,ЦветОкна:число)

    Выводит окно оповещения по типу окна от 1С ПоказатьОповещениеПользователя() на время= ВремяПоказа, сек. Если ВремяПоказа=0 – до закрытия пользователем. При нажатии на текст окно оповещения закрывается и генерирует внешнее событие DESKTOP_ALERT_CLICK, данные – текст сообщения.

    СоздатьСообщениеПользователю(ТекстСообщения:строка) – создает отдельное окно с сообщением пользователю.

    СоздатьИнформОкно(ТекстСообщения:строка,ВремяПоказа:число) – создает отдельную форму информации (по типу, как в AIMP последних версий), располагающуюся вверху экрана.

    Счетчика бездействия для контроля неактивного сеанса

    УстановитьКонтрольАктивности() – устанавливает упрощенную ловушку событий мыши (клик левой/правой кнопками) для оценки активности пользователя в текущем сеансе.

    Генерирует внешнее событие LAST_CLICK, данные — количество в минутах после запуска Windows

    Соответственно и ВремяРаботыWindows — в минутах, для удобства. Оценивать неактивность в мс или сек — просто элементано неудобно.

    Кстати, в тестовой базе, все эти методы задействованы.

    а после этого система работает стабильно?..

    А спроси у скачавших MiracleV8: Расширенная версия :)))

    Я такие ВК пишу года эдак с 2002…

    И никогда не публикую (и не пользую), что нестабильно

    Reply
  15. DrAku1a

    (14) Спрашиваю! Народ, отпишитесь, кто тестил — особенно, если падало!.. У меня — ни разу, но пробовал только на толстом брате…

    УстановитьКонтрольАктивности() – устанавливает упрощенную ловушку событий мыши (клик левой/правой кнопками) для оценки активности пользователя в текущем сеансе. Генерирует внешнее событие LAST_CLICK, данные — количество в минутах после запуска Windows

    Счетчик бездействия — ловит не только нажатия мыши, но и малейший сдвиг курсора или нажатие клавиш на клавиатуре.

    Кстати, публикацию обновил — теперь с рекламой ВК Miracle (с нее собственно и начинается).

    Reply
  16. Abadonna

    (15)

    ловит не только нажатия мыши, но и малейший сдвиг курсора или нажатие клавиш на клавиатуре.

    Отказался еще на заре. Юзверь (обычный) обязательной мышью кликнет, если что-то делает.

    И уж тем более на сдвиг его «ловить»… Ну, двиганул, случайно.

    P.S. Пресловутая тетя Маша запустила 1С сама не знает зачем (на всяк случай), потом бумажки перебирала или пыль со стола стирала — вот тебе и сдвиг 😉

    У меня — ни разу, но пробовал только на толстом брате…

    Ты, видать, Native тестил, а я про COM — MiracleV8, а той уж сто лет в обед. А Native, как и написано в описании,

    наследница вышеупомянутой. Да еще я до фига от предка выкинул, хотя бы потому, что та еще и 7.7 поддерживала.

    И оставил в Native только то, что мне действительно надо.

    Reply
  17. DrAku1a

    (16) Одна пресловутая тетя Маша — один сеанс, погоды не делает… Да и все равно через какое-то время будет отключена. Так то я выкидываю в основном тех, кто на ночь открытой 1С-ку оставляет… Еще и в журнал регистрации записываю событие — потом таких наказываю.

    Reply
  18. Abadonna

    (0) Плюс ставить не буду, а то скажут «за что кукушка…» :)))

    Но в уме плюс, полный одобрямс!

    Reply
  19. Abadonna

    (18)

    кто на ночь открытой 1С-ку оставляет…

    Дык и я про то же! Если на ночь оставил, контроля клика вполне достаточно.

    А я всех гадов на пару часов сажаю (а иногда и на полчаса), ибо не фиг:)) А то родные проггеры в нашей родной базе и то умудряются «забыть».

    Reply
  20. DrAku1a

    (19) Аналогично. Хотя у нас на ночь прогеры порой важные расчеты оставляют…

    Reply
  21. CaSH_2004

    + за профессиональное и доступное оформление/описание

    > Я так понимаю ФоновоеСообщение (Заголовок, ТекстСообщения) не имеет никаких настроек типа ЦветФона, Картинка, Параметры шрифта? Всегда будет как на рисунке? Что за зеленая стрелка справа?

    Reply
  22. yuraos

    Я смотрю тут всякие вкусности реализованны,

    что-то навроде FormEx.dll для 1с-7.7

    Люблю интерфейсные плюшки!

    Их так не хватает в 1С, особенно в управляемом интерфейсе.

    Скажите

    1) Может ли ваша ВК управлять расположением окна формы?

    Ширину и высоту ее изменять можно,

    Но иногда хочется вершний левый угол окна подогнать

    к какому-нибудь из элементов управления в другом окне.

    2) Мне не нравится как отрабатывается метод Форма::ВыбратьИзМеню().

    Список выбора выравнивается по верхнему левому углу

    элемента управления, для которого метод вызывается.

    Иногда хотелось бы видеть его около курсора мыши,

    аналогично варианту без привязки к элементу управления

    у метода Сервис::ВыбратьЗначение() у ВК FormEx.dll.

    Reply
  23. DrAku1a

    (21) Настроек действительно нет никаких — реализовано только так, как на картинке. Но ведь исходники прилагаются — никто не мешает Вам это дело исправить 😉

    (22) ни 1, ни 2 не реализовано — но вроде, реализовать то не сложно… но я бы для таких целей использовал VBScript…

    Reply
  24. yuraos

    (23)


    ни 1, ни 2 не реализовано — но вроде, реализовать то не сложно… но я бы для таких целей использовал VBScript…

    а можно по-подробнее в порядке ликбеза

    🙂

    Reply
  25. babylon_5

    А можно в ВК добавить возможность отправлять какое-либо значение на LPT? Чтобы определенную линию данных порта на какое-то время переключить 0-1.

    Reply
  26. kentavr27

    Чего-то я недопонял…

    выложено 2 архива (не считая исходников). v8utils2.zip и v8utils.zip

    Обработки в этих архивах разные, но DLL-ки абсолютно одинаковые (от 24.09.2012 15:35 размер то же одинаковый)

    Если «Обновление от 11.01.2013» то чего ж файл 12-ым годом датирован?

    Обработки изначально нерабочие (смотрю в управляемом приложении)

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

    АдресВК = ПоместитьВоВременноеХранилище(ОбъектВК, ЭтаФорма.УникальныйИдентификатор);

    по причине:

    Переданное значение не может быть помещено во временное хранилище

    Сделал через переменную модуля. Дошли до паузы… Метод объекта не обнаружен (Пауза)

    ОбъектВК.Пауза(3000);

    Бездействие: Поле объекта не обнаружено (НаблюдениеВремениБездействияАктивно)

    Фоновое сообщение: Метод объекта не обнаружен (ФоновоеСообщение)

    Инфо о сеансе: Метод объекта не обнаружен (НомерСоединенияИнформационнойБазы)

    Это как? Не ту версию выложил, или это шутка такая была?

    Reply
  27. DrAku1a

    (26)

    Если «Обновление от 11.01.2013» то чего ж файл 12-ым годом датирован?

    DLL-ка не изменялась.

    Что касается тонкого клиента — там совершенно другая система поставки ВК (нужно делать комплект для Windows+Linux+Плагины для браузеров + описание всего этого в XML), но 1С не выдает ошибку при попытке зарегестрировать ВК — она просто возвращает неопределено.

    Reply
  28. kentavr27

    (27) да она регистрируется, вот только во временное хранилище помещать такой объект нельзя. А как на счет отсутствия вышеперечисленных методов? (и в тонком, и в толстом поведение одинаково)

    Reply
  29. DrAku1a

    (28) kentavr27, протестировал в толстом клиенте — все методы есть и работают. Проверяйте, что возвращает

    ОбъектВК = Новый(«AddIn.DemoLib.ExecExtention»)

    если неопределено — то надо разбираться в причинах, почему 1С не грузит компоненту.

    Reply
  30. Omicron

    Вдруг тут ещё кто-то есть.

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

    «Глобально» объект компоненты никак ведь не объявить. Если опрашивать её в ОбработчикеОжидания(), то экземпляр каждый раз создаётся новый.

    Делал примерно такой код:

     АдресХранилищаКомпоненты = Инициализация.ПодключитьКомпонентуСервер();
    ПодключитьВнешнююКомпоненту(АдресХранилищаКомпоненты, «DemoLib»);
    Компонент = Новый («AddIn.DemoLib.ExecExtention»);
    Компонент.НаблюдениеВремениБездействияАктивно = Истина;
    ВремяПростояРазрешённое = 15;
    ВремяПростояНакопленное = Инициализация.ВернутьВремяПростоя();
    ВремяПростояТекущее = Компонент.ВремяБездействияПользователя;
    Если ВремяПростояТекущее + ВремяПростояНакопленное > ВремяПростояРазрешённое Тогда
    Инициализация.УстановитьВремяПростоя(0);
    ЗаблокироватьРаботуПользователя();
    Иначе
    Инициализация.УстановитьВремяПростоя(ВремяПростояНакопленное + ВремяПростояТекущее);
    КонецЕсли;

    Показать

    Время простоя пишется в параметр сеанса.

    В момент вызова метод ВремяБездействияПользователя возвращает 0.

    Что я делаю не так?

    Reply
  31. DrAku1a

    (30)

    «Глобально» объект компоненты никак ведь не объявить.

    На форме — можно попробовать так:

    &НаКлиенте;
    Перем Компонент;

    Reply
  32. Omicron

    (31) Да. Но не прописывать же объявление компоненты во всех формах конфигурации.

    Я думал, можно как-то инициализировать её при начале работы системы, чтобы она постоянно работала и подсчитывала время простоя сеанса пользователя, а в ОбработкеОжидания я бы это время получал, но, похоже, это невозможно.

    Reply
  33. DrAku1a

    (32) Может, сделать для неё глобальную переменную в модуле сеанса управляемого приложения?

    Reply

Leave a Comment

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