Книга знаний

1С:Предприятие / Приемы программирования / Запросы

Вывод остатков в форме списка

Оптимальный вывод остатков в формах списков и журналах. Вызвана бесконечными вопросами на форуме. Будет удобно посылать новичков сюда.Автор статьи: H A D G E H O G s
Последняя редакция №1 от 21.02.10
URL: http://kb.mista.ru/article.php?id=775

Ключевые слова: Остатки, форма списка, ПриПолученииДанных, ПриВыводеСтроки


Собственно, выводить остатки надо только при событии ПриПолученииДанных.
Данное событие генерируется только для свежепоказываемых строк справочника, в то время, как ПриВыводеСтроки генерируется уже на показанные строки. Необходимо отметить, что ПриПолученииДанных вызывается для всех строк при обновлении формы (ctrl+shift+r).

Также выбор ПриПолученииДанных вызван тем, что в ней можно накопить массив элементов справочника и выполнить запрос 1 раз, вместо цикличного набора запросов для каждого элемента.

Собственно, пример:
Есть справочник "Номенклатура", в который вручную добавлена колонка "Количество", не привязанная к данным.
Ну а в форме списка добавлен следующий код:


Перем ЗапросОстатков;

Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
   Если ЭлементыФормы.Список.Колонки.Количество.Видимость=Истина Тогда
       СписокНоменклатур=Новый СписокЗначений;
       Для Каждого Элемент ИЗ ОформленияСтрок Цикл
           СписокНоменклатур.Добавить(Элемент.ДанныеСтроки.Ссылка);
       КонецЦикла;
       ЗапросОстатков.УстановитьПараметр("СписокНоменклатур",СписокНоменклатур);
       РезультатЗапроса=ЗапросОстатков.Выполнить();
       Если НЕ РезультатЗапроса.Пустой() Тогда
           Выборка=РезультатЗапроса.Выбрать();
           Для Каждого Элемент ИЗ ОформленияСтрок Цикл
               Выборка.Сбросить();
               Элемент.Ячейки.Количество.ОтображатьТекст=Истина;
               Если Выборка.НайтиСледующий(Элемент.ДанныеСтроки.Ссылка,"Номенклатура") Тогда
                   Элемент.Ячейки.Количество.Текст=Выборка.Количество;
               Иначе
                   Элемент.Ячейки.Количество.Текст="0";
               КонецЕсли;
               СписокНоменклатур.Добавить(Элемент.ДанныеСтроки.Ссылка);
           КонецЦикла;
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры

ЗапросОстатков=Новый Запрос;
ЗапросОстатков.Текст=
"ВЫБРАТЬ
|    ТоварыНаСкладахОстатки.Номенклатура,
|    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
|ИЗ
|    РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура В (&СписокНоменклатур)) КАК ТоварыНаСкладахОстатки";


Думаю, по коду все понятно.
Запрос инициируется 1 раз, код обработки выполняется только тогда, когда колонка видима (пользователь может скрыть ее в настройке списка).

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика