Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Расширение возможностей УРБД (число прочтений - 39182 )
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Расширение возможностей УРБД
28. Мая 2009 :: 07:42
Печать  
Нахожусь в ситуации аналогичной топикстартеру  из http://www.1cpp.ru/forum/YaBB.pl?num=1234460554, хочу немного модернизировать УРБД но пока не знаю с чего начать, сказывается нехватка информации по теме.

Основные вопросы которые сейчас стоят передо мной:
1) Для того что бы сделать задуманное мне скорей всего придется подменить родную dll своей, которая некоторые команды будет делать сама, а остальные отдаст родной dll. В с вязи с этом нужна информация как это можно осуществить, как это в принципе делается.
2) Нужна информация как работает компонента УРБД. Я понимаю, что 1С врятли с кем ни будь поделиться исходниками, но может у кого есть информация про эту компоненту.

Если есть хоть какая ни будь информация или ссылка буду очень признателен если поможете. Просто голова уже идет кругом, нужна отправная точка для начала движения.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #1 - 28. Мая 2009 :: 08:58
Печать  
Задачу озвучь для начала.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #2 - 28. Мая 2009 :: 08:58
Печать  
Информацию по теме можно найти в руководстве по компоненте.
О том, как она работает, можно прочитать здесь: http://argat.h11.ru/URBDStructure.html.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #3 - 28. Мая 2009 :: 09:16
Печать  
Для начала хочу осуществить настройку миграции объектов с привязкой к базам. Как пример миграция документа только в те базы где он нужен а не во все. Хочу сделать дополнительную настройку где бы мы указывали в какую базу какие элементы мы будем грузить а куда не надо. Средствами языка 1С я это уже сделал, но обмен данных идет достаточно часто, и я считаю абсурдным перед каждым обменом данных запускать 1С предприятие, обрабатывать ДБФ файлы а потом конфигуратором делать выгрузку.

В двух словах что я хочу реализовать: На уровне ядра 1С выборочная регистрация изменений для разных баз в зависимости от настроек.
Примерно выглядит идея следующим образом: Есть 10 периферийных баз, и документ должен попасть в 3 из них. Мы просто для этих трех баз регистрируем изменения, а для 7 оставшихся баз этого не делаем. На выходе мы получаем уже готовый файл изменений необходимых для выгрузки, а дальше стандартный механизм справиться на ура.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #4 - 28. Мая 2009 :: 10:46
Печать  
Можешь регистрировать все 10. Потом из таблицы выгрузки 7 удали.
Для sql  это легко как для dbf не знаю.
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #5 - 28. Мая 2009 :: 11:13
Печать  
Выгрузка и загрузка проходит в пакетном режиме, топология УРБД не позволяет перед каждой выгрузкой проводить зачистку ненужных данных из ДБФ. Обмен данных происходит "на ходу", и требуется 100% гарантия что с момента завершения обработки и до начала выгрузки никто не успеет ничего сделать. Внешняя обработка для 1С которая зачищает ДБФ от ненужной информации у меня есть, но воспользоваться я ей не могу в виду того что я не могу гарантировать ее 100% работоспособность в том виде в каком она мне нужна. Если лезть в ядро 1С то я полагаю самый простой способ "не писать" данные, чем их потом "удалять".

P.S. Очень много видел ссылки на "Rainbow Addon 2000" как на первоисточник, но никак не могу поймать исходники. Если есть у кого ни будь поделитесь.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #6 - 28. Мая 2009 :: 12:25
Печать  
Цитата:
Выгрузка и загрузка проходит в пакетном режиме

Так и делай ее в bat файле.
Первым шагом в этом файле удаление.
Вторым сама выгрузка пакетным режимом.


В данном случае лучше удалять.
Ответь на вопрос размер базы какой ?
Если база маленькая то выгружай все и в переф. базах
не показывай.
Если база большая то почему dbf ?

Для sql можно написать самому на тригерах ,
либо есть и готовое смотри на www.1csql.ru
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #7 - 28. Мая 2009 :: 16:55
Печать  
SQL пока не рассматривается, ДБФ в полне хватает по скорости работы, вот только функционал УРБД немного подводит, поэтому и стал вопрос небольшой модернизации.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Расширение возможностей УРБД
Ответ #8 - 01. Июня 2009 :: 12:05
Печать  
А это не то?
  

Clipboard01_005.jpg ( 176 KB | Загрузки )
Clipboard01_005.jpg
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #9 - 02. Июня 2009 :: 05:30
Печать  
Существует несколько магазинов, к каждому магазину закреплен один склад и одна касса. Задача выгружать в базу только те документы которые относятся к этому складу или к этой кассе. Получается что один и тот же документ в зависимости от значений реквизитов попадает в некоторые базы. Ситуацию усугубляет то что помимо центрального офиса где стоят центральные базы (а их несколько), есть еще и несколько складов, каждый из которых обслуживает свой участок. Если кто то знает как решить такую задачу штатными средствами, поделитесь. Вариант SQL пока не предлагать, базы достаточно маленькие чтобы еще и разоряться на сервер с лицензией на SQL. Основная задача ограничить данные в периферийных базах. Знающему человеку из периферийной базы сделать центральную, и прописать себя Администратором дело 5-10 сек, вот чтобы избежать подобного и затевается все это.
  
Наверх
 
IP записан
 
Brr
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 142
Зарегистрирован: 26. Декабря 2006
Re: Расширение возможностей УРБД
Ответ #10 - 02. Июня 2009 :: 07:47
Печать  
Пример:
Прих. накладная - нужно чтобы приходила только в опред. ПБ.
Решение.
Область миграции - место создания и центр.
В ПБ по мере надобности создаем пустые документы - "болванки".
В ЦБ их заполняем.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Расширение возможностей УРБД
Ответ #11 - 02. Июня 2009 :: 09:48
Печать  
А где доки генерятся?
  
Наверх
 
IP записан
 
Brr
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 142
Зарегистрирован: 26. Декабря 2006
Re: Расширение возможностей УРБД
Ответ #12 - 02. Июня 2009 :: 10:48
Печать  
В ПБ
  
Наверх
 
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 127
Зарегистрирован: 29. Января 2007
Re: Расширение возможностей УРБД
Ответ #13 - 02. Июня 2009 :: 11:06
Печать  
Место создания и центр - все созданное в центральной базе попадет во все...

Может смотреть в сторону мода
  
Наверх
 
IP записан
 
Brr
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 142
Зарегистрирован: 26. Декабря 2006
Re: Расширение возможностей УРБД
Ответ #14 - 02. Июня 2009 :: 13:29
Печать  
Место создания и центр - попадет только в место создания и центр.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Расширение возможностей УРБД
Ответ #15 - 02. Июня 2009 :: 14:10
Печать  
Бред конечно, но можно создать копии доков каждого вида для пар (склад-касса) и настроить миграцию в центр и в пары склад-касса.
По идее должно работать.
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Расширение возможностей УРБД
Ответ #16 - 03. Июня 2009 :: 03:59
Печать  
Я делал подобную систему для SQL.
Основная идея: Все сливается в центральную базу, выгрузки из неё фильтруются.
Способ: замена хранимой процедуры _1sp_RegisterUpdate
на свою, в которой проводится анализ: необходима условная выгрузка объекта или безусловная (по типу объекта и необходимости фильтрации данных для ИБ) Улыбка
Объекты безусловной выгрузки пишутся в стандартную таблицу _1SUPDTS, а условной выгрузки в свою таблицу.
Затем, перед выгрузкой проходим по таблице SQL-скриптом и переносим записи в табл. _1SUPDTS для объектов, удовл. условию. Остальные удаляем.
Я фильтровал только доки по общему реквизиту, в который програмно писал коды баз для выгрузки. Улыбка

Плюсы:
-Если забыли вызвать скрипт (или он выполнился некорректно) никаких лишних данных никуда не уйдет.
-Алгоритм заполнения общего реквизита любой:
У меня учитывается как подчинение документов, так и значение реквизитов (Написан спец. класс для анализа, в котором есть процедуры для каждого вида документа). Также возможно у нужного документа просто установить "Галочку" на против соотв. базы.

PS: Для справочников подобный алгоритм реализовать сложнее - там нет общего реквизита, но нет ничего невозможного Улыбка
  
Наверх
 
IP записан
 
Dimitry
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 21. Апреля 2008
Re: Расширение возможностей УРБД
Ответ #17 - 03. Июня 2009 :: 10:29
Печать  
я решил эту проблему написав триггер.
при обращении к таблице _1SDWNLDS производим зачистку "лишних" записей в _1SUPDTS. все работает уже на протяжении более 2 лет без сбоев на 23 филиалах . триггер отрабатывает по связке  _1SUPDTS, _1SJOURN и справочника фирм.
если нужно скину код, но там есть внутренние идентификаторы ....
идею нарыл где то на просторах инета. ссылку к сожалению не помню.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #18 - 03. Июня 2009 :: 10:53
Печать  
Dimitry писал(а) 03. Июня 2009 :: 10:29:
я решил эту проблему написав триггер.
при обращении к таблице _1SDWNLDS производим зачистку "лишних" записей в _1SUPDTS. все работает уже на протяжении более 2 лет без сбоев на 23 филиалах . триггер отрабатывает по связке  _1SUPDTS, _1SJOURN и справочника фирм.
если нужно скину код, но там есть внутренние идентификаторы ....
идею нарыл где то на просторах инета. ссылку к сожалению не помню.

