Почему в 1С:Розница долго закрывается смена и как это исправить

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

Проблема длительного закрытия кассовой смены в 1С:Розница (редакции 2.2 и 2.3) — одна из самых частых жалоб кассиров и системных администраторов. Процесс, который должен занимать не более минуты, растягивается на 20, 30, а иногда и более минут. Это происходит даже при небольшом количестве чеков за день. Проанализируем ситуацию и разберем по шагам, почему это происходит и как вернуть программе былую скорость.

Выясняем причину зависания программы

Прежде чем приступать к исправлению, давайте разберем по шагам, что именно делает программа в момент нажатия кнопки «Закрыть смену». Основная нагрузка ложится на процедуру ОбработатьДокументыККМСервер обработки ЗакрытиеКассовойСмены. В этот момент система выполняет несколько тяжелых задач:

  1. Анализирует все чеки ККМ со статусом, отличным от «Архивный», для формирования документа «Отчет о розничных продажах».
  2. Рассчитывает суммы наличных и безналичных оплат.
  3. Проверяет остатки алкогольной продукции и формирует акты списания ЕГАИС.
  4. Взаимодействует с драйвером ККТ для печати Z-отчета.

Как показывает практика и замеры производительности, основной тормоз кроется в запросах к базе данных. Проблема в том, что стандартный алгоритм 1С зачастую просматривает все чеки за всю историю работы магазина, у которых не проставлен статус «Архивный», или даже просто выполняет неоптимальное соединение таблиц товаров и оплат без ограничения по дате.

Решение 1: Ограничение выборки чеков через расширение

Это самый эффективный метод. Мы изменим логику запроса так, чтобы программа анализировала документы не за все годы, а только за последние несколько дней. Рассмотрим, как это реализовать. Нам нужно перехватить выполнение процедуры в расширении и добавить параметр НачалоИнтервала.

Посмотрим на пример кода, который можно внедрить в расширение для ограничения анализа данных (например, за последние 3 дня):


&НаСервере
Процедура Оптимизированная_ОбработатьДокументыККМСервер()
    // Устанавливаем границу поиска чеков
    ОдинДень = 24 * 60 * 60;
    ПроверятьЧекиСДаты = НачалоДня(ТекущаяДата()) - (ОдинДень * 3);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ЧекККМ.Ссылка КАК Ссылка
        |ИЗ
        |   Документ.ЧекККМ КАК ЧекККМ
        |ГДЕ
        |   ЧекККМ.Дата >= &НачалоИнтервала
        |   И ЧекККМ.КассаККМ = &КассаККМ
        |   И ЧекККМ.Проведен";
    
    Запрос.УстановитьПараметр("НачалоИнтервала", ПроверятьЧекиСДаты);
    Запрос.УстановитьПараметр("КассаККМ", Объект.КассаККМ);
    // Дальнейшая логика обработки...
КонецПроцедуры

Использование НачалоДня и вычитание нескольких дней позволяет подстраховаться на случай, если смена переходит через полночь или не закрывалась пару дней.

Решение 2: Оптимизация запроса расчета наличных

В некоторых релизах 1С:Розница был обнаружен крайне тяжелый запрос в переменной ЗапросСуммаОплатыНаличных. Проанализируем ситуацию: когда таблица Документ.ЧекККМ.Оплата разрастается до сотен тысяч записей, левое соединение с таблицей товаров без фильтра по дате начинает «вешать» сервер. Рассмотрим подробнее исправленный вариант запроса, который значительно ускоряет процесс:


// Заменяем стандартный текст запроса на оптимизированный
ЗапросСуммаОплатыНаличных.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЧекККМОплата.Ссылка КАК Ссылка,
| ЧекККМОплата.ДоговорПлатежногоАгента КАК ДоговорПлатежногоАгента
|ПОМЕСТИТЬ ТаблицаЧековСОплатойНаличными
|ИЗ
| Документ.ЧекККМ.Оплата КАК ЧекККМОплата
|ГДЕ
| ЧекККМОплата.Ссылка.КассаККМ = &КассаККМ
| И ЧекККМОплата.Ссылка.Проведен
| И НЕ ЧекККМОплата.Ссылка.СтатусЧекаККМ = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Архивный)
| И НЕ ЧекККМОплата.Ссылка.СтатусЧекаККМ = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Аннулированный)
| И ЧекККМОплата.ВидОплаты = &Наличные
|;
|// ... (дальнейший текст запроса с использованием временной таблицы ТаблицаЧековСОплатойНаличными)";

Важный момент: Использование временных таблиц (ПОМЕСТИТЬ) позволяет базе данных сначала отобрать нужные документы по кассе и статусу, а уже потом соединять их с суммами, что в десятки раз быстрее прямого соединения гигантских таблиц.

Решение 3: Очистка «зависших» чеков и архивация

Если вы не хотите менять код программы, можно пойти путем администрирования данных. Часто смена закрывается долго, потому что в базе накопилось много чеков, которые не получили статус «Архивный» из-за сбоев или ошибок связи. Выясним причину их появления и устраним их:

  1. Перейдите в список «Чеки ККМ».
  2. Установите фильтр по полю Статус — оставьте только пустые или «Пробитый».
  3. Если среди них есть документы за прошлые периоды (не сегодняшние), их нужно пометить на удаление и физически удалить из базы через «Обслуживание — Удаление помеченных объектов».
  4. После удаления выполните сжатие таблиц через утилиту chdbfl.exe или «Тестирование и исправление» (пункт «Сжатие таблиц информационной базы»).

Помните, что в файловом режиме база .1CD не уменьшается в размере автоматически при удалении записей, поэтому процедура сжатия обязательна для восстановления индексации и скорости.

Решение 4: Проблема с особенностями учета (ЕГАИС)

Если магазин торгует алкоголем, 1С при закрытии смены проверяет реквизиты номенклатуры. Иногда после обновления конфигурации реквизит ОсобенностьУчета оказывается не заполнен, что заставляет систему выполнять дополнительные проверки. Разберем, как это исправить массово:

  1. Откройте «Групповое изменение реквизитов».
  2. Выберите справочник Номенклатура.
  3. Добавьте фильтр: АлкогольнаяПродукция = Да И ОсобенностьУчета = Пусто.
  4. В дополнительных параметрах включите «Показывать служебные реквизиты».
  5. Установите значение ОсобенностьУчета в «Алкогольная (спиртосодержащая) продукция».
  6. Нажмите «Изменить реквизиты».

Технические советы по настройке оборудования

Помимо программных методов, проанализируем техническую часть. Часто 1С «зависает», ожидая ответа от кассового аппарата или драйвера:

Подведем итог: Если смена в «1С:Розница» начала закрываться долго, первым делом проверьте количество архивных чеков и примените расширение, ограничивающее дату анализа документов. В 90% случаев это сокращает время ожидания с 20 минут до 1–2 минут.

← На главную