Работая с типовой конфигурацией Розница 2, часто слышал жалобы работников на предупреждение о контроле 24 часа при пробитии чеков и закрытии смены. Данное предупреждение разумеется не является ошибкой, а скорее требование закона, какого именно я вас не скажу, так как не знаю. Однако требование было высказано, а соответственно исполнять его надо.
Решение как и всегда когда дело имеем с типовыми конфигурациями оказалось достаточно простое. После недолгой отладки выяснилось, что проверка на на время закрытия выполняется в общем модуле РозничныеПродажиСервер в процедуре СменаОткрыта .
Соответственно переносим данный модуль в Расширение конфигурации и переопределяем нашу требуемую функцию. Код следующий
<code>&Вместо("СменаОткрыта") Функция Расш1_СменаОткрыта(КассоваяСмена, Дата, ОписаниеОшибки = "") Экспорт СменаОткрыта = Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | КассоваяСмена.Статус КАК СтатусКассовойСмены, | КассоваяСмена.НачалоКассовойСмены КАК НачалоКассовойСмены, | КассоваяСмена.ОкончаниеКассовойСмены КАК ОкончаниеКассовойСмены |ИЗ | Документ.КассоваяСмена КАК КассоваяСмена |ГДЕ | КассоваяСмена.Проведен | И КассоваяСмена.Ссылка = &КассоваяСмена"; Запрос.УстановитьПараметр("КассоваяСмена", КассоваяСмена); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда Если Выборка.СтатусКассовойСмены = Перечисления.СтатусыКассовойСмены.Открыта Тогда // Если смена открыта, то с момента открытия должно пройти не больше чем 24 часа. //Если Дата - Выборка.НачалоКассовойСмены < 86400 Тогда СменаОткрыта = Истина; //Иначе // // ОписаниеОшибки = НСтр("ru = 'С момента открытия кассовой смены истекло более 24 часов.'"); // СменаОткрыта = Ложь; // //КонецЕсли; ИначеЕсли ЗначениеЗаполнено(Выборка.СтатусКассовойСмены) Тогда Если Выборка.ОкончаниеКассовойСмены >= Дата И Выборка.НачалоКассовойСмены <= Дата Тогда СменаОткрыта = Истина; Иначе ОписаниеОшибки = НСтр("ru = 'Кассовая смена закрыта.'"); СменаОткрыта = Ложь; КонецЕсли; КонецЕсли; Иначе ОписаниеОшибки = НСтр("ru = 'Кассовая смена не открыта.'"); СменаОткрыта = Ложь; КонецЕсли; Возврат СменаОткрыта; КонецФункции </code>
upd от 14.08.2019.
Для полноценной работы нужно еще переопределить процедуру СтатусПоследнейСмены в Общем модуле КассовыеСменыВызовСервера. Переопределяем конечно через расширение.
<code>&Вместо("СтатусПоследнейСмены") Функция Расш1_СтатусПоследнейСмены(ФискальноеУстройство) Экспорт РезультатОперации = Новый Структура(); РезультатОперации.Вставить("Активна", Ложь); РезультатОперации.Вставить("Открыта", Ложь); РезультатОперации.Вставить("ТекущийНомерЧека"); РезультатОперации.Вставить("НомерСмены"); РезультатОперации.Вставить("КассоваяСмена"); ОписаниеПоследнейСмены = ОписаниеПоследнейКассовойСмены(ФискальноеУстройство); Если Не (ОписаниеПоследнейСмены = Неопределено) Тогда РезультатОперации.Открыта = ОписаниеПоследнейСмены.Статус = Перечисления.СтатусыКассовойСмены.Открыта; РезультатОперации.Активна = РезультатОперации.Открыта; РезультатОперации.ТекущийНомерЧека = ПолучитьТекущийНомерЧекаККТ(ФискальноеУстройство, ОписаниеПоследнейСмены.КассоваяСмена); РезультатОперации.КассоваяСмена = ОписаниеПоследнейСмены.КассоваяСмена; РезультатОперации.НомерСмены = ОписаниеПоследнейСмены.КассоваяСмена.Номер; КонецЕсли; Возврат РезультатОперации; КонецФункции </code>