При разработке печатных форм нередко возникает задача скрыть определенные конфиденциальные данные — например, цены или суммы в коммерческих предложениях или накладных. Распространенной ошибкой начинающих разработчиков и пользователей является попытка «замаскировать» текст, установив цвет шрифта в ячейке белым в цвет фона. Однако при отправке такого документа на физический принтер или при экспорте данные все равно становятся видимыми. Разберем причины такого поведения и рассмотрим правильные программные подходы к решению этой задачи в 1С.
Проанализируем технические причины, из-за которых скрытый белым цветом текст проявляется при печати:
ТабличныйДокумент. При сохранении макета в форматы PDF или Excel текстовый слой полностью сохраняется. Любой пользователь может прочитать скрытые данные простым выделением текста, копированием в буфер обмена или изменением цвета ячейки.Главное правило: чтобы данные не отображались на бумаге и не попали клиенту, их необходимо физически исключать из табличного документа на этапе формирования, а не просто перекрашивать макет.
Рассмотрим вариант, когда данные для печатной формы формируются запросом. Мы можем передать в запрос логический параметр и проверять необходимость вывода цен с помощью конструкции ВЫБОР.
Посмотрим на пример текста запроса:
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
Товары.Количество КАК Количество,
ВЫБОР
КОГДА &НеПечататьЦены ТОГДА ""
ИНАЧЕ Товары.Цена
КОНЕЦ КАК Цена,
ВЫБОР
КОГДА &НеПечататьЦены ТОГДА ""
ИНАЧЕ Товары.Сумма
КОНЕЦ КАК Сумма
ИЗ
Документ.КоммерческоеПредложение.Товары КАК Товары
ГДЕ
Товары.Ссылка = &Ссылка
При установке параметра НеПечататьЦены со значением Истина в поля цены и суммы попадет пустая строка, благодаря чему ячейки на печатной форме физически останутся пустыми.
Если запрос универсальный и модифицировать его нежелательно, разберем программную обработку параметров области макета перед выводом строки в результирующий табличный документ.
Посмотрим на пример заполнения строки в цикле:
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого Стр Из ТаблицаТоваров Цикл
ОбластьСтрока.Параметры.Заполнить(Стр);
Если НеВыводитьЦены Тогда
ОбластьСтрока.Параметры.Цена = "";
ОбластьСтрока.Параметры.Сумма = "";
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
В этом случае в макете сохраняются исходные параметры, но при выводе строк с активным флагом скрытия значения принудительно очищаются.
В случаях, когда пустая колонка «Цена» нарушает оформление документа, рассмотрим полное исключение колонки из макета с помощью горизонтальных и вертикальных секций.
КолонкаНоменклатура, КолонкаКоличество, КолонкаЦена, КолонкаСумма.Вывести(), а остальные колонки добавляем методом Присоединить().Разберем пример кода формирования строки:
ОбластьСтрокаНоменклатура = Макет.ПолучитьОбласть("Строка|КолонкаНоменклатура");
ОбластьСтрокаКоличество = Макет.ПолучитьОбласть("Строка|КолонкаКоличество");
ОбластьСтрокаЦена = Макет.ПолучитьОбласть("Строка|КолонкаЦена");
Для Каждого Стр Из ТаблицаТоваров Цикл
ОбластьСтрокаНоменклатура.Параметры.Заполнить(Стр);
ТабличныйДокумент.Вывести(ОбластьСтрокаНоменклатура);
ОбластьСтрокаКоличество.Параметры.Заполнить(Стр);
ТабличныйДокумент.Присоединить(ОбластьСтрокаКоличество);
Если ВыводитьЦены Тогда
ОбластьСтрокаЦена.Параметры.Заполнить(Стр);
ТабличныйДокумент.Присоединить(ОбластьСтрокаЦена);
КонецЕсли;
КонецЦикла;
Аналогичным образом формируются области шапки и подвала таблицы, что позволяет автоматически перестраивать ширину таблицы без пустых пробелов.
Если макет уже сформирован целиком, но требуется скрыть определенную колонку, можно воспользоваться свойством видимости области ячеек табличного документа.
Посмотрим на пример скрытия третьей колонки документа:
Если НеВыводитьЦены Тогда
ТабличныйДокумент.Область("C3:C3").Видимость = Ложь;
КонецЕсли;
Данный метод сжимает колонку до нулевой ширины, полностью скрывая ее содержимое как при просмотре на экране, так и при выводе на печать.
Для удобства пользователей рекомендуется не требовать ручного редактирования настроек, а зарегистрировать в модуле менеджера объекта две отдельные команды печати через Библиотеку стандартных подсистем (БСП):
Разберем регистрацию команд в процедуре ДобавитьКомандыПечати:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
Команда = КомандыПечати.Добавить();
Команда.Идентификатор = "КоммерческоеПредложение";
Команда.Представление = НСтр("ru = 'Коммерческое предложение'");
Команда.ПроверкаПроведенияПередПечатью = Ложь;
Команда = КомандыПечати.Добавить();
Команда.Идентификатор = "КоммерческоеПредложениеБезЦен";
Команда.Представление = НСтр("ru = 'Коммерческое предложение (без цен)'");
Команда.ПроверкаПроведенияПередПечатью = Ложь;
КонецПроцедуры
В процедуре печати анализируем ИдентификаторКоманды: если вызвана печать без цен, передаем соответствующий флаг в процедуру формирования макета. Это исключает ошибки пользователей и гарантирует корректную печать документов.