Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> УПП Форма Документа(Фильтр/Отбор)          
MIF Подменю пользователя
сообщение 31.10.12, 17:20
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

Прошу помощи.
Надо на форму документа вывести возможность отбора.
Документ состоит из 6000 строк, пользователь хочет фильтровать эти строки по Номенклатуре, Цене номенклатуры, Проценту наценок.
В ТЧ документа есть такие столбцы: Номенклатура, СтараяЦена, ПроцентНаценки, НоваяЦена, Модификатор
Единственное что приходит в голову это делать запросом, но тогда:
1. Время на обработку такого запроса боюсь будет очень большое, а документов масса и в некоторых есть и по 30000 строк
2. Как быть со строками не попадающими в фильтр, ведь они будут затираться, соответственно весь список строк надо хранить во временной ТЗ, а после отмены фильтра выгружать обратно в документ. Опять таки документы большие, накладно.
3. Придется создать множество кнопок, на каждый фильтр свою.

Может есть какой другой способ добавить отбор на форму документа (не форма выбора и не форма списка), что бы строки не попадающие в отбор просто скрывались?
Заранее благодарен

zay Подменю пользователя
сообщение 31.10.12, 18:32
Сообщение #2

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 167
Из: Киев
Спасибо сказали: 139 раз
Рейтинг: 147.2

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

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

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

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

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

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

ignsv Подменю пользователя
сообщение 31.10.12, 20:10
Сообщение #3

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 193
Спасибо сказали: 60 раз
Рейтинг: 0

тоже делал подобное. Удобно использовать текст : ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(ЗначениеОтбора);


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

logist Подменю пользователя
сообщение 31.10.12, 20:16
Сообщение #4

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2539 раз
Рейтинг: 0

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

А в обычном приложении нет динамического списка?


Signature
Личные бесплатные консультации не даю, для этого есть форум!

MIF Подменю пользователя
сообщение 31.10.12, 21:49
Сообщение #5

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

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


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


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


 ! 

Правила, п.13
 

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


 ! 

Правила, п.13
 


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

 ! 

Правила, п.13
 

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


 ! 

Правила, п.13
 


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


 i 

Если лень цитировать конкретный текст - сообщения будут удаляться полностью!
 


Сообщение отредактировал logist - 31.10.12, 22:03

alex040269 Подменю пользователя
сообщение 01.11.12, 8:10
Сообщение #6

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

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

если реквизита нет - его можно добавить!


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

zay Подменю пользователя
сообщение 01.11.12, 9:00
Сообщение #7

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 167
Из: Киев
Спасибо сказали: 139 раз
Рейтинг: 147.2

Цитата(logist @ 31.10.12, 20:16) *
А в обычном приложении нет динамического списка?

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

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

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


alex040269 Подменю пользователя
сообщение 01.11.12, 9:13
Сообщение #8

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

Цитата(zay @ 01.11.12, 9:00) *
Да, действительно. Например

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

можно и так.

но никто не запрещает это поручить системе:
ЗаписьТЧ.УникальныйИдентификатор = Новый УникальныйИдентификатор();


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

ignsv Подменю пользователя
сообщение 01.11.12, 9:19
Сообщение #9

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 193
Спасибо сказали: 60 раз
Рейтинг: 0

Цитата(logist @ 31.10.12, 20:16) *
Пробовал: Пишет "Не обнаружено поле ОтборСтрок". Добавил кнопку "фильтр" в командной панели и в действии прописывал.


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


Покажите Ваш нерабочий код + дочитайте [необходимо зарегистрироваться для просмотра ссылки]

zay Подменю пользователя
сообщение 01.11.12, 9:50
Сообщение #10

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 167
Из: Киев
Спасибо сказали: 139 раз
Рейтинг: 147.2

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

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

MIF Подменю пользователя
сообщение 01.11.12, 10:05
Сообщение #11

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

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

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

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

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

Не я разрабатывал этот документ, и что б разобраться в нём полностью(что, откуда и почему именно так) и оптимизировать всё у меня уйдут не одни сутки, а времени у меня до конца недели. Вот такая вот лажа)
Единственное что пока пришло в голову и займет где-то пол дня, плюнуть на тормоза, делать фильтры через запросы (устанавливая параметры), после чего данные из запроса загружать в новый документ(похожий на изначальный), где пользователь может что угодно делать с данными, после чего заменять данные текущего документа, данными из нового (по номеру строки). И новый удалять.

logist Подменю пользователя
сообщение 01.11.12, 10:06
Сообщение #12

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2539 раз
Рейтинг: 0

MIF можете успокоиться, ОтборСтрок в Вашем случае не будет работать. Странно, что ни у вас ни у ignsv не возникло желание залезть в синтаксис помощник и увидеть там, что это НЕ работает в обычном приложении.


Signature
Личные бесплатные консультации не даю, для этого есть форум!

zay Подменю пользователя
сообщение 01.11.12, 10:06
Сообщение #13

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 167
Из: Киев
Спасибо сказали: 139 раз
Рейтинг: 147.2

Цитата(alex040269 @ 01.11.12, 9:13) *
никто не запрещает это поручить системе:
ЗаписьТЧ.УникальныйИдентификатор = Новый УникальныйИдентификатор();

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

MIF Подменю пользователя
сообщение 01.11.12, 10:09
Сообщение #14

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(logist @ 01.11.12, 11:06) *
MIF можете успокоиться, ОтборСтрок в Вашем случае не будет работать. Странно, что ни у вас ни у ignsv не возникло желание залезть в синтаксис помощник и увидеть там, что это НЕ работает в обычном приложении.


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

ignsv Подменю пользователя
сообщение 04.11.12, 18:18
Сообщение #15

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 193
Спасибо сказали: 60 раз
Рейтинг: 0

logist

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


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

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


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


MIF Подменю пользователя
сообщение 09.11.12, 13:59
Сообщение #16

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 16.06.25, 7:55
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!