В процессе работы с алкогольной продукцией (АП) в 1С:Розница 2.2 пользователи часто сталкиваются с ситуацией, когда чек на кассе не закрывается из-за отказа УТМ. Основная причина — марка не числится за организацией по поштучному учету. Это происходит потому, что при приемке товара сотрудники не всегда выполняют сканирование каждой бутылки, доверяя данным в ТТН. Разберем, как можно реализовать проверку принадлежности марки в момент ее сканирования в РМК, чтобы избежать блокировки чека на этапе оплаты.
Для начала проанализируем, где именно в 1С хранятся сведения о марках. В конфигурации Розница 2.2 (и более новых версиях) данные распределяются по нескольким объектам:
АкцизныеМаркиЕГАИС: Это основной источник данных для системы. Здесь хранятся сведения о марках, которые уже «прописаны» в базе как имеющиеся в наличии.ШтрихкодыУпаковокТоваров: В этот справочник попадают данные после того, как была выполнена процедура сканирования при приемке или проверке упаковок.ТТН Входящая ЕГАИС: Даже если марка еще не попала в общие регистры, она физически присутствует в табличной части АкцизныеМарки входящей накладной версии v3.Проанализируем ситуацию: если мы хотим проверить марку «на лету», нам нужно обратиться к этим источникам данных до того, как запрос уйдет в УТМ.
Самый быстрый способ — проверить наличие записи в регистре сведений. Рассмотрим логику запроса. Когда кассир сканирует марку, нам нужно убедиться, что для данного кода существует запись со статусом «В наличии».
Рассмотрим пример кода для проверки статуса марки:
Функция МаркаЕстьВНаличии(ТекстМарки) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АкцизныеМаркиЕГАИС.Статус КАК Статус
|ИЗ
| РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
|ГДЕ
| АкцизныеМаркиЕГАИС.АкцизнаяМарка = &АкцизнаяМарка";
Запрос.УстановитьПараметр("АкцизнаяМарка", ТекстМарки);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Ложь; // Марка вообще не поступала или не была оприходована
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат (Выборка.Статус = Перечисления.СтатусыАкцизныхМарок.ВНаличии);
КонецФункции
Однако стоит учитывать, что если приемка велась без сканирования (доверительная приемка), то в регистре АкцизныеМаркиЕГАИС записи может не оказаться, хотя в ЕГАИС товар за вами числится.
Если в основном регистре марки нет, нам необходимо проверить входящие документы ТТН Входящая ЕГАИС. Важно искать только в тех документах, по которым был отправлен «Акт подтверждения». Если накладная находится в статусе «Принят», значит, марки из её состава должны быть доступны для продажи.
Разберем, как реализовать поиск по табличным частям документов. Это более ресурсоемкая операция, поэтому ее целесообразно выполнять только в том случае, если первый метод не дал результата.
ЗапросТТН = Новый Запрос;
ЗапросТТН.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ТТНВходящаяЕГАИС.Ссылка КАК Ссылка
|ИЗ
| Документ.ТТНВходящаяЕГАИС.АкцизныеМарки КАК ТТНМарки
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТТНВходящаяЕГАИС КАК ТТНВходящаяЕГАИС
| ПО ТТНМарки.Ссылка = ТТНВходящаяЕГАИС.Ссылка
|ГДЕ
| ТТНМарки.НомерУпаковки = &ТекстМарки
| И ТТНВходящаяЕГАИС.СтатусЕГАИС = ЗНАЧЕНИЕ(Перечисления.СтатусыОбработкиТТНВходящейЕГАИС.Подтвержден)";
ЗапросТТН.УстановитьПараметр("ТекстМарки", ТекстМарки);
// Далее обработка результата...
Выясним причину, почему это важно: если марка найдена в подтвержденной ТТН, но отсутствует в регистре АкцизныеМаркиЕГАИС, значит, в базе нарушена цепочка формирования складских документов (например, не создано «Поступление товаров» на основании ТТН). В этом случае продажа через УТМ пройдет успешно, но локальный учет остатков в 1С будет некорректным.
Для обеспечения 100% гарантии можно использовать механизм запроса остатков поштучной продукции непосредственно из УТМ. В 1С это реализуется через документ «Запрос остатков партионной продукции» (для Регистр №3).
Рассмотрим алгоритм действий:
QueryRestBCode.Справке 2 (РФУ2), к которой должен быть привязан товар.Важный нюанс: этот метод работает медленно (ответ от ЕГАИС может идти от нескольких секунд до минут), поэтому выполнять его в реальном времени в РМК при каждом сканировании не рекомендуется. Его лучше использовать как инструмент предварительной проверки товара при выкладке на полку.
Чтобы реализовать проверку в момент сканирования, необходимо внести изменения в процедуру обработки штрихкодов в форме РМК. Проанализируем типичное место для вставки кода. Обычно это обработчик события сканирования, где происходит опознание типа штрихкода (EAN13 или PDF417/DataMatrix).
Рассмотрим последовательность действий программиста:
ОбработкаШтрихкодов.Ложь, выводим предупреждение: «Внимание! Данная марка не найдена в подтвержденных поступлениях. Продажа может быть отклонена УТМ!».Практический совет: Не блокируйте продажу жестко, если марка не найдена в локальной базе. Иногда данные могут просто не успеть синхронизироваться. Лучше выдать предупреждение кассиру или запросить подтверждение правами администратора.
Не забудем про старые типы марок (длинные PDF417). Они могут не иметь привязки к поштучному учету (v3). Для их продажи часто требуется предварительная привязка к балансу второго регистра или перевод на поштучный учет через «Акт фиксации марок». Если вы планируете внедрять тотальный контроль, убедитесь, что ваша проверка умеет различать типы марок и корректно обрабатывать старые образцы, которые учитываются партионно.
Подведем итог: наиболее эффективным и сбалансированным решением для 1С:Розница 2.2 будет комбинированная проверка:
РегистреСведений.АкцизныеМаркиЕГАИС (мгновенно).ТТНВходящаяЕГАИС за последние 3 месяца.Такой подход позволит значительно снизить количество «зависших» чеков и дисциплинирует персонал в вопросах корректной приемки алкогольной продукции. Совместная работа программиста по настройке этих фильтров и администратора магазина по контролю приемки обеспечит стабильную работу торговой точки.