При разработке внешних обработок часто возникает задача динамического формирования графических данных, например, генерация штрихкода «вручную» путем закрашивания ячеек табличного документа. Рассмотрим подробно, как обратиться к ячейкам макета, изменить их фон и корректно отобразить результат пользователю.
Для того чтобы изменить любое свойство ячейки (цвет фона, шрифт, текст), нам необходимо получить объект типа ОбластьЯчеекТабличногоДокумента. Это делается с помощью метода Область(). Мы можем обращаться к конкретной ячейке или к диапазону ячеек, указывая координаты: номер первой строки, номер первой колонки, номер последней строки и номер последней колонки.
Разберем базовый синтаксис изменения цвета фона:
// Получаем область (одна ячейка на пересечении 1-й строки и 5-й колонки)
Область = ТабДок.Область(1, 5, 1, 5);
// Устанавливаем черный цвет фона
Область.ЦветФона = WebЦвета.Черный;
Если нам нужно закрасить целую полосу (например, для имитации штриха), мы можем указать диапазон строк. Проанализируем пример, где мы закрашиваем вертикальную линию в первой колонке с 1-й по 10-ю строку:
ОбластьШтриха = ТабДок.Область(1, 1, 10, 1);
ОбластьШтриха.ЦветФона = Новый Цвет(0, 0, 0); // Черный цвет через RGB
Представим ситуацию: у нас есть двоичный код (строка из "0" и "1"), и нам нужно превратить его в последовательность черных и белых полос. Рассмотрим пошагово, как реализовать этот цикл в коде:
ТабличныйДокумент.Посмотрим на пример реализации:
ТабДок = Новый ТабличныйДокумент;
ДвоичныйКод = "101100101"; // Пример данных
Для Поз = 1 По СтрДлина(ДвоичныйКод) Цикл
Символ = Сред(ДвоичныйКод, Поз, 1);
// Выделяем ячейку в первой строке и текущей колонке
ТекущаяЯчейка = ТабДок.Область(1, Поз, 1, Поз);
// Устанавливаем ширину колонки (0.5 - очень узкая)
ТекущаяЯчейка.ШиринаКолонки = 0.5;
Если Символ = "1" Тогда
ТекущаяЯчейка.ЦветФона = WebЦвета.Черный;
Иначе
ТекущаяЯчейка.ЦветФона = WebЦвета.Белый;
КонецЕсли;
КонецЦикла;
После того как табличный документ сформирован и раскрашен в памяти, его необходимо показать пользователю. В управляемом приложении 1С существует два основных способа сделать это.
Способ 1: Использование реквизита формы.
Это наиболее удобный вариант, если вы хотите, чтобы штрихкод отображался прямо внутри окна вашей обработки. Выполним следующие действия:
РезультатПечати) и установим ему тип ТабличныйДокумент.
// На сервере
Объект.РезультатПечати = ТабДок;
Способ 2: Метод Показать().
Если результат нужно вывести в отдельном модальном или стандартном окне просмотра (как перед печатью на принтер), используем метод Показать().
ТабДок.Показать("Сформированный штрихкод");
Чтобы результат выглядел профессионально и корректно считывался сканерами, проанализируем дополнительные настройки оформления:
1. Отключение сетки. По умолчанию в табличном документе видны серые линии сетки. Для штрихкода они лишние. Отключим их командой: ТабДок.ОтображатьСетку = Ложь;.
2. Управление границами. Иногда между закрашенными ячейками могут проскакивать белые пиксели из-за установленных границ. Чтобы этого избежать, убедитесь, что у ячеек нет обрамления:
Область.ГраницаСлева = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Нет);
Область.ГраницаСправа = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Нет);
3. Производительность. Если штрихкод очень длинный, обращение к методу Область() на каждой итерации может замедлить работу. В таких случаях рекомендуется сначала сформировать макет, а затем выводить его секциями, либо использовать один объект области для изменения свойств группы ячеек.
4. Использование цветов. Рекомендуется использовать системное перечисление WebЦвета. Это гарантирует, что цвета будут отображаться одинаково как в толстом клиенте, так и в веб-клиенте через браузер.
Выясним еще одну интересную возможность 1С: вместо закрашивания фона самих ячеек можно программно добавлять в табличный документ объекты типа «Рисунок». Это позволяет рисовать линии абсолютно любой ширины, не привязываясь к сетке колонок.
// Добавление прямоугольника (штриха)
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);
Рисунок.Расположить(ТабДок.Область("R1C1:R10C1")); // Размещаем в определенных координатах
Рисунок.ЦветФона = WebЦвета.Черный;
Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Нет);
Таким образом, мы рассмотрели классический способ управления фоном через области ячеек и дополнительные методы настройки визуализации. Выбор конкретного метода зависит от сложности графического объекта, который вы планируете создать.