[Мониторинг изменения файлов] - ActiveX-компонента для 1С 8.х + ВК для 7.7

Опубликовал Василий Демидов (Душелов) в раздел Программирование - Практика программирования

Компонента следит за изменениями файлов в заданных каталогах, без таймеров и опросов файловой системы.
Использует события Windows.

Насколько я знаю, подобная ВК есть, но...
Т.к. в 8-ке в контексте сервера нет возможности использовать внешние компоненты в стандартном представлении 1С, то пришлось написать аналог в виде ActiveX, который прекрасно работает в серверном режиме (т.е. регламентные и прочие задания).

*** Для работы компоненты потребуется установленный Microsoft .NET Framework 2.0, который можно скачать отсюда.


Чтобы зарегистрировать компоненту в Windows - запустить reg.bat
(для удаления информации о компоненте в Windows - запустить unreg.bat)
или использовать совместно с хранилищем внешних компонент: //infostart.ru/projects/2863/

*** Использование в 1С 8.х:

v8: Меню "Форма" - "Вставить ActiveX..." - Выбрать элемент "Душелов.FileWatcher" или Новый COMObject("Душелов.FileWatcher");

*** Использование в 1С 7.7:

Перем Мониторинг;

ИмяВК="AddIn.FileWatcher";
 
Попытка
    ПодключитьВнешнююКомпоненту(ИмяВК);
Исключение
    Сообщить("Не удалось подключить компоненту "+ИмяВК);
КонецПопытки;

Попытка
    Мониторинг = СоздатьОбъект(ИмяВК);
Исключение
    Сообщить("Ошибка создания объекта внешней компоненты: "+ ИмяВК);
КонецПопытки;

СИНТАКСИС:

*** Контекст компоненты:
   
  *** Методы:

  Работа с элементами мониторинга:

  • Добавить(ИмяЭлемента); //возвращает объект типа "Элемент мониторинга"
  • Удалить(ИмяЭлемента);
  • УдалитьВсе();
  • Получить(ИндексЭлемента);
  • ПолучитьПоИмени(ИмяЭлемента);
  • Количество();

  *** События ActiveX:

  • ПриСоздании(ИмяЭлемента, ИмяФайла, Путь)
  • ПриИзменении(ИмяЭлемента, ИмяФайла, Путь)
  • ПриУдалении(ИмяЭлемента, ИмяФайла, Путь)
  • ПриПереименовании(ИмяЭлемента, ИмяФайла, Путь, СтароеИмяФайла, СтарыйПуть)

  *** Внешнее событие ВК:

 - Источник = "FileWatcher"
 - Событие (ПриСоздании, ПриИзменении, ПриУдалении, ПриПереименовании, Ошибка)
 - Данные (ИмяЭлемента + ИмяФайла + Путь), при переименовании еще "СтароеИмяФайла + СтарыйПуть"

*** Элемент мониторинга:
   
  *** Параметры:

  • Имя //только чтение, имя элемента
  • Активирован //булево, запуск и остановка мониторинга
  • Фильтр //строка фильтра, используемая для определения файлов, контролируемых в каталоге
  • ФильтрИзменений //типы отслеживаемых изменений
      (Атрибуты, ВремяСоздания, ИмяКаталога, ИмяФайла, Доступ, Модификация, Безопасность, Размер)
  • Путь //контролируемый каталог

Скачать файлы

Наименование Файл Версия Размер
-
.1236256555 19,13Kb
25.09.09
312
.1236256555 19,13Kb 312 Бесплатно
ВК для 7.7
.1236928929 20,25Kb
25.09.09
142
.1236928929 20,25Kb 142 Бесплатно

См. также

Комментарии
1. Василий Демидов (Душелов) 3779 05.03.09 15:38 Сейчас в теме
Насколько я знаю, подобная ВК есть, но...
Т.к. в 8-ке в контексте сервера нет возможности использовать внешние компоненты в стандартном представлении 1С, то пришлось написать аналог в виде ActiveX, который прекрасно работает в серверном режиме (т.е. регламентные и прочие задания).
2. Александр Рытов (Арчибальд) 2652 05.03.09 16:05 Сейчас в теме
Предлагаю альтернативный ник
Душелов_Для_работы_MS.NET_Framework2.0
3. Игорь Белышев (biv75) 05.03.09 16:15 Сейчас в теме
А лучше отдельную страницу "Душелов разработки"
4. Александр Рытов (Арчибальд) 2652 05.03.09 16:21 Сейчас в теме
(3)Отнюдь НЕ ВСЕ разработки Василия требуют фрамугу. Так что альтернатива нужна.
5. Артур Аюханов (artbear) 851 05.03.09 17:25 Сейчас в теме
Подобное вроде как можно сделать и на штатном MS.ScriptControl, без всяких
наворотов в виде ВК ?
Его события вроде бы также можно юзать в восьмерке.

ЗЫ сам в 8.1 не тестил :)
в 77 с помощью 1С++ подобная схема работает.
6. Василий Демидов (Душелов) 3779 05.03.09 19:57 Сейчас в теме
(5) Честно, не помню, по-моему Watcher там есть.... Можно, конечно, порыскать, но для меня быстрее компоненту написать, чем со скриптами разбираться ;)
7. Игорь Белышев (biv75) 06.03.09 00:21 Сейчас в теме
(6) Вот.. лень двигатель прогресса, ленись Василий, мне нравится как ты это делаешь
_rashik; Арчибальд; +2 Ответить
8. Сhe Burashka (CheBurator) 12.03.09 04:29 Сейчас в теме
Василий! вот у мну есть подозрение.. что используя очередь событий виндов (или как оно там называется) - можно организовать обмен между сеансами в одной базе... яточно знаю что как-то так можно!
9. Василий Демидов (Душелов) 3779 12.03.09 08:57 Сейчас в теме
(8) Обмен чем? Сообщениями? Можно, почему нет?
10. Сhe Burashka (CheBurator) 12.03.09 14:52 Сейчас в теме
Вот!!!! так надо делать!!!
то есть например... я "плюнул" сообщение, оно "стало" в очередь (где-то в виндах"), по факту появления данного сообщения в очереди в запущенных экземплярах 1ски генерится внешнее событие....
или меня не туда несет?
11. Василий Демидов (Душелов) 3779 12.03.09 14:56 Сейчас в теме
Открыл обработку - создайл файлик свой в определенном каталоге и начал мониторить этот каталог на изменение там файлов всех, кроме своего.

В свой файлик записал сообщение - все, у кого открыты обработки увидели, что файлик изменен и давай его кучно читать :)
12. Василий Демидов (Душелов) 3779 12.03.09 15:01 Сейчас в теме
Соответственно, закрыл обработку - грохнул файлик.
Присутствие файликов - аналог онлайна пользователей :)
13. Александр Рытов (Арчибальд) 2652 12.03.09 15:13 Сейчас в теме
(11)>все, у кого открыты обработки увидели, что файлик изменен и давай его кучно читать
Не все. Только те, кто умеет ;)
14. Василий Демидов (Душелов) 3779 12.03.09 15:15 Сейчас в теме
(13) Ну и все, кому разрешено его читать :)
15. Александр Маляев (maljaev) 767 12.03.09 15:57 Сейчас в теме
У меня стоит точно такая же задача, как у Чебура. Путей реализации без изврата через файлы или справочники пока не нашел.
16. Василий Демидов (Душелов) 3779 12.03.09 15:58 Сейчас в теме
17. Василий Демидов (Душелов) 3779 12.03.09 16:00 Сейчас в теме
(15) ПонимаешЬ, в чем отличие использования компоненты от просто файлов и справочников - не надо использовать обработки ожидания и постоянное насилование файловой системы. когда файлы изменятся - сгенерируются нужные события у всех, кто следит за нужным каталогом.
18. Александр Маляев (maljaev) 767 12.03.09 16:15 Сейчас в теме
Мне тут на 1CPP кинули ссылку на решение через сетевые сокеты. Теоретически, должно быть неплохое решение. Нужно только разобраться как это все работает и как применить к нашей ситуации.

http://www.rikcenter.ru/downloads.php?file=13
http://www.1cpp.ru/forum/YaBB.pl?num=1234860912
19. Василий Демидов (Душелов) 3779 12.03.09 16:19 Сейчас в теме
(18) Так это можешь мой чат взять :)
Вообщем, все понятно. Сейчас сяду и напишу сервер событий :)))
20. H A D G E H O G s (Hadgehogs) 324 13.03.09 01:01 Сейчас в теме
Где же это я все видел - то...
21. Сhe Burashka (CheBurator) 13.03.09 01:44 Сейчас в теме
(18) перая ссылка ( http://www.rikcenter.ru/downloads.php?file=13 ) - это как раз по вопросу, который я завязал обсуждать на мисте, аналогично упомянутому мной выше, а суть была в том: как из одного сеанса 1Ски (работающего с базой ИБ1) передать событие в другой сеанс этой же ИБ...?
ОбработкаОжидания - отметаем сразу, ради того чтобы обработать событие которое может быть раз в 2 часа (а может раз в 10 минут) - постоянно крутить ожидание - это какое-то извращение! Я хочу, чтобы, работая в базе, мне извне "генерилось" событие - и вот когда оно пришло - вот тогда я и сделаю что надо... так вот - единственное решение придложил Садовников - чат по ссылке как раз и является примером.. Но! там тоже не все гламурно!
...
и вот еще: соответсвенно, работая в ИБ, я хочу иметь "глобальный" обработчик событий (независимо от того в какой я форме нахожусь) - как я понял из беседс Василием - это можно сделать активиксом, но для него надо держать постоянно открытой форму... - тоже изврат...
..
так вот.. еще один вариант - но смотрел только поверхностно (ибо не спец) - чат может быть построен на очереди сообщений виндов (но для этого добен нужен...)
22. Сhe Burashka (CheBurator) 13.03.09 01:47 Сейчас в теме
(20) аналогичная компонента по мониторингу файлов с генерацией ВС есть у romix? у него еще есть fakir.dll (я ее юзаю для целей автообновления псевдожурнала при проведении документа, отображаемого в журнале) - то есть я могу в модуле проведения сгенерить событие и оно отловится 1Ской... но опять же - только в рамках данного сеанса 1С... вот...
23. Александр Рытов (Арчибальд) 2652 13.03.09 08:13 Сейчас в теме
24. H A D G E H O G s (Hadgehogs) 324 13.03.09 09:27 Сейчас в теме
(22) Ну вообще это все в Нетленке реализовано давно.
25. H A D G E H O G s (Hadgehogs) 324 13.03.09 09:28 Сейчас в теме
Это я так Василия, идущего дорогой баянов, подъеживаю.
26. Василий Демидов (Душелов) 3779 13.03.09 09:35 Сейчас в теме
(25) Читаем 1 коммент... Я там как бы все написал.
27. Василий Демидов (Душелов) 3779 13.03.09 10:23 Сейчас в теме
По многочисленным просьбам :) Написал аналогичную ВК для 7.7 (можно и в 8-ке использовать, только смысла нет) с теми же методами.
28. Сhe Burashka (CheBurator) 13.03.09 12:07 Сейчас в теме
(24) вас ист дас "Теленка"? тьфу, "нетленка"?
29. Игорь Белышев (biv75) 13.03.09 12:08 Сейчас в теме
30. Varelchik (varelchik) 13.03.09 13:06 Сейчас в теме
А кто нить еще пробовал под 7.7?
У мене че 1С в коврик сворачивается при ппытке изменения сканируемого файла.
31. Василий Демидов (Душелов) 3779 13.03.09 13:14 Сейчас в теме
(30) Попробовал на разных машинах + в терминале, не падает.
Как вариант, можно попробовать прологировать все и посмотреть, где у тебя что выпадает.
32. Василий Демидов (Душелов) 3779 13.03.09 17:22 Сейчас в теме
(23) Вот тестовый сервер событий http://za-ha-dum.narod.ru/1c/EventServer.zip
Есть пример клиентов для 7.7 и 8.1
В примерах есть все команды, кроме одной, ее просто не успел включить:
КлиентСобытий.ОтправитьПриватно(Ник, Текст)

