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