Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: УПП Форма Документа(Фильтр/Отбор)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
MIF
Прошу помощи.
Надо на форму документа вывести возможность отбора.
Документ состоит из 6000 строк, пользователь хочет фильтровать эти строки по Номенклатуре, Цене номенклатуры, Проценту наценок.
В ТЧ документа есть такие столбцы: Номенклатура, СтараяЦена, ПроцентНаценки, НоваяЦена, Модификатор
Единственное что приходит в голову это делать запросом, но тогда:
1. Время на обработку такого запроса боюсь будет очень большое, а документов масса и в некоторых есть и по 30000 строк
2. Как быть со строками не попадающими в фильтр, ведь они будут затираться, соответственно весь список строк надо хранить во временной ТЗ, а после отмены фильтра выгружать обратно в документ. Опять таки документы большие, накладно.
3. Придется создать множество кнопок, на каждый фильтр свою.

Может есть какой другой способ добавить отбор на форму документа (не форма выбора и не форма списка), что бы строки не попадающие в отбор просто скрывались?
Заранее благодарен
zay
Цитата(MIF @ 31.10.12, 17:20) необходимо зарегистрироваться для просмотра ссылки
1. Время на обработку такого запроса боюсь будет очень большое, а документов масса и в некоторых есть и по 30000 строк

При правильном построенных индексах проблем быть не должно. Исключением является ситуация когда на табличную часть стоит обработчик "ПриПолученииДанных", который что-то там расчитывает по каждой строке, а особенно - подкрашивает строки/ячейки. В таких ситуациях тормозов избежать не удастся, но скорее даже не при наложении фильтра (и при этом конечно тоже), а при PageUp/PageDown.

Цитата(MIF @ 31.10.12, 17:20) необходимо зарегистрироваться для просмотра ссылки
Может есть какой другой способ добавить отбор на форму документа что бы строки не попадающие в отбор просто скрывались?

Можно, если выполняется такое условие: в табличной части есть некий уникальный реквизит, который на всю табличную часть встречается только один раз, например номенклатура. Если это так - то:
1. Пользователь устанавливает свои фильтры, нажимает "Применить отбор".
2. Запросом (с ограничением по заданому пользователем фильтру) получаем список уникальных реквизитов, например номенклатуры.
3. Ставим отбор по "Номенклатура"--"В списке"--"Список всех ссылок, полученых запросом".

Но я так понимаю, что в вашей ситуации такого уникального реквизита нет, поэтому установить отбор в табличной части документа не получится.

В таком случае, я думаю лучше создать специализированную обработку. В обработке сделать табличную часть такую же, как в документе. Загружать в нее только те строки, которые подпадают под указанные пользователем фильтры, при этом запоминать номер строки документа, из которой была получена загружаемая строка. Пользователь может как угодно изменять строки, даже сортировать их - при окончании работы заменять строки в "родительском" документе строками из обработки. Сопоставление производить по номеру строки. Можно отдельно обрабатывать ситуации с удалением и добавлением строк (в обработке) - запоминать их номера и проделывать те же действия (добавление / удаление) в "родительском" документе.
ignsv
тоже делал подобное. Удобно использовать текст : ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(ЗначениеОтбора);


подробнее необходимо зарегистрироваться для просмотра ссылки
logist
Цитата(zay @ 31.10.12, 19:32) необходимо зарегистрироваться для просмотра ссылки
В таком случае, я думаю лучше создать специализированную обработку.

А в обычном приложении нет динамического списка?
MIF
Цитата(ignsv @ 31.10.12, 21:10) необходимо зарегистрироваться для просмотра ссылки
тоже делал подобное. Удобно использовать текст : ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(ЗначениеОтбора);


подробнее необходимо зарегистрироваться для просмотра ссылки


Пробовал: Пишет "Не обнаружено поле ОтборСтрок". Добавил кнопку "фильтр" в командной панели и в действии прописывал.


 ! 

Правила, п.13
 

К сожалению некоторые колонки каждой строки рассчитываются очень замудренным путем, данные подтягиваются из кучи разных документов. Открытие одного такого документа занимает порядка 3 минут(если строк около 3 тысяч), формирование самого документа занимает около часа-двух.


 ! 

Правила, п.13
 


Думал об этом, но думал не про обработку, а про отдельный документ, но опять же всё упирается во время, не будет ли загрузка строк в новый документ, а потом выгрузка их обратно, трудоёмкой для 1ски? (учитывая их кол-во)

 ! 

Правила, п.13
 

К сожалению некоторые колонки каждой строки рассчитываются очень замудренным путем, данные подтягиваются из кучи разных документов. Открытие одного такого документа занимает порядка 3 минут(если строк около 3 тысяч), формирование самого документа занимает около часа-двух.


 ! 

Правила, п.13
 


Думал об этом, но думал не про обработку, а про отдельный документ, но опять же всё упирается во время, не будет ли загрузка строк в новый документ, а потом выгрузка их обратно, трудоёмкой для 1ски? (учитывая их кол-во)


 i 

Если лень цитировать конкретный текст - сообщения будут удаляться полностью!
 
alex040269
Цитата(zay @ 31.10.12, 18:32) необходимо зарегистрироваться для просмотра ссылки
Но я так понимаю, что в вашей ситуации такого уникального реквизита нет, поэтому установить отбор в табличной части документа не получится.

если реквизита нет - его можно добавить!
zay
Цитата(logist @ 31.10.12, 20:16) необходимо зарегистрироваться для просмотра ссылки
А в обычном приложении нет динамического списка?

В обычном приложении динамического списка нет. Что-то издалека похожее на динамический список - это использование в табличных частях СправочникСписок и РегистрСведенийСписок с предустановленными отборами, но в данном случае это конечно не то.

Цитата(alex040269 @ 01.11.12, 8:10) необходимо зарегистрироваться для просмотра ссылки
если реквизита нет - его можно добавить!

Да, действительно. Например
ЗаписьТЧ.УникальныйИдентификатор =
        СокрЛП(ЗаписьТЧ.Номенклатура.Код) + "_" +
        Строка(ЗаписьТЧ.ПроцентНаценки) + "_" +
        Строка(ЗаписьТЧ.НоваяЦена);

alex040269
Цитата(zay @ 01.11.12, 9:00) необходимо зарегистрироваться для просмотра ссылки
Да, действительно. Например

ЗаписьТЧ.УникальныйИдентификатор =
СокрЛП(ЗаписьТЧ.Номенклатура.Код) + "_" +
Строка(ЗаписьТЧ.ПроцентНаценки) + "_" +
Строка(ЗаписьТЧ.НоваяЦена);

можно и так.

но никто не запрещает это поручить системе:
ЗаписьТЧ.УникальныйИдентификатор = Новый УникальныйИдентификатор();
ignsv
Цитата(logist @ 31.10.12, 20:16) необходимо зарегистрироваться для просмотра ссылки
Пробовал: Пишет "Не обнаружено поле ОтборСтрок". Добавил кнопку "фильтр" в командной панели и в действии прописывал.


только что все еще раз проверил: все там работает;
//Установить отбор
ЭлементыФормы.Состав.ОтборСтрок.Организация.Установить(Справочники.Организации.НайтиПоКоду("000000001"));
//Снять отбор
ЭлементыФормы.Состав.ОтборСтрок.Организация.Установить(,Ложь);


Покажите Ваш нерабочий код + дочитайте необходимо зарегистрироваться для просмотра ссылки
zay
Цитата(MIF @ 31.10.12, 21:49) необходимо зарегистрироваться для просмотра ссылки
К сожалению некоторые колонки каждой строки рассчитываются очень замудренным путем, данные подтягиваются из кучи разных документов. Открытие одного такого документа занимает порядка 3 минут(если строк около 3 тысяч), формирование самого документа занимает около часа-двух.

То что у вас такие "тормоза" - следствие неправильной организации работы с данными (Выделенный текст в цитате). Данные должны подтягиватся не из документов, а из регистров. Структура регистров организована таким образом, чтобы быстро получать из них данные. В общем, для увеличения скорости работы вам нужно смотреть в сторону оптимизации.
Советы по оптимизации такие:
Если у вас при "подтягивании данных" одна и таже функция вызывается несколько сот/тысяч раз - может быть имеет смысл делать кеширование. Один раз вызвать функцию, заполнить таблицу значений или соответствие и потом работать с этим хранилищем, а не тысячу раз выполнять один и тот же запрос. При такой работе конечно повышается использование памяти, но время работы существенно уменьшается.
Если есть возможность "подтягивать данные" одним запросом, а не несколькими - то следует поступить именно так. SQL-Server гораздо быстрее выполняет один запрос на 200 строк, чем 100 раз 10 запросов по 20 строк. Конечно при условии что построены индексы по реквизитам из области запроса ГДЕ или по которым происходят объединения.
MIF
Процедура КоманднаяПанельТаблицыТиповЦенФильтр(Кнопка)
    ЭлементыФормы.ТаблицаЦен.ОтборСтрок.Номенклатура.Установить(Справочники.Номенклатура.НайтиПоКоду("000000001"));
КонецПроцедуры

Документ заполняется с помощью обработок и других документов. Условие
Цитата
Т.е. табличное поле должно быть связано с табличной частью.
у меня не верно. ТП не связано с ТЧ. Пробовал вместо ОтбораСтрок делать просто Отбор, но проблема таже, "Поле не найдено "Отбор"".

Пробовал и так:

ЭтотОбъект.Товары.ОтборСтрок.Номенклатура.Установить(Справочники.Номенклатура.НайтиПоКоду("000000001"));

и так
ЭлементыФормы.ТаблицаЦен.ТекущиеДанные.ОтборСтрок.Номенклатура.Установить(Справочники.Номенклатура.НайтиПоКоду("000000001"));

И вместо "ОтбораСтрок" - "отбор".

Цитата(zay @ 01.11.12, 10:50) необходимо зарегистрироваться для просмотра ссылки
То что у вас такие "тормоза" - следствие неправильной организации работы с данными (Выделенный текст в цитате).

Не я разрабатывал этот документ, и что б разобраться в нём полностью(что, откуда и почему именно так) и оптимизировать всё у меня уйдут не одни сутки, а времени у меня до конца недели. Вот такая вот лажа)
Единственное что пока пришло в голову и займет где-то пол дня, плюнуть на тормоза, делать фильтры через запросы (устанавливая параметры), после чего данные из запроса загружать в новый документ(похожий на изначальный), где пользователь может что угодно делать с данными, после чего заменять данные текущего документа, данными из нового (по номеру строки). И новый удалять.
logist
MIF можете успокоиться, ОтборСтрок в Вашем случае не будет работать. Странно, что ни у вас ни у ignsv не возникло желание залезть в синтаксис помощник и увидеть там, что это НЕ работает в обычном приложении.
zay
Цитата(alex040269 @ 01.11.12, 9:13) необходимо зарегистрироваться для просмотра ссылки
никто не запрещает это поручить системе:
ЗаписьТЧ.УникальныйИдентификатор = Новый УникальныйИдентификатор();

УникальныйИдентификатор котрый получен таким образом - это УникальныйИдентификатор ТЧ документа + НомерСтроки (Не уверен что это так, а писать проверочный тест - лень smile.gif ).
Если это так, то получаем:
Использовали отбор по системному УникальномуИдентификатору, все хорошо
В середине ТЧ добавили/удалили строку.
У всех последующих строк УникальныйИдентификатор изменился
Теперь отбор показывает какую-то кашу
MIF
Цитата(logist @ 01.11.12, 11:06) необходимо зарегистрироваться для просмотра ссылки
MIF можете успокоиться, ОтборСтрок в Вашем случае не будет работать. Странно, что ни у вас ни у ignsv не возникло желание залезть в синтаксис помощник и увидеть там, что это НЕ работает в обычном приложении.


Залазил, читал, по-этому и писал в начале темы, что форма обычная)
Но мало ли, вдруг где-то завтыкал, проверка не заняла более 2 минут.
ignsv
logist

мы наверное о разном говорим, что вы хотите сказать под :
Цитата(MIF @ 01.11.12, 10:09) необходимо зарегистрироваться для просмотра ссылки
что это НЕ работает в обычном приложении.


Если вы о методе ОтборСтрок то он работает в обычном приложении.
И эти строки я проверял:

Цитата(ignsv @ 01.11.12, 9:19) необходимо зарегистрироваться для просмотра ссылки
//Установить отбор
ЭлементыФормы.Состав.ОтборСтрок.Организация.Установить(Справочники.Организации.Н
айтиПоКоду("000000001"));
//Снять отбор
ЭлементыФормы.Состав.ОтборСтрок.Организация.Установить(,Ложь);


а у ТС я думаю не работает из-за того что:
Цитата(MIF @ 01.11.12, 10:05) необходимо зарегистрироваться для просмотра ссылки
ТП не связано с ТЧ

MIF
Собственно по некоторым причинам решил всё обработкой, которая выбирает документы, получает их ТЧ, далее с ТЧ что хотят, то и делают, и дальше перезаписываются поля. необходимо зарегистрироваться для просмотра ссылки
П.с. почему сделано обработкой, потому что док содержит 20000 строк, в форме документа работать нереально по независящим от меня причинам, а переделывать сам документ ой как тяжко будет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.