Книга знаний

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

Размещение колонки с остатками в списке справочника

Размещение колонки с остатками в списке справочникаАвтор статьи: acsent | Редакторы: Волшебник, Гений 1С, ZolotarevAA, romix, FlyingOff, Паучог
Последняя редакция №18 от 21.05.11 | История
URL: http://kb.mista.ru/article.php?id=310

Ключевые слова: Форма, остатки, колонка, справочник, список


Вариант 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) Многие полезные алгоритмы реализуются похожим способом (по ссылке приведены некоторые из них).

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

Обновление остатка в справочнике происходит после проведения/отмены проведения документа. Если карточка товара в этот момент была заблокирована, также по событию после ее закрытия.

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

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