Переключение на Главную Страницу Страницы: 1 2 [3] 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Расширение возможностей УРБД (число прочтений - 39186 )
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 записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 
ОтправитьПечать