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