На базе этого сервера можно сделать чат (в примере он таким и является), а так же всякие выгонялки, оповестелки и прочее.
33. Василий Демидов (Душелов) 3779 13.03.09 17:22 Сейчас в теме
точнее не ник, а имя соединения ;)
34. Василий Демидов (Душелов) 3779 13.03.09 17:23 Сейчас в теме
Если запускать на одном компьютере (терминальная сессия, разные базы), то каждому клиенту надо назначить разные порта. Автопоиск портов свободных сделаю потом. Да и стоит ли делать "группы", по аналогии с комнатами чатовскими?
35. Александр Маляев (maljaev) 767 15.03.09 16:57 Сейчас в теме
Чего-то у меня при соединении постоянно ошибку выдает:

Ошибка: Ошибка сокета - Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт) (10048).
36. Василий Демидов (Душелов) 3779 15.03.09 17:00 Сейчас в теме
(35) см. 34, каждому клиенту надо задать разные порты.
37. Александр Маляев (maljaev) 767 15.03.09 17:03 Сейчас в теме
(36) Задавал, не помогает. Ошибка вылазит даже при одном запущенном клиенте.
38. Василий Демидов (Душелов) 3779 15.03.09 17:05 Сейчас в теме
Запускаешь сервер на 27000 порту, потом запускаешь клиента на 27001 к примеру. Что пишет?
39. Александр Маляев (maljaev) 767 15.03.09 17:12 Сейчас в теме
Уточняю:

Сервер с портом по умолчанию. Клиент с портом по умолчанию. Первое соединение происходит нормально. Второе соединение, равно как и последующие, выдает ошибку. Не помогает даже закрытие/переоткрытие обработки клиента. Помогает закрытие/переоткрытие сеанса 1С. В остальном все нормально - клиенты видят друг друга, обмен сообщениями происходит. Если нажать "отсоединиться", а затем "соединиться", то на первом клиенте идет без ошибки, второй клиент высвечивает все ту же ошибку.
40. Александр Маляев (maljaev) 767 15.03.09 17:13 Сейчас в теме
Ошибся: один клиент 27001, второй 27002. Жалко нету редактирования постов.
41. Александр Маляев (maljaev) 767 17.03.09 12:55 Сейчас в теме
Душелов, ты чего-нибудь по постам 39-40 скажешь? Будешь дорабатывать или нет?
42. Василий Демидов (Душелов) 3779 17.03.09 12:59 Сейчас в теме
Надо сделать отдельной разработкой и там это дело обсуждать ;)
43. Василий Демидов (Душелов) 3779 17.03.09 13:21 Сейчас в теме
(41) Попробуй это http://infostart.ru/projects/3644/
Пока сделал автопрощупывание 10 портов
44. Elfar (Elfar) 44 06.12.09 19:22 Сейчас в теме
Выполняю этот механизм на 7.7 и у меня при изменении(создании, удалении) в контролируемом каталоге вылетает ошибка и вылетает 1С-ка.
Подскажите в чём есть проблема.
Прикрепленные файлы:
45. koreav (koreav) 53 21.12.09 16:50 Сейчас в теме
1С:Предприятие 8.1 (8.1.13.41), при возникновении event'а окно 1С закрывается без сообщения об ошибке
46. Вова Юхимчук (fpohtmeh) 109 31.05.10 18:15 Сейчас в теме
Я не сторонник того, чтобы в имя компоненты впихивать свое имя
Тем более комбинация англ. и рус. слов (Душелов и Filewatcher)...
Впрочем, это моё мнение
47. Константин Шушков (shushkovka) 131 27.08.10 16:02 Сейчас в теме
Платформа 8.1.14.72. reg.bat отработал без ругани. Запускаю мониторинг на диск C:\*.*, создаю любой файл... 1С вылетает "без шума и пыли"... где копать?
48. idle Быньков (idle) 03.06.13 17:35 Сейчас в теме
Прописал компоненту и описал контролируемый каталог и тип файлов...
Процедура ПриНачалеРаботыСистемы()
	Попытка
		Мониторинг = СоздатьОбъект("AddIn.FileWatcher");
	Исключение
		Сообщить("Ошибка создания объекта внешней компоненты: AddIn.FileWatcher");
	КонецПопытки;
	ЭлМон = Мониторинг.Добавить("файло");
	ЭлМон.Путь = "C:\temp\";
	ЭлМон.Фильтр = "*.csv";
	ЭлМон.ФильтрИзменений = "Модификация";
	ЭлМон.Активирован = 1;
КонецПроцедуры
...Показать Скрыть

При проверке работоспособности (создании или изменении существующего в папке файла) 1С вылетает...

Подскажите в чем может быть проблема?
49. Ёпрст (Ёпрст) 1015 03.06.13 17:40 Сейчас в теме
(48) Автора ВК уже нет в живых, врят ли кто-то будет поддерживать его творения.
50. Ёпрст (Ёпрст) 1015 03.06.13 17:41 Сейчас в теме
А так, через regsvr32 попробуй зарегить вк, для начала
51. idle Быньков (idle) 03.06.13 18:24 Сейчас в теме
(50) Ёпрст, Таки с этого и начал работу с компонентой...
Далее в глобальнике:
Попытка
	ПодключитьВнешнююКомпоненту("AddIn.FileWatcher");
	Сообщить("Внешняя компонента мониторинга папки успешно загружена!");
Исключение
	Сообщить("Не удалось подключить компоненту ""AddIn.FileWatcher""");
КонецПопытки;
...Показать Скрыть

и еще что выше написал в первом сообщении...
Хотел насладиться в отладчике пойманным событием, но увы...
52. s e (dreadlord) 08.02.16 15:14 Сейчас в теме
Може есть у кого рабочий пример под 7-ку.
Так и не удалось запустить ЭТОТ!

Перем Мониторинг;

// ==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
Процедура ПриОткрытии()
	ЗагрузитьВнешнююКомпоненту("FileWatcher.dll");
	
	Попытка
		Мониторинг = СоздатьОбъект("AddIn.FileWatcher");
	Исключение
		Сообщить("Ошибка создания объекта внешней компоненты: FileWatcher");
	КонецПопытки;
	
	ЭлемМониторинга = Мониторинг.Добавить("ПапкаФТП");
	ЭлемМониторинга.Фильтр = "*@cbd.zip";
	ЭлемМониторинга.Путь = "N:\Base\Obmin\";
	//ЭлемМониторинга.ФильтрИзменений = "";
    ЭлемМониторинга.Активирован = 1;
	
КонецПроцедуры	// ПриОткрытии

// ==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
// - Источник = "FileWatcher"
// - Событие (ПриСоздании, ПриИзменении, ПриУдалении, ПриПереименовании, Ошибка)
// - Данные (ИмяЭлемента + ИмяФайла + Путь), при переименовании еще "СтароеИмяФайла + СтарыйПуть"
//
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные);
	Сообщить("ОбработкаВнешнегоСобытия: "+Источник);

	Если Источник = "FileWatcher" Тогда
		Сообщить("Событие "+Событие);
		Сообщить("Данные "+Данные);
	КонецЕсли;
КонецПроцедуры

...Показать Скрыть


Вылетает с ошибкой:
ЭлемМониторинга = Мониторинг.Добавить("ПапкаФТП");
{N:\COPYCB\EXTFORMS\МОНИТОРИНГФТП.ERT(13)}: Поле агрегатного объекта не обнаружено (Добавить)


Есть рабочий вариант от Romix-а, НО - проблема в том, что какой именно файл создан у него не видно, нужно парсить папку.

Спасибо.