С вступлением в силу изменений в 54-ФЗ (согласно 192-ФЗ), при расчетах между организациями и индивидуальными предпринимателями в чеке стали обязательными реквизиты покупателя: наименование (тег 1227) и ИНН (тег 1228). Для пользователей устаревшей, но все еще надежной платформы 1С:Предприятие 7.7, это стало серьезным вызовом. В данной статье мы подробно разберем, как реализовать передачу этих данных на кассовых аппаратах Атол, используя драйверы версии 8.16.x.
Прежде всего, проанализируем технические требования. Несмотря на то что Атол активно продвигает 10-ю версию драйверов, реализация на ДТО 8.16.6 (или 8.16.4) остается вполне рабочей для 1С 7.7. Однако здесь есть критически важные условия:
Рассмотрим стандартный способ инициализации объекта драйвера в 1С 7.7. Мы используем программный идентификатор AddIn.FprnM45. Обратите внимание на использование компоненты FprnM1C.dll. Опытные разработчики рекомендуют копировать бесплатную версию этой DLL (из папки Bin_Free драйвера) непосредственно в каталог базы данных или в системную папку 1С.
Процедура ПодключитьККМ()
Попытка
Объект = СоздатьОбъект("AddIn.FprnM45");
Сообщить("Драйвер ККМ загружен успешно.");
Исключение
Предупреждение("Ошибка при создании объекта драйвера Атол!");
Возврат;
КонецПопытки;
Объект.DeviceEnabled = 1;
Если Объект.ResultCode <> 0 Тогда
Сообщить("Не удалось занять порт ККМ: " + Объект.ResultDescription);
КонецЕсли;
КонецПроцедуры
Существует важный нюанс при передаче ИНН. Согласно требованиям форматов, ИНН юридического лица должен содержать 10 цифр, а индивидуального предпринимателя — 12 цифр. При работе с драйвером 8.x иногда требуется дополнять ИНН юридического лица двумя пробелами справа, чтобы общая длина строки составляла 12 символов. Выясним это на практике, проанализировав код подготовки:
// Подготовка ИНН покупателя
ИННКонтр = СокрЛП(Контрагент.ИНН);
Если СтрДлина(ИННКонтр) = 10 Тогда
// Для ЮЛ иногда требуется дополнение до 12 знаков
ИННКонтр = ИННКонтр + " ";
КонецЕсли;
НаимКонтрагента = СокрЛП(Контрагент.ПолноеНаименование);
Многие программисты сталкиваются с тем, что код написан верно, ошибок нет, но ИНН в чеке не печатается. Проанализируем ситуацию: атрибуты покупателя должны передаваться строго после открытия чека методом OpenCheck(), но до его закрытия. Если вы попытаетесь записать атрибуты до формирования документа, касса их проигнорирует.
Рассмотрим правильный алгоритм действий в коде обработки печати чека:
// 1. Открываем чек (тип 0 - продажа)
Объект.Password = 30; // Пароль кассира по умолчанию
Объект.CheckType = 0;
Объект.OpenCheck();
// 2. Сразу после открытия записываем атрибуты покупателя
// Тег 1227 - Наименование покупателя
Объект.AttrNumber = 1227;
Объект.AttrValue = НаимКонтрагента;
Объект.AttrPrint = 1; // Указываем, что нужно печатать на чеке
Объект.WriteAttribute();
// Тег 1228 - ИНН покупателя
Объект.AttrNumber = 1228;
Объект.AttrValue = ИННКонтр;
Объект.AttrPrint = 1;
Объект.WriteAttribute();
// 3. Регистрация позиций (товаров/услуг)
// Здесь идет цикл по табличной части документа
// Объект.Name = ... Объект.Price = ... Объект.Quantity = ...
// Объект.Registration();
Важный момент: Некоторые разработчики отмечают, что на определенных версиях прошивок атрибуты лучше «залетают», если их передавать в самом конце, перед методом CloseCheck(), но после всех оплат. Если первый вариант не сработал, попробуйте переместить блок записи атрибутов вниз.
Часто в чеках по умолчанию печатается «ТОВАР», хотя организация оказывает услуги. Разберем, как это изменить с помощью свойства ItemType. Это свойство устанавливается для каждой позиции чека перед вызовом метода Registration().
Основные значения ItemType для драйвера 8.16:
// Пример регистрации услуги
Объект.Name = "Консультационные услуги";
Объект.Price = 1000;
Объект.Quantity = 1;
Объект.ItemType = 4; // Указываем, что это услуга
Объект.Registration();
Если ваша торговая операция подразумевает частичную оплату или зачет аванса, необходимо использовать метод Payment() с указанием типа закрытия TypeClose. Посмотрим на пример кода, где часть суммы оплачивается наличными, а часть — зачетом аванса:
// Сумма наличными
Объект.Summ = 500;
Объект.TypeClose = 0; // Наличные
Объект.Payment();
// Зачет аванса (предоплаты)
Объект.Summ = 200;
Объект.TypeClose = 3; // Аванс
Объект.Payment();
// Закрытие чека
Объект.CloseCheck();
Для успешной реализации печати ИНН покупателя в 1С 7.7 на драйверах Атол ДТО 8 выполните следующие шаги:
WriteAttribute() для тегов 1227 и 1228 внутри открытого чека (после OpenCheck).Соблюдение этих правил позволит вам корректно формировать чеки согласно законодательству, не прибегая к дорогостоящему переходу на новые платформы 1С.