Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) По 8 (число прочтений - 14650 )
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: По 8
Ответ #15 - 08. Октября 2008 :: 10:35
Печать  
>>А ТЗ то все равно не передашь нормально
Подразумевается, что нельзя просто передать несколько/много параметров сразу через ОЛЕ, между разными системами
А приведенный тобой пример - это работа в одной базе, т.е. не то, о чем говорилось.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: По 8
Ответ #16 - 08. Октября 2008 :: 15:01
Печать  
artbear писал(а) 08. Октября 2008 :: 10:35:
>>А ТЗ то все равно не передашь нормально
Подразумевается, что нельзя просто передать несколько/много параметров сразу через ОЛЕ, между разными системами
А приведенный тобой пример - это работа в одной базе, т.е. не то, о чем говорилось.


Да.
Но все таки решил проверить и провел тест
Код
Выбрать все
перем  V7,локОлеДБКоманда,локОлеДБ;
Процедура КнопкаВыполнитьНажатие(Кнопка)
			ТекстЗапроса = "
		|select СпрТ.id as id
		|from $Справочник.Номенклатура as СпрТ
		|";
		ТЗн = локОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);
		ТЗн.ВыбратьСтроки();

		Пока ТЗн.ПолучитьСтроку()= 1 Цикл
			 id=ТЗн.id;

		КонецЦикла ;


КонецПроцедуры
 


Последняя колонка - это процент общего времени выполнения
Цитата:
     Форма.Форма      11      id=ТЗн.id;      4702      0,987063      48,12
     Форма.Форма      10      Пока ТЗн.ПолучитьСтроку()= 1 Цикл      4703      0,977118      47,64
     Форма.Форма      7      ТЗн = локОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);      1      0,074106      3,61
     Форма.Форма      13      КонецЦикла ;      4702      0,012074      0,59
     Форма.Форма      8      ТЗн.ВыбратьСтроки();      1      0,000772      0,04
     Форма.Форма      16      КонецПроцедуры      1            


Обращение к свойствам com-объекта ТЗн занимают в сумме 96%
Собственно запрос 3.5% от общего времени
Если бы было 10 полей, что достаточно типично,
то собственно запрос наверно займет 1/300 от общего времени выполнения
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: По 8
Ответ #17 - 08. Октября 2008 :: 15:28
Печать  
Через XBASE чтение SC33 заняло 0,131215 сек
Код
Выбрать все
Процедура ОсновныеДействияФормыЧерезXBase(Кнопка)
	МойXBase=Новый XBase("C:\SC33.dbf", , Истина);
	Если МойXBase.Открыта() Тогда
		 МойXBase.Первая();
		 Пока   МойXBase.Следующая() Цикл
			   id=МойXBase.id;

	    КонецЦикла;
	КонецЕсли;
КонецПроцедуры
 




- приблизительно в 15 раз быстрее, чем общая процедура выше постом и только вдвое хуже прямого запроса(0,074106).
C SQL вероятно лучше - там есть возможность сразу читать такие таблицы.
Получается через Com надо выполнить запрос , результат во временную таблицу,
потом ее прочитать и уничтожить.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: По 8
Ответ #18 - 09. Октября 2008 :: 09:55
Печать  
Здесь Dmitro писал специальную компоненту
GameWithFire
для быстрой загрузки в ТЗ из ADO.
правда от 13 2007
  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: По 8
Ответ #19 - 09. Октября 2008 :: 13:38
Печать  
Еще надо заметить, что работа из 1с77 с 1с81 через V81.ComConnector значительно быстрей, чем из 1с81 с 1с77 через V77.Application (за счет того, что ComConnector это InprocServer). Может стоит развернуть постановку задачи на 180 градусов?
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: По 8
Ответ #20 - 10. Октября 2008 :: 05:28
Печать  
Alex_Bob писал(а) 09. Октября 2008 :: 13:38:
Еще надо заметить, что работа из 1с77 с 1с81 через V81.ComConnector значительно быстрей, чем из 1с81 с 1с77 через V77.Application (за счет того, что ComConnector это InprocServer). Может стоит развернуть постановку задачи на 180 градусов?


Примерчик?
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: По 8
Ответ #21 - 10. Октября 2008 :: 05:38
Печать  
kiruha писал(а) 09. Октября 2008 :: 09:55:
Здесь Dmitro писал специальную компоненту
GameWithFire
для быстрой загрузки в ТЗ из ADO.
правда от 13 2007


А кто-нибудь ей пользовался? Может есть простенький пример получения справочника из 77? И как в ней с типизацией?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: По 8
Ответ #22 - 10. Октября 2008 :: 05:44
Печать  
Цитата:
kiruha писал(а) 09. Октября 2008 :: 09:55:
Здесь Dmitro писал специальную компоненту
GameWithFire
для быстрой загрузки в ТЗ из ADO.
правда от 13 2007


А кто-нибудь ей пользовался? Может есть простенький пример получения справочника из 77? И как в ней с типизацией?

Поищи на форуме itland или на этом форуме по названию ВК.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: По 8
Ответ #23 - 10. Октября 2008 :: 07:26
Печать  
artbear писал(а) 10. Октября 2008 :: 05:44:
Цитата:
kiruha писал(а) 09. Октября 2008 :: 09:55:
Здесь Dmitro писал специальную компоненту
GameWithFire
для быстрой загрузки в ТЗ из ADO.
правда от 13 2007


А кто-нибудь ей пользовался? Может есть простенький пример получения справочника из 77? И как в ней с типизацией?

Поищи на форуме itland или на этом форуме по названию ВК.


Поискал.
Принципиально новых ссылок нет Озадачен

Такое впечатление - что никому особо не нужны прямые запросы в 8.0 ....
Хотя криков о тормозах - навалом.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: По 8
Ответ #24 - 12. Октября 2008 :: 06:08
Печать  
Я решал такую задачу (регулярный перенос данных из 77 в 8).
Сделал так: из 8ки прямыми запросами к бд 77 через ADO.
Для быстрого и удобного получения результата прямого запроса использовал ранее написанную ради шутки GameWithFire, немного доработал ее, чтобы получать не только объект ТаблицаЗначений, а сразу объект РезультатЗапроса.

По поводу проблемы имен объектов базы 77.
Текст запроса собирается конкатенацией. Конфигурацию 8ки научил получать и хранить сведения о метаданных, именах объектов БД, идентификаторах.
Хранится все в виде вложенных объектов типа Структура. Текст запроса писать достаточно удобно.
Получение (или обновление) информации о метаданных 77 идет подключением к ИБ 77 по ОЛЕ и использованием 1с++ (MetaDataWork) для получения внутренних идентификаторов.

Вроде все просто.
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: По 8
Ответ #25 - 12. Октября 2008 :: 06:24
Печать  
Цитата:
Такое впечатление - что никому особо не нужны прямые запросы в 8.0 ....
Хотя криков о тормозах - навалом.

хм.. дык чо там, дурачки покричать горазды. А зачем ей прямые запросы, когда и сами штатные запросы в основном объеме функционала не отличаются от прямых, плюс дают нехилое преимущество в части:
1) представления результата в иерархическом виде (предложение ИТОГИ, объект ВыборкаИзРезультатаЗапроса), для удобной обработки результата;
2) работа с составными типами;
3) механизм дополнения результата на стороне клиента;
4) весьма грамотная поддержка кеширования представлений объектов-ссылок (функция языка запросов Представление());
5) удобная штука - ПостороительЗапроса, и еще более удобная КомпоновкаДанных;
6) поддержка трех разных серверов БД (в значителной части весь исходный код запросов универсален).

Вобщем готов обсуждать эту тему, есть еще желающие? =)
  
Наверх
ICQ  
IP записан
 
U_zer
Экс-Участник


По 8 2
Ответ #26 - 13. Октября 2008 :: 05:57
Печать  
DmitrO писал(а) 12. Октября 2008 :: 06:08:
Я решал такую задачу (регулярный перенос данных из 77 в 8).
Сделал так: из 8ки прямыми запросами к бд 77 через ADO.
Для быстрого и удобного получения результата прямого запроса использовал ранее написанную ради шутки GameWithFire, немного доработал ее, чтобы получать не только объект ТаблицаЗначений, а сразу объект РезультатЗапроса.

По поводу проблемы имен объектов базы 77.
Текст запроса собирается конкатенацией. Конфигурацию 8ки научил получать и хранить сведения о метаданных, именах объектов БД, идентификаторах.
Хранится все в виде вложенных объектов типа Структура. Текст запроса писать достаточно удобно.
Получение (или обновление) информации о метаданных 77 идет подключением к ИБ 77 по ОЛЕ и использованием 1с++ (MetaDataWork) для получения внутренних идентификаторов.

Вроде все просто.


А можно посмотреть пример реализации этого механизма (обработку), именно с использованием GameWithFire?
« Последняя редакция: 14. Октября 2008 :: 13:34 - fez »  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: По 8
Ответ #27 - 13. Октября 2008 :: 06:08
Печать  
Цитата:
А можно посмотреть пример реализации этого механизма (обработку), именно с использованием GameWithFire?

Код
Выбрать все
Процедура ЗагрузитьПродажи(Connection, Отказ)

	КомментироватьПроцесс("Загружаются продажи..");

	МДПродажи = МД.Регистр.Продажи;

	ТекстЗапроса = "
	|select
	|	Данные.Период,
	|	Данные.СтавкаНДС,
	|	Данные.КассовыйТерминал,
	|	Кассы.code as КассовыйТерминалКод,
	|	Кассы.descr as КассовыйТерминалНаименование,
	|	Данные.Выручка as СуммаПродажи,
	|	cast(Данные.Выручка *
	|		case Данные.СтавкаНДС
	|			 when '"+МД.Перечисление.СтавкиНДС._1000+"' then 10
	|			 when '"+МД.Перечисление.СтавкиНДС._1800+"' then 18
	|			 when '"+МД.Перечисление.СтавкиНДС._2000+"' then 20
	|			 else 0
	|		end /
	|		case Данные.СтавкаНДС
	|			 when '"+МД.Перечисление.СтавкиНДС._1000+"' then 110
	|			 when '"+МД.Перечисление.СтавкиНДС._1800+"' then 118
	|			 when '"+МД.Перечисление.СтавкиНДС._2000+"' then 120
	|			 else 1
	|		end
	|	 as numeric(15,2)) as НДС
	|from (
	|	select
	|		rg.period as Период,
	|		rg.sp"+МДПродажи.СтавкаНДС+" as СтавкаНДС,
	|		rg.sp"+МДПродажи.КассовыйТерминал+" as КассовыйТерминал,
	|		sum(rg.sp"+МДПродажи.Выручка+") as Выручка
	|	from rg"+МДПродажи.ИД+" rg (nolock)
	|	where period between '"+мДатаНач+"' and '"+мДатаКон+"'
	|	group by rg.period, rg.sp"+МДПродажи.СтавкаНДС+", rg.sp"+МДПродажи.КассовыйТерминал+"
	|	having sum(rg.sp"+МДПродажи.Выручка+") != 0
	|) as Данные
	|left join sc"+МД.Справочник.Кассы.ИД+" Кассы (nolock) on Кассы.id = Данные.КассовыйТерминал
	|order by Данные.Период, Данные.СтавкаНДС, Кассы.descr
	|
	|";

	//Сообщить(ТекстЗапроса);
	РЗ = мУтилиты.ADORecordsetВРезультатЗапроса(Connection.Execute(ТекстЗапроса), "
	|Сумма(СуммаПродажи),
	|Сумма(НДС)
	|по Период, СтавкаНДС");

	ВыбОбщие = РЗ.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока ВыбОбщие.Следующий() Цикл
		ВыбПериод = ВыбОбщие.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
		КоличествоИтераций(ВыбПериод.Количество());
		//вырезано
		Пока ВыбПериод.Следующий() Цикл
			//вырезано
			ВыбСтавка = ВыбПериод.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
			Пока ВыбСтавка.Следующий() Цикл
				//вырезано
				Выб = ВыбСтавка.Выбрать();
				Пока Выб.Следующий() Цикл
//и т.д.
 


переменная МД - реквизит обработки, Структура с метаданными 77
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: По 8
Ответ #28 - 14. Октября 2008 :: 07:48
Печать  
По просьбам трудящихся, процедура, которая формирует объект Структура, содержащая метаданные 77 для составления прямых запросов.

Код
Выбрать все
Функция ЗагрузитьМетаданные(КаталогИБ, ИмяПользователяV7, ПарольПользователяV7) Экспорт
	МД = Новый Структура;

	Состояние("Подключение к " + КаталогИБ);

	V7 = Новый COMОбъект("V77.Application");
	Если V7.Initialize(V7.RMTrade, "/d"""+КаталогИБ+""" /n"+ИмяПользователяV7+" /p"+ПарольПользователяV7, "NO_SPASH_SHOW") = 0 Тогда
		Сообщить("Нет доступа к информационной базе.");
		Возврат Ложь;
	КонецЕсли;

	MDW = V7.CreateObject("MetaDataWork");

	MD = V7.Метаданные;

	Состояние("Загрузка справочников..");
	Ст1 = Новый Структура;
	МД.Вставить("Справочник", Ст1);
	Для Номер1 = 1 По MD.Справочник() Цикл
		МДСправочник = MD.Справочник(Номер1);
		Ст2 = Новый Структура;
		Ст1.Вставить(МДСправочник.Идентификатор, Ст2);
		Ст2.Вставить("ИД", MDW.ИДОбъекта(МДСправочник));
		Для Номер2 = 1 По МДСправочник.Реквизит() Цикл
			МДРеквизит = МДСправочник.Реквизит(Номер2);
			Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
		КонецЦикла;
	КонецЦикла;

	Состояние("Загрузка перечислений..");
	Ст1 = Новый Структура;
	МД.Вставить("Перечисление", Ст1);
	Для Номер1 = 1 По MD.Перечисление() Цикл
		МДПеречисление = MD.Перечисление(Номер1);
		Ст2 = Новый Структура;
		Ст1.Вставить(МДПеречисление.Идентификатор, Ст2);
		Ст2.Вставить("ИД", MDW.ИДОбъекта(МДПеречисление));
		Для Номер2 = 1 По МДПеречисление.Значение() Цикл
			МДЗначение = МДПеречисление.Значение(Номер2);
			Ст2.Вставить(МДЗначение.Идентификатор, V7.EvalExpr("_idtostr("+MDW.ИДОбъекта(МДЗначение)+")")+"   ");
		КонецЦикла;
	КонецЦикла;

	Состояние("Загрузка документов..");
	Ст1 = Новый Структура;
	МД.Вставить("Документ", Ст1);
	Для Номер1 = 1 По MD.Документ() Цикл
		МДДокумент = MD.Документ(Номер1);
		Ст2 = Новый Структура;
		Ст1.Вставить(МДДокумент.Идентификатор, Ст2);
		Ст2.Вставить("ИД", MDW.ИДОбъекта(МДДокумент));
		Для Номер2 = 1 По МДДокумент.РеквизитШапки() Цикл
			МДРеквизит = МДДокумент.РеквизитШапки(Номер2);
			Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
		КонецЦикла;
		Для Номер2 = 1 По МДДокумент.РеквизитТабличнойЧасти() Цикл
			МДРеквизит = МДДокумент.РеквизитТабличнойЧасти(Номер2);
			Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
		КонецЦикла;
	КонецЦикла;

	Состояние("Загрузка регистров..");
	Ст1 = Новый Структура;
	МД.Вставить("Регистр", Ст1);
	Для Номер1 = 1 По MD.Регистр() Цикл
		МДРегистр = MD.Регистр(Номер1);
		Ст2 = Новый Структура;
		Ст1.Вставить(МДРегистр.Идентификатор, Ст2);
		Ст2.Вставить("ИД", MDW.ИДОбъекта(МДРегистр));
		Для Номер2 = 1 По МДРегистр.Измерение() Цикл
			МДИзмерение = МДРегистр.Измерение(Номер2);
			Ст2.Вставить(МДИзмерение.Идентификатор, MDW.ИДОбъекта(МДИзмерение));
		КонецЦикла;
		Для Номер2 = 1 По МДРегистр.Ресурс() Цикл
			МДРесурс = МДРегистр.Ресурс(Номер2);
			Ст2.Вставить(МДРесурс.Идентификатор, MDW.ИДОбъекта(МДРесурс));
		КонецЦикла;
		Для Номер2 = 1 По МДРегистр.Реквизит() Цикл
			МДРеквизит = МДРегистр.Реквизит(Номер2);
			Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
		КонецЦикла;
	КонецЦикла;

	Константы.МетаданныеУдаленнойИБ.Установить(Новый ХранилищеЗначения(МД));
	Возврат Истина;
КонецФункции
 



Формируется конечно не быстро, но Структура - объект сериализуемый, поэтому ее надо просто хранить в ХранилищеЗначения в базе 8ки, и восстанавливать перед каждым переносом данных, а не формировать заново. Обновлять ее можно периодически при изменении конфигурации, ито если изменения влияют на перенос данных.

Обратите внимание: все идентификаторы объектов в 10ой системе, а идентификаторы значений перечислений в 36ой.
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: По 8
Ответ #29 - 14. Октября 2008 :: 07:51
Печать  
и еще несколько полезных процедур, а то и это попросят Улыбка

Код
Выбрать все
Функция ПолучитьСтрокой(ЗначениеСтроки) Экспорт
	Если ПустаяСтрока(ЗначениеСтроки) Тогда
		Возврат "";
	ИначеЕсли ЗначениеСтроки = Null Тогда
		Возврат "";
	Иначе
		Возврат СокрП(ЗначениеСтроки);
	КонецЕсли;
КонецФункции

Функция ПолучитьДатой(ЗначениеДаты) Экспорт
	Если ЗначениеДаты = '17530101000000' Тогда
		Возврат '00010101000000';
	ИначеЕсли ЗначениеДаты = Null Тогда
		Возврат '00010101000000';
	Иначе
		Возврат ЗначениеДаты;
	КонецЕсли;
КонецФункции

Функция РасшифроватьДатуВремя(ДатаВремяИД) Экспорт
	ДатаВремя = Дата(Число(Лев(ДатаВремяИД, 4)), Число(Сред(ДатаВремяИД, 5, 2)), Число(Сред(ДатаВремяИД, 7, 2)));

	Вес = 1;
	Секунд=0;
	Для Ном = 0 по 5 Цикл
		Код = КодСимвола(ДатаВремяИД, 14 - Ном);
		Если Код = 32 Тогда
			Код = 0;
		ИначеЕсли Код < 65 Тогда
			Код = Код - 48;
		Иначе
			Код = Код - 55;
		КонецЕсли;
		Секунд = Секунд + Код * Вес;
		Вес = Вес * 36;
	КонецЦикла;
	ДатаВремя = ДатаВремя + Секунд / 10000;
	Возврат ДатаВремя;
КонецФункции
 

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