Имя: Пароль:
1C
1С v8
Альфа-Авто 4.1: Остаток по кассе
0 Mikhail Volkov
 
10.04.18
18:32
В Альфа-Авто 4.1.01.30 есть такая функция:

// Возвращает таблицу остатков по КассеККМ
// Параметры:
//    КассаККМ - СправочникСсылка.КассыККМ
//    НаМомент - Момент времени на который получаем остатки
//
Функция дкПолучитьОстатокПоКассеККМ(КассаККМ,НаМомент) Экспорт
    
    Документ = Неопределено;
    Если ТипЗнч(НаМомент) = Тип("Дата") Тогда
        ДатаРасчета = НаМомент;
    ИначеЕсли ТипЗнч(НаМомент) = Тип("МоментВремени") Тогда
        Документ    = НаМомент.Ссылка;
        ДатаРасчета = НаМомент.Дата;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |КассыККМ.СпособОплаты КАК ТипОплаты,
    |СУММА(ВЫБОР
    |    КОГДА КассыККМ.ВидДвижения = &ВидДвижения
    |            И КассыККМ.Сумма > 0
    |        ТОГДА ЕСТЬNULL(КассыККМ.Сумма, 0)
    |    ИНАЧЕ 0
    |КОНЕЦ) -
    |Сумма(ВЫБОР
    |    КОГДА КассыККМ.ВидДвижения = &ВидДвиженияВозврат
    |            И КассыККМ.Сумма > 0
    |        ТОГДА ЕСТЬNULL(КассыККМ.Сумма, 0)
    |    ИНАЧЕ 0
    |КОНЕЦ) КАК Сумма,
    |
    |-1* (СУММА(ВЫБОР
    |    КОГДА КассыККМ.ВидДвижения = &ВидДвижения
    |            И КассыККМ.Сумма < 0
    |        ТОГДА ЕСТЬNULL(КассыККМ.Сумма, 0)
    |    ИНАЧЕ 0
    |КОНЕЦ) -
    |Сумма(ВЫБОР
    |    КОГДА КассыККМ.ВидДвижения = &ВидДвиженияВозврат
    |            И КассыККМ.Сумма < 0
    |        ТОГДА ЕСТЬNULL(КассыККМ.Сумма, 0)
    |    ИНАЧЕ 0
    |КОНЕЦ)) КАК СуммаВозврат
    |
    |ИЗ
//+МВ 26.09.2017 заменил    
//    |    РегистрНакопления.КассыККМ КАК КассыККМ" + ?(Документ = Неопределено, "", " И
//    |    (НЕ КассыККМ.Регистратор = &Ссылка)") + "
    |    РегистрНакопления.КассыККМ КАК КассыККМ
//-МВ    
    |ГДЕ
    |    КассыККМ.Период <= &НаМомент
    |    И КассыККМ.КассаККМ = &КассаККМ
//+МВ 26.09.2017 добавил    
    |    И КассыККМ.Регистратор <> &Ссылка
//-МВ    
    |
    |СГРУППИРОВАТЬ ПО
    |    КассыККМ.СпособОплаты";
    Если Документ = Неопределено Тогда //+МВ 26.09.2017
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И КассыККМ.Регистратор <> &Ссылка", "");
    КонецЕсли;    //-МВ
    Запрос.УстановитьПараметр("НаМомент",ДатаРасчета);
    Запрос.УстановитьПараметр("КассаККМ",КассаККМ);
    Запрос.УстановитьПараметр("Ссылка",Документ);
    Запрос.УстановитьПараметр("ВидДвижения",ВидДвиженияНакопления.Приход);
    Запрос.УстановитьПараметр("ВидДвиженияВозврат",ВидДвиженияНакопления.Расход);
    
    тзЗапрос = Новый ТаблицаЗначений;
    тзЗапрос.Колонки.Добавить("ТипОплаты");
    тзЗапрос.Колонки.Добавить("Сумма");
    тзЗапрос.Колонки.Добавить("СуммаВозврат");
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Если Выборка.Сумма = 0 И Выборка.СуммаВозврат = 0 Тогда
            Продолжить;
        ИначеЕсли Выборка.ТипОплаты.Объект = Перечисления.ТипыОплатыВРознице.Наличные И Выборка.Сумма = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        НоваяСтрока = тзЗапрос.Добавить();
        НоваяСтрока.ТипОплаты = Выборка.ТипОплаты;
        НоваяСтрока.Сумма = Выборка.Сумма;
        НоваяСтрока.СуммаВозврат = 0;
        Если Выборка.ТипОплаты.Объект = Перечисления.ТипыОплатыВРознице.Наличные Тогда
            НоваяСтрока.Сумма = НоваяСтрока.Сумма-Выборка.СуммаВозврат;
        Иначе
            НоваяСтрока.СуммаВозврат = Выборка.СуммаВозврат;
        КонецЕсли;
    КонецЦикла;
    
    Возврат тзЗапрос;
КонецФункции

Правда с ошибка, но вроде поправил. Более полугода к ней претензий не было, пока не стали отбивать чеки по "Плат. карта". А именно чеки возврата по "Плат. карта", какая-то хрень полезла...
Возвратные чеки имеют ВидДвиженияНакопления.Приход, но со знаком минус. ВидДвиженияНакопления.Расход - только документы Инкассации. Сумма прихода наличных берется итоговая: Сумма - СуммаВозврат, гасится  расходом инкассации (изъятия из кассы) запрошлые дни. В результате по наличным функция выдает остаток только по текущему дню.
А по "Плат. карта" сумму не объединяются Сумма и СуммаВозврат, расходом инкассации не гасятся возвраты по "Плат. карта", и вылазят с прошлых дней!?
Толи не все исправил как надо, толи... запутался!?
1 Mikhail Volkov
 
11.04.18
14:03
Сумма - остаток прихода формируется судя по запросу из:
+ (КассыККМ.ВидДвижения = &ВидДвижения И КассыККМ.Сумма > 0) - из сумм приходов, оплаты, при отбитии чеков
- (КассыККМ.ВидДвижения = &ВидДвиженияВозврат И КассыККМ.Сумма > 0) - суммы изъятия из кассы при инкассации
СуммаВозврат - остаток возвратов формируется судя по запросу из:
- (КассыККМ.ВидДвижения = &ВидДвижения И КассыККМ.Сумма < 0) - прихода отрицательных сумм, т.е. при отбитии возвратных чеков
+ (КассыККМ.ВидДвижения = &ВидДвиженияВозврат И КассыККМ.Сумма < 0) - отрицательные суммы изъятия из кассы при инкассации! При наличных такое невозможно, может при операциях с "Плат. карта" такое возможно?
Допустим вчера отбили чек на 100, и возвратный чек на 20. Получили остаток Сумма = 100, СуммаВозврат = 20. Сделали инкассацию: изъяли 80. А сегодня смотрим остаток: Сумма = (100 - 80), СуммаВозврат = 20!? Сегодня чеков еще не отбивали.
2 Mikhail Volkov
 
11.04.18
16:23
Мне вообще не понятны эти условия КассыККМ.Сумма > 0 и КассыККМ.Сумма < 0 в тексте запроса к регистру остатков!? КассыККМ.Сумма - это накопленный ресурс на определенный момент времени, это же не измерения КассаККМ или СпособОплаты. Или это ОстаткиИОбороты?
3 Mikhail Volkov
 
12.04.18
07:10
Кажется разобрался: изъятие по "Плат. карта" проводится по кассе двумя строками: отдельно Сумма, отдельно -СуммаВозврат. Это изъятие наличных общей строкой: Сумма - СуммаВозврат.