Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Запрос по ТЗ (число прочтений - 6213 )
Kurya
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Зарегистрирован: 24. Мая 2006
Запрос по ТЗ
31. Мая 2006 :: 09:51
Печать  
Есть большая ТаблицаЗначений (порядка 200 000 записей), в ней есть колонка "Документ" в которой сидят различные документы (количество видов документов заранее не известно). Необходимо пробежаться по ТЗ и повытаскивать некоторые реквизиты этих документов (Напр. "Контрагент"). Средствами 1С такая операция выполнима, но занимает порядка 30 мин.
Можно ли ускорить процесс применив что либо из 1С++?
Пробовал через ИндексированнуюТаблицу (Объединить, ЗаполнитьКолонку), но результат не совсем тот что нужен. Объединить например просто добавляет в ТЗ строки, ЗаполнитьКолонку проставляет полученные реквизиты только в строки с первым вхождением индекса...
Может ув. гуру подскажут еще что нибудь?
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по ТЗ
Ответ #1 - 31. Мая 2006 :: 10:19
Печать  
1) Как ты хоть получил эту ТаблицуЗначений?
2) И почему нельзя заполнить нужные реквизиты на этапе получения этой таблицы?
  
Наверх
 
IP записан
 
Kurya
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Зарегистрирован: 24. Мая 2006
Re: Запрос по ТЗ
Ответ #2 - 31. Мая 2006 :: 10:29
Печать  
Получил с помощью класса AccntQuery (запрос к бух итогам), на этапе получения теоретически можно получить реквизиты (джоинить таблицы) но в случае когда заранее не известно какие документы попадут в выборку - это представляется проблематичным. Для меня во всяком случае (в СКЛ я баран)...
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по ТЗ
Ответ #3 - 31. Мая 2006 :: 10:48
Печать  
И все таки лучше доработать результирующую таблицу на серваке, добавив в нее нужные реквизиты из разных документов, причем можно и не извращаться с одним громоздким запросом:

1) Выполняешь запрос и результаты его оставляешь на серваке во временной таблице #temp (не надо тащить его на клиента)
2) Выполняешь N-запросов (N- видов нужных тебе документов) с целью дополнения этой таблицы нужными тебе реквизитами (конструкция типа:
Код
Выбрать все
UPDATE T.Реквизит = $Док.РеквизитДока FROM #temp AS T
INNER JOIN $Документ.НужныйДокумент AS Док ON (T.IDDOC = Док.IDDOC) 

)
3) Тащишь на клиента готовую таблицу
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по ТЗ
Ответ #4 - 31. Мая 2006 :: 11:47
Печать  
Kurya писал(а) 31. Мая 2006 :: 09:51:
ЗаполнитьКолонку проставляет полученные реквизиты только в строки с первым вхождением индекса...

Ты точно этот пункт проверял?
Вроде специально делали, чтобы заполнение работало по всему индексу.
Возможно, у тебя индекс построен как уникальный?
  

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


I Love YaBB 2!

Сообщений: 28
Зарегистрирован: 24. Мая 2006
Re: Запрос по ТЗ
Ответ #5 - 31. Мая 2006 :: 12:34
Печать  
2 artbear Может я что то не так делал...
Рассказываю:
Есть большая ТЗ 200 000 строк (Поля: Товар, Документ, Количество, Сумма, Контрагент)
Поле Контрагент пустое.
Выгружаю ТЗ в ИндексировануюТаблицу (Инд1)
Выгружаю ТЗ в тз2.
тз2 Сворачиваю по полю Документ. (в тз2 получается 5000 строк)
Пробегаю по тз2 и заполняю "Контрагент"
тз2 выгружаю в Инд2
Назначаю индекс для Инд1 (ДобавитьИндекс("Доки", "Документ")
Назначаю индекс для Инд2 (ДобавитьИндекс("Доки", "Документ")
Дальше:
Инд1.ЗаполнитьКолонку("Доки", "Документ", Инд2, "Доки", "Документ")

Может где то неправильно?
ЗЫ: Если бы примерчики использования ИТ были...


  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по ТЗ
Ответ #6 - 31. Мая 2006 :: 12:46
Печать  
я ускоряю это не перебором, думаю что у тебя именно перебор, а соданием "ключевых колонок" или по другому "составных колонок", или "колонок с составным ключем", думаю понятно шо я имею ввиду, и тогда поиск по колонке объектов неопределенного вида, как бы становится определенным...
а если еще и отсортировать по этому составному ключу, можешь мне поверить, ты ускоришь свою операцию с 30 мин. до 2-3, по крайней мере на 2 000 000 - 2 500 000  записей у меня так долго не работает нечто подобное...

наверное тем самым я как бы создаю аналог индексированой таблицы...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по ТЗ
Ответ #7 - 31. Мая 2006 :: 12:49
Печать  
Вот тебе пример из юнит-тестов объекта "ИндексированнаяТаблица" (именно подобные простые юнит-тесты мы используем при разработке)
Код
Выбрать все
Процедура тестЗаполнитьКолонкуИндТЗ() Экспорт
	Сам = Сам();

	ТЗ = СоздатьОбъект("ИндексированнаяТаблица");
	ТЗ.НоваяКолонка("к1");
	ТЗ.НоваяКолонка("к2");
	ТЗ.НоваяКолонка("к3");

	_ТЗ = СоздатьОбъект("ИндексированнаяТаблица");
	_ТЗ.НоваяКолонка("к1");
	_ТЗ.НоваяКолонка("к2");
	_ТЗ.НоваяКолонка("к3");

	Для н = 1 По 6 Цикл
		ТЗ.НоваяСтрока();
		ТЗ.к1 = н;
		ТЗ.к2 = 0;
		ТЗ.к3 = 0;

		_ТЗ.НоваяСтрока();
		_ТЗ.к1 = н;
		_ТЗ.к2 = н*2;
		_ТЗ.к3 = н*4;
	КонецЦикла;

	ТЗ.ДобавитьИндекс("и1", "к1");
	ТЗ.УстановитьФильтр(2, 4, "и1");

	_ТЗ.ДобавитьИндекс("и1", "к1");
	_ТЗ.УстановитьФильтр(3, 6, "и1");

	ТЗ.ЗаполнитьКолонку("и1", "к2", _ТЗ, "и1", "к2");
	Сам.ПроверитьРавенство(ТЗ.Получить(1, "к2"), 0);
	Сам.ПроверитьРавенство(ТЗ.Получить(2, "к2"), 6);
	Сам.ПроверитьРавенство(ТЗ.Получить(3, "к2"), 8);
	Сам.ПроверитьРавенство(ТЗ.Получить(4, "к2"), 10);
	Сам.ПроверитьРавенство(ТЗ.Получить(5, "к2"), 0);
	Сам.ПроверитьРавенство(ТЗ.Получить(6, "к2"), 0);

	ТЗ.ЗаполнитьКолонку("и1", "к2", _ТЗ, "и1", "к3");
	Сам.ПроверитьРавенство(ТЗ.Получить(1, "к2"), 0);
	Сам.ПроверитьРавенство(ТЗ.Получить(2, "к2"), 12);
	Сам.ПроверитьРавенство(ТЗ.Получить(3, "к2"), 16);
	Сам.ПроверитьРавенство(ТЗ.Получить(4, "к2"), 20);
	Сам.ПроверитьРавенство(ТЗ.Получить(5, "к2"), 0);
	Сам.ПроверитьРавенство(ТЗ.Получить(6, "к2"), 0);

	ТЗ.ЗаполнитьКолонку("и1", "к3", _ТЗ, "и1");
	Сам.ПроверитьРавенство(ТЗ.Получить(1, "к3"), 0);
	Сам.ПроверитьРавенство(ТЗ.Получить(2, "к3"), 12);
	Сам.ПроверитьРавенство(ТЗ.Получить(3, "к3"), 16);
	Сам.ПроверитьРавенство(ТЗ.Получить(4, "к3"), 20);
	Сам.ПроверитьРавенство(ТЗ.Получить(5, "к3"), 0);
	Сам.ПроверитьРавенство(ТЗ.Получить(6, "к3"), 0);
КонецПроцедуры
 


ЗЫ Сам.ПроверитьРавенство выдает исключение, если выражения не равны, т.е. если код доходит до конца процедуры, значит, все верно.
  

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


I Love YaBB 2!

Сообщений: 28
Зарегистрирован: 24. Мая 2006
Re: Запрос по ТЗ
Ответ #8 - 31. Мая 2006 :: 12:57
Печать  
2 Славко.
Мне не поиск нужен. Мне нужно в каждую из 200 000 строк добавить значение реквизита. Так что составной ключ тут нипричем.
2 artbear
Спасибо, щас поразбираюсь...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по ТЗ
Ответ #9 - 31. Мая 2006 :: 12:58
Печать  
Kurya писал(а) 31. Мая 2006 :: 12:34:
Есть большая ТЗ 200 000 строк (Поля: Товар, Документ, Количество, Сумма, Контрагент)
Поле Контрагент пустое.
Выгружаю ТЗ в ИндексировануюТаблицу (Инд1)
Выгружаю ТЗ в тз2.
тз2 Сворачиваю по полю Документ. (в тз2 получается 5000 строк)
Пробегаю по тз2 и заполняю "Контрагент"
тз2 выгружаю в Инд2
Назначаю индекс для Инд1 (ДобавитьИндекс("Доки", "Документ")
Назначаю индекс для Инд2 (ДобавитьИндекс("Доки", "Документ")
Дальше:
Инд1.ЗаполнитьКолонку("Доки", "Документ", Инд2, "Доки", "Документ")


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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по ТЗ
Ответ #10 - 31. Мая 2006 :: 13:08
Печать  
Kurya писал(а) 31. Мая 2006 :: 12:57:
2 Славко.
Мне не поиск нужен. Мне нужно в каждую из 200 000 строк добавить значение реквизита. Так что составной ключ тут нипричем.
2 artbear
Спасибо, щас поразбираюсь...

на колчичестве 2 000 000 - 2 500 000 и более я добавляю по 3-4 реквизита и вся оперция занимает не более 2-х минут, ВК для этого не используются
Внимание вопрос: что я делаю не так?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
sd
1c++ power user
Отсутствует



Сообщений: 30
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по ТЗ
Ответ #11 - 31. Мая 2006 :: 16:26
Печать  
Kurya писал(а) 31. Мая 2006 :: 12:57:
Мне не поиск нужен. Мне нужно в каждую из 200 000 строк добавить значение реквизита. Так что составной ключ тут нипричем.


Присоединяюсь к DrACe и предлагаю потратить время (пусть даже немалое) на изучение T-SQL и составление соответствующего запроса. Затраченное время потом с лихвой окупится Улыбка

PS - чуть не забыл - AccntQuery 2.3 может выгружать итоги сразу в индексированную таблицу. Для этого созданный объект IndexedTable нужно передать вместо параметра "ТЗ" в методы ВыгрузитьИтоги() и ВыполнитьИнструкцию().
  
Наверх
ICQ  
IP записан
 
Kurya
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Зарегистрирован: 24. Мая 2006
Re: Запрос по ТЗ
Ответ #12 - 01. Июня 2006 :: 06:14
Печать  
sd писал(а) 31. Мая 2006 :: 16:26:
AccntQuery 2.3 может выгружать итоги сразу в индексированную таблицу. Для этого созданный объект IndexedTable нужно передать вместо параметра "ТЗ" в методы ВыгрузитьИтоги() и ВыполнитьИнструкцию().


Вот за это огромный сенькс!
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать