Хочу напечатать обычный чек, но в шапке чека хочу напечатать дополнительные строки текста программно. Использую в начале функции печати чека (ПечататьЧек) следующий код:
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = "устройство не подключено";
Возврат 0;
ИначеЕсли ПодключитьсяКФР(Объект) = 0 Тогда
Возврат 0;
КонецЕсли;
Объект.Mode = 1; // режим регистрации чеков
Объект.Password = Пароль; // пароль на режим регистрации
Объект.SetMode();
Объект.GetStatus();
Если Объект.СостояниеЧека <> 0 Тогда
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
КонецЕсли;
Если Объект.Результат <> 0 Тогда
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
ОтключитьсяОтФР(Объект, 0);
Возврат 0;
КонецЕсли;
// регистрация товаров
РезРегистрация = 1;
СписокТоваров.ВыбратьСтроки();
ДлинаНаименования = Объект.ДлинаСтрокиСимволов; // зависит от модели ФР
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
//Проверка наличия колонки "НДС" в таблице значений.
НДСЕсть = "";
Попытка
НДС = СписокТоваров.НДС;
НДСЕсть = 1;
Исключение
НДСЕсть = 0;
КонецПопытки;
Если НДСЕсть = 1 Тогда
Объект.Name = "...";
Иначе
Объект.Name = "..."; //Лев(СписокТоваров.ТовНаим, ДлинаНаименования);
КонецЕсли;
Если Объект.Результат <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
ОтключитьсяОтФР(Объект, 0);
Возврат 0;
КонецЕсли;
Если НДСЕсть = 1 Тогда
СтрокаДляПечати = "";//СписокТоваров.ТовНаим;
Пока СтрДлина(СтрокаДляПечати)>0 Цикл
Объект.Caption = Лев(СтрокаДляПечати,ДлинаНаименования);
Объект.PrintString();
СтрокаДляПечати = СокрЛП(Сред(СтрокаДляПечати,ДлинаНаименования+1));
КонецЦикла;
КонецЕсли;
Если Объект.Результат <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
ОтключитьсяОтФР(Объект, 0);
Возврат 0;
КонецЕсли;
КонецЦикла;
Если ПустоеЗначение(Скидка) = 0 Тогда
Если Скидка < 0 Тогда
// надбавка
Объект.Percents = -Скидка;
Объект.ПроцентнаяНадбавка();
Иначе
// Скидка
Объект.Percents = Скидка;
Объект.ПроцентнаяСкидка();
КонецЕсли;
КонецЕсли;
Если Объект.Результат <> 0 Тогда
Объект.Percents = 0;
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
ОтключитьсяОтФР(Объект, 0);
Возврат 0;
КонецЕсли;
Объект.Department = НомерСекции;
НомерЧека = Объект.НомерЧека;
Если (Получено > 0) И (Получено > СуммаЧека) Тогда
Объект.Summ = Окр(Получено, 2, 1);
Объект.ОплатаСоСдачей();
Иначе
Объект.ЗакрытьЧек();
КонецЕсли;
Если Объект.Результат <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
ОтключитьсяОтФР(Объект, 0);
Возврат 0;
КонецЕсли;
(6) Ёпрст, так будет печататься, но в каждой строке с товаром в чеке. Можно функцию печати строк поставить после НомерЧека = Объект.НомерЧека; но тогда текст печатается после окончания строк с товарами и Итого. Что тоже неудобно.
Нужно, чтобы текст был или в шапке или после всех Итого. В ШтрихМ всё работает нормально. Вот код
Функция ПечататьЧек(Объект, СписокТоваров, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ТипОплаты, СписокРеклТекст, ВключитьРеклЧек)
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = "устройство не подключено";
Возврат 0;
КонецЕсли;
//печать логотипа
Объект.НомерПервойЛинии=1;
Объект.НомерПоследнейЛинии=90;
Объект.Пароль=глФРПарольПользователя;
Объект.ПечатьКартинки();
//печать номера кассы
Объект.ИспользоватьЧековуюЛенту=1;
Объект.ИспользоватьПодкладнойДокумент=0;
Объект.Пароль=глФРПарольПользователя;
Объект.СтрокаДляПечати=НомерСекции;
Объект.ПечатьСтроки();
//печать ФИО кассира
Объект.ИспользоватьЧековуюЛенту=1;
Объект.ИспользоватьПодкладнойДокумент=0;
Объект.Пароль=глФРПарольПользователя;
Объект.СтрокаДляПечати="ФИО кассира: "+СокрЛП(Пользователь.Сотрудник.Наименование);
Объект.ПечатьСтроки();
// регистрация товаров
РезРегистрация = 1;
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
Объект.Отдел = 1;
Объект.СтрокаДляПечати = Лев(СписокТоваров.ТовНаим, 40);
Объект.Цена = Окр(СписокТоваров.Цена,2,1);
Объект.Количество = СписокТоваров.Количество;
Если ПризнВозврата = 0 Тогда
Объект.Продажа();
Иначе
Объект.ВозвратПродажи();
КонецЕсли;
Если Объект.Результат <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Возврат 0;
КонецЕсли;
КонецЦикла;
*********** и т.д.
(10) Ёпрст, меняющийся. Одна часть текстов это ФИО + ещё одно поле. Вторая часть это рекламный текст из 4 строк
Объектов несколько, по нескольку ККМ. Стрёмно менять вручную везде )))) В версии АТОЛ не может быть дело?
В-общем, вывел информацию перед разделом "Итого". Клиент не возражает.
Думаю, проблема в самом устройстве, а не в драйвере АТОЛ.
PS: Если у кого вдруг появится более подходящее решение, просьба поделиться здесь.
Проблема эта на свежих драйверах Атола! Они там функцию поменяли печати строки с год назад сталкивался с такой проблемой решилась переделкой обработки печати чека! Смотри в документацию по драйверам Атола: http://www.atol.ru/link/file/66/
(13) Studman, спасибо за ответ. Можно расшифровать "переделкой обработки печати чека"?
Опишу еще раз проблему "Печать строки возможна только внутри открытого чека. До него и после невозможна." попробовать откатить драйвера?
Я не нашел у тебя команды OpenCheck() или BeginDocument() перед печатью строки!
"BeginDocument()
НачалоДокумента()
Печать нефискального документа на принтере ПД. Метод переводит драйвер в состояние
буферизации данных, добавляемых методами печати
строки и поля.Это означает, что все последующие команды PrintString, AddField
и PrintField помещают данные во временный буфер драйвера (в памяти ПК). Данные будут переданы и
напечатаны на ККМ только по команде EndDocument. Очистка буфера осуществляется командой
ClearOutput."
"OpenCheck()
ОткрытьЧек()
Метод открывает чек соответствующего типа (свойство
CheckType). После успешного выполнения метода состояние чека меняется на соответствующее и на
чековой и контрольной лентах печатается наименование типа чека. Сумма чека при
выполнении данного метода не меняется."
(17) Studman, так я же не печатаю нефискальный документ. Можешь в коде выставить, где это нужно ставить? А OpenCheck зачем? У меня же новый чек. Не пойму ход мыслей, пардон.
Я не помню, говорю же год назад разбирался у меня в начале чека такой код:
Функция ПечататьЧек(Объект, Пароль, СписокТоваров, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека,ТипОплаты)
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = "устройство не подключено";
Возврат 0;
КонецЕсли;
Объект.Mode = 1; // режим регистрации чеков
Объект.Password = Пароль; // пароль на режим регистрации
Объект.SetMode();
Объект.GetStatus();
Если Объект.СостояниеЧека <> 0 Тогда
Попытка
Объект.TypeClose=ТипОплаты;
Объект.CancelCheck();
Исключение
КонецПопытки;
КонецЕсли;
Если ПризнВозврата=0 Тогда
Объект.checkType=1;
Иначе
Объект.CheckType=2;
КонецЕсли;
Ход мыслей очень прост! Если он тебе выдает ошибку что "Печать строки возможна только внутри открытого чека. До него и после невозможна.", то видимо ему надо как то открыть чек и показать что ты добавляеш строки в уже открытый документ.
Функция ПечататьЧек(Объект, Пароль, СписокТоваров, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека,ТипОплаты)
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = "устройство не подключено";
Возврат 0;
КонецЕсли;
Объект.Mode = 1; // режим регистрации чеков
Объект.Password = Пароль; // пароль на режим регистрации
Объект.SetMode();
Объект.GetStatus();
Если Объект.СостояниеЧека <> 0 Тогда
Попытка
Объект.TypeClose=ТипОплаты;
Объект.CancelCheck();
Исключение
КонецПопытки;
КонецЕсли;
Если Объект.Результат <> 0 Тогда
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Возврат 0;
КонецЕсли;
Объект.OpenCheck();
Объект.Caption= " ";
Объект.TextWrap=1;
Объект.Alignment=1;
Объект.PrintString();
Объект.FontItalic =0;
РезРегистрация = 1;
ДлинаНаименования = Объект.ДлинаСтрокиСимволов; // зависит от модели ФР
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
Если СписокТоваров.Количество=0 Тогда
Если СписокТоваров.ДвойнойРазмер=0 Тогда
Если СписокТоваров.ТовНаим<>"" Тогда
Объект.FontDblHeight=-1;
Объект.Caption= СписокТоваров.ТовНаим;
Объект.TextWrap=1;
Объект.FontBold = -1;
Объект.Alignment=СписокТоваров.Ориентация;
Объект.PrintString();
КонецЕсли;
Иначе
Если СписокТоваров.ТовНаим<>"" Тогда
Объект.FontBold = -1;
Объект.Caption= СписокТоваров.ТовНаим;
Объект.Alignment=СписокТоваров.Ориентация;
Объект.PrintField();
КонецЕсли;
КонецЕсли;
Иначе
Объект.Name = Лев(СписокТоваров.ТовНаим, ДлинаНаименования);
Объект.Price = Окр(СписокТоваров.Цена,2,1);
Объект.Quantity = СписокТоваров.Количество;
Если ПризнВозврата = 0 Тогда
Объект.Регистрация();
Иначе
Объект.Возврат();
КонецЕсли;
КонецЕсли;
Если Объект.Результат <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
Возврат 0;
КонецЕсли;
КонецЦикла;
Если ПустоеЗначение(Скидка) = 0 Тогда
Если Скидка < 0 Тогда
// надбавка
Объект.Percents = -Скидка;
Объект.ПроцентнаяНадбавка();
Иначе
// Скидка
Объект.Percents = Скидка;
Объект.ПроцентнаяСкидка();
КонецЕсли;
КонецЕсли;
Если Объект.Результат <> 0 Тогда
Объект.Percents = 0;
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Попытка
Объект.CancelCheck();
Исключение
КонецПопытки;
Возврат 0;
КонецЕсли;
НомерЧека = Объект.НомерЧека;
Если (Получено > 0) И (Получено > СуммаЧека) Тогда
Объект.Summ = Окр(Получено, 2, 1);
Объект.ОплатаСоСдачей();
Иначе
Объект.TypeClose=ТипОплаты;
Объект.ЗакрытьЧек();
КонецЕсли;
Если Объект.Результат <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Попытка
Объект.TypeClose=ТипОплаты;
Объект.CancelCheck();
Исключение
КонецПопытки;
Возврат 0;
КонецЕсли;
Возврат 1;
КонецФункции
Здравствуйте, хоть тема и стара, но всё-таки.. хочется немного поспрашивать:
1) Как вы сделали "оплата подарочными картами"
2) Я не совсем понял, может ли быть в одном чеке и регистрация и возврат. Т.е. Продали товар +1 и тут же в этом чеке возврат подарочная карта - так это возможно?
3) Объект.ЗакрытьЧек(); - тут без разницы, мы возвращаем деньги клиенту (возврат) или он нам платит? ККМ сам определяет?