Имя: Пароль:
1C
1C 7.7
v7: Алгоритм синхронизации данных
,
0 Электроник
 
21.02.13
14:29
Здравствуйте. Прошу помочь в решении одной задачи, над которой бьюсь уже неделю. Заранее говорю, что не прошу писать код за меня, мне нужно только усвоить идею, алгоритм, может, кто-то уже делал подобное.
Собственно задача: есть 3 семёрочных базы ТиС, структура идентична, через УРИБ не связаны. В них реализован механизм дисконтных карт (ДК), скидки по которым рассчитываются динамически в зависимости от суммы продаж. Информация о ДК хранится в соответствующем справочнике, суммы продаж накапливаются в регистре остатков при проведении Реализации. Необходимо производить синхронизацию сумм продаж по ДК между всеми тремя базами хотя бы раз в сутки. Обмены данными должны идти в автоматическом режиме и гарантировать, что не будет дважды загружен один и тот же пакет данных.
Заранее спасибо за любые мысли по этому поводу.
1 Ёпрст
 
21.02.13
14:29
МОД проще всего.
2 Электроник
 
21.02.13
14:32
Из того, что я знаю о МОДе, он перероет всю конфу, а мне нужно синхронизировать только один из разделов торговли.
3 Скользящий
 
21.02.13
14:35
Через КД2 можно такое реализовать. Или КД1, что кому ближе. Но это надо осваивать, и долго.
4 GLazNik
 
21.02.13
14:42
хранить информацию в виде: ДК, ИБ, Дата (день продаж), Сумма.
5 Жан Пердежон
 
21.02.13
14:42
(3) а регистрацию изменений и квитирование тоже в кд сделаешь?)
6 DalexLad
 
21.02.13
14:43
Ну типа самому реализовать подобие механизма УРБД.
Может быть и не очень сложно.
1. Обработка получает DBF с FTP
2. Догружает свой справочник ДК.
3. Выгружает в этот DBF свои новые записи.
4. Следующая машина отрабатывает аналогичный цикл и т.д.

Естественно тема интересная, В DBF можно предусмотреть флаг закачен в БД1,БД2,БД3, Сделать назначеное задание, предесмотреть чисить это DBF, в случае закачки и т.д. и т.п.
Хотя это все только в плане предложений. Может это и бред :-)
7 Электроник
 
21.02.13
14:44
Я знаю КД2. Сам перенос я уже в ней написал. Проблема в автоматизации этого процесса. Если подробнее и на пальцах :), то, например, мы выгружаем из базы 1 продажи за период с 01.02 по 02.02. Выгрузили, запомнили где-нибудь этот период на всякий случай :). А в базу 2 выгрузка не дошла (инета не было). На следующий день какой период выгружать: с 02.02 по 03.02 или с 01.02 по 03.02?
8 Mikeware
 
21.02.13
14:44
(1)  ну а что тут может быть сложного?
принципов всего два:
1)одна база должна быть ведущей.
2) каждый пакет должен иметь идентификатор
9 GLazNik
 
21.02.13
14:45
(7) для этого база 1 должна получить ответ от базы 2
10 Электроник
 
21.02.13
14:45
(6) Это не бред ))
(8) "каждый пакет должен иметь идентификатор". Идентификатор чего?
11 vde69
 
21.02.13
14:46
(7) надежный транспорт исключающий потрею при транспортировке

http://infostart.ru/public/16687/
12 Электроник
 
21.02.13
14:46
(9) Логично. Но что должно содержаться в этом ответе? Только дата конца периода выгрузки?
13 GLazNik
 
21.02.13
14:46
а базы случайно не в SQL и не на одном сервере? А то ж можно и вообще без обменов
14 Mikeware
 
21.02.13
14:47
(7) а это зависит от условий- либо ты можешь  забрать пакет за любой день (тогда тебе надо хранить пакеты и отправлять их по запросам
либо ведузая база должна отвечать на запросы - тогда протокол на твое усмотрение
либо третий, не упомянутый в (8) вариант - квитирование
15 Ёпрст
 
21.02.13
14:48
(2) зато у тебя будет регистрация изменений и перенос чего угодна, откуда угодна и куда угодно.
16 Электроник
 
21.02.13
14:50
(11) Не совсем то, что нужно.
(13) Базы SQL на одном центральном сервере. А как?
17 Электроник
 
21.02.13
14:52
(15) Тоже верно, но конфа и так переписана вдоль и поперек, идут всякие самописные обмены с 7-ми и 8-ми, и встраивать в нее еще и МОД - боязно как-то.
18 Электроник
 
21.02.13
14:54
Квитирование - идея хорошая, сам думал использовать, тока как?!
19 GLazNik
 
21.02.13
14:55
(16) брать движения напрямую из sql. например, через 1cpp
20 vde69
 
21.02.13
14:56
(16)>>>>Базы SQL на одном центральном сервере

1. можно извратится и повесить тригеры
2. можно напрямую получать данные из всех трех баз в реальном времени
3. можно синхранизаровать средствами скуля
4. можно тупо через файл
5. можно при проведении доков писать сразу в три базы

ну т.д.
21 Mikeware
 
21.02.13
14:57
(18) точно так же, как делается в штатном УРБД
22 Электроник
 
21.02.13
15:04
Хотелось бы некий вариант алгоритма, вроде "в пришедшем пакете проверить то-то, в ответе отправить то-то".
(19) Нельзя, т.к. из этих трех баз одна - "ведущая", в которой должны агрегироваться суммы продаж из 2-х других баз. А эти 2 базы - УРИБ-овские, обмены хоть и идут часто, но иногда инет в филиале пропадает надолго.
23 Электроник
 
21.02.13
15:05
(21) Как?
24 Mikeware
 
21.02.13
15:06
(22) ведущей может быть вообще база "не из этих трех". и даже не на 1с :-)
25 Mikeware
 
21.02.13
15:06
(23) в яндексе забанили?
26 Электроник
 
21.02.13
15:07
(24) Верно, но зачем плодить сущности? :)
27 Электроник
 
21.02.13
15:08
(25) Смотрю, смотрю...
28 Mikeware
 
21.02.13
15:09
(26) зависит от задачи...
29 Электроник
 
21.02.13
15:10
Кстати, интересная идея из (14): "ты можешь  забрать пакет за любой день (тогда тебе надо хранить пакеты и отправлять их по запросам". И на первый взгляд кажется проще, чем реализовывать квитирование.
30 GLazNik
 
21.02.13
15:11
(22) в чем проблема? в данном случае нет ведущей (точнее не обязательна). в каждой базе доступна вся информация по ДК. Дублирования информации УРБД можно исключить.
31 Mikeware
 
21.02.13
15:12
(29) а все варианты равнозначные
32 Электроник
 
21.02.13
15:14
(31) Уже делал что-то похожее?
33 Электроник
 
21.02.13
15:19
(30) Проблемы как минимум 3:
1) Как отследить изменение реализации задним числом?
2) За какой период делать выгрузку для каждой конкретной базы? Ведь для каждой "ведомой" базы выгрузка должна быть своя, если не по периоду, то уж по суммам продаж - точно.
3)Как бороться с возможным дублированием сумм в загружаемых данных?
34 GLazNik
 
21.02.13
15:25
(33) я предлагаю вариант без выгрузки. Вам шашечки или ехать? Конечная цель какая? Определить сумму продаж по ДК. Так и определяйте ее на лету. три запроса к трем базам.
35 Электроник
 
21.02.13
15:27
(34) Вариант интересный. А как быть в удаленных филиалах, не имеющих доступа к нужным базам?
36 DalexLad
 
21.02.13
15:31
(33)
1 - При выгрузке выгружать новые и измененные с момента послелней выгрузки данные. Соответвенно в базах флаги "Выгружен" , "Изменен"
2 - За весь период но с условием "Выгружен" = 0, "Изменен"=1
3 - В случае загрузки Флаг в DBF "Загруженно". На мемент загрузки Загружать если "Загружено"=0;
37 GLazNik
 
21.02.13
15:32
(25) :) так началось то все с (13) и ответа на него (16)
Используйте МОД. А то смотрю все новые и новые пунктики в условиях появляются.
38 Mikeware
 
21.02.13
15:32
(32) нет. просто считать умею...
39 GLazNik
 
21.02.13
15:35
(37) к (35)
40 Электроник
 
21.02.13
15:47
Всем огромное спасибо за советы! Вы подсказали мне хорошую идею. Пошел развивать ее и писать код.
41 Mikeware
 
21.02.13
16:38
(40) от же ж!
мы ему идею, а он нам - куй!
даже идею не обрисовал...
42 Электроник
 
21.02.13
16:56
(41) Не-не-не! Камрад, как можно! Обязательно отпишу, если из идеи что-то жизнеспособное получится. А пока - неохота позориться перед почтенной публикой :).
43 Mikeware
 
21.02.13
16:57
(42) хы. дык может, обгадив идею сразу, мы тебе труд и время съэкономим? :-)
а может, и посоветуем чего...
44 Электроник
 
21.02.13
17:00
Ага! Сразу б вам обгадить! :))
Сейчас раб. день кончился. Завтра и напишу.
45 Электроник
 
27.02.13
17:36
Всем привет. Если интересно, вот как я решил сделать.
Итак, есть 3 отдельных базы ТиС (не УРИБ). Одна из них будет "центральной", в ней будут аккумулироваться продажи по дисконтным картам и рассылаться остальным двум базам. Во всех 3-х базах создаем справочник, в котором будем хранить дату последней выгрузки для каждой базы-получателя.
Выгружать будем по принципу "кому надо - тот возьмет". Т.е. из каждой периферийной базы формируются файлы выгрузки и помещаются в каталоги на FTP-сервере. Затем центральная база загружает ВСЕ файлы, которые найдет в этих каталогах (файлы после загрузки удаляются), сама формирует файлы выгрузки и кладёт в свой каталог на FTP. Периферийные базы загружают предназначенные для них файлы. Цикл обмена закончен.
Если данные меняются задним числом, то дата последней выгрузки откатывается на это число, и след. обмен выгрузит новые продажи.
Что получаем в итоге: выгрузки/загрузки идут синхронно, не нужно реализовывать квитирование, обмены не чувствительны к разрывам связи с центральным офисом и даже с FTP-сервером (т.к. просто в следующий раз к уже выгруженным добавятся новые файлы). Если по какой-то причине одна из баз не "заберет" свои файлы, то ничего страшного не случится, т.к. это можно будет сделать при следующем обмене (т.к. файлы выгрузок остаются на FTP).
46 rs_trade
 
27.02.13
17:42
(0) Делал подобную синхронизацию через 8-ку.

1. Сделал простую конфу на 8, нужные справочники и план обмена. В плане обмена заводишь для каждой базы 7.7 узел.

2. Повесил регламент. Конектимся по COM поочередно к базам на 7.7, забираем изменения и регистрируем изменения для остальных узлов.

3. Потом выгрузка изменений для каждой базы 7.7.
47 Электроник
 
27.02.13
22:38
Что-то не понял - при чем здесь 8-ка, если базы все 7-ные.
"...Конектимся по COM поочередно к базам на 7.7..." - не подходит, т.к. базы на территориально удаленных серверах.
48 rs_trade
 
28.02.13
10:09
(47) Так удобно, если все базы в локалке.
Программист всегда исправляет последнюю ошибку.