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