Как из многострочной части выгрузить в ТЗ только определённые строки? #89795


#0 by Inkognito
В многострочной части есть 200-300 строк. Мне нужно в ТЗ выгрузить только те строки, один из Реквизитов которых равен заданному. Например, в реквизитах многострочной части есть реквизит Номенклатура. Так вот из этих 200-300 строк мн.стр.части нужно в отдельную ТЗ выгрузить только строки, где Номенклатура = Хлеб, а с колбасой и водкой не выгружать. Единственное, что пришло на ум - это ВыбратьСтроки и потом условием проверять Хлеб это или нет. Если Хлеб, то ТЗ.НоваяСтрока... Но беда в том, что это нужно делать раз 300-400. Нерационально... Может можно, например, сделать Запрос из многострочной части, где указать Условие?
#1 by Джинн
Запросом не получится. Можно выгрузить все, затем отфильтровать ТЗ по реквизиту. Будет ли разница в скорости - не знаю.
#2 by DoPing
попробуй отсортировать ТЗ, а уже потом выбирай из нее свой Хлеб
#3 by Inkognito
А чем можно отфильтровать ТЗ? Всёравно перебором всех строк? А что мне даст сортировка? Если, допустим, весь Хлеб получится в конечной части таблицы, то всёравно прийдётся перебирать всю таблицу?++++Жаль, что Запросом не получится :(
#4 by Кортес
Когда я хочу сделать скульптуру, я беру глыбу и отсекаю ненужное. ©
#5 by Vacony
1 - а почему запросом не выйдет ? если это не в контексте этого документа незаписанного, то в запросе группировка НомерСТроки , условие и выгрузить в ТЗ..
#6 by Inkognito
Запрос должен работать в МодулеФормы этого же документа, откуда происходит выборка. Документ будет записан всегда.
#7 by Vacony
6 - ну если так, то в запрос доп. условие по выборке документа и вперед
#8 by mvk
Если ищешь точное значение, то не надо перебирать таблицу.Надо отсортировать и использовать метод НайтиЗначение.
#9 by p rj
Что-то вроде (с точность до синт. ошибок)ТЗТабЧасть.Сортировать("Номенклатура+");Но не знаю, будет ли это быстрее, чем перебором. Если можно сочетать сортировку по внутр. представлению с направлением (просто не пробовал так: ТЗ.Сортировать("Номенклатура*+") или ТЗ.Сортировать("Номенклатура*-")) - тогда точно будет быстрее.
#10 by Z1
Запросом нормально получиться получитьсяВариант 1ТекДок = ТвойДокументТекстЗапроса = "Период с ТекДок по ТекДок;...Вариант 2или еще вариант| Группировка СтрокаДокумента;Первый должен быстрее работать.(В отсортировоной таблице для поиска хлеб не набо пробегать все строки а воспользуйся методом найтизначение.)
#11 by Джинн
То 10.- Документ не записан. Что даст твой запрос?- Документ записан, но после этого модифицирован, изменения не сохранены. Что получим?- И вообще - кто нибудь пытался сравнить скорость запроса к базе и скорость перебора набора данных в памяти? Или все только голые теоретики, без привязки к жизни?То 0. Выгрузи ТЧ в ТЗ. Потом отфильтруй простой функцией, которая во многих типовых есть примерно в таком виде :
#12 by Inkognito
ПОнятно. Всем большое спасибо!
#13 by Z1
Прочти пост из чего однозначно что выборка идет по сохраненномудокументу а не по контексту формы."И вообще - кто нибудь пытался сравнить скорость запроса к базе и скорость перебора набора данных в памяти? Или все только голые теоретики, без привязки к жизни?" - Запрос для sql базы работает значительно быстрее,для dbf базы все не так однозначно быстрее всего будет
#14 by Пупкин
Я написал для этой цели такую функцию:Проводил несколько замеров производительности - сортировка+поиск дают значительный прирост по сравнению с перебором
#15 by Джинн
То 13. Я внимательно его читал. И потому не зря задал такие вопросы :)А по поводу "Запрос для sql базы работает значительно быстрее..." - пардон, но это из области "Армяне лучше, чем грузины". Быстрее чего? Быстрее обработки набора данных, хранящегося в памяти?
#16 by p rj
Дело зачастую в том, что, во время "обработки набора данных, хранящегося в памяти", 1С (такой уж ее сделали) делает множество запросов к БД.Например, ВыбратьСтроки...Получить строкув модулях формы и проведения.Запрос к табличной части документа делается действительно только 1 раз. Выбираются все реквизиты (select * from dt... where iddoc=...), и далее в память. Но, даже такая простая операция:"Пока ПолучитьСтроку=1 Цикла    ...    ТекТовар=Товар;    ...КонецЦикла;"приводит к выполнению хранимой процедуры, фактически осуществяляюшей выборку всех реквизитов данного элемента справочника. Т.е. обращение в цикле по строкам (пусть их будет N)к M различным реквизитам таб. части типа "док." или "спр." - это (N*M) мелких запросов к БД (слава богу, хотя бы повторные обращения не приводят к запросам - кеширует 1С-ка). Подход, ИМХО, неправильный, ибо далеко не всегда мне нужны реквизиты реквизитов ТЧ. Например, для реквизита ТЗ (кроме ТЗ, в которую сделали ВыгрузитьТабличнуюЧасть) запрос идет только тогда, когда именно пытаешься впервые обратиться к одному из реквизитов этого реквизита.Поэтому запрос очень часто выигрывает, т.к. данные (в т.ч. и "реквизиты реквизитов", какие нужны) уже отобраны агрегатно. Точнее, для прямых запросов (ToySQL, Радуга) это однозначно, для 1С-х лишь часто (странно как то они реализованы - лично у меня глаза по профайлеру разбегаются).
#17 by Z1
Если речь идет о контексте формы то тут только один вариант :Работа с таблицей значений.Если речь идет о выборке из таблицы базы то с доп фильтрацией по конкретному товару ИМХОдля sql в порядке убывания по скорости :1. прямой запрос sql самый быстрый2. Запрос 1с3. выбратьстроки;для dbf базы :прямые запросы применяют редко хотя для задачи вполне можно.запрос 1с будет очень часто проигрывать потому что за время на подготовкии формирования запроса к dbf таблице вполне можно перебрать все строки документа. Если количество строк большое в многостроч частях документа то запрос может работать быстрее.Т.е если база работает под sql то для выборки с условием запрос предпочтительней. Для dbf легче использовать перебор строк или ВыгрузитьТабличнуюЧасть. Если нужно получить максимальную производительность в dbf то нужно провести для конкретной конфигурации и базы эксперементы на основании которых выбрать самый быстрый способ и даже может быть рассмотреть и прямой запрос к таблице dbf базы.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям