Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) По 8 (число прочтений - 14736 )
U_zer
Экс-Участник


По 8
07. Октября 2008 :: 09:46
Печать  
Всем привет!
Может подскажет кто, есть ли описалово+примеры по работе в 1С 8 через ОЛЕ?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: По 8
Ответ #1 - 07. Октября 2008 :: 11:32
Печать  
поиск
на http://itland.ru/ слова "V8.Application"
  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: По 8
Ответ #2 - 07. Октября 2008 :: 11:33
Печать  
А что нужно работа 1с8 как сервера автоматизации или обращение из 1с8 к другим программам?
  

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


Re: По 8
Ответ #3 - 07. Октября 2008 :: 14:05
Печать  
Alex_Bob писал(а) 07. Октября 2008 :: 11:33:
А что нужно работа 1с8 как сервера автоматизации или обращение из 1с8 к другим программам?


из 1с8 к другим программам
  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: По 8
Ответ #4 - 08. Октября 2008 :: 04:52
Печать  
Вот пример из книги Михайлова "1С:Предприятие 7.7/8.0 Системное программирование"
Код
Выбрать все
objIE = New ComObject("InternetExplorer.Application");
objIE.Visible = Ложь; //Отключаем видимость
objIE.Silent = Ложь;
objIE.Navigate(Адрес);
Сообщить("Идет загрузка страницы. Ждите...");
Пока objIE.readyState<4 Цикл // Ждем пока загрузится страница
КонецЦикла;
objDoc = objIE.Document;
Для Каждого a Из objDoc.all.Tags("A") Цикл //Перебираем все ссылки  
    Сообщить(a.href);
КонецЦикла;
objIE.Quit(); //Закрываем приложение
objIE = Неопределено;
 

  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: По 8
Ответ #5 - 08. Октября 2008 :: 04:57
Печать  
Alex_Bob писал(а) 08. Октября 2008 :: 04:52:
Код
Выбрать все
...
Сообщить("Идет загрузка страницы. Ждите...");
Пока objIE.readyState<4 Цикл // Ждем пока загрузится страница
КонецЦикла;
 




ОФФ: интересно а вот 1С-овцы специально потенциально бесконечные циклы используют, меня учили в таких случаях дополнительно "отваливаться по таймауту"
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: По 8
Ответ #6 - 08. Октября 2008 :: 05:01
Печать  
Alex_Bob писал(а) 07. Октября 2008 :: 11:33:
А что нужно работа 1с8 как сервера автоматизации или обращение из 1с8 к другим программам?


я всё таки обращу внимание на web-службы - пример взаимодействия чистой воды Улыбка


  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
U_zer
Экс-Участник


Re: По 8
Ответ #7 - 08. Октября 2008 :: 06:41
Печать  
lustin писал(а) 08. Октября 2008 :: 05:01:
Alex_Bob писал(а) 07. Октября 2008 :: 11:33:
А что нужно работа 1с8 как сервера автоматизации или обращение из 1с8 к другим программам?


я всё таки обращу внимание на web-службы - пример взаимодействия чистой воды Улыбка




Так, стоп!  Улыбка Меня на данный момент интересуют примеры (простые) реализации OLE доступа из 8 к 77. Поиск по предложенной ссылке мало что дал. Мне нужно нечто типа фака, как сделать подключение, как то-се ... Кстати, а есть возможность заюзать 1С++ из OLE?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: По 8
Ответ #8 - 08. Октября 2008 :: 08:22
Печать  
Цитата:
lustin писал(а) 08. Октября 2008 :: 05:01:
Alex_Bob писал(а) 07. Октября 2008 :: 11:33:
А что нужно работа 1с8 как сервера автоматизации или обращение из 1с8 к другим программам?


я всё таки обращу внимание на web-службы - пример взаимодействия чистой воды Улыбка




Так, стоп!  Улыбка Меня на данный момент интересуют примеры (простые) реализации OLE доступа из 8 к 77. Поиск по предложенной ссылке мало что дал. Мне нужно нечто типа фака, как сделать подключение, как то-се ... Кстати, а есть возможность заюзать 1С++ из OLE?

Пример
Код
Выбрать все
 V77 = Новый COMОбъект("V77M.Application");

	Если  V77.Initialize(V77.RMTrade,"ИсточникСтр","") Тогда
	       Сообщить("Успех");
		   ЗаполнитьОснованиеРеализации(V77);

	Иначе  Предупреждение("Ошибка открытия информационной базы");
           Возврат;

	КонецЕсли;
 

Код
Выбрать все
Процедура ЗаполнитьОснованиеРеализации(V77)
	 Накл= V77.EvalExpr("CreateObject(""Документ.РасходнаяНакладная"")");
	 ДокОсн= V77.EvalExpr("CreateObject(""Документ"")");

	 Накл.ВыбратьДокументы();
	 Пока Накл.ПолучитьДокумент()=1 Цикл
		 Номер=СокрЛП(Накл.НомерДок);
		  ДокСоотв=Документы.РеализацияТоваров.НайтиПоНомеру(СокрЛП(Номер), Накл.ДатаДок);  
		   Если Накл.Проведен()=0 Тогда
		     Продолжить;

		 КонецЕсли;
        Если ДокСоотв=Документы.РеализацияТоваров.ПустаяСсылка() Тогда  
	         Сообщить("! для "+Накл.Вид()+" "+Накл.НомерДок+" не найдено соответстствие");
             Продолжить;

		 КонецЕсли;
		Если Накл.ДокументОснование.Выбран()=0 Тогда
			Продолжить;
		КонецЕсли;
// и т.д.
 



Самое быстрое через ADO, например к ДБФ
Код
Выбрать все
ADO= Новый COMОбъект( "ADODB.Connection" );
ADO.Open("
    |Provider=VFPOLEDB.1;
    |Deleted=Yes;
    |Null = Yes;
    |Exclusive = No;
    |SourceType = DBF;
    |Data Source=" + КаталогИБСтрокой + ";
    |Mode=ReadWrite;
    |Extended Properties="""";
    |User ID="""";
    |Password="""";
    |Mask Password=False;
    |Collating Sequence=MACHINE;
    |DSN="""""); 


и далее как Fez описывал.
Запрос можно подготовить с помощью 1С++
(Писать с использованием $, далее через Отладка(1) получить реальные имена таблиц и этот запрос использовать в ADO)
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: По 8
Ответ #9 - 08. Октября 2008 :: 08:28
Печать  
О! Спасибо! Буду изучать ...
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: По 8
Ответ #10 - 08. Октября 2008 :: 09:24
Печать  
Я в шоке!

Код
Выбрать все
	V7 = Новый ComОбъект("V77s.Application");
    Открыта = V7.Initialize(V7.RMTrade,"/d\\d2enkor\Work_2008","NO_SPLASH_SHOW");
	Если Открыта Тогда
		Запрос = V7.CreateObject("OdbcRecordSet");
		ТЗ = "
		|select СпрТ.id [Элем $Справочник.Города]
		|from $Справочник.Города СпрТ (nolock)
		|where СпрТ.isMark = 0";
		ТЗн = Запрос.ВыполнитьИнструкцию(ТЗ);
		ТЗн.ВыбратьСтроки();
		Пока ТЗн.ПолучитьСтроку()= 1 Цикл
			Сообщить(ТЗн.Элем.Наименование+" "+Формат(Тзн.Элем.Код, "Ч(0)9.0"))
		КонецЦикла
	КонецЕсли;

 



Работает!!!!!!
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: По 8
Ответ #11 - 08. Октября 2008 :: 09:33
Печать  
kiruha писал(а) 08. Октября 2008 :: 08:22:
Самое быстрое через ADO, например к ДБФ

А смысл? можно и через ОЛЕ 1С++ юзать Улыбка
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: По 8
Ответ #12 - 08. Октября 2008 :: 09:35
Печать  
Цитата:
Я в шоке!

Код
Выбрать все
	V7 = Новый ComОбъект("V77s.Application");
    Открыта = V7.Initialize(V7.RMTrade,"/d\\d2enkor\Work_2008","NO_SPLASH_SHOW");
	Если Открыта Тогда
		Запрос = V7.CreateObject("OdbcRecordSet");
		ТЗ = "
		|select СпрТ.id [Элем $Справочник.Города]
		|from $Справочник.Города СпрТ (nolock)
		|where СпрТ.isMark = 0";
		ТЗн = Запрос.ВыполнитьИнструкцию(ТЗ);
		ТЗн.ВыбратьСтроки();
		Пока ТЗн.ПолучитьСтроку()= 1 Цикл
			Сообщить(ТЗн.Элем.Наименование+" "+Формат(Тзн.Элем.Код, "Ч(0)9.0"))
		КонецЦикла
	КонецЕсли;

 



Работает!!!!!!

Вот я про это и написал Улыбка
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: По 8
Ответ #13 - 08. Октября 2008 :: 09:45
Печать  
artbear писал(а) 08. Октября 2008 :: 09:33:
kiruha писал(а) 08. Октября 2008 :: 08:22:
Самое быстрое через ADO, например к ДБФ

А смысл? можно и через ОЛЕ 1С++ юзать Улыбка


Круто !

P.S.
А ТЗ то все равно не передашь нормально Печаль (в смысле только с построчным обходом)
Разве что через временную таблицу
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: По 8
Ответ #14 - 08. Октября 2008 :: 10:25
Печать  
kiruha писал(а) 08. Октября 2008 :: 09:45:
artbear писал(а) 08. Октября 2008 :: 09:33:
kiruha писал(а) 08. Октября 2008 :: 08:22:
Самое быстрое через ADO, например к ДБФ

А смысл? можно и через ОЛЕ 1С++ юзать Улыбка


Круто !

P.S.
А ТЗ то все равно не передашь нормально Печаль (в смысле только с построчным обходом)
Разве что через временную таблицу


Код
Выбрать все
		Запрос = V7.CreateObject("OdbcRecordSet");
		VT = V7.CreateObject("Addin.ValTable");
ТЗ = "
		|select СпрТ.id [Элем $Справочник.Города]
		|from $Справочник.Города СпрТ (nolock)
		|where СпрТ.isMark = 0";
				 VT.Загрузить(Запрос.ВыполнитьИнструкцию(ТЗ));
			Тзн = VT.ПолучитьИтоги("Элем","");		Тзн.ВыбратьСтроки();
		Пока Тзн.ПолучитьСтроку()= 1 Цикл
			Сообщить(Тзн.Элем.Наименование+" "+Формат(Число(Тзн.Элем.Код), "ЧЦ=9;ЦДЦ=0;ЧН=0;"))
		КонецЦикла
 



И группируй как хочешь, думаю, что и ИТЗ сработает.
Только что-то Формат(Число(Тзн.Элем.Код), "ЧЦ=9;ЦДЦ=0;ЧН=0;"))
не пашет, мне надо чтобы было "00000000234", а выводит "234".
  
Наверх
 
IP записан
 
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 &amp;&amp; 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 &amp;&amp; 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 записан
 
RomDron
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 28. Октября 2008
Re: По 8
Ответ #30 - 28. Октября 2008 :: 12:41
Печать  
DmitrO: Идея отличная. Я уже долгое время ищу способ создания "файловой помойки", т.е консолидации основных данных из баз 7.7 в базе 8.1. Перепробовал кучу способов.. Улыбка 

А только с помощью 1с++ нельзя получить данные? почему-то библиотека в восьмерке не грузится. Печаль
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: По 8
Ответ #31 - 28. Октября 2008 :: 15:10
Печать  
Там же написано, не через ЗагрузитьВнешнююКомпоненту, а через ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");
  
Наверх
 
IP записан
 
RomDron
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 28. Октября 2008
Re: По 8
Ответ #32 - 29. Октября 2008 :: 14:18
Печать  
Цитата:
Там же написано, не через ЗагрузитьВнешнююКомпоненту, а через ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");

Я про 1с++ библиотеку, а не про GameWithFire  Подмигивание
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: По 8
Ответ #33 - 29. Октября 2008 :: 14:33
Печать  
А она под 8 не работает. Попробуй через OLE.
  
Наверх
 
IP записан
 
RomDron
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 28. Октября 2008
Re: По 8
Ответ #34 - 29. Октября 2008 :: 15:36
Печать  
Может кто поможет написать прямой запрос для получения плана счетов (код счета и наименование его видов субконто). Не могу таблицу видов субконто найти... Озадачен
  
Наверх
 
IP записан
 
RomDron
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 28. Октября 2008
Re: По 8
Ответ #35 - 29. Октября 2008 :: 15:36
Печать  
Цитата:
А она под 8 не работает. Попробуй через OLE.

Да, я уже понял.. Жаль.
  
Наверх
 
IP записан
 
RomDron
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 28. Октября 2008
Re: По 8
Ответ #36 - 30. Октября 2008 :: 06:19
Печать  
RomDron писал(а) 29. Октября 2008 :: 15:36:
Может кто поможет написать прямой запрос для получения плана счетов (код счета и наименование его видов субконто). Не могу таблицу видов субконто найти... Озадачен


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