Почему белый текст в печатной форме 1С виден при печати и как правильно скрыть цены

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке печатных форм нередко возникает задача скрыть определенные конфиденциальные данные — например, цены или суммы в коммерческих предложениях или накладных. Распространенной ошибкой начинающих разработчиков и пользователей является попытка «замаскировать» текст, установив цвет шрифта в ячейке белым в цвет фона. Однако при отправке такого документа на физический принтер или при экспорте данные все равно становятся видимыми. Разберем причины такого поведения и рассмотрим правильные программные подходы к решению этой задачи в 1С.

Почему маскирование цветом не работает

Проанализируем технические причины, из-за которых скрытый белым цветом текст проявляется при печати:

  1. Особенности работы драйверов печати. При отправке документа на монохромный лазерный принтер либо при активированном режиме печати в оттенках серого драйвер устройства выполняет растеризацию. Алгоритмы оптимизации контрастности для сохранения читаемости текста принудительно заменяют светлые оттенки шрифтов на черный цвет, игнорируя установленное значение белого цвета.
  2. Небезопасность экспорта. Изменение цвета текста не удаляет значение из объекта ТабличныйДокумент. При сохранении макета в форматы PDF или Excel текстовый слой полностью сохраняется. Любой пользователь может прочитать скрытые данные простым выделением текста, копированием в буфер обмена или изменением цвета ячейки.

Главное правило: чтобы данные не отображались на бумаге и не попали клиенту, их необходимо физически исключать из табличного документа на этапе формирования, а не просто перекрашивать макет.

Способ 1. Управление выводом цен на уровне запроса

Рассмотрим вариант, когда данные для печатной формы формируются запросом. Мы можем передать в запрос логический параметр и проверять необходимость вывода цен с помощью конструкции ВЫБОР.

Посмотрим на пример текста запроса:


ВЫБРАТЬ
	Товары.Номенклатура КАК Номенклатура,
	Товары.Количество КАК Количество,
	ВЫБОР
		КОГДА &НеПечататьЦены ТОГДА ""
		ИНАЧЕ Товары.Цена
	КОНЕЦ КАК Цена,
	ВЫБОР
		КОГДА &НеПечататьЦены ТОГДА ""
		ИНАЧЕ Товары.Сумма
	КОНЕЦ КАК Сумма
ИЗ
	Документ.КоммерческоеПредложение.Товары КАК Товары
ГДЕ
	Товары.Ссылка = &Ссылка

При установке параметра НеПечататьЦены со значением Истина в поля цены и суммы попадет пустая строка, благодаря чему ячейки на печатной форме физически останутся пустыми.

Способ 2. Очистка параметров макета перед выводом

Если запрос универсальный и модифицировать его нежелательно, разберем программную обработку параметров области макета перед выводом строки в результирующий табличный документ.

Посмотрим на пример заполнения строки в цикле:


ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

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

В этом случае в макете сохраняются исходные параметры, но при выводе строк с активным флагом скрытия значения принудительно очищаются.

Способ 3. Использование горизонтальных и вертикальных секций

В случаях, когда пустая колонка «Цена» нарушает оформление документа, рассмотрим полное исключение колонки из макета с помощью горизонтальных и вертикальных секций.

  1. Разделим макет печатной формы на вертикальные колонки: например, КолонкаНоменклатура, КолонкаКоличество, КолонкаЦена, КолонкаСумма.
  2. В модуле печати выводим сначала базовую секцию методом Вывести(), а остальные колонки добавляем методом Присоединить().

Разберем пример кода формирования строки:


ОбластьСтрокаНоменклатура = Макет.ПолучитьОбласть("Строка|КолонкаНоменклатура");
ОбластьСтрокаКоличество   = Макет.ПолучитьОбласть("Строка|КолонкаКоличество");
ОбластьСтрокаЦена         = Макет.ПолучитьОбласть("Строка|КолонкаЦена");

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

Аналогичным образом формируются области шапки и подвала таблицы, что позволяет автоматически перестраивать ширину таблицы без пустых пробелов.

Способ 4. Программное управление видимостью колонок

Если макет уже сформирован целиком, но требуется скрыть определенную колонку, можно воспользоваться свойством видимости области ячеек табличного документа.

Посмотрим на пример скрытия третьей колонки документа:


Если НеВыводитьЦены Тогда
	ТабличныйДокумент.Область("C3:C3").Видимость = Ложь;
КонецЕсли;

Данный метод сжимает колонку до нулевой ширины, полностью скрывая ее содержимое как при просмотре на экране, так и при выводе на печать.

Способ 5. Реализация двух вариантов печатных форм в БСП

Для удобства пользователей рекомендуется не требовать ручного редактирования настроек, а зарегистрировать в модуле менеджера объекта две отдельные команды печати через Библиотеку стандартных подсистем (БСП):

  1. Команда «Коммерческое предложение».
  2. Команда «Коммерческое предложение (без цен)».

Разберем регистрацию команд в процедуре ДобавитьКомандыПечати:


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

	Команда = КомандыПечати.Добавить();
	Команда.Идентификатор = "КоммерческоеПредложение";
	Команда.Представление = НСтр("ru = 'Коммерческое предложение'");
	Команда.ПроверкаПроведенияПередПечатью = Ложь;

	Команда = КомандыПечати.Добавить();
	Команда.Идентификатор = "КоммерческоеПредложениеБезЦен";
	Команда.Представление = НСтр("ru = 'Коммерческое предложение (без цен)'");
	Команда.ПроверкаПроведенияПередПечатью = Ложь;

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

В процедуре печати анализируем ИдентификаторКоманды: если вызвана печать без цен, передаем соответствующий флаг в процедуру формирования макета. Это исключает ошибки пользователей и гарантирует корректную печать документов.

← На главную