В связи с введением обязательной маркировки товаров реализован новый функционал их продажи с передачей информации в систему «Честный знак» (ЦРПТ).

Каждый товар маркируют уникальным двумерным Data Matrix кодом, который наносят на упаковку, ярлык или прямо на товар. Код выдается ЦРПТ, и он содержит информацию о продукции в базе данных системы маркировки.

Data Matrix код состоит из двух частей:

  • Код идентификации: это позиция товара в системе и национальном каталоге товаров;
  • Код проверки (крипто-хвост): генерируется оператором.

Необходимые требования для Атол: fpAtol 5.7.10  и unifr306000.

Настройки в менеджерской станции

  • В справочник Меню > Модификаторы по умолчанию добавлена подгруппа "ЕГАИС Маркированная продукция", в которую добавлен предустановленный модификатор "Маркированная продукция".

    По умолчанию выставлен чекбокс "Печатать справочное имя". В этом случае в чеке r_keeper будет напечатано имя модификатора "Маркированная продукция" вместо значения отсканированной марки.
    Свойство доступно, если выставлен чекбокс "Печатать в чеке". 

  • В справочник Меню > Схемы модификаторов по умолчанию добавлена схема " РОССИЯ: ЕГАИС Маркированная продукция" с предустановленной группой модификаторов "ЕГАИС Маркированная продукция". У группы установлено ограничение 1 по максимальному и минимальному количеству. Модификатор из группы является обязательным.
  •  В справочник Меню >Классификации блюд  по умолчанию добавлена классификация Маркировка/Россия с предустановленными категориями:
    • Алкогольные коктейли
    • Алкогольные напитки
    • Маркированная продукция
    • Молочная продукция
    • Нет
    • Пиво и слабоалкогольные напитки в кегах
    • Пиво и слабоалкогольные напитки в упаковках
    • Табак
    • Упакованная вода.
      Если классификация не активирована, активируйте ее.
      Если меню было заведено до активации классификации, чтобы активировать классификацию Маркировка\Россия, снимите флаг Обяз. группировка. Активируйте классификацию, распределите блюда по активных категориям, а потом снова выставьте флаг, если обязательная группировка нужна.

Для категории "Маркированная продукция" выбрана предустановленная схема модификаторов "РОССИЯ: ЕГАИС Маркированная продукция". 

  • В справочнике Сервис > Обработка сигналов и устройств > Mcr алгоритмы добавлен предустановленный алгоритм для считывания кода Data Matrix.
  • В справочнике Меню > Меню для маркированной продукции необходимо сделать следующие настройки: 
    • В разделе Порции в поле Добавление в заказ выберите значение Отдельная строка для каждой порции

    • В разделе Основное в поле Штрих-коды введите штрих-код этого товара (EAN-13). С его помощью можно выбрать это блюдо в заказ, считав код с помощью сканера. Необязательное свойство.
    • В поле Тип товара выбрать один из вариантов:
      • Подакцизный товар без кода маркировки — должна быть акцизная марка, но нет DM-кода от Честного Знака. Например: алкогольная продукция. 
      • Подакцизный товар с кодом маркировки — должна быть акцизная марка, и DM-код от Честного Знака, например Табак.
      • Неподакцизный товар без кода маркировки — не должно быть акцизной марки, должен быть DM-код от Честного Знака, но можно продать без него. Например: товар должен быть маркирован, но еще можно продавать (идет срок введения маркировки). Головка сыра должна иметь маркировку, весовые порции — нет.
      • Неподакцизный товар с кодом маркировки — обязателен DM-код от Честного Знака, нет акцизной марки. Пример: молочная продукция, упакованная вода.
    • В разделе Модификаторы — в поле Ввод Datamatrics при оплате установите чекбокс, если необходимо создавать заказы с маркированным товаром без указания марки. Перед оплатой заказа для всех маркированных товаров необходимо будет добавить марку.
      В разделе Классификации укажите необходимую классификацию.
    • В справочнике Настройки >Печать > Схемы печати у представления документа не должно стоять флага Паковать перед печатью.

  • Если в Перечисляемом свойстве в Фискальном типе стоит значение, отличное от нуля, то для этого типа ФР используется это значение.
    Иначе используется значение по умолчанию из поля Значение.
  • Для ФФД 1.05 и 1.1 в драйверах fpShtr54 и fpRU_AtolDTO производится подмена значений 27,28,29,32,33 на 1, а 30,31 на 2.

Скрипт, ограничивающий продажу блюд из категории с определенным кодом.

В r_keeper есть ограничение на продажу количества блюд определенной категории. Ниже приведен пример скрипта для ограничения продажи, не более 128 блюд.

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var
 it : TCheckItem;
 Categ : TClassificatorGroup;
 i, dishCount, categCode : integer;
begin
  dishCount := 0;
  categCode := 10; //Здесь указать код категории
  Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', categCode)); 
  for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do 
   begin
    it := RKCheck.CurrentOrder.Sessions.Lines[i];
    if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
     if Categ.IsChild(it.RefItem) then
      dishCount:=dishCount + 1;
   end;
   if AEditType = etInsert then
    if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
     if (dishCount >= 128) and (Categ.IsChild(TDish(AObjectAft).RefItem)) then
       begin
        AAllow:=false;
        AMessage := 'В этом заказе содержится максимальное количество маркированных товаров: 128. Добавление маркированных товаров в этот заказ невозможно';
       end; 
end;

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var
 it : TCheckItem;
 Categ : TClassificatorGroup;
 i, dishCount, categCode : integer;
begin
  dishCount := 0;
  categCode := 10; //Здесь указать код категории
  Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', categCode)); 
  for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do 
   begin
    it := RKCheck.CurrentOrder.Sessions.Lines[i];
    if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
     if Categ.IsChild(it.RefItem) then
      dishCount:=dishCount + 1;
   end;
   if AEditType = etInsert then
    if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
     if (dishCount = 128) and (Categ.IsChild(TDish(AObjectAft).RefItem)) then
      gui.showmessage('В этом заказе уже содержится максимальное количество маркированных товаров: 128. Добавление маркированных товаров в этот заказ невозможно');
end;

Запасной вариант скрипта, который обрабатывает кнопку количество.

function GetQuantity(qnt,s:double; cat:integer): boolean;
var
i:integer;
Categ: TClassificatorGroup;
it : TCheckItem;
kolvo:double;
begin
Categ   := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', cat));
for i     := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
  begin    
    it:= RKCheck.CurrentOrder.Sessions.Lines[i];
    if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then 
      if Categ.IsChild(it.RefItem) then kolvo:=kolvo+TDish(it).Quantity;
      
  end;
if kolvo+qnt>s then result:=true else result:=false;
end;

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var
numcateg:integer;
Categ: TClassificatorGroup;
maxQNT:double;
begin
//*********Parameters***************
numcateg:=16391; // код категории маркированных товаров
maxQNT:=128; // максимальное количество блюд

//**********************************
Categ   := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', numcateg));
if (AEditType = etInsert) or (AEditType = etChange) then
  begin
    if SYS.ObjectInheritsFrom(TObject(AObjectBef), 'TDish') then 
    if (Categ.IsChild(TDish(AObjectBef).RefItem)) then 
      Begin
        if getQuantity(1, maxQNT, numcateg) then
          begin
            AAllow:=False;
            gui.showmessage('В заказе не может быть больше ' + floattostr(maxQNT)+' маркированных товаров!' );
          end;
      end;
  end;
end;
 
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
var
ed: TObject;
curitem : TCheckItem;
numcateg:integer;
maxQNT:double;
Categ: TClassificatorGroup;
begin
//*********Parameters***************
numcateg:=16391; // код категории маркированных товаров
maxQNT:=128; // максимальное количество блюд

//**********************************

if operation=rkoEditAmount then 
  begin
    Categ   := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', numcateg));
    CurItem := RKCheck.CurrentCheckItem;
    ed := TObject(gui.FindComponentByName('Editor'));
    if SYS.ObjectInheritsFrom(curitem, 'TDish') then 
      if (Categ.IsChild(curitem.RefItem)) then
        if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then 
          if getQuantity(strtofloat(TNumEditor(ed).Text)-TDish(curitem).quantity, maxQNT, numcateg) then
            begin
              res:=1;
              gui.showmessage('В заказе не может быть больше ' + floattostr(maxQNT)+' маркированных товаров!' );
            end;                 
  end;  
end;

Примеры использования

Продажа с указанием марки сразу после добавления товара в заказ

  1. Выберите товар в заказ вручную из меню, или отсканировав с товара код EAN-13. Затем отсканируйте DataMatrix код.
  2. При выборе товара к нему автоматически будет добавлен уникальный DataMatrix код (марка) в виде обязательного модификатора.
  3. Оплатите заказ стандартным образом.

При оплате заказа будет распечатан чек r_keeper, в котором вместо марки печатается имя модификатора.

При оплате заказа будет распечатан фискальный чек, в котором печатается тип товара "Подакцизный товар". DataMatrix код не печатается.

DataMatrix код передается только в ОФД.

Контрольно-кассовая техника отправляет данные о реализации маркированного товара в оператор фискальных данных, а тот в систему Честный Знак

В печатной форме чека по ФФД 1.1 отображается буква [M] с префиксом в квадратных скобках.

В зависимости от ответа статуса кода:
[M+] фискальный накопитель положительно проверил крипто хвост КИ, и прошла проверка статуса в системе Честный знак
[M] указывается, если любая из проверок не была завершена успешно. Или если аппарат работает в автономном режиме, без подключения к интернету;
[М-] печатается на чеке, если возникла хотя бы одна ошибка при проверке, но кассир завершил реализацию по согласованию с гостем. Возможна ошибка в указании или в верификации кода есть сомнения.

При продаже маркированной продукции не рекомендуется использовать нефискальные валюты для полной или комбинированной оплаты заказа.
Если валюта не является фискальной, а маркированная продукция полностью или частично закрывается этой валютой, то при оплате марка не передается в ОФД и, следовательно, в систему Честный Знак.

Продажа с отложенным указанием марки

Привязка уникального DataMatrix кода осуществляется не при добавлении блюда в заказ, а позже — перед оплатой. Код можно привязать как к несохраненному, так и к сохраненному блюду.
Примеры использования:

  • Обслуживание очереди через r_k Waiter. В заведении быстрого обслуживания сотрудник принимает заказ у гостей, ожидающих в очереди. На момент создания заказа у него нет в руках товара, который нужно отсканировать. Марку добавит сотрудник, собирающий заказ.

  • Доставка. На момент создания заказа не известно, какая марка попадет в заказ. Сборщик добавляет марку, после отдает заказ курьеру.

  • Заказ, оформленный на киоске самообслуживания. Марка добавляется на KDS PRO в момент сборки заказа.

Работа на кассе.

  1. Добавьте товар в заказ вручную из меню или отсканируйте с его упаковки код EAN-13.
  2. Сохраните заказ
  3. Перед оплатой заказа выберите маркированный товар и отсканируйте его DataMatrix код.
    Если в заказе есть маркированные товары, для которых не указан DataMatrix код, то такой заказ оплатить нельзя. Система выдаст сообщение:

  4. При оплате заказа будет распечатан чек r_keeper, в котором марка печатается как модификатор, и фискальный чек, в котором будет указан тип товара "Подакцизный товар". DataMatrix код в фискальном чеке не печатается и передается только в ОФД.

Расчет по местам

При расчете по местам блюда, относящиеся к категории Маркированная продукция, нельзя оставить в общих блюдах.

При расчете чека по местам, если в заказе есть маркированное блюдо с незаполненным местом, выйдет ошибка.

Настройки ОКП

Если код маркировки не выбывает в Честном Знаке:

  1. Убедитесь что ОФД отправляет данные в Честный Знак
  2. Проверьте настройку ОКП 

ОКП — сервер обновления ключей проверки.

ОКП должен обновляться автоматически кассовой программой, при открытии смены.

Для этого в настройках фискального регистратора укажите IP адрес и Порт: