gifts2017

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

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

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

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

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


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

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

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

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

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

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

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

СИНТАКСИС:

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

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

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

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

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

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

ЗЫ сам в 8.1 не тестил :)
в 77 с помощью 1С++ подобная схема работает.
6. Василий Демидов (Душелов) 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. Василий Демидов (Душелов) 12.03.09 08:57
(8) Обмен чем? Сообщениями? Можно, почему нет?
10. Сhe Burashka (CheBurator) 12.03.09 14:52
Вот!!!! так надо делать!!!
то есть например... я "плюнул" сообщение, оно "стало" в очередь (где-то в виндах"), по факту появления данного сообщения в очереди в запущенных экземплярах 1ски генерится внешнее событие....
или меня не туда несет?
11. Василий Демидов (Душелов) 12.03.09 14:56
Открыл обработку - создайл файлик свой в определенном каталоге и начал мониторить этот каталог на изменение там файлов всех, кроме своего.

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

http://www.rikcenter.ru/downloads.php?file=13
http://www.1cpp.ru/forum/YaBB.pl?num=1234860912
19. Василий Демидов (Душелов) 12.03.09 16:19
(18) Так это можешь мой чат взять :)
Вообщем, все понятно. Сейчас сяду и напишу сервер событий :)))
20. H A D G E H O G s (Hadgehogs) 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. Александр Рытов (Арчибальд) 13.03.09 08:13
24. H A D G E H O G s (Hadgehogs) 13.03.09 09:27
(22) Ну вообще это все в Нетленке реализовано давно.
25. H A D G E H O G s (Hadgehogs) 13.03.09 09:28
Это я так Василия, идущего дорогой баянов, подъеживаю.
26. Василий Демидов (Душелов) 13.03.09 09:35
(25) Читаем 1 коммент... Я там как бы все написал.
27. Василий Демидов (Душелов) 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. Василий Демидов (Душелов) 13.03.09 13:14
(30) Попробовал на разных машинах + в терминале, не падает.
Как вариант, можно попробовать прологировать все и посмотреть, где у тебя что выпадает.
32. Василий Демидов (Душелов) 13.03.09 17:22
(23) Вот тестовый сервер событий http://za-ha-dum.narod.ru/1c/EventServer.zip
Есть пример клиентов для 7.7 и 8.1
В примерах есть все команды, кроме одной, ее просто не успел включить:
КлиентСобытий.ОтправитьПриватно(Ник, Текст)

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

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

Сервер с портом по умолчанию. Клиент с портом по умолчанию. Первое соединение происходит нормально. Второе соединение, равно как и последующие, выдает ошибку. Не помогает даже закрытие/переоткрытие обработки клиента. Помогает закрытие/переоткрытие сеанса 1С. В остальном все нормально - клиенты видят друг друга, обмен сообщениями происходит. Если нажать "отсоединиться", а затем "соединиться", то на первом клиенте идет без ошибки, второй клиент высвечивает все ту же ошибку.
40. Александр Маляев (maljaev) 15.03.09 17:13
Ошибся: один клиент 27001, второй 27002. Жалко нету редактирования постов.
41. Александр Маляев (maljaev) 17.03.09 12:55
Душелов, ты чего-нибудь по постам 39-40 скажешь? Будешь дорабатывать или нет?
42. Василий Демидов (Душелов) 17.03.09 12:59
Надо сделать отдельной разработкой и там это дело обсуждать ;)
43. Василий Демидов (Душелов) 17.03.09 13:21
(41) Попробуй это http://infostart.ru/projects/3644/
Пока сделал автопрощупывание 10 портов
44. Elfar (Elfar) 06.12.09 19:22
Выполняю этот механизм на 7.7 и у меня при изменении(создании, удалении) в контролируемом каталоге вылетает ошибка и вылетает 1С-ка.
Подскажите в чём есть проблема.
Прикрепленные файлы:
45. koreav (koreav) 21.12.09 16:50
1С:Предприятие 8.1 (8.1.13.41), при возникновении event'а окно 1С закрывается без сообщения об ошибке
46. Вова Юхимчук (fpohtmeh) 31.05.10 18:15
Я не сторонник того, чтобы в имя компоненты впихивать свое имя
Тем более комбинация англ. и рус. слов (Душелов и Filewatcher)...
Впрочем, это моё мнение
47. Константин Шушков (shushkovka) 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. Епрст (Ёпрст) 03.06.13 17:40
(48) Автора ВК уже нет в живых, врят ли кто-то будет поддерживать его творения.
50. Епрст (Ёпрст) 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-а, НО - проблема в том, что какой именно файл создан у него не видно, нужно парсить папку.

Спасибо.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа