Переключение на Главную Страницу Страницы: 1 2 [3] 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Ускорение работы документа с большой ТЗ при помощи 1С++ (число прочтений - 11232 )
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #30 - 20. Августа 2010 :: 08:00
Печать  
Х.з. у меня такое работает (делал через хранимую процедуру на сервере):
Цитата:
     ТекстЗапроса = "select top 1 Date_F,Tovar,Post,iddoc_F,Cena,ProcPlus,ProcMinus,Active into #tmpCenaDogovor
     | from CenaDogovor where 0=1";
     глРС_Аддон.ВыполнитьСкалярный(ТекстЗапроса);
     ТекстЗапроса = "insert into #tmpCenaDogovor(Date_F,Tovar,Post,iddoc_F,Cena,ProcPlus,ProcMinus,Active) Values(?,?,?,?,?,?,?,?)";
     глРС_Аддон.Подготовить(ТекстЗапроса);
     //глРС_Аддон.ПостроитьПараметры();
     глРС_Аддон.ДобПараметр(1,10,10,0);
     глРС_Аддон.ДобПараметр(1,14,9,0);
     глРС_Аддон.ДобПараметр(1,14,9,0);
     глРС_Аддон.ДобПараметр(1,14,13,0);
     глРС_Аддон.ДобПараметр(1,11,12,3);
     глРС_Аддон.ДобПараметр(1,11,5,2);
     глРС_Аддон.ДобПараметр(1,11,5,2);
     глРС_Аддон.ДобПараметр(1,3,2,0);
     ПромДок.ВыбратьСтроки();
     глРС_Аддон.УстПараметр(1,дСКЛ);
     глРС_Аддон.УстПараметр(3,ПромДок.ОсновнойПоставщик);
     глРС_Аддон.УстПараметр(4,времДок);
     глРС_Аддон.УстПараметр(8,вДок);
     Пока ПромДок.ПолучитьСтроку() = 1 Цикл
           глРС_Аддон.УстПараметр(2,ПромДок.Товар);
           глРС_Аддон.УстПараметр(5,ПромДок.Цена);
           глРС_Аддон.УстПараметр(6,ПромДок.ПроцентОтклоненияПлюс);
           глРС_Аддон.УстПараметр(7,ПромДок.ПроцентОтклоненияМинус);
           глРС_Аддон.ВыполнитьСкалярный();
     КонецЦикла;
     // В хранимке идут поля "Дата, Документ, Поставщик"
     глРС_Аддон.УстановитьТекстовыйПараметр("ПромДата",дСКЛ);
     глРС_Аддон.УстановитьТекстовыйПараметр("времДок",времДок);
     );
     ТекстЗапроса = "exec CD_Update :ПромДата,:времДок~,:ПромПоставщик";
     глРС_Аддон.ВыполнитьСкалярный(ТекстЗапроса);

UPD: делал в цикле, так как были некоторые мои косяки при использовании "ВыполнитьSQLИзТЗ", а посмотреть на результат его работы через Отладка(1) - нельзя. А как заработало, то я и не стал трогать.
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #31 - 20. Августа 2010 :: 12:30
Печать  
Заработало таким способом:
Код
Выбрать все
	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	мКонтекст.ВыгрузитьТабличнуюЧасть(ТЗ);

	Мета = СоздатьОбъект("MetaDataWork");
	рс = СоздатьОбъект("ODBCRecordset");
	лТекущийДокумент = мКонтекст.ТекущийДокумент();

	Сообщить("Удаляем строки");
	рс.УстановитьТекстовыйПараметр("Док", лТекущийДокумент);
	рс.Выполнить("DELETE * FROM dt1741_x WHERE iddoc = :Док");
	Сообщить("лРез = " + лРез + " Ошибка: " + рс.ПолучитьОписаниеОшибки());

	лТекстЗапроса = "insert into dt1741_x (
			|iddoc,
			|LINENO_,
			|$ДокументСтроки.Загрузка.Клиент,
|$ДокументСтроки.ЗагрузкаИзСоцЗащиты.Строка1)
			|values (?, ?, ?, ?)";
	лТекстЗапроса = Мета.ОбрМетаСКЛ(лТекстЗапроса);
	рс.Подготовить(лТекстЗапроса);
 	рс.ДобПараметр(1,14,9,0);
 	рс.ДобПараметр(1,3,0,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,14,200,0);
	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСтроку() = 1 Цикл
		рс.УстПараметр(1, лТекущийДокумент);
		рс.УстПараметр(2, ТЗ.НомерСтроки);
		рс.УстПараметр(3, ТЗ.Клиент);
		рс.УстПараметр(4, ТЗ.Строка1);
		рс.ВыполнитьСкалярный();
	КонецЦикла;
 



Теперь проблема: как быть если пользователь просто нажимает кнопку "Записать".
Мой код срабатывает в процедуре "ПриЗаписи" и удялает строки. В результате пользователь видит пустую ТЧ. А если строки в ТЧ не удалять, то 1С начинает сама записывать ТЧ и опять все надолго "замолкает"
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #32 - 20. Августа 2010 :: 13:53
Печать  
Выставляй в "ПриЗаписи()" СтатусВозврата(0) и не надо будет удалять строки из ТЧ
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #33 - 23. Августа 2010 :: 11:00
Печать  
А что если не создавать новую таблицу, а использовать таблицу многострочной части документа? И самому напрямую в нее писать и читать? Все данные хранить в ТЗ, для ее редактирования использовать ТабличноеПоле.

Я сейчас так сделал, вроде работает. Какие могут быть в дальнейшем грабли?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #34 - 23. Августа 2010 :: 11:12
Печать  
es3000 писал(а) 23. Августа 2010 :: 11:00:
А что если не создавать новую таблицу, а использовать таблицу многострочной части документа? И самому напрямую в нее писать и читать? Все данные хранить в ТЗ, для ее редактирования использовать ТабличноеПоле.

Я сейчас так сделал, вроде работает. Какие могут быть в дальнейшем грабли?

Если табличную часть хранишь в ТЗ то не сможешь по табличной части делать sql отчеты. Также так как ты писал что у тебя огромные таблицы и количество строк и сами реквизиты то ТЗ скорее всего в какой то момент свалится  по ошибке.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #35 - 23. Августа 2010 :: 11:21
Печать  
Z1 писал(а) 23. Августа 2010 :: 11:12:
es3000 писал(а) 23. Августа 2010 :: 11:00:
А что если не создавать новую таблицу, а использовать таблицу многострочной части документа? И самому напрямую в нее писать и читать? Все данные хранить в ТЗ, для ее редактирования использовать ТабличноеПоле.

Я сейчас так сделал, вроде работает. Какие могут быть в дальнейшем грабли?

Если табличную часть хранишь в ТЗ то не сможешь по табличной части делать sql отчеты. Также так как ты писал что у тебя огромные таблицы и количество строк и сами реквизиты то ТЗ скорее всего в какой то момент свалится  по ошибке.


1) с отсутствием отчетов пока можно смириться
2) свалится из-за чего? из-за недостатка оперативки?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #36 - 23. Августа 2010 :: 11:23
Печать  
Еще вопрос:
Существует ли поставщик данных для табличной части?  Не ODBC-поставщик а именно поставщик ТЧ?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #37 - 23. Августа 2010 :: 11:23
Печать  
es3000 писал(а) 23. Августа 2010 :: 11:21:
Z1 писал(а) 23. Августа 2010 :: 11:12:
es3000 писал(а) 23. Августа 2010 :: 11:00:
А что если не создавать новую таблицу, а использовать таблицу многострочной части документа? И самому напрямую в нее писать и читать? Все данные хранить в ТЗ, для ее редактирования использовать ТабличноеПоле.

Я сейчас так сделал, вроде работает. Какие могут быть в дальнейшем грабли?

Если табличную часть хранишь в ТЗ то не сможешь по табличной части делать sql отчеты. Также так как ты писал что у тебя огромные таблицы и количество строк и сами реквизиты то ТЗ скорее всего в какой то момент свалится  по ошибке.


1) с отсутствием отчетов пока можно смириться
2) свалится из-за чего? из-за недостатка оперативки?


2 (это мое ИХМО) нет из-за того что никто не отлаживал(имеется ввиду фирму 1с) работы с огромными таблицами и скорее всего в самый неподходящий момент это и произойдет.

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #38 - 23. Августа 2010 :: 11:55
Печать  
ну пока ошибок никаких нету,
а как все-таки насчет поставщика данных многострочной части?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #39 - 23. Августа 2010 :: 11:57
Печать  
ошибку нашел!

Когда документ не записан и я его сохраняю первый раз, то iddoc для новых строк записывается равным нулю! И при следующем открытии (уже записанного документа у которого есть конкретный iddoc) записи не читаются из базы.

Как это можно обойти?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #40 - 23. Августа 2010 :: 12:11
Печать  
es3000 писал(а) 23. Августа 2010 :: 11:57:
ошибку нашел!

Когда документ не записан и я его сохраняю первый раз, то iddoc для новых строк записывается равным нулю! И при следующем открытии (уже записанного документа у которого есть конкретный iddoc) записи не читаются из базы.

Как это можно обойти?


Пока  НовыйДокумент то не давай добавлятьстроку в табличную часть.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #41 - 23. Августа 2010 :: 12:27
Печать  
Z1 писал(а) 23. Августа 2010 :: 12:11:
Пока  НовыйДокумент то не давай добавлятьстроку в табличную часть.


спасибо
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #42 - 23. Августа 2010 :: 12:31
Печать  
Остается вопрос про использование "родной" таблицы многострочной части документа? Если самому напрямую в нее писать и читать, данные хранить в ТЗ, и для работы с этой ТЗ использовать табличное поле.

Будет ли 1С-ка кроме моих ручных действий по записи и чтению моей ТЗ, записывать и читать свою родную табличную часть? Если да, то тогда выигрыша по времени у меня не будет.
А если на диалоге табличной части не будет, так может 1С-ка и не будет ее читать\писать? Никто не пробовал так делать?
  
Наверх
ICQ  
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #43 - 23. Августа 2010 :: 13:18
Печать  
нет на форме ТЧ то и читат ее 1с не будет, выводить то некуда...

писать ТЧ будешь сам, читать тоже сам
  
Наверх
wwwICQ  
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #44 - 23. Августа 2010 :: 14:35
Печать  
(0) А почему не делаете вместо одного документа с кол-вом строк в тч 25000 например 50 доков с 500 строками ?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 
ОтправитьПечать