Выкладывай хуже не будет.
Только у автора subj - dbf
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #19 - 03. Июня 2009 :: 11:49
Печать  
Еще вдогонку тема для размышления.

В периферийную базы мы выгружаем только те документы которые относятся к склады/кассе закрепленной за этой базой. С приходом/расходом никаких вопросов, но вот когда выгружаем перемещения документы выгружаются со всеми его движениям, и в базу попадают движения по чужому складу/кассе. Соответственно не трудно догадаться что по складам по которым у нас идет полный обмен в периферийной базе проблем у нас не будет, а вот что делать с теми складами у которых пришли только перемещения?

В принципе пока что я вижу 2 решения: Лезть в ядро 1С и настраивать выгрузку движений таких случаев или обрабатывать файл выгрузки и выкидывать от туда движения по "паразитным" складам. Не знаю даже что легче осуществить.

Может у кого будут идейки по интересней?
  
Наверх
 
IP записан
 
Brr
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 142
Зарегистрирован: 26. Декабря 2006
Re: Расширение возможностей УРБД
Ответ #20 - 04. Июня 2009 :: 05:13
Печать  
Разбить перемещение на 2 документа, первый списывает остатки на складе отправителе, второй приходует остатки на складе получателе
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Расширение возможностей УРБД
Ответ #21 - 04. Июня 2009 :: 05:25
Печать  
Dimitry писал(а) 03. Июня 2009 :: 10:29:
я решил эту проблему написав триггер.
при обращении к таблице _1SDWNLDS производим зачистку "лишних" записей в _1SUPDTS. все работает уже на протяжении более 2 лет без сбоев на 23 филиалах . триггер отрабатывает по связке  _1SUPDTS, _1SJOURN и справочника фирм.
если нужно скину код, но там есть внутренние идентификаторы ....
идею нарыл где то на просторах инета. ссылку к сожалению не помню.


Выкладывай конечно. Давно про тригера слышу. Но как ими пользоваться, и куда применить ХЗ.
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Расширение возможностей УРБД
Ответ #22 - 04. Июня 2009 :: 05:38
Печать  
Yukimir писал(а) 03. Июня 2009 :: 11:49:
В периферийную базы мы выгружаем только те документы которые относятся к склады/кассе закрепленной за этой базой. С приходом/расходом никаких вопросов, но вот когда выгружаем перемещения документы выгружаются со всеми его движениям, и в базу попадают движения по чужому складу/кассе. Соответственно не трудно догадаться что по складам по которым у нас идет полный обмен в периферийной базе проблем у нас не будет, а вот что делать с теми складами у которых пришли только перемещения?

В принципе пока что я вижу 2 решения: Лезть в ядро 1С и настраивать выгрузку движений таких случаев или обрабатывать файл выгрузки и выкидывать от туда движения по "паразитным" складам. Не знаю даже что легче осуществить.

Может у кого будут идейки по интересней?

Не вариант! Имеем ситуацию: перепроведение документа в перефирийной базе - следовательно, документ летит обратно в центральную и замещает объект, стирая все движения по второму складу...
Так что варианта два:
-Игнорировать отрицательные остатки по складам (програмно в случае проведения, и пользователям это объяснить);
-Разбить документ на два: Отправка товара и получение товара.
ИМХО: самый правильный вариант, так как по-сути, в случае большого кол-ва филиалов прием и отправка перемещения разделяют ЧАСЫ, а иногда и ДНИ!
Ну и соответственно новый регистр "Транзит товара"...

ЗЫ: to Brr - не заметил твоего сообщения Улыбка Надо чаще страницы обновлять Смех
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Расширение возможностей УРБД
Ответ #23 - 04. Июня 2009 :: 06:13
Печать  
МОД еще никто не предлагал ?
Улыбка
Можно и гибрид уриб-мод, есл регистрация изменений от МОДа не устраивает...
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #24 - 04. Июня 2009 :: 07:16
Печать  
Eprst писал(а) 04. Июня 2009 :: 06:13:
МОД еще никто не предлагал ?
Улыбка
Можно и гибрид уриб-мод, есл регистрация изменений от МОДа не устраивает...


А можно поподробней по поводу МОДа. Я что то уже встречал похожее, но тогда програмка накоторую я натыкался не решала основной задачи, а красивый интерфейс на сервере к которому даже манитор не подключен мне пока не нужен. Может что и изменилось с тех пор.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Расширение возможностей УРБД
Ответ #25 - 04. Июня 2009 :: 07:20
Печать  
А что именно подробней ?
МОД позволяет иметь неограниченное количество перефириек, гибкие правила обмена , которые могут меняться на-ходу..
Единственный минус - встраивание своего кода во все объекты, добавление реквизита IDD и использование спец. конструкций, например. вместо Объект.Записать, писать ОбъектЗаписать(Объект,) ну и т.д..

ЗЫ: Обмениваться можно м-ду любыми конфигурациями (т.е с разными мд-никами).
Есть регистрация изменений, если она не устраивает, можно регистрировать урибом, а выгружать МОД-ом..

подробней, на www.pb.ru
Да, последняя редакция МОДа от 28 ноября 2005 ..если что
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #26 - 04. Июня 2009 :: 07:36
Печать  
Этот МОД не подходит, он использует XML для выгрузки/загрузки и в свете того что постоянно идут доработки то я просто повешусь каждый раз переделывать правила. У меня порядка 10 баз, с общим числом перифирийных более 30. Если я при каждом изменении конфигурации должен буду вносить изменения в механизм миграции данных то я только и буду заниматься настройкой. В УРБД меня устраивает то что у меня не болит голова за обновления баз, и за то что если я добавлю какой нибудь реквизит, к какому нибудь справочнику, он не выгрузиться или выгрузиться но не так. Я хоть сплю по ночам спокойно.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Расширение возможностей УРБД
Ответ #27 - 04. Июня 2009 :: 08:10
Печать  
Там не только XML, это раз и отправлять умеет мд-ник Это два..
а правила настраиваются автоматом, если что..
Да и.. как часто вы конфу правите ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Расширение возможностей УРБД
Ответ #28 - 04. Июня 2009 :: 08:12
Печать  
+ Возможность повторной загрузки пакета
+ Перепроведение базы, используя МОД, не выгоняя юзверей
+ еще много чего полезного.. всего не перечислишь..

А по поводу Уриба, сюда еще поглядите
http://infostart.ru/profile/1045/projects/1071/
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #29 - 04. Июня 2009 :: 10:51
Печать  
В месяц 2-4 раза базы обновляются, иногда чаще, иногда реже. Все зависит от поставленной задачи и количества времени на тестирование. У МОДа есть ряд ограничений которые не дают возможность осуществить задуманное, особенно неспособность загрузить новую конфигурацию в периферийной базе. Плюс ко всему она "интеллектуально" меняет конфигурацию, а если в некоторых местах там камня на камне не осталось от родной конфигурации, как долго я буду отлавливать глюки которые она привнесет с собой меняя стандартные процедуры на свои?

Не, это не вариант. Это скорей как соломинка для утопающего, но не как кардинальное решение поставленной задачи.

Для тех у кого обмен данными происходит в нерабочее время предлагаю небольшую обработочку, которая читает данные ид ДБФ и выкидывает ненужные записи о регистрации изменений в зависимости от настроек.

Необходимые доработки базы:
1)      Создать справочник «ПринадлежностьСклада» подчиненный складу с длиной наименования 3 символа.
2)      Сделать тоже самое для справочника Кассы с названием нового справочника «ПринадлежностьКассы».
3)      В новых справочниках мы просто перечисляем названия периферийных баз куда нужно выгружать документ.
Перед выгрузкой в периферийные базы мы просто запускаем эту обработку и УРБД дальше делает все сама.

P.S. Обработка была написанна за 1 день, и работает только с 2-мя типами документов. Полевые испытания она так и не прошла поэтому до сих пор она может делать только это. Смысла ее небыло пока расширять.
  

__________DBF.ert ( 29 KB | Загрузки )
Наверх
 
IP записан
 
Dimitry
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 21. Апреля 2008
Re: Расширение возможностей УРБД
Ответ #30 - 04. Июня 2009 :: 20:46
Печать  
сорри. был очень занят.
ловите триггер
просьба камнями не бросать - писал давно, причин переписывать небыло, но работает безотказно Улыбка
триггер создается только в центральной базе.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[_1SDWNLDS_Delete] ON [dbo].[_1SDWNLDS]
     FOR  DELETE
  AS Set NoCount On      
Delete _1SUPDTS
From _1SUPDTS T1
Join (
Select Upd.DBSign, Upd.TypeID, Upd.ObjID
From _1SUPDTS Upd (NOLOCK)
Join _1SJOURN Jorn (NOLOCK) On Upd.TypeID = Jorn.IDDocDef And Upd.OBJID = Jorn.IDDoc And (Upd.TypeID = 14643)
Join SC375 Firm (NOLOCK) On Jorn.SP1136 = Firm.ID And Upd.DBSign <> Firm.Code And Upd.DBSign <> Right(Upd.ObjID,3) And Upd.DBSign <> 'TR ' And Upd.DBSign <> 'BI '
) T2 On T1.DBSign=T2.DBSign And T1.TypeID=T2.TypeID And T1.ObjID=T2.ObjID

где SC375 справочник фирмы,
Jorn.SP1136 - общий реквизит фирмы
'TR ' и 'BI ' коды обязательных периферийных баз (в них док попадает всегда)
14643 - вид нужного документа
Upd.DBSign - куда уходит док
код справочника фирмы = код ИБ (так мне удобно т.к. много всякого в базе нарисовано для хитрых обменов и прав доступа)

принцип работы:
ставим миграцию у нужного типа (здесь 14643) все ИБ.
когда создаем док на периферийную базу система в _1SUPDTS пишет на каждую базу свою строку (при загрузке пакета обмена в центральную) .
при инициализации обмена идет обращение (что то там проверяется по идентификаторам пакетов обмена) к _1SDWNLDS и соответственно по заданным условиям триггером удаляются строки.

прим. в базе используется разделение документов - одним списываем в Базе1, он в момент проведения создает или корректирует уже имеющийся докумет на Базу2 и через обмен он попадает ТОЛЬКО в Базу2  и Центральную

будут вопросы  - задавайте, с радостью помогу  Подмигивание
  
Наверх
 
IP записан
 
marina
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 37
Зарегистрирован: 14. Июня 2009
Re: Расширение возможностей УРБД
Ответ #31 - 21. Июня 2009 :: 13:29
Печать  
Есть центральная база и 4 периферийные. В центральную данные только мигруруют из периферийных баз и передаются по OLE. Поьлзователи данные в ЦБ не вводят. Задача состоит в следующем: нужно отловить изменения, которые поступают в ЦБ, а именно создание элементов некоторых справочников и проведение документов.
Кто нибудь уже сталкивался? Как можно решить вопрос? Триггерами?
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #32 - 22. Июня 2009 :: 05:33
Печать  
На данный момент я нашел для себя решение, мне на глаза попалась одна очень хорошая обработка которая разбирает файл обмена данных и показывает какие изменения пришли в базу. Вот ссылка на эту обработку http://infostart.ru/projects/565. Я взял за основу механизм разбора файла, и пока что сделал упаковку данных обратно. Осталось только по каким либо правилам обработать данные (убавить или добавить) и обработка будет делать то что мне нужно. Сейчас работа немного застопорилась, так как появились неотложные задачи, как со временем станет легче доделаю и выложу то что у меня получилось.
У меня база ДБФ поэтому и приходиться извращаться подобным образом. Но я думаю идея с распаковкой файла обмена с последующей обработкой и упаковкой обратно решит многие вопросы УРБД. В файле хранятся разные данные включая ссылки на исходную базу и базу получателя, немного поколдовав с этими данными легко можно получить структуру типа "снежинка", чего так не хватает УРБД.
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #33 - 06. Июля 2009 :: 07:09
Печать  
При оптимизации скорости работы своей обработки столкнулся с одной проблемой, пока пытаюсь найти как ускорить процесс решил задать вопрос здесь, может кто сталкивался, или кто знает метод побыстрее. Суть дела в том что у меня выгрузка в файл съедает до 60% времени. Вот часть кода:

     ИмяФайла = КаталогИБ() + "УРБД\TEMP\1Cv77Chs.dat";
     Текст=СоздатьОбъект("Текст");
     Текст.КодоваяСтраница(0);
     Если ФС.СуществуетФайл(ИмяФайла) = 0 Тогда
           Текст.Записать(ИмяФайла);
     КонецЕсли;      
     Текст.Открыть(ИмяФайла);
     Текст.Очистить();
     Текст.ДобавитьСтроку("");
     
     Для к = 1 По РезСписок.РазмерСписка() Цикл
           Результат = РезСписок.ПолучитьЗначение(к);
           Текст.ДобавитьСтроку(Результат);
     КонецЦикла;
     Текст.Записать(ИмяФайла);

Строка "Текст.ДобавитьСтроку(Результат);" здесь самая медленная. Я конечно понимаю что выгрузить 200тыс строк в 2 файла это процесс достаточно трудоемкий, но может кто знает как это процесс можно ускорить?

РезСписок - это список значений в котором храниться содержание конечного файла построчно. Каждый элемент этого списка есть отдельная строка конечного файла. Все необходимые знаки препинания и синтаксис строк уже проставлен, нужно тупо перегрузить построчно список значений в текстовый файл как есть, и по возможности наиболее быстрым способом.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #34 - 06. Июля 2009 :: 08:00
Печать  
BinaryData работает заметно быстрее, чам Текст.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #35 - 06. Июля 2009 :: 10:46
Печать  
Используя компоненту V7Plus мне удалось ускорить выполнение этой операции со 161сек до 9сек. Прирост производительности очень заметный. Сижу теперь с остальным кодом колдую, может еще где можно будет выжать несколько секунд.

P.S. Уже не раз убеждаюсь в правильности поговорки "Дурная голова ногам покоя не дает." А в нашем случае "Рукам покоя не дает". Ведь часто пользовался этой компонентой, и что меня дернуло в этот раз воспользоваться штатными средствами.
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #36 - 05. Ноября 2009 :: 12:34
Печать  
Немного помучившись с учебниками по C++ мне удалось реализовать поставленную задачу, как мне кажется достаточно хорошо. На данный момент обработка проходит стадию завершающего тестирования перед внедрением, но я надеюсь я уже все глюки выловил. Но если что не так не обижайтесь.

Вкратце расскажу как это все работает.

Обработка состоит из 2 файлов:
Настройка УРБД.ert - настройка правил выгрузки, а также путей к исходным файлам. Для успешной работы необходимы компоненты v7plus.dll и 1С++.
URBD.exe - непосредственно обработка которая обрабатывает архив файла выгрузки в соответствии с правилами описанными в предыдущей обработке. Для нормальной работы необходимо чтобы в системе был установлен WinRAR.

Настройка УРБД.ert запускать следует при НЕ монопольном режиме работы 1С. При первом запуске в каталоге с базой создается новый каталог в котором эта обработка и будет хранить все свои файлы. После первого запуска рекомендую закрыть обработки и открыть ее повторно, пока не было времени разобраться чем для 1С отличаются открытый файл от вновь созданного. Дальше производите настройку правил. На первой закладке сводная таблица всех правил, 2-4 закладка повторяет те же правила но для Справочников, документов и регистров по отдельности.
В принципе весь интерфейс я старался делать интуитивно понятным, чтобы через год/два самому не ломать голову что к чему.

При запуске URBD.exe ей надо передать в качестве параметра каталог где содержаться файлы созданные предыдущей обработки, например:
URBD_2.exe E:\Base\<Ваша база>\URBD\
Эта программа сама возьмёт все необходимые ей настройки и обработает все файлы выгрузки. Так же этой программе все равно что обрабатывать файл переноса данных, или файл первоначальной выгрузки, так что можно начать с того что создать новую периферийную базу сохранив ее в тот же файл что и данные выгрузки и натравить URBD.exe на этот файл. После развертывания периферийной базы сразу все станет видно, что и как режется.

P.S. Эта обработка предназначена только для тех кто отдает себе отчет в своих действиях, и может понять к каким последствиям может привести неправильное использование настроек. Одна из проблем с который вы можете столкнуться, это если вы решите ограничить движения документов, то в периферийной базе такие документы ни в коем случае не должны проводиться.
  

URBD.ZIP ( 157 KB | Загрузки )
Наверх
 
IP записан
 
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #37 - 19. Января 2010 :: 11:19
Печать  
Интересно получается,  тут http://infostart.ru/public/14923/ сделано что:
В таблицу _1SUPDTS добавляется запись на регистрацию изменений.
Т.е. Можно и самому зарегистрировать это. Вот пример (используется 1С++ для определения внутренних идентификаторов:
Код
Выбрать все
АДО = CreateObject("ADODB.Connection");
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="""+ КаталогИБ() +""";Extended Properties=DBASE IV;;;";
Попытка
	АДО.Open(СтрокаСоединения);
Исключение
	 Сообщить("Ошибка открытия 1SUPDTS.DBF из-за "+ОписаниеОшибки());
	Возврат;
КонецПопытки;

МетаИмена	= СоздатьОбъект("MetaDataWork");

  // Для всех переферийных баз
Базы =  АДО.Execute("SELECT * FROM 1SDBSET");
Пока Базы.EOF = 0 Цикл
	ИдБазы	= Базы.Fields("DBSIGN").Value;
	Длина	= СтрДлина(ИдБазы);
	Для Сч = Длина+1 По 3 Цикл
		ИдБазы	= ИдБазы + " ";
	КонецЦикла;

	Если ИдБазы = ТекущаяИбКод() Тогда
		Базы.MoveNext();
		Продолжить;	// сами себе не выгружаем
	КонецЕсли;

	// С начала проверим наличие текущего документа в выгрузке
	Стр	= МетаИмена.ЗначениеВДлиннуюСтрокуБД(ТекущийДокумент());
	ИдТипа		= Лев(Стр,4);
	ИдОбъекта	= Прав(Стр,9);

	ТекстЗапроса="SELECT *
			|FROM 1SUPDTS
			|WHERE (
			|((DBSIGN)  ="""+ИдБазы+""") AND
			|((TYPEID)  ="""+ИдТипа+""") AND
			|((OBJID)   ="""+ИдОбъекта+""") AND
			|((DWNLDID) =""     0"")
			|)
			|";

	Выборка	=  АДО.Execute(ТекстЗапроса);
	Если Выборка.EOF()<>0 Тогда
		АДО.Execute("
			|INSERT INTO 1SUPDTS (DBSIGN, TYPEID, OBJID, DWNLDID)
			|VALUES("""+ИдБазы+""","""+ИдТипа+""","""+ИдОбъекта+""",""     0""
			|)");
		КонецЕсли;

	Базы.MoveNext();
КонецЦикла;

АДО.Close();
 



Так вот прикол в том, что в таблице 1SUPDTS.DBF запись добавляется, но при выгрузке не выгружается, т.е. так и остается с 0 пакетом. Следовательно, 1С где-то еще фиксит выгрузку?

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #38 - 19. Января 2010 :: 11:51
Печать  
О .dbf не в курсе, а в sql туда пишутся только пробелы (без нуля).
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #39 - 19. Января 2010 :: 13:09
Печать  
Пробелы тоже пробовал - так же
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Расширение возможностей УРБД
Ответ #40 - 20. Января 2010 :: 09:50
Печать  
newbas писал(а) 19. Января 2010 :: 11:19:
Интересно получается,  тут http://infostart.ru/public/14923/ сделано что:
В таблицу _1SUPDTS добавляется запись на регистрацию изменений.
Т.е. Можно и самому зарегистрировать это. Вот пример (используется 1С++ для определения внутренних идентификаторов:

Так вот прикол в том, что в таблице 1SUPDTS.DBF запись добавляется, но при выгрузке не выгружается, т.е. так и остается с 0 пакетом. Следовательно, 1С где-то еще фиксит выгрузку?



Выгрузку-то она фиксирует, в 1SDWNLDS, но только фиксирует уже после того как сделает, а так вообще если запись есть в 1SUPDTS, то должна выгружаться, никогда не видел чтобы не выгружалась. Разве что только когда стоит на выгрузку запись, которой на самом деле не существует и без флага Deleted = 'D'.
  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #41 - 20. Января 2010 :: 10:20
Печать  
Скорее всего вставленные таким образом записи не попадают в индексный файл.
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Расширение возможностей УРБД
Ответ #42 - 20. Января 2010 :: 10:41
Печать  
typeid помойму должно быть в 10ричном формате, т.е.
Код
Выбрать все
ИдТипа		= _StrToId(Лев(Стр,4)); 

  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Расширение возможностей УРБД
Ответ #43 - 20. Января 2010 :: 11:40
Печать  
Alex_Bob писал(а) 20. Января 2010 :: 10:20:
Скорее всего вставленные таким образом записи не попадают в индексный файл.


Да, точно, у прямых вставок или перезаписей дбф файлов такие проблемы бывали.

Цитата:
typeid помойму должно быть в 10ричном формате

это в SQL оно в десятичном формате, а в DBF в 36-ричном.
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #44 - 20. Января 2010 :: 11:42
Печать  
TypeId имеет 36-ричной формат. Проблема скорей всего в 1SDWNLDS.DBF.

В 1SUPDTS поле DWNLDID имеет код выгрузки, для этого кода обязательно должна быть запись в 1SDWNLDS в поле DWNLDID. Поля в данной строке должны быть заполнены так чтобы 1С при выгрузке видела что это еще не выгружалась. Какие конкретно значения должны быть не скажу, попробуй экспериментальным образом выяснить. У него должно  быть несколько состояний, что то типа "не выгружалось/выгружалось, подтверждение не пришло/выгружалось и пришло подтверждение".

Вот если кому поможет: я создавал обработку которая выкидывает некоторые документы по значению реквизитов из файла регистрации. Я давно отказался от этой затеи поэтому уже толком не помню что нужно доработать в конфигураторе, но думаю кому надо можно разобраться что к чему. Сейчас я занимаюсь доведением до ума обработки которая обрабатывает файл выгрузки.
  

DBF.rar ( 7 KB | Загрузки )
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Расширение возможностей УРБД
Ответ #45 - 20. Января 2010 :: 12:35
Печать  
Yukimir писал(а) 20. Января 2010 :: 11:42:
TypeId имеет 36-ричной формат. Проблема скорей всего в 1SDWNLDS.DBF.

В 1SUPDTS поле DWNLDID имеет код выгрузки, для этого кода обязательно должна быть запись в 1SDWNLDS в поле DWNLDID. Поля в данной строке должны быть заполнены так чтобы 1С при выгрузке видела что это еще не выгружалась. Какие конкретно значения должны быть не скажу, попробуй экспериментальным образом выяснить. У него должно  быть несколько состояний, что то типа "не выгружалось/выгружалось, подтверждение не пришло/выгружалось и пришло подтверждение".

Вот если кому поможет: я создавал обработку которая выкидывает некоторые документы по значению реквизитов из файла регистрации. Я давно отказался от этой затеи поэтому уже толком не помню что нужно доработать в конфигураторе, но думаю кому надо можно разобраться что к чему. Сейчас я занимаюсь доведением до ума обработки которая обрабатывает файл выгрузки.


Не соглашусь, что проблема в 1sdwnlds. Она занимается только фиксацией и подтверждением пакетов обмена и больше ничем. Если вы запустили выгрузку для какой-то периферийной базы, то в нее попадет все, что находится в 1supdts для базы с этим кодом, неважно какие там dwnldid стоят. По полю dwnldid происходит удаление записей, которые были успешно загружены периферийной базой и происходит это при загрузке файла обмена от периферийной базы.
  
Наверх
 
IP записан
 
Yukimir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Мая 2009
Re: Расширение возможностей УРБД
Ответ #46 - 20. Января 2010 :: 12:40
Печать  
Тогда остается копаться в индексном файле, больше просто негде.
  
Наверх
 
IP записан
 
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Расширение возможностей УРБД
Ответ #47 - 20. Января 2010 :: 14:22
Печать  
Alex_Bob писал(а) 20. Января 2010 :: 10:20:
Скорее всего вставленные таким образом записи не попадают в индексный файл.

Именно это и было, обнаружил случайно, а потом увидел уже тут запись. Привожу кусок кода, который помечает к выгрузке документ в периферийные базы:
Код
Выбрать все
	глОлеДБ = СоздатьОбъект("OLEDBData");
	Рез		= глОлеДБ.Соединение("
		|Provider=VFPOLEDB.1;
		|Null = Yes;
		|Exclusive = No;
		|SourceType = DBF;
		|Data Source=" + КаталогИБ() + ";
		|Mode=ReadWrite;
		|Extended Properties="""";
		|User ID="""";
		|Password="""";
		|Mask Password=False;
		|Collating Sequence=MACHINE;
		|DSN=""""");

	Запрос = глОлеДБ.СоздатьКоманду();
	Выборка		= СоздатьОбъект("ТаблицаЗначений");
	Записи		= СоздатьОбъект("ТаблицаЗначений");
	МетаИмена	= СоздатьОбъект("MetaDataWork");

	Запрос.ВыполнитьИнструкцию("SELECT * FROM 1SDBSET WHERE DBSTATUS = ""C""", Выборка);
	Выборка.ВыбратьСтроки();
	Пока Выборка.ПолучитьСтроку() = 1 Цикл
		ИдБазы	= Выборка.DBSIGN;
		ИдБазы	= глДополнитьСтрокуП(ИдБазы," ", 3);

		// С начала проверим наличие текущего документа в выгрузке
		Стр			= МетаИмена.ЗначениеВДлиннуюСтрокуБД(ТекущийДокумент());
		ИдТипа		= Лев(Стр,4);
		ИдОбъекта	= Прав(Стр,9);

		ТекстЗапроса="SELECT *
			|FROM 1SUPDTS
			|WHERE (
			|((DBSIGN)  ="""+ИдБазы+""") AND
			|((TYPEID)  ="""+ИдТипа+""") AND
			|((OBJID)   ="""+ИдОбъекта+""") AND
			|((DWNLDID) =""     0"")
			|)
			|";

		Запрос.ВыполнитьИнструкцию(ТекстЗапроса, Записи);

		Если Записи.КоличествоСтрок() = 0 Тогда
			Запрос.ВыполнитьИнструкцию("
			|INSERT INTO 1SUPDTS (DBSIGN, TYPEID, OBJID, DWNLDID, DELETED)
			|VALUES("""+ИдБазы+""","""+ИдТипа+""","""+ИдОбъекта+""",""     0"", "" ""
			|)");
		КонецЕсли;
	КонецЦикла;
 


  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать