|
Выгрузка изменений из 1С в стороннюю программу в real-time | ☑ | ||
---|---|---|---|---|
0
Valerik0101
11.10.13
✎
14:25
|
Стоит задача выгружать из 1С изменения по некоторым данным (например изменения номенклатуры, цен, остатков)
Конфигурация не важна (в моем примере ут 10.3, сервер) Необходим механизм, именно на стороне 1С, позволяющий оперативно выгружать информацию в стороннюю программу. Варианты: 1. Как в стандартном обмене с сайтом писать изменения в план обмена. Затем фоновым заданием (в цикле или с периодичностью) считывать изменения и отправлять - плохой вариант т.к. либо цикл либо та же периодичность задается. 2. «При изменении» запускать фоновое задание, которое отправит необходимые данные. В тесте при больших нагрузках возникают блокировки и плодятся фоновые задания. Возможен вариант оптимизации, но не нравиться отсутствие контроля запускаемых пользователем фоновых заданий. 3. «При изменении» писать в некий регистр сведений, читать из него в фоне и отправлять данные – буду пробовать. Кто-нибудь сталкивался с похожей задачей на практике? Может есть ещё какие-либо варианты или идеи… |
|||
1
ProgAL
11.10.13
✎
15:25
|
А чем 3 отличается от 1 ?
|
|||
2
shuhard
11.10.13
✎
15:28
|
(0) есть 4 вариант, таскать данные с сиквела через триггеры, самый лицензионно-грязный и самый шустрый
|
|||
3
Stim
11.10.13
✎
15:31
|
Можно и без изменения конфигурации
http://infostart.ru/public/153884/ |
|||
4
Fragster
модератор
11.10.13
✎
15:34
|
автору предлагаю оставить одну (ну, или n) очередь и воспользоваться вариантом (2)
|
|||
5
Fragster
модератор
11.10.13
✎
15:34
|
хотя это уже вариант 1
|
|||
6
Fragster
модератор
11.10.13
✎
15:35
|
(1) ты мучения Гения нашего не помнишь с его велосипедами с РС и обменами?
|
|||
7
Serginio1
11.10.13
✎
15:48
|
(2) Обычная практика это Очередь, запуск Задания в когда нет обработчика.
Это можно решать через блокировку ресурса, если ресурс заблокирован значит задача работает, если нет то блокируем и запускаем задачу которая будет обрабатывать некий регистр сведений который будет очередью , где уникальным измерением может быть уникальный идентификатор, т.к. объект может изменяться во время отправки |
|||
8
shuhard
11.10.13
✎
15:49
|
(7) для real-time это не катит
|
|||
9
Serginio1
11.10.13
✎
15:49
|
Ну и на всякий случай можешь запускать регламентное задание с периодичностью 1 минуту, что бы отлавливать ошибки
|
|||
10
Serginio1
11.10.13
✎
15:52
|
(8) Почему? По сути это близко к реал тайму. А иногда может быть и быстрее, т.к. не нужно запускать дополнительные потоки.
|
|||
11
Холодильник
11.10.13
✎
15:54
|
проще всего - обмениваться через текстовый файлик
|
|||
12
Valerik0101
11.10.13
✎
16:09
|
(1) Третий вариант ещё только попробую.
Отличается тем, что изменения из плана обмена можно выбрать запросиком раз по расписанию регламентного задания, а из регистра можно вытянуть например при добавлении записи. |
|||
13
Valerik0101
11.10.13
✎
16:12
|
(10) хотелось бы обойтись без запуска регламента каждую минуту. Сейчас запущен обмен который с очереди таскает в 1С данные когда они есть в фоне. Утром запускается, вечером отрубается. Хотелось бы тоже самое, только в другую сторону и с учетом того, что если вдруг что-то не отправилось, то можно понять что именно не отправилось и потом обработкой или в ручном режиме послать таки.
|
|||
14
Serginio1
11.10.13
✎
16:14
|
Можно кстати использовать для обмена MSMQ
v8: Подскажите как связать 1Сv8 и MSMQ И посылать оповещение клиенту например ИД последнего сообщения, что бы тот обрабатывал очередь. Так как чтение из очереди и запись намного дольше чем запись в очередь, то такой способ тоже имеет право на жизнь |
|||
15
Valerik0101
11.10.13
✎
16:14
|
Вариант 2 работал, но при пиковой нагрузке создавалось ну очень много фоновых заданий от пользователей. Один раз за сутки подвесили базу. Да и трудно отслеживать изменения
|
|||
16
Valerik0101
11.10.13
✎
16:16
|
(14) Ну что-то похожее и используется. Как посылать сообщения не вопрос. Вопрос примерно такой: по какому принципу именно в 1с формировать очередь чтоб послать в очередь MQ )
|
|||
17
wPa
11.10.13
✎
16:17
|
(0) "3. «При изменении» писать в некий регистр сведений, читать из него в фоне и отправлять данные – буду пробовать.
зачем? если уже есть встроенный механизм регистрации изменений для обмена |
|||
18
Serginio1
11.10.13
✎
16:17
|
(16) А при записи нельзя сразу в очередь поставить и оповестить клиента?
|
|||
19
Valerik0101
11.10.13
✎
16:19
|
(18) При записи на стороне клиента - если проводится большой документ переоценки может относительно долгое время занять процедура. На стороне сервера - получается вариант 2 со своими недостатками.
|
|||
20
Serginio1
11.10.13
✎
16:20
|
(16) Или как в 7. Делать очередь на регистрах сведений и использовать вместо критических секций блокировку на записи регистра. Смысл в том, что если поток обработки работает то ничего дополнительно делать не надо, если не запущен то запускаем поток.
|
|||
21
Serginio1
11.10.13
✎
16:21
|
(19) Ну так поставил в очередь MSMQ а клиент будет постепенно вытаскивать данные и записывать. Вариант с MSMQ намного интересней.
|
|||
22
Valerik0101
11.10.13
✎
16:21
|
(20) Я правильно понял что так получается один поток?
|
|||
23
Serginio1
11.10.13
✎
16:23
|
(22) Да. Но можешь использовать и пул потоков и потоко безопасную очередь.
|
|||
24
Valerik0101
11.10.13
✎
16:25
|
(21) Совершенно верно, но как поставить в очередь MSMQ?
Допустим документ изменения цен проводится. Если при записи или проведении на клиенте то может быть долго. Если на сервере, то это либо один поток, либо неограниченное количество потоков которые возникают по действиям пользователей. И в таком варианте не отследить что и когда отправил. Если обработкой ппо плану изменений то по регламенту в цикле как типовой. |
|||
25
Valerik0101
11.10.13
✎
16:26
|
(23) Согласен, такой вариант думаю попробовать. но есть определенные опасения за производительность.
|
|||
26
Serginio1
11.10.13
✎
16:32
|
(23) Смотря где. При записи лучше использовать по минимуму потоков, так как можно нарваться на блокировки. Там как раз удобен однопоток.
При использовании MSMQ ты поставил в очередь и оповестил клиента. А клиент уж сам будет выбирать из очереди и организовывать. |
|||
27
badboychik
11.10.13
✎
16:41
|
А что мешает повесить подписку на событие и писать изменения в какую нибудь базу по ADO?
|
|||
28
Valerik0101
11.10.13
✎
16:47
|
(27)Я вроде уже пробовал так... Пользователь проводит документ 1000 строк, есть подписка на событие "при проведении" в которой отправка сообщений есть.
Пользователь в результате будет ждать пока отработает процедура отправки сообщений, так? |
|||
29
Happy Bear
11.10.13
✎
16:49
|
На практике использовал вариант 2.
Подписка на событие + фоновое задание. Данные уходят в sql базу. |
|||
30
Valerik0101
11.10.13
✎
16:52
|
(29) В подписке на событие что-то типа: ФоновыеЗадания.Выполнить("ОбшийМодуль.Блаблабал", МассивПараметров, Ключ, "Синхронизация");
|
|||
31
Happy Bear
11.10.13
✎
16:53
|
(30) да
|
|||
32
Valerik0101
11.10.13
✎
16:55
|
(31)А при активной работе пользователей сколько максимум фоновых заданий было? примерно...
|
|||
33
Happy Bear
11.10.13
✎
16:58
|
(32) не считал, но много
у меня подписка на регистр бухгалтерии например, вчера запускал групповое проведение параллельно на 2 юрлица, ошибок обмена не было |
|||
34
Valerik0101
11.10.13
✎
17:01
|
Вариант хороший и испробованный, может нужно оптимизировать мне его.
Но что будет если 100 пользователей начнут что-то менять в базе (независимое, без блокировок) - это будет 100 фоновых заданий одновременно. А если процедура отправки не просто берет данные из тч документа например, а ещё надо соединение сделать с регистром свойств номенклатуры... Я не понял как контролировать это, ведь очереди никакой нет. Просто фоновое задание, которое вполне может заблокировать другое задание и словить дедлок. |
|||
35
Happy Bear
11.10.13
✎
17:02
|
ОжидатьЗавершения тебе поможет
|
|||
36
Valerik0101
11.10.13
✎
17:04
|
(35) Спс. Попробую. Но ведь тогда очередь из ожидающих фоновых заданий может получиться большая?
|
|||
37
Happy Bear
11.10.13
✎
17:06
|
(36) здесь остается только максимально оптимизировать время выполнения обмена
|
|||
38
badboychik
11.10.13
✎
17:12
|
с sql.ru :
"Вам нужна хорошая промышленная реализация очереди сообщений. Это может быть, например, MSMQ, JMS, IBM WebSphere MQ. Из бесплатных реализаций очередей - Apache ActiveMQ. Далее вы должны реализовать посылку сообщения в очередь, асинхронную обработку его некоторым процессом-сервисом и получение ответа. Далее все зависит от используемой вами платформы. В двух словах не опишешь. Паттернов много. Вообщем виде надо выделить какой то сервисный уровень, который будет отправлять сообщения в очередь и обращаться к очереди ответов, другой сервис будет читать сообщения из очереди в многопоточном режиме, обрабатывать их и посылать результат-сообщение в очередь ответов. Если рассматривать конкретные платформы: WCF, например, позволяет использовать MSMQ в качестве транспорта, есть сторонние адаптеры под WebSphere MQ J2EE сервера все реализуют JMS" |
|||
39
badboychik
11.10.13
✎
17:14
|
есть еще Apache Qpid http://qpid.apache.org/
|
|||
40
Valerik0101
11.10.13
✎
17:18
|
(38)"..Вообщем виде надо выделить какой то сервисный уровень, который будет отправлять сообщения в очередь.." - у меня сейчас только с этим куском загвоздка.
Так обмен с RabbitMQ работает отлично. |
|||
41
Serginio1
11.10.13
✎
17:26
|
(40) А в чем проблема? Сериализвал в XML строку. Отправил в очередь. Через Web сервис оповестил клиента с последним номером сообщения. Клиент уже организует выборку очереди. Если выборка запущена, то ничего не делает, если нет то запускает поток на чтение очереди. При этом раз в минуту можно запускать на чтение очереди если что то пойдет не так. Обрыв связи итд.
|
|||
42
Valerik0101
11.10.13
✎
17:32
|
(41) "Отправил в очередь" - можно сказать сейчас речь о том где вызывается в 1С процедура отправки в очередь?
|
|||
43
Serginio1
11.10.13
✎
17:36
|
Ну отправка в очередь понятно где вызывается там где и произошли изменения. А вот записывашь ты наверное в другую базу из базы где произошли изменения через COM?
|
|||
44
Valerik0101
11.10.13
✎
17:39
|
(43)Не, вот Happy Bear верно понял проблему ))
"Ну отправка в очередь понятно где вызывается там где и произошли изменения" - провели документ установки цен, тыща строк. Где вызвать процедуру отправки? |
|||
45
Serginio1
11.10.13
✎
17:44
|
В процедуре при изменении. Сериализация тысячи строк это мизер.
|
|||
46
Serginio1
11.10.13
✎
17:44
|
Тебе нужно грамотно выбирать очередь.
|
|||
47
Serginio1
11.10.13
✎
17:46
|
Где проще использовать мьютексы семафоры
|
|||
48
Valerik0101
11.10.13
✎
17:50
|
(45) Сериализовать мне надо в JSON что работает дольше чем ХМЛ, и не просто строку документа, а лефтджоином брать свойства номенклатуры и характеристики из регистра свойств
Поэтому есть некоторые задержки от которых не может страдать пользователь ожидающий выполнения операций. Поэтому просто при изменении низя это вызывать) |
|||
49
badboychik
11.10.13
✎
17:53
|
а если в подписке послать во внешнюю систему только ссылку на измененный документ, а она в порядке очереди будет через сервис читать то, что надо (там и все соединения с характеристиками прописать) и писать данные из них в себя, получится проведение тормозить не будет, а будет только очередь из внешних запросов к базе
|
|||
50
Jaap Vduul
11.10.13
✎
17:56
|
Ещё, кстати, надо учитывать, что если писать в ПриЗаписи куда-то наружу, то можно получить расхождения с 1цэ из-за отката транзакций.
В этом плане использование планов обменов самое надёжное решение. |
|||
51
Valerik0101
11.10.13
✎
18:02
|
(49)Интересный вариант. Но "внешняя система" это просто очередь. И из неё читает cmsсайта, которая никакого доступа в 1С не имеет. Если б целью обмена была бы другая база например, то все ок. Или прослойку какую-то делать нужно...
(50)Планы обмена наверное да, самые надежные. Но есть определенная задача и их использовать тут не очень удобно |
|||
52
Valerik0101
11.10.13
✎
18:09
|
(2) "shuhard: есть 4 вариант, таскать данные с сиквела через триггеры, самый лицензионно-грязный и самый шустрый"
интересно такое кто-нибудь реализовывал? |
|||
53
Delorn
11.10.13
✎
18:50
|
(52) Делал доп лог на изменение журнала документов в 7.7. с помощи тригеров. Запись лога идет в отдельную базу. Все быстро не заметно. Четыре года отпахало, 20 юзеров любящих обработки c загрузкой из текстовых файлов.
Рассказывали про реализацию, когда на регистре сведений висел тригер. Если в РС появлялась запись, скриптом запускалась 1с, которая запускала обмен. Я кстати за план обмена. При обмене очень важно понимать что данные изменились. А так же что данные дошли до сторонней базы. |
|||
54
Кокос
11.10.13
✎
20:20
|
я за (1) РИБ с отключенной галочкой :)
|
|||
55
shuhard
11.10.13
✎
21:52
|
(52)[интересно такое кто-нибудь реализовывал?]
неоднократно структура базы 1С на сиквела тупа до безобразия |
|||
56
Valerik0101
11.10.13
✎
22:05
|
(55)К сожалению не сталкивался, сложно будет за короткий срок реализовать.
Запрос навесить на триггер в скуле, вытянуть нужные данные, затем как-то через внешние функции всё в json запихать а потом подключить бибилиотеку rabbitmq и послать сообщение. Уверен что прирост скорости будет не хилый и если со всем этим разберусь то будет круто, но сроки... (53)(54) Через план обмена - это типовой обмен считай. Либо регламентное задание, которое раз в несколько минут запускается, либо, пробовал, фоновое постоянно работает и в цикле читаем изменения и отправляем. Это работало, но как-то не очень красиво )) |
|||
57
Casey1984
11.10.13
✎
23:04
|
Если воспринимать план обмена, как очередь изменений ожидающих передачи в другую программу, то такой путь ниже чем не реалтайм?
1. Читаем и освобождаем очередь изменений (план обмена). 2. Выгружаем изменения. 3. Пункт 1. И вообще что такое реалтайм, если скорости возникновения изменений их передачи и приема не совпадают? |
|||
58
Serginio1
11.10.13
✎
23:18
|
(48) Делал выгрузку из 7 в 8 ку через объекты XDTO и прямые запросы. Скрость высокая. Аналогично и здесь можешь например на C# написать выгрузку через прямой запрос и json. 1000 строк это мизер.
|
|||
59
Иде я?
12.10.13
✎
00:08
|
Реалтайм - это xenomai и реалтайм ядра
Все остальное подвержено квантованию на уровне юзерспейс приоритета и в итоге будут данные пропадать. https://www.olimex.com/forum/index.php?topic=812.75 |
|||
60
Casey1984
12.10.13
✎
00:09
|
(59) запутал еще больше;)))
|
|||
61
Иде я?
12.10.13
✎
00:11
|
(60)Нагружай мозги по полной, потом перерывчик и на тебя снизодет озарение
|
|||
62
sda553
12.10.13
✎
00:19
|
триггеры и еще скорее всего ssis
|
|||
63
Serginio1
12.10.13
✎
11:36
|
(48) Может пригодится
http://speshuric.livejournal.com/163665.html |
|||
64
Valerik0101
12.10.13
✎
14:49
|
(59) э... чо? 1С и квантовый параллелизм... может в 1С 9.0 такое будет. Настоящего риал-тайма конечно не добиться ) Даже если под QNXом 1с запустить
(63) Спс. На этом можно выиграть время. Сформировать xml и затем с помощью какой-либо внешней библиотеки преобразовать в json. Либо отправлять xml и сериализацию в json делать где-то там на сайте, но это уже если договорюсь Пожалуй на неделе буду допиливать фоновые задания и ускорять выполнение операций. И опционально чтоб обмен можно было переключить на планы обмена с выгрузкой в одну очередь одним регламентом. Потом, если будет время, полезу в дебри sql триггеров |
|||
65
Serginio1
12.10.13
✎
18:27
|
(64) Тебе лучше использовать планы обмена с регламентом раз в минуту и ключом, что бы если регламентное задание не закончилось второе следующее не начиналось. Ну и конечно можно ускорить выгрузку используя компилируемые языки. И если лезть в дебри тригеров можно сначала сделать прямой запрос и сериализовать его в джейсон
|
|||
66
Serginio1
12.10.13
✎
19:34
|
Если начнешь писать пряме запросы то вот некоторые ссылки
v8: Перевод Запроса 1С в SQL? v8: Как перевести ГУИД в число и обратно? |
|||
67
Gepard
12.10.13
✎
19:48
|
вариант 1 с заданием раз в 30 сек (если выполняется предыдущий экземпляр, то новый не запускать). В реальной работе задержка будет незаметна
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |