ВК для 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 не будет опубликован. Обязательные поля помечены *