При переходе на формат фискальных данных (ФФД) 1.05 программисты часто сталкиваются с тем, что старые методы работы с драйвером ККТ перестают выдавать ожидаемый результат. Одной из распространенных проблем является попытка оформить возврат прихода. В этой статье мы подробно разберем, почему прямая запись атрибутов может не работать и как правильно настроить программный код в 1С 7.7 для корректной печати чеков возврата на оборудовании АТОЛ.
Рассмотрим ситуацию, когда разработчик пытается напрямую передать признак расчета через запись атрибута 1054. В коде это выглядит примерно так:
Объект.AttrNumber = 1054;
Объект.AttrValue = 2; // Возврат прихода
Объект.WriteAttribute();
Проблема заключается в том, что в драйверах АТОЛ значение этого тега жестко привязано к внутреннему свойству драйвера CheckType. При вызове метода открытия чека OpenCheck() драйвер автоматически формирует значение тега 1054 на основе текущего состояния свойства CheckType. Если мы записываем атрибут вручную, драйвер либо игнорирует это действие, либо перезаписывает его своими данными при финализации чека. Поэтому для корректной работы необходимо использовать штатные свойства драйвера.
Для того чтобы касса распознала операцию как возврат, мы должны установить тип чека до момента его открытия. Проанализируем правильную последовательность действий:
Рассмотрим фрагмент кода, который решает проблему:
// Устанавливаем режим регистрации (1)
Объект.Mode = 1;
Объект.SetMode();
// Устанавливаем тип чека: 1 - Приход, 2 - Возврат прихода
Если ПризнВозврата = 1 Тогда
Объект.CheckType = 2; // Возврат прихода
Иначе
Объект.CheckType = 1; // Приход
КонецЕсли;
// Устанавливаем режим формирования чека (1 - с печатью)
Объект.CheckMode = 1;
// Теперь открываем чек
Объект.OpenCheck();
Важный нюанс: Установку CheckType лучше всего выполнять непосредственно перед вызовом OpenCheck(). Это гарантирует, что драйвер применит нужный признак расчета ко всему документу.
Согласно требованиям ФФД 1.05, при регистрации каждой позиции товара или услуги крайне важно передавать дополнительные признаки. Выясним, какие атрибуты являются критически важными:
Разберем, как включить эти данные в цикл регистрации товаров:
// Пример регистрации позиции
Объект.Name = "Наименование товара";
Объект.Price = 100.00;
Объект.Quantity = 1;
// Устанавливаем Признак предмета расчета (Тег 1212)
// 1 - Товар, 3 - Услуга
Объект.AttrNumber = 1212;
Объект.AttrValue = 1;
Объект.WriteAttribute();
// Устанавливаем Признак способа расчета (Тег 1214)
// 4 - Полный расчет
Объект.AttrNumber = 1214;
Объект.AttrValue = 4;
Объект.WriteAttribute();
// Регистрируем позицию
Объект.Registration();
Часто в 1С 7.7 требуется сохранить реальный номер чека, присвоенный кассовым аппаратом, для ведения внутреннего учета или последующей печати накладных. В новых версиях обработки это делается через обращение к регистрам ККТ. Посмотрим, как получить номер документа:
// После успешного закрытия чека (метод CloseCheck)
Объект.RegisterNumber = 51; // Номер регистра для получения номера документа
Объект.GetRegister();
НомерДокументаККМ = Объект.DocNumber;
Сообщить("Чек пробит. Номер документа: " + НомерДокументаККМ);
Помимо номера документа, мы можем получить и другие полезные данные, обратившись к соответствующим регистрам:
Сведем все полученные знания в единый алгоритм работы. Проанализируем итоговую структуру процедуры:
// Инициализация драйвера
Драйвер.Mode = 1;
Драйвер.SetMode();
Драйвер.NewDocument();
// Данные кассира (Тег 1021)
Драйвер.AttrNumber = 1021;
Драйвер.AttrValue = "Иванов И.И.";
Драйвер.WriteAttribute();
// Настройка типа чека на ВОЗВРАТ
Драйвер.CheckType = 2;
Драйвер.OpenCheck();
// Налоговая система (Тег 1055)
// 1 - ОСН, 2 - УСН доход, 8 - ЕНВД
Драйвер.AttrNumber = 1055;
Драйвер.AttrValue = 2;
Драйвер.WriteAttribute();
// Регистрация товара
Драйвер.Name = "Возвращаемый товар";
Драйвер.Price = 500.00;
Драйвер.Quantity = 1;
Драйвер.TaxTypeNumber = 4; // НДС не облагается
Драйвер.Registration();
// Оплата (0 - Наличные, 1 - Электронные)
Драйвер.TypeClose = 0;
Драйвер.Summ = 500.00;
Драйвер.Payment();
// Закрытие чека
Если Драйвер.CloseCheck() <> 0 Тогда
Предупреждение("Ошибка закрытия чека!");
Иначе
// Получаем номер чека для базы 1С
Драйвер.RegisterNumber = 51;
Драйвер.GetRegister();
НомерЧека = Драйвер.DocNumber;
КонецЕсли;
Важно помнить, что при оформлении возврата тип оплаты (TypeClose) должен соответствовать тому, как фактически возвращаются денежные средства клиенту. Если покупка была совершена по карте, возврат также должен быть оформлен как электронный (тип 1). Рассмотрим ситуацию: если в денежном ящике кассы недостаточно наличных (например, с утра еще не было выручки), ККТ АТОЛ может выдать ошибку при попытке сделать возврат наличными. В таких случаях сначала необходимо выполнить операцию внесения денежных средств в кассу.
Если вы используете более свежие версии драйверов (например, АТОЛ 10-й серии через COM-обертку), рекомендуется вместо метода Registration() использовать конструкцию BeginItem() / EndItem(). Это позволяет более гибко управлять всеми параметрами позиции товара, включая налоги и признаки расчета, внутри одного блока кода. Однако для классической связки 1С 7.7 и драйверов 8.х метод через CheckType остается самым надежным и проверенным решением.
Таким образом, мы выяснили, что ключ к успешному выполнению возврата прихода — это отказ от ручного манипулирования тегом 1054 в пользу использования встроенного свойства CheckType. Следуя этой логике и не забывая про обязательные атрибуты ФФД 1.05, вы сможете обеспечить стабильную работу торгового оборудования.