Ошибка в ИНКАСАЦИИ при «Закрытии Кассовой смены (если есть ПКО).
Ситуация:
1.Делаем «ЧЕК» на сумму 100р.-> В регистр «КассыККМ», записываем 100р. и в фискальную память ФР записываем 100р.
2.Делаем ПКО на сумму 100р. с признаком оплаты через ФР, ->В регистр «ДенежныеСредстваКомпании» и фискальную память ФР записываем 100р.
3. Делаем штатную обработку «Закрытие Кассовой Смены», при этом в 19 релизе выдается предупреждение о расхождении сумм в фискальной памяти ФР (200р.) и Наличности в ККМ (100р.). Выбираем «Закрыть Смену». Получаем документ инкассации который списывает с регистра «КассыККМ» 200р. В результате имеем отрицательные остатки по кассе.
Предлагаю :
Выбрать сумму всех ПКО пробитые через этот ФР, исключить из инкассации, при этом как вариант я их еще показываю в форме «НепроведенныеДокументы»
// Получаем номер последней смены из ФР
//Находим все ПКО в этой смене и интервале дат
//Итоговую сумма всех этих ПКО сохраняем что бы потом вычеть из суммы инкасации
Функция ПроверитьРасхожденияСуммПК(ДатаНачала, ДатаКонца, НепроведенныеДокументы)
Состояние("Проверка расхождения сумм c ПКО...");
ТаймаутФР = 60;
Результат = Истина;
СуммаПКО = 0;
Если ДатаНачала=Неопределено Тогда
ДатаНачала = НачалоДня(ДатаКонца);
Предупреждение("Не смогли определить дату предыдущего Z-Отчета, Проверьте правильность документа ИНКАСАЦИИ", 10, "Внимание!")
КонецЕсли;
Для Каждого ФР Из Оборудование Цикл
Если НЕ ФР.Использовать Тогда
Продолжить;
КонецЕсли;
ТекФР = ФР.Оборудование;
Если ТекФР = Неопределено Тогда
Продолжить;
КонецЕсли;
//Получаем данные о Последнем номере смены из ФР
Если СтатусыОборудования[ТекФР]<>Перечисления.СтатусыОборудования.Включено Тогда Продолжить; КонецЕсли;
GUID_ФР = ТекФР.ИдентификаторОборудования;
SafeArrayПоследнийДокумент=Рарус_Компонента.СоздатьПараметры(,);
КодОшибки=Рарус_Компонента.ЗаказатьВыполнениеДействияСинхронно(GUID_ФР,"ПоследнийДокумент",SafeArrayПоследнийДокумент,ТаймаутФР);
Если НЕ КодОшибки = 0 Тогда
Если Вопрос("Ошибка при получении статуса оборудования "+ТекФР+"
|Проверка расхождения сумм ПКО на этом ФР не может быть выполнена.
|Продолжить закрытие кассовой смены?0",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Возврат Неопределено;
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;
Попытка
SafeArrayПоследнийДокументРеквизиты=SafeArrayПоследнийДокуме нт.GetValue(2,0);
Попытка
ПоследнийНомерСмены=Число(SafeArrayПоследнийДокументРеквизиты.GetValue(0,0));
Исключение
ПоследнийНомерСмены=-1;
Если Вопрос("Ошибка при получении статуса оборудования "+ТекФР+"
|Проверка расхождения сумм ПКО на этом ФР не может быть выполнена.
|Продолжить закрытие кассовой смены?1",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Возврат Неопределено;
Иначе
Продолжить;
КонецЕсли;
КонецПопытки;
Исключение
ПоследнийНомерСмены=-1;
Если Вопрос("Ошибка при получении статуса оборудования "+ТекФР+"
|Проверка расхождения сумм ПКО на этом ФР не может быть выполнена.
|Продолжить закрытие кассовой смены?2",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Возврат Неопределено;
Иначе
Продолжить;
КонецЕсли;;
КонецПопытки;
Если НЕ(ПоследнийНомерСмены = -1) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриходныйКассовыйОрдер.Ссылка Как ДокПКО,
| ПриходныйКассовыйОрдер.Представление,
| ПриходныйКассовыйОрдер.Проведен,
| ПриходныйКассовыйОрдер.СуммаДокумента КАК СуммаДокумента,
| ПриходныйКассовыйОрдер.НомерЧека КАК НомерЧека,
| ПриходныйКассовыйОрдер.ДатаФР КАК ДатаФР,
| ПриходныйКассовыйОрдер.НомерДокумента КАК НомерДокумента,
| ПриходныйКассовыйОрдер.НомерСмены КАК НомерСмены,
| ПриходныйКассовыйОрдер.ДляПробитияНаФР КАК ДляПробитияНаФР
|ИЗ
| Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
|ГДЕ
| ПриходныйКассовыйОрдер.Проведен = &Проведен
| И ПриходныйКассовыйОрдер.ДатаФР Между &ДатаНачала И &ДатаКонца
| И ПриходныйКассовыйОрдер.НомерСмены = &НомерСмены
|ИТОГИ
| СУММА(СуммаДокумента)
|ПО
| ОБЩИЕ";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКонца", ДатаКонца);
Запрос.УстановитьПараметр("НомерСмены", ПоследнийНомерСмены);
Запрос.УстановитьПараметр("Проведен", Истина);
Результат = Запрос.Выполнить();
ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаОбщийИтог.Следующий(); // Общий итог
Если НЕ(ВыборкаОбщийИтог.СуммаДокумента = Неопределено) Тогда
СуммаПКО = СуммаПКО + ВыборкаОбщийИтог.СуммаДокумента;
КонецЕсли;
ВыборкаСуммаДокумента = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСуммаДокумента.Следующий() Цикл
НоваяСтрока = НепроведенныеДокументы.Добавить();
НоваяСтрока.Флаг = Ложь;
НоваяСтрока.Документ = ВыборкаСуммаДокумента.ДокПКО;
НоваяСтрока.Сумма = ВыборкаСуммаДокумента.СуммаДокумента;
КонецЦикла;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Возврат СуммаПКО;
КонецФункции // ПроверитьРасхожденияСуммПК
Что бы суммы в ФР не накапливались в настройках самого ФР, обязательно ставить признак обнулять наличность при Z-отчете, тогда в Z-Отчете, бухгалтер увидит только сумму чеков пробитых через ПКО, а все остальные суммы в виде выплат. Желательно что бы еще это работало и если чеков нет, а есть только документ «ЧЕК на Оплату»
Ситуация:
1.Делаем «ЧЕК» на сумму 100р.-> В регистр «КассыККМ», записываем 100р. и в фискальную память ФР записываем 100р.
2.Делаем ПКО на сумму 100р. с признаком оплаты через ФР, ->В регистр «ДенежныеСредстваКомпании» и фискальную память ФР записываем 100р.
3. Делаем штатную обработку «Закрытие Кассовой Смены», при этом в 19 релизе выдается предупреждение о расхождении сумм в фискальной памяти ФР (200р.) и Наличности в ККМ (100р.). Выбираем «Закрыть Смену». Получаем документ инкассации который списывает с регистра «КассыККМ» 200р. В результате имеем отрицательные остатки по кассе.
Предлагаю :
Выбрать сумму всех ПКО пробитые через этот ФР, исключить из инкассации, при этом как вариант я их еще показываю в форме «НепроведенныеДокументы»
// Получаем номер последней смены из ФР
//Находим все ПКО в этой смене и интервале дат
//Итоговую сумма всех этих ПКО сохраняем что бы потом вычеть из суммы инкасации
Функция ПроверитьРасхожденияСуммПК(ДатаНачала, ДатаКонца, НепроведенныеДокументы)
Состояние("Проверка расхождения сумм c ПКО...");
ТаймаутФР = 60;
Результат = Истина;
СуммаПКО = 0;
Если ДатаНачала=Неопределено Тогда
ДатаНачала = НачалоДня(ДатаКонца);
Предупреждение("Не смогли определить дату предыдущего Z-Отчета, Проверьте правильность документа ИНКАСАЦИИ", 10, "Внимание!")
КонецЕсли;
Для Каждого ФР Из Оборудование Цикл
Если НЕ ФР.Использовать Тогда
Продолжить;
КонецЕсли;
ТекФР = ФР.Оборудование;
Если ТекФР = Неопределено Тогда
Продолжить;
КонецЕсли;
//Получаем данные о Последнем номере смены из ФР
Если СтатусыОборудования[ТекФР]<>Перечисления.СтатусыОборудования.Включено Тогда Продолжить; КонецЕсли;
GUID_ФР = ТекФР.ИдентификаторОборудования;
SafeArrayПоследнийДокумент=Рарус_Компонента.СоздатьПараметры(,);
КодОшибки=Рарус_Компонента.ЗаказатьВыполнениеДействияСинхронно(GUID_ФР,"ПоследнийДокумент",SafeArrayПоследнийДокумент,ТаймаутФР);
Если НЕ КодОшибки = 0 Тогда
Если Вопрос("Ошибка при получении статуса оборудования "+ТекФР+"
|Проверка расхождения сумм ПКО на этом ФР не может быть выполнена.
|Продолжить закрытие кассовой смены?0",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Возврат Неопределено;
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;
Попытка
SafeArrayПоследнийДокументРеквизиты=SafeArrayПоследнийДокуме
Попытка
ПоследнийНомерСмены=Число(SafeArrayПоследнийДокументРеквизиты.GetValue(0,0));
Исключение
ПоследнийНомерСмены=-1;
Если Вопрос("Ошибка при получении статуса оборудования "+ТекФР+"
|Проверка расхождения сумм ПКО на этом ФР не может быть выполнена.
|Продолжить закрытие кассовой смены?1",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Возврат Неопределено;
Иначе
Продолжить;
КонецЕсли;
КонецПопытки;
Исключение
ПоследнийНомерСмены=-1;
Если Вопрос("Ошибка при получении статуса оборудования "+ТекФР+"
|Проверка расхождения сумм ПКО на этом ФР не может быть выполнена.
|Продолжить закрытие кассовой смены?2",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Возврат Неопределено;
Иначе
Продолжить;
КонецЕсли;;
КонецПопытки;
Если НЕ(ПоследнийНомерСмены = -1) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриходныйКассовыйОрдер.Ссылка Как ДокПКО,
| ПриходныйКассовыйОрдер.Представление,
| ПриходныйКассовыйОрдер.Проведен,
| ПриходныйКассовыйОрдер.СуммаДокумента КАК СуммаДокумента,
| ПриходныйКассовыйОрдер.НомерЧека КАК НомерЧека,
| ПриходныйКассовыйОрдер.ДатаФР КАК ДатаФР,
| ПриходныйКассовыйОрдер.НомерДокумента КАК НомерДокумента,
| ПриходныйКассовыйОрдер.НомерСмены КАК НомерСмены,
| ПриходныйКассовыйОрдер.ДляПробитияНаФР КАК ДляПробитияНаФР
|ИЗ
| Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
|ГДЕ
| ПриходныйКассовыйОрдер.Проведен = &Проведен
| И ПриходныйКассовыйОрдер.ДатаФР Между &ДатаНачала И &ДатаКонца
| И ПриходныйКассовыйОрдер.НомерСмены = &НомерСмены
|ИТОГИ
| СУММА(СуммаДокумента)
|ПО
| ОБЩИЕ";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКонца", ДатаКонца);
Запрос.УстановитьПараметр("НомерСмены", ПоследнийНомерСмены);
Запрос.УстановитьПараметр("Проведен", Истина);
Результат = Запрос.Выполнить();
ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаОбщийИтог.Следующий(); // Общий итог
Если НЕ(ВыборкаОбщийИтог.СуммаДокумента = Неопределено) Тогда
СуммаПКО = СуммаПКО + ВыборкаОбщийИтог.СуммаДокумента;
КонецЕсли;
ВыборкаСуммаДокумента = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСуммаДокумента.Следующий() Цикл
НоваяСтрока = НепроведенныеДокументы.Добавить();
НоваяСтрока.Флаг = Ложь;
НоваяСтрока.Документ = ВыборкаСуммаДокумента.ДокПКО;
НоваяСтрока.Сумма = ВыборкаСуммаДокумента.СуммаДокумента;
КонецЦикла;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Возврат СуммаПКО;
КонецФункции // ПроверитьРасхожденияСуммПК
Что бы суммы в ФР не накапливались в настройках самого ФР, обязательно ставить признак обнулять наличность при Z-отчете, тогда в Z-Отчете, бухгалтер увидит только сумму чеков пробитых через ПКО, а все остальные суммы в виде выплат. Желательно что бы еще это работало и если чеков нет, а есть только документ «ЧЕК на Оплату»