Многие пользователи программы 1С:Розница (особенно начиная с версий 2.3.10 и выше) сталкиваются с ситуацией, когда нумерация чеков перестает обнуляться при закрытии смены. Если раньше каждый день начинался с чека №1, то теперь номера суммируются: 100 чеков в первый день, а на второй день первый чек получает номер 101. Это создает значительные неудобства при сверке отчетов и анализе дневных продаж.
Рассмотрим подробно, почему это происходит, как устроена логика программы и какие шаги необходимо предпринять, чтобы вернуть привычную нумерацию.
Для начала проанализируем ситуацию и выясним корень проблемы. В современных конфигурациях 1С логика формирования номера чека напрямую зависит от типа подключенного оборудования. Если вы используете полноценный Фискальный регистратор (ККТ), то номер чека берется из памяти самого устройства. ККТ при выполнении Z-отчета (закрытия смены) аппаратно обнуляет свой внутренний счетчик.
Однако, если используется обычный принтер чеков (нефискальное устройство, работающее через Windows-драйвер или эмулятор), ситуация меняется. Для такого устройства 1С сама генерирует номер. В последних обновлениях разработчики 1С изменили подход к нумерации в сторону обеспечения уникальности данных в базе. Программа начинает использовать НомерДокумента из базы данных вместо порядкового номера внутри смены. Поскольку документ ЧекККМ в базе имеет сквозную нумерацию, она не обнуляется утром.
Прежде чем переходить к сложным настройкам, проверим, действительно ли смена закрывается в программе корректно. Выясним причину, по которой 1С может считать смену «затянувшейся».
Отчет о розничных продажах не сформирован, значит, смена не была закрыта полностью.Разберем ситуацию: если 1С «не видит» успешного формирования документа Отчет о розничных продажах, она продолжает считать текущую транзакцию частью старой смены, даже если визуально интерфейс РМК (Рабочего места кассира) обновился.
Это самый эффективный способ решить проблему без программирования. Если принтер просто выводит текст, мы можем изменить поле, которое отвечает за номер. Проанализируем настройки шаблона.
Выполним следующие шаги:
[НомерДокумента] или [Номер].В чем секрет решения? Нам нужно заменить параметр [НомерДокумента] на поле, которое отвечает за Номер чека в смене. В некоторых релизах это поле называется НомерЧека. Если принтер нефискальный, 1С может подставлять туда разные значения. Попробуем заменить переменную в редакторе шаблона и проведем тестовую печать. Если в шаблоне используется XML-редактор, код строки может выглядеть примерно так:
<Строка>
<Текст Значение="Чек №" />
<Параметр Имя="НомерЧекаВККМ" />
</Строка>
Важный момент: Параметр НомерЧекаВККМ чаще всего привязан к аппаратной части. Для обычного принтера он может оставаться пустым или дублировать номер документа. Если это не помогло, переходим к следующему шагу.
Иногда нумерация «залипает» из-за ошибок в служебных таблицах 1С. Программа хранит данные о каждой пробитой операции в специальном регистре. Проанализируем состояние этого регистра.
Рассмотрим порядок действий:
В этом случае может помочь очистка кэша или принудительное закрытие всех «зависших» смен через документ Кассовая смена (раздел Продажи — Кассовые смены).
Если штатные средства не помогают, и программа упорно выводит сквозной номер документа, выясним, как это изменить на уровне кода. В 1С:Розница за формирование текста чека для нефискальных принтеров отвечает процедура в модуле менеджера оборудования.
Мы можем создать небольшое Расширение, которое будет перехватывать процедуру печати. Нам нужно изменить алгоритм заполнения структуры ДанныеЧека. Посмотрим на пример логики, которую можно реализовать:
&После("СформироватьДанныеЧека")
Процедура Имя_СформироватьДанныеЧека(ПараметрыЧека, ДанныеЧека)
// Вычисляем порядковый номер чека за текущую смену
ТекущаяСмена = ДанныеЧека.КассоваяСмена;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КолИЗ ЧекиККМ ГДЕ КассоваяСмена = &Смена";
Запрос.УстановитьПараметр("Смена", ТекущаяСмена);
// Устанавливаем наш вычисленный номер вместо стандартного
ДанныеЧека.НомерЧека = Запрос.Выполнить().Выгрузить()[0].Кол + 1;
КонецПроцедуры
Этот код принудительно подсчитывает количество чеков в текущей открытой смене и выводит на печать актуальный порядковый номер, начиная с 1 каждый день. Это идеальное решение для тех, кто использует обычные чековые принтеры в качестве «кухонных» принтеров или для нефискального учета.
Подведем итоги нашего исследования. Сквозная нумерация в новых версиях 1С — это не баг, а особенность работы с нефискальным оборудованием в рамках стандартов БПО. Для исправления ситуации:
Отчет о розничных продажах.Помните, что для управленческого учета сквозной номер даже удобнее (он уникален), но если требования бизнес-процессов диктуют начинать день с единицы, вышеописанные методы помогут вам вернуть привычный функционал.