gifts2017

HOWTO: Остатки в форме регистрации продаж в УТ10

Опубликовал Sergei (kauksi) в раздел Программирование - Практика программирования

Как заставить УТ10 показывать остатки в форме регистрации продаж (Документ ЧекККМ)

Почему то такая потребность довольно часто возникала у всех, кто использует интерфейс кассира в УТ10. В Рознице 2.0, например, такая возможность уже есть.

Для того, чтобы показывались остатки, достаточно добавить текстовое поле Остаток и назначить следующую процедуру для обработчика ПриПолученииДанных табличного поля Товары в ФормеРегистрацииПродаж ЧекаККМ

Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
        
    Если ОформленияСтрок.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ТаблицаНоменклатуры.Номенклатура,
    |    ТаблицаНоменклатуры.ХарактеристикаНоменклатуры,
    |    ТаблицаНоменклатуры.Склад
    |ПОМЕСТИТЬ ТаблицаВЗапрос
    |ИЗ
    |    &ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Склад,
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыВРознице.Остатки(
    |            ,
    |            (Номенклатура, ХарактеристикаНоменклатуры, Склад) В
    |                (ВЫБРАТЬ
    |                    ТаблицаВЗапрос.Номенклатура,
    |                    ТаблицаВЗапрос.ХарактеристикаНоменклатуры,
    |                    ТаблицаВЗапрос.Склад
    |                ИЗ
    |                    ТаблицаВЗапрос КАК ТаблицаВЗапрос)) КАК ТоварыНаСкладахОстатки
    |ГДЕ
    |    ТоварыНаСкладахОстатки.Номенклатура.Услуга = ЛОЖЬ";
    
    ТаблицаНоменклатуры = Товары.Выгрузить();
    ТаблицаНоменклатуры.Колонки.Добавить("Склад",Новый ОписаниеТипов("СправочникСсылка.Склады"));
    ТаблицаНоменклатуры.ЗаполнитьЗначения(Склад,"Склад");
    
    Запрос.УстановитьПараметр("ТаблицаНоменклатуры", ТаблицаНоменклатуры);
    
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        //Сообщить ("Нет смогли определить остатки");
        Возврат;
    КонецЕсли;
    
    ТаблицаОстатков = Результат.Выгрузить();
    ТаблицаОстатков.Индексы.Добавить("Номенклатура,ХарактеристикаНоменклатуры");
    
    СтруктураПоиска = Новый Структура;
    МассивСтрок = Новый Массив;

    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        
        СтруктураПоиска.Вставить("Номенклатура"  , ОформлениеСтроки.ДанныеСтроки.Номенклатура);
        СтруктураПоиска.Вставить("ХарактеристикаНоменклатуры", ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);
        СтруктураПоиска.Вставить("Склад"         , Склад);
        
        МассивСтрок = ТаблицаОстатков.НайтиСтроки(СтруктураПоиска);
        Остаток=0;
        Если МассивСтрок.Количество() > 0  Тогда
              Остаток = МассивСтрок[0].КоличествоОстаток;
        КонецЕсли;
        ОформлениеСтроки.Ячейки.Остаток.УстановитьТекст(Остаток);

    КонецЦикла;

    
КонецПроцедуры

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Константин Исиченко (IsiKosta) 30.11.16 12:25
Аватарку смени. Куда смотрит администрация?
2. Андрей Тарлыков (Tarlich) 30.11.16 15:58
Данный способ был описан Радченко в 2009 г -))
3. Sergei (kauksi) 30.11.16 16:48
(2) И что же 1С его не реализовала в УТ10 и УПП?, даже в рознице 1.0 по моему не было, добавили только в 2.0
4. Геннадий Жаркой (ifal) 02.12.16 09:51
Видно, что вы хотели сделать все красиво, поэтому не сочтите за придирки:
1. Условие на услуги лишнее, ну а если все же добавляете, то добавляйте его в отборы виртуальной таблицы, чтобы уж все правильно было.
2. В структуре поиска склад не нужен, он же у вас и так один, соответственно и в выборке во втором запросе не нужен.

И момент для раздумий, если будете добавлять позиции, то каждый раз запрос по остаткам будет делаться по всем позициям видимым на экране, даже по тем, по которым уже остаток вычислен, такие позиции можно исключить. Если конечно, кассирам не надо в реальном времени видеть изменения остатка в своем чеке.
5. Юрий (as) 08.12.16 10:25
1. В отбор виртуальной таблицы нельзя добавлять, т.к. это замедлит исполнение запроса(построение виртуальной таблицы)