v8: Размещение колонки с остатками в списке справочника
Размещение колонки с остатками в списке справочника | Автор статьи: acsent | Редакторы: Волшебник, Гений 1С, ZolotarevAA, romix, FlyingOff Последняя редакция №16 от 01.08.07 | История |
Ключевые слова: Форма, остатки, колонка, справочник, список
Вариант 1: В процедуре ПриПолученииДанных
Перем Запрос; Процедура ПриОткрытии() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Рег.Номенклатура, | Рег.КоличествоОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | , | Склад = &Склад | И Номенклатура В (&Номенклатура)) КАК Рег"; Запрос.УстановитьПараметр("Склад", Склад); КонецПроцедуры Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок) Если Элемент.Колонки.Остаток.Видимость Тогда МассивНоменклатуры = Новый Массив; Для Каждого ОформлениеСтроки ИЗ ОформленияСтрок Цикл Если НЕ ОформлениеСтроки.ДанныеСтроки.ЭтоГруппа Тогда МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка); КонецЕсли; КонецЦикла; Запрос.УстановитьПараметр("Номенклатура", МассивНоменклатуры); тзОстатки = Запрос.Выполнить().Выгрузить(); Для Каждого ОформлениеСтроки ИЗ ОформленияСтрок Цикл Если НЕ ОформлениеСтроки.ДанныеСтроки.ЭтоГруппа Тогда СтрТЗ = тзОстатки.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка, "Номенклатура"); Если СтрТЗ <> Неопределено Тогда ОформлениеСтроки.Ячейки.Остаток.УстановитьТекст(СтрТЗ.КоличествоОстаток); КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры
От Гения 1С: Для ускорения вместо тзОстатки можно использовать Соответствие, оно проиндексировано
и работает быстрее таблицы значений
acsent: Соответствие конечно быстрее, но в него надо будет как-то выгружать запрос, а это скорее всего убьет всю прелесть его скорости.
FlyingOff: а не проще ли использовать выбОстатки = Запрос.Выполнить().Выбрать() и
выбОстатки.НайтиСледующий(ОформлениеСтроки.ДанныеСтроки.Ссылка,
"Номенклатура") вместо работы с таблицей значений?
см. также:
Вариант 2: Кэширование остатков в тз при открытии
Перем тзОстатки; Процедура ПриОткрытии() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Рег.Номенклатура, | Рег.КоличествоОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | , | Склад = &Склад) КАК Рег"; Запрос.УстановитьПараметр("Склад", Склад); тзОстатки = Запрос.Выполнить().Выгрузить(); КонецПроцедуры Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок) Если Элемент.Колонки.Остаток.Видимость Тогда Для Каждого ОформлениеСтроки ИЗ ОформленияСтрок Цикл Если НЕ ОформлениеСтроки.ДанныеСтроки.ЭтоГруппа Тогда СтрТЗ = тзОстатки.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка, "Номенклатура"); Если СтрТЗ <> Неопределено Тогда ОформлениеСтроки.Ячейки.Остаток.УстановитьТекст(СтрТЗ.КоличествоОстаток); КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры
Минусы данного варианта:
1) Долгое открывание формы
2) Неоперативные остатки
Плюсы:
1) Более быстрый скролинг (будет еще быстрей, когда в 8.1 появятся индексы для ТЗ)
Вариант 3: Использование обработчика событий (ВК от romix'а)
Минусы данного варианта:
1) Требуется ВК (впрочем, для кого-то это плюс)
Плюсы:
1) Скорость близка к максимально возможной (т.к. остаток хранится в таблице справочника).
2) Можно применять и в 7.7 (по ссылке приведен пример для 7.7)
3) Многие полезные алгоритмы реализуются похожим способом (по ссылке приведены некоторые из них).
Во всяком случае, пользователи получат остаток в форме списка (плюс отбор только тех товаров, которые есть в данный момент в наличии) без какого либо торможения при подборе или просмотре.
Обновление остатка в справочнике происходит после проведения/отмены проведения документа. Если карточка товара в этот момент была заблокирована, также по событию после ее закрытия.