При оформлении акционных ценников в розничной торговле часто требуется наглядно показать старую и новую цену. Стандартное свойство шрифта Зачеркнутый проводит только горизонтальную черту посередине текста. Чтобы зачеркнуть цену диагональной или косой линией, необходимо использовать графические возможности табличного документа 1С. Рассмотрим подробнее, как это реализовать, с какими ограничениями платформы можно столкнуться и как решить возможные проблемы с отображением при печати.
Прежде чем перейти к реализации, проанализируем базовые особенности работы платформы с табличными документами:
ГраницаСверху, ГраницаСнизу, ГраницаСлева и ГраницаСправа. Сделать диагональную границу встроенным свойством ячейки невозможно.РисунокТабличногоДокумента с типом ТипРисункаТабличногоДокумента.Прямая всегда проводится строго из левого верхнего угла ограничивающего прямоугольника в правый нижний угол. Сделать восходящую линию этим инструментом не получится.Разберем самый простой вариант добавления косой линии непосредственно в макете ценника через визуальный редактор конфигуратора или пользовательского макета:
Истина. При необходимости настроим толщину и цвет линии (например, выберем красный цвет для акцента).Важная причина, почему линия может не выводиться на печать:
Если линия нарисована в макете, но её границы хотя бы на пиксель выходят за пределы именованной секции ценника, платформа при выполнении метода ТабДок.Вывести(Область) не включает графический объект в вывод. Линия должна строго принадлежать той секции макета, которая отправляется на печать, либо перекрывать область целиком в пределах одной секции.
Чтобы избежать проблем со смещением линии при динамическом изменении длины цены или размеров строк ценника, наилучшим решением является программное добавление линии в коллекцию рисунков выводимой области. Метод Расположить() позволяет вписать графический объект ровно в границы целевой ячейки.
Посмотрим на пример кода формирования ценника:
// Получаем область ценника из макета
ОбластьЦенника = Макет.ПолучитьОбласть("Ценник");
// Заполняем параметры области
ОбластьЦенника.Параметры.СтараяЦена = СтараяЦена;
ОбластьЦенника.Параметры.НоваяЦена = НоваяЦена;
// Создаем графическую линию перечеркивания
ЛинияПеречеркивания = ОбластьЦенника.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямая);
ЛинияПеречеркивания.ВыводитьНаПечать = Истина;
ЛинияПеречеркивания.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 2);
ЛинияПеречеркивания.ЦветЛинии = WebЦвета.Красный;
// Точно вписываем линию в границы ячейки со старой ценой
ЛинияПеречеркивания.Расположить(ОбластьЦенника.Область("СтараяЦена"));
// Выводим секцию в итоговый табличный документ
ТабДок.Вывести(ОбластьЦенника);
Такой подход гарантирует, что линия всегда будет привязана к ячейке с ценой и гарантированно попадет в результирующий документ для вывода на печать.
Если требуется зачеркнуть цену снизу вверх (классический росчерк справа налево или слева направо наверх), стандартный объект Прямая не подойдет из-за фиксированного направления отрисовки. В такой ситуации разберем использование прозрачного изображения:
ТипРисункаТабличногоДокумента.Картинка поверх ячейки цены либо поместим его в общие картинки конфигурации.Расположить(), аналогично первому способу.Выясним еще один альтернативный способ, который не требует работы с графическими объектами табличного документа. Это актуально при выводе на специализированные термопринтеры ценников и этикеток, где векторная графика иногда масштабируется некорректно. Можно воспользоваться специальным комбинируемым символом Unicode U+0338 (Combining Long Solidus Overlay), который накладывает косую черту на предшествующий символ.
Рассмотрим функцию преобразования текста цены:
Функция ЗачеркнутьКосойЧертой(ИсходныйТекст)
СимволСлеша = Символ(824); // U+0338
Результат = "";
Для Позиция = 1 По СтрДлина(ИсходныйТекст) Цикл
Результат = Результат + Сред(ИсходныйТекст, Позиция, 1) + СимволСлеша;
КонецЦикла;
Возврат Результат;
КонецФункции
Обратите внимание: корректность отрисовки комбинированного символа зависит от шрифта, выбранного для ценника. Рекомендуется протестировать печать на используемом принтере перед внедрением этого способа.