Почему в 1С:Управление торговлей 11.4 дважды пробивается чек на кассе и как решить проблему с уникальностью номеров?

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

При работе в программе «1С:Управление торговлей 11.4» (особенно в файловом режиме базы данных через терминальный доступ RDP) системные администраторы и программисты иногда сталкиваются с крайне неприятной проблемой. Кассир пробивает чек из рабочего места кассира (РМК), физический фискальный регистратор послушно печатает чек, но в самой программе 1С возникает ошибка блокировки транзакции. Документ на экране остается визуально непробитым. Кассир нажимает кнопку пробития повторно, касса выдает еще один бумажный чек, и только со второго раза документ успешно записывается в программе.

В результате такой ошибки происходит задвоение выручки на кассовом аппарате (что ведет к расхождениям с ОФД и налоговой), а при попытке открыть список чеков ККМ система выдает критическую ошибку: «Поле "Номер" не уникально» или аналогичные сообщения о неуникальности ключевых полей. Проанализируем детально причины этого сбоя и рассмотрим пошаговые методы его устранения и профилактики.

---

Выясняем техническую причину: почему двоится чек и ломается список документов?

Для того чтобы понять природу ошибки, рассмотрим алгоритм работы Библиотеки подключаемого оборудования (БПО) 1С при отправке документа на печать:

  1. Передача XML-пакета: 1С формирует xml-данные чека и отправляет их в драйвер кассового аппарата (ККТ).
  2. Физическая фискализация: Кассовый аппарат регистрирует операцию в своем фискальном накопителе (ФН) и распечатывает бумажный чек. Драйвер возвращает в 1С параметры фискализации (номер чека, номер фискального документа, ФПД и т.д.).
  3. Фиксация параметров фискализации: Для предотвращения потери связи на стыке систем 1С мгновенно записывает полученные параметры в независимый регистр сведений (обычно это ФискальныеОперации или НомераЧековККТ). Эта запись происходит во внешней (независимой) транзакции, которая сразу фиксируется в базе данных.
  4. Запись основного документа: После фиксации фискальных параметров программа пытается записать и провести сам документ ЧекККМ.

Где происходит критический сбой? В файловых базах данных при одновременной работе нескольких пользователей (например, кассира и оператора, проводящего тяжелую реализацию) СУБД блокирует таблицы целиком. Если в момент выполнения шага №4 таблица документов заблокирована другим процессом, транзакция проведения документа ЧекККМ ожидает освобождения ресурса, превышает таймаут (по умолчанию 20 секунд) и откатывается (происходит Rollback).

При этом запись в регистре ФискальныеОперации, сделанная на шаге №3 в независимой транзакции, остается в базе данных. Для программы документ выглядит как непробитый, форма РМК не очищается, кнопка печати активна. Кассир нажимает кнопку повторно. Драйвер ККТ бьет второй физический чек, а 1С записывает вторую запись в регистр фискальных операций для этого же документа-основания. Со второй попытки транзакция документа проходит успешно.

Откуда берется ошибка уникальности номера? Список чеков в 1С строится на базе механизма динамического списка. Запрос этого списка соединяет (посредством оператора ЛЕВОЕ СОЕДИНЕНИЕ) основную таблицу документов ЧекККМ и таблицу регистра ФискальныеОперации. Поскольку для одного и того же документа в регистре теперь находятся две записи с разными номерами чеков, левое соединение возвращает две строки на один документ. Динамический список обнаруживает дублирование ключевого поля (ссылки на документ) и аварийно завершает работу с ошибкой неуникальности.

---

Шаг 1. Исправление ошибки «здесь и сейчас» (ручная очистка данных)

Чтобы вернуть кассиру возможность работать с журналом чеков ККМ, нам необходимо устранить дублирующую запись в регистре сведений. Разберем, как это сделать:

  1. Откроем консоль запросов (или воспользуемся групповой обработкой данных) и найдем проблемный документ. Для поиска дублей можно использовать следующий запрос к базе данных:

ВЫБРАТЬ
	ФискальныеОперации.ДокументОснование КАК ПроблемныйДокумент,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ФискальныеОперации.НомерЧекаККТ) КАК КоличествоЗаписей
ИЗ
	РегистрСведений.ФискальныеОперации КАК ФискальныеОперации
СГРУППИРОВАТЬ ПО
	ФискальныеОперации.ДокументОснование
ИМЕЮЩИЕ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ФискальныеОперации.НомерЧекаККТ) > 1
  1. Определив конкретный документ-источник, нам необходимо программно или с помощью встроенных обработок («Редактирование движений», «Универсальный обмен данными XML» в режиме удаления) удалить первую (лишнюю) запись из регистра сведений ФискальныеОперации.
  2. Ниже приведен пример программного кода для удаления дублирующей записи, который можно выполнить во внешней обработке:

ПроблемныйДокумент = Документы.ЧекККМ.НайтиПоНомеру("НомерВашегоЧека", ТекущаяДата());

НаборЗаписей = РегистрыСведений.ФискальныеОперации.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ДокументОснование.Установить(ПроблемныйДокумент);
НаборЗаписей.Прочитать();

Если НаборЗаписей.Количество() > 1 Тогда
	// Удаляем самую первую запись (которая застряла при ошибке)
	// Оставляем только ту, которая соответствует успешному проведению
	НаборЗаписей.Удалить(0); 
	НаборЗаписей.Записать();
	Сообщить("Дублирующая запись успешно удалена!");
КонецЕсли;
  1. Важное действие на кассе: Поскольку физически кассовый аппарат пробил два чека, в ОФД ушла удвоенная выручка. Необходимо во избежание штрафных санкций со стороны налоговой службы сделать на кассовом аппарате чек коррекции (или операцию возврата прихода по первому ошибочному номеру чека) через утилиту тест-драйвера ККТ.

---

Шаг 2. Системные методы решения проблемы (профилактика блокировок)

Поскольку конфигурация находится на поддержке и вносить изменения в типовой код нежелательно, рассмотрим системные и архитектурные решения проблемы блокировок.

Вариант А. Перевод базы данных на SQL-вариант (Рекомендуется)

Использование файлового режима для одновременной работы даже 2–3 активных пользователей в тяжелых конфигурациях на управляемых формах (УТ 11, КА 2, ERP) всегда сопряжено с рисками монопольных блокировок таблиц. Перевод базы данных под управление СУБД (PostgreSQL, MS SQL Server) кардинально меняет работу системы:

Вариант Б. Использование Расширения конфигурации

Если перевод на SQL невозможен, мы можем обойти ограничение изменения типовой конфигурации с помощью механизма Расширений. Создадим расширение, которое перехватывает попытку повторного пробития чека.

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

Пример кода модуля расширения для защиты от повторной отправки:


&Перед("ПробитьЧек")
Процедура Расш_ПробитьЧекПеред(ДокументСсылка, Отказ)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	ФискальныеОперации.НомерЧекаККТ КАК НомерЧека
		|ИЗ
		|	РегистрСведений.ФискальныеОперации КАК ФискальныеОперации
		|ГДЕ
		|	ФискальныеОперации.ДокументОснование = &ДокументОснование";
		
	Запрос.УстановитьПараметр("ДокументОснование", ДокументСсылка);
	РезультатЗапроса = Запрос.Выполнить();
	
	Если Не РезультатЗапроса.Пустой() Тогда
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующий();
		Предупреждение("Внимание! Чек уже был фискализирован на кассе (Номер: " + Выборка.НомерЧека + "). Повторная печать заблокирована.");
		Отказ = Истина;
	КонецЕсли;
	
КонецПроцедуры

Вариант В. Организация автономного рабочего места (РИБ)

Работа кассира напрямую в тяжелой центральной базе по RDP — это всегда риск задержек сети и конфликтов блокировок. Разумным архитектурным решением является создание локальной кассовой базы:

Вариант Г. Оптимизация производительности текущей файловой базы

Если бюджет ограничен и необходимо оперативно снизить частоту возникновения транзакционных ошибок в файловом режиме, выполните следующие административные действия:

  1. Перенос базы на SSD: Убедитесь, что файл базы данных 1Cv8.1CD расположен на скоростном твердотельном накопителе (SSD NVMe) сервера. Медленные жесткие диски (HDD) увеличивают время фиксации транзакций в разы.
  2. Исключения антивируса: Добавьте файлы базы данных 1С и временные файлы в список исключений антивирусного ПО на сервере. Сканирование записываемых СУБД блоков файлов блокирует базу для пользователей.
  3. Отключение фоновых заданий: Настройте блокировку регламентных заданий в рабочее время кассиров (особенно полнотекстового поиска, извлечения текстов, автоматического расчета себестоимости и обновления индексов). Выполнение этих процессов парализует файловую базу.

Применение данных методик позволит оперативно устранить последствия сбоя ККТ и гарантировать стабильную работу кассового узла без риска повторных блокировок.

← На главную