В данной статье поднимается вопрос про кассовую дисциплину, а в частности про лимиты денежных средств в кассе при розничной торговле. Поэтому в первую очередь немного раскроем тему «что это такое и что за это будет», а во второй части рассмотрим один из вариантов автоматизации данной проблемы для того, чтобы ее не у кого не возникало.
Лимит кассы — это максимальная сумма наличных, которая может оставаться в кассе в конце рабочего дня и переноситься на начало следующего. Этот лимит устанавливается руководителем компании и зависит от определенных условий. Превышать этот «порог» запрещено, однако сумма может быть меньше установленного лимита.
Это касается средних и крупных компаний. Согласно правилам Банка России (согласно пункту 2 Указаний Банка России №3210-У от 11 марта 2014 года), индивидуальные предприниматели и малый бизнес не обязаны устанавливать лимит кассы, но могут сделать это по своему желанию.
При нарушении лимитов кассы предприятие несет административную ответственность в виде штрафов. Их размеры утверждены ст. 15.1 КоАП РФ.
При выявлении превышение лимитов, выписывает штраф:
- от 4 до 5 тыс. руб. на должностное лицо;
- от 20 до 25 тыс. руб. на малое предприятие;
- от 40 до 50 тыс. руб. на юридических лиц.
Таким образом, следует обратить внимание на превышение кассовых лимитов сотрудниками розничной торговли. Для того, чтобы не держать всю информацию в голове по текущим лимитам и для своевременного, эффективного исполнения указов по ведению кассовых операций и исключению получения штрафов за вышеописанные нарушения, появилась идея сделать доработки в базе «Розница 2.3».
В чем суть доработок? Суть заключается в том, чтобы в программе установить для каждого магазина свой лимит денежных средств, а также установить минимальный порог денежных средств, который необходимо контролировать. Грубо говоря…У нас, есть «Магазин - 1», максимальный лимит по кассе у него будет «10000», а вот порог для контроля у него будет допустим «2000». Таким образом если в кассе будет достигнут порог 8000 тогда пользователю будет приходить уведомление о том, что ему необходимо сдать денежные средства. Уведомление допустим будет появляться каждый раз, когда пользователь входит в РМК (рабочее место кассира).
Итак, что нам необходимо сделать!
Во-первых, необходимо добавить в расширение новый «Регистр сведений». Назовем его «Лимиты по кассе». Сделаем его периодическим в пределах одного года (так как обычно лимиты устанавливаются на год, но при необходимости периодичность можно сделать на свой выбор). Далее нам необходимо создать следующие реквизиты: Измерение: «Магазин» с типом данных «Справочники.Магазины», Ресурсы: «Лимит» с типом «Число», Реквизиты: «Минимальный лимит». На этом работа с регистром сведений закончена. Так же лучше создать «Константу» по которой будем включать или выключать данный функционал. Давайте так и сделаем. Создаем константу с названием «АнализЛимитовПоКассе», тип у нее будет «Булево».
Так как у нас оповещение пользователя будет происходить при открытии окна РМК (рабочее место кассира), то давайте добавим в расширение процедуру «ПриОткрытии» в которой вызовем исполнение процедуры проверки лимитов. Назовем процедуру «ПроверкаДоступныхЛимитовПоКассе()»
&НаКлиенте
Процедура Расширение1_ПриОткрытииПосле(Отказ)
ПроверкаДоступныхЛимитовПоКассе();
КонецПроцедуры
В процедуре «ПроверкаДоступныхЛимитовПоКассе()» необходимо определить следующей алгоритм. Который будет получать данные по наличю денежных средств в кассе и кассе ККТ текущего магазина и при приближении к данным лимитам как и говорилась выше вводится некое предупреждение пользователю.
&НаКлиенте
Процедура ПроверкаДоступныхЛимитовПоКассе()
// Получаем структуру, которая содержит информацию
// по денежным средствам. Если лимиты не достигнуты, то оповещения выполнено не будет
СтруктураОтвета = ПроверкаДоступныхЛимитовПоКассеСервер();
Если СтруктураОтвета = Неопределено Тогда
Возврат;
КонецЕсли;
// Формируем сообщение пользователю (можно конечно через шаблон, но для наглядности пусть будет так)
//
ТекстСообщения = Новый ФорматированнаяСтрока("ВЫ ПРИБЛИЗИЛИСЬ К ЛИМИТУ, НЕОБХОДИМО СДАТЬ ВЫРУЧКУ!" + Символы.ПС +
"Остаток по кассе: " + СтруктураОтвета.ОбщийОстаткокДенежныхСредствВКассе + Символы.ПС +
"Остаток по кассе ККТ: " + СтруктураОтвета.ОбщийОстаткокДенежныхСредствВКассеККТ + Символы.ПС +
"Остаток общий: " + (СтруктураОтвета.ОбщийОстаткокДенежныхСредствВКассеККТ + СтруктураОтвета.ОбщийОстаткокДенежныхСредствВКассе) + Символы.ПС +
"Общий лимит по кассе: " + СтруктураОтвета.ОбщийЛимитПоКассе);
// Выводим сообщение пользователю
ОписаниеОповещения = Новый ОписаниеОповещения("ПредупрежедениеЗавершение",ЭтаФорма);
ПоказатьПредупреждение(ОписаниеОповещения, ТекстСообщения,, "Кассовые лимиты");
КонецПроцедуры
&НаСервере
Функция ПроверкаДоступныхЛимитовПоКассеСервер()
// Установка привилегированного режима
// Это для выполнения запроса, чтобы не давать права пользователям,
// можно конечно создать роли (по хорошему) и установить каждому пользователя свои права доступа
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДенежныеСредстваНаличныеОстатки.Магазин КАК Магазин,
| ДенежныеСредстваНаличныеОстатки.Касса КАК Касса,
| ЕСТЬNULL(ДенежныеСредстваНаличныеОстатки.СуммаОстаток, 0) КАК СуммаОстатокКасса
|ИЗ
| РегистрНакопления.ДенежныеСредстваНаличные.Остатки(, Магазин = &Магазин) КАК ДенежныеСредстваНаличныеОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДенежныеСредстваККМОстатки.КассаККМ КАК КассаККМ,
| ЕСТЬNULL(ДенежныеСредстваККМОстатки.СуммаОстаток, 0) КАК СуммаОстатокККТ
|ИЗ
| РегистрНакопления.ДенежныеСредстваККМ.Остатки(, КассаККМ = &КассаККМ) КАК ДенежныеСредстваККМОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЛимитПоКассеСрезПоследних.Магазин КАК Магазин,
| ЕСТЬNULL(ЛимитПоКассеСрезПоследних.Лимит, 0) КАК Лимит,
| ЛимитПоКассеСрезПоследних.МинимальныйЛимит КАК МинимальныйЛимит
|ИЗ
| РегистрСведений.ЛимитПоКассе.СрезПоследних КАК ЛимитПоКассеСрезПоследних
|ГДЕ
| ЛимитПоКассеСрезПоследних.Магазин = &Магазин";
Запрос.УстановитьПараметр("Магазин", Объект.Магазин);
Запрос.УстановитьПараметр("КассаККМ", ТекущаяКассаККМ);
РезультатЗапроса = Запрос.ВыполнитьПакет();
СуммаОстатокКасса = РезультатЗапроса[0].Выгрузить();
СуммаОстатокККТ = РезультатЗапроса[1].Выгрузить();
ЛимитПоКассе = РезультатЗапроса[2].Выгрузить();
АнализироватьЛитимы = Константы.АнализЛимитовПоКассе.Получить();
УстановитьПривилегированныйРежим(Ложь);
// Тут у нас сумма остатка в кассе по магазину
//////////////////////////////////////////////////////////////////////////////////////////////////////
Если СуммаОстатокКасса.Количество() = 0 Тогда
ОбщийОстаткокДенежныхСредствВКассе = 0;
Иначе
ОбщийОстаткокДенежныхСредствВКассе = СуммаОстатокКасса[0].СуммаОстатокКасса;
КонецЕсли;
// Тут у нас сумма остатка в кассе ККТ по подключенной кассе
//////////////////////////////////////////////////////////////////////////////////////////////////////
Если СуммаОстатокККТ.Количество() = 0 Тогда
ОбщийОстаткокДенежныхСредствВКассеККТ = 0 ;
Иначе
ОбщийОстаткокДенежныхСредствВКассеККТ = СуммаОстатокККТ[0].СуммаОстатокККТ;
КонецЕсли;
// Тут у нас установленные лимиты по магазину ну и расчеты
//////////////////////////////////////////////////////////////////////////////////////////////////////
Если ЛимитПоКассе.Количество() = 0 Тогда
ОбщийЛимитПоКассе = 0;
МинимальныйЛимит = 0;
Иначе
ОбщийЛимитПоКассе = ЛимитПоКассе[0].Лимит;
МинимальныйЛимит = ЛимитПоКассе[0].МинимальныйЛимит;
КонецЕсли;
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Тут проверяем, а точнее проверяем условие по которому у нас появляется оповещение пользователя
Если (ОбщийОстаткокДенежныхСредствВКассе + ОбщийОстаткокДенежныхСредствВКассеККТ) > (ОбщийЛимитПоКассе - МинимальныйЛимит) И АнализироватьЛитимы Тогда
Возврат Новый Структура("ОбщийОстаткокДенежныхСредствВКассе, ОбщийОстаткокДенежныхСредствВКассеККТ, ОбщийЛимитПоКассе",
ОбщийОстаткокДенежныхСредствВКассе, ОбщийОстаткокДенежныхСредствВКассеККТ, ОбщийЛимитПоКассе);
Иначе
Возврат Неопределено
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ПредупрежедениеЗавершение(Параметры) Экспорт
// При необходимости, но в данном случае необходимости нет
КонецПроцедуры
Теперь все сохраняем, и можно запускать. Как выше было написано, для использования функционала необходимо включить константу «АнализЛимитовПоКассе». Поэтому первым делом нам необходимо это сделать. Далее проставляем в регистре сведений необходимые лимиты по кассе и магазин. В данном примере нет ролей на регистр, от слова совсем, хотя чисто теоретически, а точнее правильно было-бы это сделать. В принципе при реализации решения можно это предусмотреть, чтобы в дальнейшем можно было назначит ответственного за заполнение актуальных данных. В данном примере заполнение данных осуществляется с помощью дополнительной обработки, которая заполняет регистр лимитов через внешний файл. Поэтому реализация дополнительных прав не потребовалось. На этом все, настройка закончена, можно пользоваться.
Стоит заметить, что, конечно можно более усовершенствовать данный механизм. Например: добавить в регистр отборы по организации. Так же можно сделать это регламентным заданием или даже бизнес - процессом с оповещением пользователей в задачи. Так же можно добавить отправку предупреждения на электронную почту, в мессенджеры различные и много куда еще (при необходимости). Тут уже как говорится может делать так как он хочет, не чего сложного тут как такового нет. По-хорошему при достижении определенного лимита надо установить полный запрет на дальнейшею реализацию каких-либо товаров или услуг, но тут уже каждый решает сам.
Таким образом небольшая доработка позволяет избежать больших проблем в исполнении кассовой дисциплины, в том числе позволяет разгрузить сотрудников розничной торговли от сложных подсчетов по остатку денежных средств в кассе. Конечно, это не защитит от человеческого фактора или просто игнорирования данных предупреждений, но тут опять поможет только полный запрет на продажу. Доработка делалась для «Розницы 2.3», а именно для старого РМК (рабочее место кассира). При необходимости можно всегда доработать под разные конфигурации.
На всякий случай прикрепляю мини инструкцию по расчету кассовых лимитов
1. Расчет лимита кассы: по выручке
Первый способ основан на показателях фактической или планируемой выручки организации. Он подойдет тем, кто продает товары или оказывает услуги за наличный расчет. В этом случае формула лимита кассы будет вот такая:
Лимит = Выручка / Расчетный период * Дни
Расчетный период составляет не более 92 рабочих дней компании. Выбирать его можно произвольно, учитывая, например, сезонность или продажи поступления прошлых лет.
Дни — это число рабочих дней между датами сдачи денег в банк, продолжительность этого периода должна быть не более 7 дней, а в местностях, где нет банка — не более 14.
2. Расчет лимита кассы: по объему выдачи наличных
Второй способ подходит больше тем, кто в основном пользуется наличными деньгами для оплаты покупок или услуг. Формула лимита кассы будет основана на объеме выдачи наличных:
Лимит = Выдача / Расчетный период * Дни
Опять-таки информации по данной теме достаточно много в интернете, поэтому все-таки лучше руководствоваться официальными данными, так как периодически все меняется. Поэтому лучше использовать специализированные ресурсы которые постоянно актуализируют информацию.
Тестирование проводилось:
- Платформа: 1С:Предприятие 8.3 (8.3.25.1374)
- Конфигурация: Розница, редакция 2.3 (2.3.20.28)