При оформлении розничных продаж в программах 1С часто возникает ситуация, когда покупателем выступает юридическое лицо или индивидуальный предприниматель. Согласно действующему законодательству (54-ФЗ), в таких случаях в кассовом чеке обязательно должны быть указаны наименование покупателя и его ИНН. Однако стандартные механизмы печати часто ограничивают длину строки, из-за чего наименование обрезается. В этой статье мы подробно разберем, как реализовать автоматический перенос длинного наименования на следующую строку, чтобы обеспечить соответствие первичного документа требованиям покупателя и налоговой службы.
Проанализируем ситуацию с точки зрения форматов фискальных документов (ФФД). Данные о покупателе передаются в ККТ в специальном теге 1227 (наименование покупателя). По стандарту этот тег может содержать до 256 символов. Проблема «обрезки» текста на бумажном чеке обычно не связана с потерей данных в электронном чеке, который уходит в ОФД. Тем не менее, для покупателя важно иметь визуально читаемое полное наименование в бумажной версии документа для корректного принятия расходов к учету.
Рассмотрим причины, по которым текст может не переноситься автоматически:
Прежде чем приступать к изменению программного кода 1С, проверим настройки самого оборудования. Большинство современных онлайн-касс (Атол, Штрих-М) поддерживают автоматический перенос строк на уровне прошивки или драйвера.
Выполним следующие шаги для проверки:
Драйвер ККТ 10.х).Перенос строк или Автоматический перенос. Если такой флаг есть, его включение позволит драйверу самостоятельно разбивать длинный текст тега 1227 на несколько физических строк чека.Если драйвер не поддерживает автоматический перенос или нам требуется жестко контролировать визуальное представление, рассмотрим программный метод решения задачи. В типовых конфигурациях 1С (таких как Управление торговлей 11, Розница 2.3/3.0 или Бухгалтерия предприятия 3.0) данные для чека готовятся в виде XML-пакета.
Проанализируем ситуацию: тег 1227 является фискальным реквизитом. Мы не можем просто вставить символы переноса строки Символы.ПС внутрь значения тега, так как это может привести к ошибке формата при передаче данных в ФНС. Правильным подходом будет использование нефискальных строк для дублирования информации.
Разберем алгоритм доработки в общем модуле, ответственном за формирование чека (обычно это модули, связанные с МенеджерОборудованияВызовСервера или обработчики команд печати чека):
// Пример функции для разбивки длинной строки наименования
Функция РазбитьНаименованиеДляПечати(ИсходнаяСтрока, МаксДлинаСтроки)
МассивСтрок = Новый Массив;
ТекущаяСтрока = ИсходнаяСтрока;
Пока СтрДлина(ТекущаяСтрока) > 0 Цикл
ЧастьСтроки = Лев(ТекущаяСтрока, МаксДлинаСтроки);
МассивСтрок.Добавить(ЧастьСтроки);
ТекущаяСтрока = Сред(ТекущаяСтрока, МаксДлинаСтроки + 1);
КонецЦикла;
Возврат МассивСтрок;
КонецФункции
Далее, при формировании XML для ККТ, мы можем добавить эти строки в секцию текстовых сообщений, которые печатаются сразу после или до блока «Покупатель». Посмотрим на пример формирования структуры текста:
// Предположим, мы формируем массив строк для печати в чеке
НаименованиеПокупателя = "Общество с ограниченной ответственностью 'ДлинноеНаименованиеДляПроверкиПереноса'";
МаксимальнаяШиринаЛенты = 32; // Пример для узкой ленты
МассивЧастей = РазбитьНаименованиеДляПечати(НаименованиеПокупателя, МаксимальнаяШиринаЛенты);
Для Каждого СтрокаЧасть Из МассивЧастей Цикл
// Добавляем программный вывод текстовой строки в XML-пакет
// Используем стандартные механизмы БПО для добавления текстовых строк
ДобавитьТекстовуюСтрокуВЧек(ДанныеЧека, СтрокаЧасть);
КонецЦикла;
Если вмешательство в структуру формирования фискального чека кажется слишком рискованным, выясним причину необходимости переноса. Если покупателю важно видеть полное название именно для отчетности, мы можем программно добавить вывод нефискального текста в конце чека (после итога и подписи).
В 1С при использовании БПО за это отвечает структура TextString. Рассмотрим пример заполнения данных:
// В структуре формирования чека для БПО
// добавляем блок нефискальных данных
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "Покупатель: " + ПолноеНаименованиеПокупателя);
ЗаписьXML.ЗаписатьКонецЭлемента(); // TextString
Важно помнить: при таком подходе в самом теге 1227 (который является фискальным) все равно останется обрезанная строка, но на бумаге покупатель увидит полную информацию в дополнительном текстовом блоке.
Иногда проблему можно решить без программирования, просто изменив настройки шрифта в кассовом аппарате. Проанализируем настройки ККТ: большинство моделей позволяют выбрать один из встроенных шрифтов (Шрифт №1, Шрифт №2 и т.д.). Узкие шрифты позволяют уместить до 48 символов в одной строке на 80-мм ленте. Этого объема обычно достаточно для большинства названий организаций без необходимости реализации сложного переноса.
Организация переноса наименования покупателя — задача комплексная. Мы рекомендуем начинать с обновления драйверов ККТ и проверки настроек автоматического переноса в параметрах оборудования. Если это не помогает, следует прибегнуть к программной разбивке строки в модулях 1С, используя механизмы БПО для вывода текстовых строк. Помните, что приоритетом является корректность передачи данных в теге 1227 в электронном виде, а визуальное отображение на чеке может быть дополнено нефискальными строками для удобства контрагента.