Имя: Пароль:
1C
1C 7.7
v7: Конвертация данных
0 Joshim
 
23.10.13
15:24
Несколько раз в день мне необходимо переносить данные справочников из одной базы 1С 7.7 в другую базу 1С 7.7. Для этого буду использовать конфигурацию "Конвертация данных". С настройкой правил разобрался. Вопрос: Как определить какие элементы справочников в базе были изменены с момента последнего обмена и соответсвенно должны быть перенесены в другую базу?
1 Попытка1С
 
23.10.13
15:26
Для этого лучше бы УРБД подошло.
2 Joshim
 
23.10.13
15:26
(1) Базы разные
3 Joshim
 
23.10.13
16:22
никакого нет способа?
4 Mikeware
 
23.10.13
16:23
(3) УРБД
5 Mikeware
 
23.10.13
16:24
вообще, для этого МОД пидуман.
6 varelchik
 
23.10.13
16:25
(5)+100.
7 Joshim
 
23.10.13
16:30
(5) что такое МОД?
8 varelchik
 
23.10.13
17:18
(7)Менеджер Обмена Данными
9 arsik
 
гуру
23.10.13
17:22
(0) УРБД уже было?
10 arsik
 
гуру
23.10.13
17:22
(5) Он нестабилен
11 zak555
 
23.10.13
17:24
перейти на 8ку -- там реализовать обмен с помощью плана
12 arsik
 
гуру
23.10.13
17:24
(0) Ну или самое простое.
Какой ни будь справочник, с полем типа неопределено. И при изменении документа, справочника создавать новый элемент со ссылкой на это справочник.
13 varelchik
 
23.10.13
17:30
(10) а ты его юзал коли такое вердикт выносиш?
14 arsik
 
гуру
23.10.13
17:35
(13) К сожалению да :)) Но это было где то лет 7-8 назад. Не думаю, что то то изменилось
15 Mikeware
 
23.10.13
17:36
(10) У людей годами работает без проблем....
----
но я бы применил УРБД с самостоятельным управлением...
16 mikecool
 
23.10.13
17:37
я бы рекомендовал использовать КД2
17 ЧессМастер
 
23.10.13
17:40
(16) если я правильно понял у ТС проблема - как определить что именно нужно переносить (что изменилось между сеансами обмена)
18 varelchik
 
23.10.13
17:41
(14) Ну не нравятся мне ваши кошки.
Ха! Да вы не умеете их готовить!
19 mikecool
 
23.10.13
17:43
(17) это никак не связано с моим топиком, согласен
но на будущее - запарится он править правила,написанные в КД1
20 ЧессМастер
 
23.10.13
17:49
(19) так вот в связи со стоящими перед ним проблемами встаеет вопрос - а нужна ли ему КД ? я согласен с (5) что нужно использовать МОД. он позволяет организовать обмен между РАЗНЫМИ конфами и отлично справляется с решением проблемы "что выгружать"

а заявления что МОД глючный это вранье. есть кривые руки или плохая постановка задачи а МОД отличный инструмент
21 varelchik
 
23.10.13
17:55
(20)+100.
Я его еще и доработал на предмет регистрации изменений.
У меня щас все на триггерах построено.
Так что регистрируются изменения даже если база в пространстве УРБД находиться.
И не надо использовать ОбъектЗаписать().
Триггеры сами реагируют не только на интерактивные но и программные изменения.
22 ЧессМастер
 
23.10.13
17:58
(21) не понял. как ты реализовывал то что далает ЗарегистрироватьОбъектДляМод() при интерактивной записи ?
23 GreyK
 
23.10.13
18:14
(0) Если известна дата последнего обмена, то можно использовать журнал изменений.
24 Mikeware
 
23.10.13
19:29
(22) Элементарно. триггер.
(23) крайне плохое решение.
25 GreyK
 
23.10.13
19:40
(24) Почему? Думаешь у ТС часто меняют справочники обработками?
26 varelchik
 
24.10.13
09:33
(25) согласен.
Думаю не часто.
Вот только шерстить ЖР это уже совсем другое дело.
27 varelchik
 
24.10.13
09:34
(22) Мало того я практически из форм документов и модулей проведения вообще убрал то что мод туда насовал.
И переправили все в Перехватчика.
28 varelchik
 
24.10.13
09:35
+(27) и форм списков справочников и форм элементов тож.
29 dk
 
24.10.13
09:41
немного работал с МОДом лет 7-8 назад
валился, собака, если нужно было выгрузить большой объем данных - что-то около 4000 эл. номенклатуры
30 varelchik
 
24.10.13
09:55
(29) это смотря какую версию mod.dll ты использовал.
так что последняя воплне нормально справляется и о огромными объемами выгрузки-загрузки.
31 Joshim
 
24.10.13
10:59
Решил задачу следующим образом:
Каждому справочнику добавил реквизит GUID куда при записи записываю уникальный код.

Сделал справочник "Измененные объекты"
- Вид справочника
- GUIDОбъекта
- GUIDСобытия
- Удален

Глобальным поиском нашел все команды "Записать()", добавил после "Записать()" код записи в справочник "Измененные объекты". Конвертацией буду выбирать все строки из этого справочника, находить элементы базы и выгружать.

Контролировать успешность обмена буду по "GUIDСобытия". После загрузки объекта в базу приемник, буду выгружать GUIDСобытия обратно в базу источник для подтверждения приема. Есть что-то еще, что необходимо учесть при обмене?
32 varelchik
 
24.10.13
11:12
(31) Возми доку по УРБД и ее механизму.
Где то тут на форуме было.
И все поймешь.
33 VladZ
 
24.10.13
11:17
(31) Это ты молодец...  Но если у тебя справочники или документы делаются какой-то обработкой - в своем чудном справочнике ты эты события не увидишь.
34 Господин ПЖ
 
24.10.13
11:18
конвертация на 7.7 - ж.па еще та...
35 Mikeware
 
24.10.13
11:27
(31) Это "чрезж0пица®"
(34) Писать правила  в КД1 -  да, мазохизм. но с другой стороны, работает же...
36 varelchik
 
24.10.13
11:28
(35) Каждый извращается по своему.
Кому как нравится.
37 Joshim
 
24.10.13
11:31
(35) какие преимущества в КД1?
38 Joshim
 
24.10.13
11:32
(33) учту это
39 ЧеловекДуши
 
24.10.13
11:33
(0) Лучше переносить через свой файлик, который бы выгружал все не в текстовый XML, а в DBF :)
Быстрее, на больших объемах :)
А так же в "Конвертация данных" без бутылки не разобраться :)
40 dk
 
24.10.13
11:36
(37) перенос периодических реквизитов - тупо галку поставить
а в КД2 - самому выборку настраивать и загрузку
41 Mikeware
 
24.10.13
11:36
(39) Думаешь, у него не найдется денег на бутылку?
(37) у КД1 - никаких. В КД2 - удобнее
42 Aleksey
 
24.10.13
11:38
(15) просто никто не говорит об этом
43 Aleksey
 
24.10.13
11:40
(20) к инструменту вопросов нет, а вот к реализации его ...., к реализации куча вопросов и допиливания напильником
44 Aleksey
 
24.10.13
11:41
(32) для файлово версии она ему не сильно поможет, ибо нет механизма работы с таблицей изменений
45 arsik
 
гуру
24.10.13
11:46
(44) Нормально все с файловой работает.
46 Mikeware
 
24.10.13
11:48
(44) Прямой очистки - нет. но можно вполне сделать "подтверждение". Это еще проще :-)
47 Mikeware
 
24.10.13
11:48
(45) проблемы с индексами
48 Aleksey
 
24.10.13
11:49
(45) и с индексами проблем нет, ну давай рассказывай как туда записать, как удалить...
49 vvf1973
 
24.10.13
11:52
в КД2 для 7.7 нет возможности синхронизировать по УИД, нет возможности организовать поиск в зависимости от условий, надо писать  синхронизацию по бух. операциям, так как сами операции переносятся без проводок, подробнее у Бояркина, если нельзя перепроводить, нет возможности без перепроведения сформировать движения по регистрам :-) нет возможности организовать поиск документов по дате и номеру одновременно :-) а вот МОД, имхо, интересная разработка :-)
50 arsik
 
гуру
24.10.13
11:56
(48)
Вытаскиваем примерно так
ТекстЗапроса =
    "SELECT
    |    урбд.dbsign as dbsign,
    |    урбд.typeid as typeid,
    |    урбд.objid as objid,
    |    урбд.deleted as deleted,
    |    урбд.dwnldid as dwnldid,
    |    урбд.typeid+урбд.objid as [Ссылка $Документ]
    |
    |FROM
    |    1SUPDTS as урбд
    |WHERE
    |    урбд.dbsign = :КодБД AND
    |    урбд.dwnldid <> '     0' AND
    |    урбд.typeid IN ("+СпИДДокументов+")";

А чистим вот так:
    //Подключимся через 1cpp к базе 77 внутри ОЛЕ
    Соединение = "
        |Provider=VFPOLEDB.1;
    //    |Deleted=Yes;
        |Null = Yes;
        |Exclusive = No;
        |SourceType = DBF;
        |Data Source=" + СокрЛП(ИБ77Каталог) + ";
        |Mode=ReadWrite;
        |Extended Properties="""";
        |User ID="""";
        |Password="""";
        |Mask Password=False;
        |Collating Sequence=MACHINE;
        |DSN=""""";    
    
    Рез = База.Соединение(Соединение);
    Если Рез = 0 Тогда
        Предупреждение("Не смогли подключится через OLEDBData");
        Возврат Ложь;
    КонецЕсли;
    
    //Запросом 1cpp вытащим идентификаторы и уиды периферийной и центральной базы.
    Запрос = База.СоздатьКоманду();
    ТекстЗапроса =
        "SELECT
        | SSYSTEM.dbsign as dbsign77,
        | DBSET.dbuuid as uid77,
        | SSYSTEM.dbsetuuid as uuid,
        | Подзапрос.dbsign82,
        | Подзапрос.uid82,
        | Подзапрос.filein82,
        | Подзапрос1.dwnldid
        |FROM 1SSYSTEM AS SSYSTEM
        |INNER JOIN 1SDBSET as DBSET ON SSYSTEM.dbsign = DBSET.dbsign
        |INNER JOIN (
        | SELECT
        |  DBSET.dbsign as dbsign82,
        |  DBSET.dbuuid as uid82,
        |  DBSET.dbfnpc as filein82
        | FROM
        |  1SDBSET as DBSET
        | WHERE
        |  DBSET.dbsign = 'V82') AS Подзапрос ON 0=0
        |
        |INNER JOIN (
        | SELECT
        |   max(base.dwnldid) as dwnldid
        | FROM 1SDWNLDS as base
        | WHERE
        |   base.dbsign = 'V82' AND
        |   base.direct = 'O'   AND
        |   base.acknowl = ''
        |) AS Подзапрос1 ON 0=0    ";
        
    ТЗДок = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
    ТЗДок.ВыбратьСтроки();
    Если ТЗДок.получитьСтроку() = 0 Тогда
        Возврат Ложь;
    КонецЕсли;
    
    //собираем вручную файлы обмена
    КаталогВременныхФайлов = КаталогВременныхФайлов();
    
    тФайл = Новый ТекстовыйДокумент;
    стр = "{""Download ID"","+СокрЛП(ТЗДок.uuid)+","""+СокрЛП(ТЗДок.dbsign82)+""","+СокрЛП(ТЗДок.uid82)+","""+СокрЛП(ТЗДок.dbsign77)+""","+СокрЛП(ТЗДок.uid77)+","""+
            Формат(МД.СтрокаВЧисло(СокрЛП(Лев(ТЗДок.dwnldid,6)),36),"ЧГ=0")+"|"+СокрЛП(ТЗДок.dbsign82)+"""}";
    тФайл.УстановитьТекст(стр);
    //Сообщить(стр);
    тФайл.Записать(КаталогВременныхФайлов+"1Cv77Dld.id",КодировкаТекста.OEM);
    
    стр = "{"+СокрЛП(ТЗДок.uuid)+","""+СокрЛП(ТЗДок.dbsign77)+""","+СокрЛП(ТЗДок.uid77)+","""+СокрЛП(ТЗДок.dbsign82)+""","+СокрЛП(ТЗДок.uid82)+","""+
            Формат(МД.СтрокаВЧисло(СокрЛП(Лев(ТЗДок.dwnldid,6)),36),"ЧГ=0")+"|"+СокрЛП(ТЗДок.dbsign82)+""",
            |{""Acknowledgements"",
            |{"""+Формат(МД.СтрокаВЧисло(СокрЛП(Лев(ТЗДок.dwnldid,6)),36),"ЧГ=0")+"|"+СокрЛП(ТЗДок.dbsign77)+"""}},
            |{""Constants""},
            |{""References""},
            |{""Documents""},
            |{""Deleted References""},
            |{""Deleted Documents""}}";
    тФайл.УстановитьТекст(стр);
    //Сообщить(стр);
    тФайл.Записать(КаталогВременныхФайлов+"1Cv77Chs.dat",КодировкаТекста.OEM);
    архивУРБД = Новый ЗаписьZipФайла(КаталогНастроек+СокрЛП(ТЗДок.filein82));
    архивУРБД.Добавить(КаталогВременныхФайлов+"1Cv77Dld.id");
    архивУРБД.Добавить(КаталогВременныхФайлов+"1Cv77Chs.dat");
    архивУРБД.Записать();
    
    СоздатьПакетныеФайлы();
    ТекущийКаталог = """"+оле77.КаталогПрограммы()+"""";
    Команда = """"+оле77.КаталогПрограммы()+"1cv7.exe"" CONFIG "+
            "/D"""+СокрЛП(ИБ77Каталог)+""" "+
            "/N"""+СокрЛП(ИБ77ИмяПользователя)+""" "+
            "/P"""+СокрЛП(ИБ77Пароль)+""" "+
            "/@"""+КаталогНастроек+"8_to_77.prm""";
            
    тФайл = Новый ТекстовыйДокумент;
    тФайл.УстановитьТекст(Команда);
    тФайл.Записать(КаталогНастроек+"st8_to_7.cmd",КодировкаТекста.OEM);
    ЗапуститьПриложение(КаталогНастроек+"st8_to_7.cmd",ТекущийКаталог,Истина,КодВозврата);
    
    Возврат КодВозврата <> Неопределено;
51 Aleksey
 
24.10.13
12:04
(50) Я вроде бы про чтения ничего не спрашивал
52 arsik
 
гуру
24.10.13
12:08
(51) Там и чтение и очистка.
53 ЧессМастер
 
25.10.13
09:53
(31) у тебя в твоем справочнике не будут зарегистрированы интерактивные измерения. например сделанные обработками.

можешь легко это проверить.
54 ЧессМастер
 
25.10.13
09:56
(31) кстати после установки МОД на рабочую конфигурацию обязательно надо во всех новых документах методы Записать() и ему подобные переписывать на те которые использует МОД (насколько помню он называется ЗарегистироватьОбъектДляМОД)

об этом отл\дельно в доке по МОД написано
55 ЧессМастер
 
25.10.13
09:57
(31) кайф УРДБ в отличии от МОД в том что тебе не надо ничего выдумывать для регистрации объектов - все что создано и изменено будет зарегистрировано (хоть в режиме пользователя хоть интерактивно)
56 ЧессМастер
 
25.10.13
09:59
(27) поясни пожалуйста про триггер. я правильно понимаю что ты это через триггеры скуля делал ?
57 varelchik
 
25.10.13
10:03
(56) Да под SQL.
58 varelchik
 
25.10.13
10:03
(56)Стучись в аську если очень интересно.
59 ЧессМастер
 
25.10.13
10:11
у УРДБ есть еще одна возможность которой у МОД нет.
это восстановление объектов которые удалены прямым удалением. после обмена объекты восстанавливаются.

у меня был случай когда случайно в центральной базе удалил прямым удалением несколько десятков элементов справочника Номенклатуры (на которые были естественно ссылки в документах). уже собирался восстанавливать из архива по ОЛЕ. но после обмена с периферийной базой эти удаленные элементы восстановились
60 ЧессМастер
 
25.10.13
10:13
(58) ага. на работе аська запрещена стукнусь на выходных - если ты не против
61 Диманыч
 
25.10.13
10:13
(0) Очень легко к каждому элементу справочника добавляешь
поле флаг (о том что реквизит изменен) При любой записи туда прописываешь 1(какое нить значение), при выгрузке обмена ее обнуляешь (стираешь). Это как примитив.

Более сложнее можешь использовать не флаг а версию объекта, этот вариант более гибче но больше кодить
62 varelchik
 
25.10.13
10:14
(59) так порукам за такие весчи давать надо и пальцы в двери.
63 vvf1973
 
25.10.13
10:23
(62) вам хочется это сделать и без повода :-)
64 ЧессМастер
 
25.10.13
11:30
(62) зачем мне самому себе давать по рукам ? сам накосячил сам исправил
65 varelchik
 
25.10.13
11:35
(60) не против.