Проблема длительного закрытия кассовой смены в 1С:Розница (редакции 2.2 и 2.3) — одна из самых частых жалоб кассиров и системных администраторов. Процесс, который должен занимать не более минуты, растягивается на 20, 30, а иногда и более минут. Это происходит даже при небольшом количестве чеков за день. Проанализируем ситуацию и разберем по шагам, почему это происходит и как вернуть программе былую скорость.
Прежде чем приступать к исправлению, давайте разберем по шагам, что именно делает программа в момент нажатия кнопки «Закрыть смену». Основная нагрузка ложится на процедуру ОбработатьДокументыККМСервер обработки ЗакрытиеКассовойСмены. В этот момент система выполняет несколько тяжелых задач:
Как показывает практика и замеры производительности, основной тормоз кроется в запросах к базе данных. Проблема в том, что стандартный алгоритм 1С зачастую просматривает все чеки за всю историю работы магазина, у которых не проставлен статус «Архивный», или даже просто выполняет неоптимальное соединение таблиц товаров и оплат без ограничения по дате.
Это самый эффективный метод. Мы изменим логику запроса так, чтобы программа анализировала документы не за все годы, а только за последние несколько дней. Рассмотрим, как это реализовать. Нам нужно перехватить выполнение процедуры в расширении и добавить параметр НачалоИнтервала.
Посмотрим на пример кода, который можно внедрить в расширение для ограничения анализа данных (например, за последние 3 дня):
&НаСервере
Процедура Оптимизированная_ОбработатьДокументыККМСервер()
// Устанавливаем границу поиска чеков
ОдинДень = 24 * 60 * 60;
ПроверятьЧекиСДаты = НачалоДня(ТекущаяДата()) - (ОдинДень * 3);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЧекККМ.Ссылка КАК Ссылка
|ИЗ
| Документ.ЧекККМ КАК ЧекККМ
|ГДЕ
| ЧекККМ.Дата >= &НачалоИнтервала
| И ЧекККМ.КассаККМ = &КассаККМ
| И ЧекККМ.Проведен";
Запрос.УстановитьПараметр("НачалоИнтервала", ПроверятьЧекиСДаты);
Запрос.УстановитьПараметр("КассаККМ", Объект.КассаККМ);
// Дальнейшая логика обработки...
КонецПроцедуры
Использование НачалоДня и вычитание нескольких дней позволяет подстраховаться на случай, если смена переходит через полночь или не закрывалась пару дней.
В некоторых релизах 1С:Розница был обнаружен крайне тяжелый запрос в переменной ЗапросСуммаОплатыНаличных. Проанализируем ситуацию: когда таблица Документ.ЧекККМ.Оплата разрастается до сотен тысяч записей, левое соединение с таблицей товаров без фильтра по дате начинает «вешать» сервер. Рассмотрим подробнее исправленный вариант запроса, который значительно ускоряет процесс:
// Заменяем стандартный текст запроса на оптимизированный
ЗапросСуммаОплатыНаличных.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЧекККМОплата.Ссылка КАК Ссылка,
| ЧекККМОплата.ДоговорПлатежногоАгента КАК ДоговорПлатежногоАгента
|ПОМЕСТИТЬ ТаблицаЧековСОплатойНаличными
|ИЗ
| Документ.ЧекККМ.Оплата КАК ЧекККМОплата
|ГДЕ
| ЧекККМОплата.Ссылка.КассаККМ = &КассаККМ
| И ЧекККМОплата.Ссылка.Проведен
| И НЕ ЧекККМОплата.Ссылка.СтатусЧекаККМ = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Архивный)
| И НЕ ЧекККМОплата.Ссылка.СтатусЧекаККМ = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Аннулированный)
| И ЧекККМОплата.ВидОплаты = &Наличные
|;
|// ... (дальнейший текст запроса с использованием временной таблицы ТаблицаЧековСОплатойНаличными)";
Важный момент: Использование временных таблиц (ПОМЕСТИТЬ) позволяет базе данных сначала отобрать нужные документы по кассе и статусу, а уже потом соединять их с суммами, что в десятки раз быстрее прямого соединения гигантских таблиц.
Если вы не хотите менять код программы, можно пойти путем администрирования данных. Часто смена закрывается долго, потому что в базе накопилось много чеков, которые не получили статус «Архивный» из-за сбоев или ошибок связи. Выясним причину их появления и устраним их:
Статус — оставьте только пустые или «Пробитый».chdbfl.exe или «Тестирование и исправление» (пункт «Сжатие таблиц информационной базы»).Помните, что в файловом режиме база .1CD не уменьшается в размере автоматически при удалении записей, поэтому процедура сжатия обязательна для восстановления индексации и скорости.
Если магазин торгует алкоголем, 1С при закрытии смены проверяет реквизиты номенклатуры. Иногда после обновления конфигурации реквизит ОсобенностьУчета оказывается не заполнен, что заставляет систему выполнять дополнительные проверки. Разберем, как это исправить массово:
Номенклатура.АлкогольнаяПродукция = Да И ОсобенностьУчета = Пусто.ОсобенностьУчета в «Алкогольная (спиртосодержащая) продукция».Помимо программных методов, проанализируем техническую часть. Часто 1С «зависает», ожидая ответа от кассового аппарата или драйвера:
*.1CD и папку с базой 1С в исключения антивируса и «Защитника Windows». При закрытии смены создается много временных файлов, и их сканирование замедляет процесс.Подведем итог: Если смена в «1С:Розница» начала закрываться долго, первым делом проверьте количество архивных чеков и примените расширение, ограничивающее дату анализа документов. В 90% случаев это сокращает время ожидания с 20 минут до 1–2 минут.