Вывести остаток в форме списка справочника #82016


#0 by Алексей В
Второй день бьюсь, видать, не там ищу. Задача в том, чтобы вывести в дополнительной колонке справочника вычисляемое при открытии значение, своё для каждой строки списка, основанное на данных этой строки. В 7.7 это было поле "Формула" вкладки "Дополнительно" в свойствах колонки. Там можно было вызывать функцию, имеющую доступ ко всем данным в её строке списка. Как реализовать подобную вещь? К Типовой УТ отпралять не надо, там посмотрел - кривая реализация извращенцев: вывод остатков формированием всего списка при каждом переходе по группам. При этом даже нельзя вывести весь справочник без групп с остатками. Типа, оператор, если не знаешь, в какой группе нужный элемент, переключай режим, вклучай вывод без иерархии, потом возвращайся в подбор с остатками, переходи в нужную группу и смотри этот остаток.
#1 by Rovan
А ты проститай кэш при открвытии формы а потом гуляй по ней где хочешь. Принудительный пересчет через кнопку на форме или через ОбработчикОшидания.
#2 by Rovan
(+1) Опечатка, д.б. "...просчитай кэш..."
#3 by Алексей В
Разобрался... М.Г.Радченко. 1С Предприятие 8.0 Практическое пособие разработчика. Страница 524. Вычисляемые колонки в списках. Обработчик события "ПриВыводеСтроки" нам поможет.
#4 by Алексей В
#5 by Волшебник
Есть еще метод УстановитьТекст, который делает сразу два действия одноврменно. ----------- Вообще к этому вопросу нужно подходить очень аккуратно. Если при выводе каждой строки тащить из регистра остатки, то это может привести к великим тормозам. Если начались тормоза, то рекомендуется сделать следующее: 1. Кеширование результата запроса в переменной модуля формы (таблица значений или массив, еще можно использовать соответствие, которое индексируется для примитивных типов данных, например, код товара или артикул) 2. При отключенной колонке (видимость) запрос к базе НЕ должен выполняться. По умолчанию колонку держать выключенной, включение только по кнопке в форме или при личных настройках определенного пользователя. 3. Лучше выполнять один большой запрос на несколько товаров, чем несколько маленьких запросов на один товар. 4. Список товаров нужно передавать как ПАРАМЕТР виртуальной таблицы Остатки, а не как параметр условия ГДЕ. 5. При повышенных требованиях к скорости отображения списка и большом количестве пользователей можно завести регистр сведений, хранящий актуальные остатки. Для поддержки его актуальности можно создать последовательность.
#6 by Волшебник
см. также:
#7 by Алексей В
Вообще, конкретно моё решение данной задачи таково: Задача: Отображение актуальных остатков в форме подбора справочника. Решение: При открытии формы подбора справочника выполняем запрос и выгружаем его результат в реквизит формы типа ТаблицаЗначений. В запросе обращаемся в виртуальным таблицам Остатки (ОстаткиТоваров, РезервыТоваров и т.д.). Если оптимизировать запрос, то в нём можно получить уже готовую таблицу расчитанных остатков (ОстатокНаСкладе-Резервы и т.п.). В таблице формы добавляем колонку "Остаток" Далее в предопределённой процедуре "ПриВыводеСтроки" ищем ту самую, уникальную строку, соответствующую выводимому элементу справочника. И значение "Остаток" из неё выводим в нужную колонку. Обращение к таблице с результатом запроса будет происходить только при перерисовке отображённых на экране строк. Пусть этих строк в справочнике будет хоть 100 000, на экране их будет не более 50. Тонкое место здесь - скорость поиска нужной строки в таблице значений. Я воспользовался методом "Найти", как он себя покажет при 100 000 строк, пока не знаю, но более быстрого варианта средствами 1С предложить не могу. Нам по идее не нужно обновлять данные об остатках раз в секунду или раз в час и т.п. Нам нужно обновлять таблицу остатков только при изменении этих остатков. Т.е. нужно как-то остлеживать в системе проведение документа, влияющего на остатки и после этого проведения повторять запрос к таблицам регистров в форме справочника.
#8 by Волшебник
При поиске по табличному полю событие ПриВыводеСтроки может срабатывать не только для тех строк, которые на экране. Это еще зависит от релиза платформы.
#9 by Алексей В
Сижу сейчас на 8.0.8.7 Сделал счётчик обращений к процедуре ПриВыводеСтроки. Количество обращений равно количеству отображаемых элементов справочника. Причём обращения происходят только при сдвиге списка. Кроме того, обращения всегда происходят при нажатии клавиш PgUp и PgDn. Если не сдвигать список, а только перемещаться курсором по отображённым элементам, то обращений к ПриВыводеСтроки нету. Ну, и при открытии формы происходит удвоенное от количества элементов на экране количество обращений. В моём предыдущем посте вкралась неточность: Таблицу остатков формирую не ПриОткрытии формы справочника, а ПередОткрытием.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С