Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
07 июл 2025, 09:07

Не правильно печатает чек из 1С

Автор Yanawerg, 21 апр 2025, 10:26

0 Пользователей и 1 гость просматривают эту тему.

Yanawerg

Подключили новый ФР, настроил, печатает, вроде всё работает НО чек он печатает только наличными.

Кто мне скажет что и где надо поменять что бы он нормально печатал чек как нужно ?
Как бы я не менял или добавлял что-то в код он постоянно выдаёт ошибку.

Процедура ОсновныеДействияФормыЧек(Кнопка)

Если ВидОперации <> Перечисления.ВидыОперацийПКО.ОплатаПокупателя Тогда
Сообщить("ОШИБКА! Чек ККМ можно пробить только из документа с видом операции ""Оплата от покупателя""!");
Возврат;
КонецЕсли;

Если (НЕ Проведен) ИЛИ Модифицированность Тогда
Ответ = Вопрос("Документ не проведен! Провести документ?", РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);
Если Ответ <> КодВозвратаДиалога.Да Тогда
Предупреждение("Операция не выполнена!");
Возврат;
ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
Если ЭтотОбъект.ЭтоНовый() Тогда
Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);
Иначе
Записать(РежимЗаписиДокумента.Проведение);
КОнецЕсли;
Возврат;
КонецЕсли;
КонецЕсли;

РаботаСЧекамиККМ.СоздатьПробитьЧекККМ(Ссылка);

Попытка
МассивФР = ПолучитьСерверТО().ПолучитьСписокУстройств(
Перечисления.ВидыТорговогоОборудования.ФискальныйРегистратор,
Справочники.КассыККМ.ПустаяСсылка());

ФР = Неопределено;
СписокФР = Новый СписокЗначений();

Для каждого Устройство Из МассивФР Цикл
Вид = Неопределено;
Представление = Неопределено;
ПолучитьСерверТО().ПолучитьПредставлениеУстройства(Устройство, Вид, Представление);
СписокФР.Добавить(Устройство, Представление);
КонецЦикла;

// Выбор фискального регистратора
КоличествоФР = СписокФР.Количество();
Если КоличествоФР = 0 Тогда
Предупреждение("Фискальный регистратор не подключен!");
Возврат;
ИначеЕсли КоличествоФР = 1 Тогда
ФР = СписокФР[0].Значение;
Иначе
ВыбранныйФР = СписокФР.ВыбратьЭлемент("Необходимо выбрать фискальный регистратор");
Если ВыбранныйФР = Неопределено Тогда
Предупреждение("Операция отменена пользователем");
Возврат;
Иначе
ФР = ВыбранныйФР.Значение;
КонецЕсли;
КонецЕсли;

// Подготовка данных для чека
ТаблицаПлатежей = Новый ТаблицаЗначений();
ТаблицаПлатежей.Колонки.Добавить("Заголовок");
ТаблицаПлатежей.Колонки.Добавить("Сумма");
ТаблицаПлатежей.Колонки.Добавить("НДС");

Для Каждого Позиция Из РасшифровкаПлатежа Цикл
СтрокаТаблицы = ТаблицаПлатежей.Добавить();
СтрокаТаблицы.Заголовок = "Принято от " + ПринятоОт + Символы.ПС + "Основание: " + Основание + Символы.ПС;
СтрокаТаблицы.Сумма = Позиция.СуммаПлатежа;
СтрокаТаблицы.НДС = УчетНДС.ПолучитьСтавкуНДС(Позиция.СтавкаНДС);
КонецЦикла;
// Пробитие чека
Попытка
НачатьТранзакцию();

Оплачено = Истина;
Записать(РежимЗаписиДокумента.Проведение);

Результат = ПолучитьСерверТО().ПечатьЧекаПКО(
ФР,
"", // Дополнительные параметры
НомерЧекаККМ, // Будет заполнен после пробития
Неопределено, // Номер смены
ТаблицаПлатежей,
СуммаДокумента,
0  // Скидка
);

Если ЗначениеЗаполнено(Результат) Тогда
ОтменитьТранзакцию();
ТекстОшибки = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(Результат);
Предупреждение("Ошибка при печати чека: " + ТекстОшибки);
Возврат;
КонецЕсли;

// Успешное пробитие чека
Записать(РежимЗаписиДокумента.Запись);
ЗафиксироватьТранзакцию();

Сообщить("Чек успешно пробит! Номер чека: " + НомерЧекаККМ);

Исключение
ОтменитьТранзакцию();
Предупреждение("Ошибка при выполнении операции: " + ОписаниеОшибки());
КонецПопытки;
Исключение
КонецПопытки;
КонецПроцедуры

Максим75

Yanawerg, вот здесь
Результат = ПолучитьСерверТО().ПечатьЧекаПКО(
                    ФР,
                    "", // Дополнительные параметры
                    НомерЧекаККМ, // Будет заполнен после пробития
                    Неопределено, // Номер смены
                    ТаблицаПлатежей,
                    СуммаДокумента,
                    0  // Скидка
                );

и должна происходить печать чека. Вы передаете даже таблицу платежей, но в ней видимо нет разделения на налик и карточку.
короче говоря посмотрите, что в этой функции происходит, там конечно в ней будут вызываться еще много чего, и должно быть обращение непосредственно к функциям команды драйвера (если не программный РРО у Вас) или если программный РРО - то там должен джисон создаваться и потом отправляться в ПО для фискализации и печати.

Yanawerg

Максим75, Отследил весь путь но честно говоря так и не понял

Функция ПечатьЧекаПКО(Идентификатор, Пароль, НомерЧека, НомерСмены,
                         ОписаниеПлатежа, СуммаНал, СуммаБезнал) Экспорт

Результат = мНетОшибки;

Результат = ПечатьЧекаПКОРКО(Идентификатор, Ложь, Пароль, НомерЧека, НомерСмены,
ОписаниеПлатежа, СуммаНал, СуммаБезнал);

Возврат Результат;

КонецФункции


Функция ПечатьЧекаПКОРКО(Идентификатор, ЭтоРКО, Пароль, НомерЧека, НомерСмены,
                         ОписаниеПлатежа, СуммаНал, СуммаБезнал)

Обработка = Неопределено;
Объект    = Неопределено;
ВремНомерЧека = 0;
Результат = ПолучитьОбъектДрайвера(Идентификатор, Обработка, Объект);

Если НЕ ЗначениеЗаполнено(Результат) Тогда
НомерОтдела = Неопределено;
Результат   = Обработка.ПолучитьПараметрыНаличнойОплаты(Объект, НомерОтдела);

Если НЕ ЗначениеЗаполнено(Результат) Тогда
Результат = Обработка.ОткрытьЧек(Объект, Пароль, ЭтоРКО, ВремНомерЧека, НомерСмены, Истина);
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Позиция = Неопределено;
Для Каждого Позиция Из ОписаниеПлатежа Цикл
Результат = Обработка.ПечататьСтроку(Объект,
                                     Позиция.Заголовок,
                                     1,
                                     Позиция.Сумма,
                                     0,
                                     НомерОтдела,
                                     Позиция.НДС);

Если ЗначениеЗаполнено(Результат) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Результат = Обработка.ЗакрытьЧек(Объект, СуммаНал, СуммаБезнал);
КонецЕсли;
КонецЕсли;
КонецЕсли;
мОписаниеОшибки = Объект.ОписаниеОшибки;
Иначе
мОписаниеОшибки = ПолучитьТекстОшибкиПодключенияТО("ФР");
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Результат) Тогда
НомерЧека = ВремНомерЧека
КонецЕсли;

Возврат Результат;

КонецФункции

Максим75

Yanawerg, Результат = Обработка.ПечататьСтроку(Объект,
                                                         Позиция.Заголовок,
                                                         1,
                                                         Позиция.Сумма,
                                                         0,
                                                         НомерОтдела,
                                                         Позиция.НДС);

вот здесь и печатается каждая строка чека ККМ. Обработка - это некий глобальный модуль, в котором куча функций должна быть и оттуда и происходит отправка команд непосредственно в РРО. Там много чего (вот открыть чек, закрыть чек, явно есть отчеты, внесение денег, выемка и т.д.). Вот там и посмотрите, реализована ли возможность печати в чеке кроме налички еще чего-то.

То, что Вы сбросили, очень сильно напоминает печать ПКО/РКО, т.е. приходника и расходника с кассы, а там могут быть только наличные деньги, на то она и касса. Вы уверены, что это именно из чека ККМ такое вызывается?

Yanawerg

Максим75, Подскажите тогда другой момент.
Так-как поменялась НДС на 5% а Атол 10.10.6 не работает с моей 1С пришлось устанавливать РБСофт.

До этого работали на Атол 10.8.0.0 через Веб сервер и подключение шло следующим образом:

Процедура ОтправитьЗаданиеНаВебСервер(ПараметрыЧека) Экспорт

Идентификатор = ПараметрыЧека.Идентификатор;
Операция = ПараметрыЧека.Операция;
АдресWebСервера = ПараметрыЧека.АдресWebСервера;
ПортWebСервера = ПараметрыЧека.ПортWebСервера;

Если Операция = "ФискальныйЧек" Тогда
АдресWebСервера = ПараметрыЧека.АдресWebСервера;
ПортWebСервера = ПараметрыЧека.ПортWebСервера;
СсылкаНаОбъект = ПараметрыЧека.ТекущийЧек;
ОтветственноеЛицо = ПараметрыЧека.ОтветственноеЛицо;
НомерКонтрагента = ПараметрыЧека.НомерКонтрагента;

Если СсылкаНаОбъект = Неопределено Тогда
Сообщить("ОШИБКА! Чек ККМ не пробит! Не удалось создать чек ККМ!");
Возврат;
КонецЕсли;

JSONзадание = "{
|""uuid"": """+Идентификатор+""",
|""request"":
|{";

Если СсылкаНаОбъект.ВидОперации = Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
JSONзадание = JSONзадание + "
|""type"": ""sell"",";
ИначеЕсли СсылкаНаОбъект.ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат Тогда
JSONзадание = JSONзадание + "
|""type"": ""sellReturn"",";
КонецЕсли;

JSONзадание = JSONзадание + "
|""ignoreNonFiscalPrintErrors"": false,
    |""operator"": {
        | ""name"": """+СокрЛП(ОтветственноеЛицо)+"""
    | },";
Если СсылкаНаОбъект.Электронный Тогда
JSONзадание = JSONзадание + "
|""electronically"": true,
    |""clientInfo"": {
        | ""emailOrPhone"": """+СокрЛП(НомерКонтрагента)+"""
    | },";
КонецЕсли;
JSONзадание = JSONзадание + "
|""items"": [";

ТоварАванс = Справочники.Номенклатура.НайтиПоКоду("ШШ000024041");
ТоварОплатаКредита = Справочники.Номенклатура.НайтиПоКоду("ШШ000040292");

Для каждого СтрТовары из СсылкаНаОбъект.Товары Цикл
Если СтрТовары.НомерСтроки <> 1 Тогда
JSONзадание = JSONзадание + ",";
КонецЕсли;
JSONзадание = JSONзадание + "
| {
        |   ""type"": ""position"",
|   ""name"": """+СокрЛП(СтрТовары.Номенклатура)+""",
|   ""price"": "+Формат(СтрТовары.Цена,"ЧГ=0;ЧРД=.")+",
|   ""quantity"": "+Формат(СтрТовары.Количество,"ЧГ=0;ЧРД=.")+",
|   ""amount"": "+Формат(СтрТовары.Сумма,"ЧГ=0;ЧРД=.")+",";
Если СтрТовары.Номенклатура = ТоварАванс Тогда
JSONзадание = JSONзадание + "
|   ""paymentMethod"": ""advance"",
        |   ""paymentObject"": ""payment"",";
ИначеЕсли СтрТовары.Номенклатура = ТоварОплатаКредита Тогда
JSONзадание = JSONзадание + "
|   ""paymentMethod"": ""creditPayment"",
        |   ""paymentObject"": ""payment"",";
Иначе
Если СсылкаНаОбъект.ПризнакСпособаРасчета = Перечисления.ПризнакиСпособаРасчета.ПередачаВКредит Тогда
JSONзадание = JSONзадание + "
        |   ""paymentMethod"": ""credit"",";
ИначеЕсли СсылкаНаОбъект.ПризнакСпособаРасчета = Перечисления.ПризнакиСпособаРасчета.ПолныйРасчет Тогда
JSONзадание = JSONзадание + "
        |   ""paymentMethod"": ""fullPayment"",";
ИначеЕсли СсылкаНаОбъект.ПризнакСпособаРасчета = Перечисления.ПризнакиСпособаРасчета.ЧастичныйРасчетИКредит Тогда
JSONзадание = JSONзадание + "
        |   ""paymentMethod"": ""partialPayment"",";
КонецЕсли;
JSONзадание = JSONзадание + "
        |   ""paymentObject"": ""commodity"",";
КонецЕсли;
Если ЗначениеЗаполнено(СтрТовары.СуммаНДС) Тогда
Если СтрТовары.Номенклатура = ТоварАванс Тогда
JSONзадание = JSONзадание + "
        |   ""tax"": {
        |       ""type"": ""vat120"",
| ""sum"": "+Формат(СтрТовары.СуммаНДС,"ЧГ=0;ЧРД=.")+"
        |    }
        | }";
ИначеЕсли СтрТовары.Номенклатура = ТоварОплатаКредита Тогда
JSONзадание = JSONзадание + "
        |   ""tax"": {
        |       ""type"": ""none""
        |    }
        | }";
Иначе
JSONзадание = JSONзадание + "
        |   ""tax"": {
        |       ""type"": ""vat20"",
| ""sum"": "+Формат(СтрТовары.СуммаНДС,"ЧГ=0;ЧРД=.")+"
        |    }
        | }";
КонецЕсли;
Иначе
JSONзадание = JSONзадание + "
        |   ""tax"": {
        |       ""type"": ""none""
        |    }
        | }";
КонецЕсли;
КонецЦикла;

JSONзадание = JSONзадание + "
        | ],
|""payments"": [";

Для каждого СтрокаОплаты из СсылкаНаОбъект.Оплата Цикл
Если СтрокаОплаты.НомерСтроки <> 1 Тогда
JSONзадание = JSONзадание + ",";
КонецЕсли;
Если СтрокаОплаты.ВидОплаты = Справочники.ВидыОплатЧекаККМ.Наличные Тогда
JSONзадание = JSONзадание + "
| {
| ""type"": ""cash"",";
ИначеЕсли СтрокаОплаты.ВидОплаты = Справочники.ВидыОплатЧекаККМ.НайтиПоКоду("000000003") Тогда //Безналичные
JSONзадание = JSONзадание + "
| {
| ""type"": ""electronically"",";
ИначеЕсли СтрокаОплаты.ВидОплаты = Справочники.ВидыОплатЧекаККМ.НайтиПоКоду("000000004") Тогда //Предварительная оплата (аванс)
JSONзадание = JSONзадание + "
| {
| ""type"": ""prepaid"",";
ИначеЕсли СтрокаОплаты.ВидОплаты = Справочники.ВидыОплатЧекаККМ.НайтиПоКоду("000000005") Тогда //Последующая оплата (кредит)
JSONзадание = JSONзадание + "
| {
| ""type"": ""credit"",";
КонецЕсли;
JSONзадание = JSONзадание + "
| ""sum"": "+Формат(СтрокаОплаты.Сумма,"ЧГ=0;ЧРД=.")+"
| }";
КонецЦикла;

JSONзадание = JSONзадание + "
|   ]
|}
|}";
ИначеЕсли Операция = "X-отчет" Тогда
JSONзадание = "{
|""uuid"": """+Идентификатор+""",
|""request"":
|{
|""type"": ""reportX""
|}
|}";
ИначеЕсли Операция = "Z-отчет" Тогда
JSONзадание = "{
|""uuid"": """+Идентификатор+""",
|""request"":
|{
|""type"": ""closeShift""
|}
|}";
КонецЕсли;

//Сообщить(JSONзадание);

HTTPЗапрос = Новый HTTPЗапрос();
HTTPЗапрос.АдресРесурса = "/requests";
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");

HTTPЗапрос.УстановитьТелоИзСтроки(JSONзадание,"CESU-8");

Попытка
Соединение = Новый HTTPСоединение(АдресWebСервера,ПортWebСервера);
ОтветHTTP = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Исключение
Сообщить("Чек не пробит! Ошибка регистрации в очереди! Проверьте работоспособность сервера и параметры кассы!");
//Возврат;
КонецПопытки;

//обработаем ответ
Тело = ОтветHTTP.ПолучитьТелоКакСтроку();
Если Не ОтветHTTP.КодСостояния = 201 Тогда
Сообщить(Тело);
Сообщить("Чек не пробит! Ошибка регистрации в очереди! Проверьте работоспособность сервера и параметры кассы!");
Возврат;
КонецЕсли;

ПараметрыЧека.Вставить("ПоставленВОчередь",Истина);

КонецПроцедуры


Его можно как-то изменить что бы он подключался к серверу РБСофт ?
Так как процедура отправляет нужные реквизиты чека.

Максим75

Yanawerg, так у Вас программный РРО?
если да, тогда берите код подключения и исправляйте под ту структуру джисона, которую будет кушать другой сервер.
Вы же на сервер подключаетесь через Http запрос и передаете в теле запроса джисон-структуру с чеком. Вот и измените структуру и передавайте, главное, чтобы сервер скушал структуру, я же не знаю, возможно там адрес сервера другой будет, возможно в заголовках запроса что-то надо изменять, это в документации читать.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск