В практике разработки на платформе 1С:Предприятие часто возникает задача ограничения доступа к конфиденциальной информации, такой как цены закупки или суммы реализации, для определенных категорий пользователей. Особенно актуально это для старых конфигураций, работающих на обычных формах (например, 1С:Управление торговлей 10.3). В данной статье мы подробно разберем, как реализовать механизм скрытия колонок в печатной форме документа «Списание товаров», опираясь на технические рекомендации опытных разработчиков.
Рассмотрим ситуацию: в функции ПечатьСписаниеТоваров необходимо реализовать отбор. Если у текущего пользователя есть определенные права (например, полные права), то в печатной форме не должны отображаться колонки «Цена» и «Сумма». Если прав нет — форма выводится в стандартном виде. Основная сложность заключается в том, что макет печатной формы имеет жесткую структуру, и простое удаление параметров из кода может привести к нарушению визуального оформления.
Проанализируем структуру макета. Обычно область строки таблицы (например, область Строка) включает в себя все колонки от номера до суммы. Чтобы управлять видимостью отдельных колонок, мы можем разделить одну горизонтальную область на несколько вертикальных секций.
Вместо получения одной области ОбластьДанных = Макет.ПолучитьОбласть("Строка|Данные");, разберем ситуацию по шагам:
КолКоличество, КолЦена, КолСумма.Пример программной реализации этого метода:
// Определяем доступ к правам
ЕстьПраваНаЦены = РольДоступна("ПолныеПрава");
// Выводим статичную часть (Номер, Товар, Количество)
ОбластьКоличество = Макет.ПолучитьОбласть("Строка|КолКоличество");
ОбластьКоличество.Параметры.Заполнить(ПараметрыПозиции);
ТабДокумент.Вывести(ОбластьКоличество);
// Условно присоединяем колонки с ценами
Если НЕ ЕстьПраваНаЦены Тогда
ОбластьЦенаСумма = Макет.ПолучитьОбласть("Строка|КолЦенаСумма");
ОбластьЦенаСумма.Параметры.Заполнить(ПараметрыПозиции);
ТабДокумент.Присоединить(ОбластьЦенаСумма);
КонецЕсли;
Важно: При использовании метода Присоединить() необходимо следить за тем, чтобы шапка таблицы и подвал (итоговые показатели) собирались по точно такой же логике, иначе колонки «съедут».
Если вы не хотите перекраивать структуру макета и возиться с вертикальными секциями, можно воспользоваться программным управлением уже сформированным табличным документом. Это более современный и гибкий подход. Мы можем сформировать документ полностью, а в самом конце — перед возвратом результата — скрыть ненужные колонки.
Рассмотрим подробнее использование свойства Видимость и метода УдалитьОбласть():
КолонкаЦена).Пример удаления колонок для обеспечения безопасности данных:
// После формирования всего ТабДокумента
Если РольДоступна("ПолныеПрава") Тогда
// Определяем область по имени колонки, заданной в макете
ОбластьЦены = ТабДокумент.Область("КолонкаЦена");
ОбластьСуммы = ТабДокумент.Область("КолонкаСумма");
// Физически удаляем колонки, чтобы их нельзя было "раздвинуть" в Excel
ТабДокумент.УдалитьОбласть(ОбластьЦены, ТипСмещенияТабличногоДокумента.ПоГоризонтали);
ТабДокумент.УдалитьОбласть(ОбластьСуммы, ТипСмещенияТабличногоДокумента.ПоГоризонтали);
КонецЕсли;
Проанализируем разницу: свойство Видимость = Ложь просто скрывает колонку с глаз пользователя, но при копировании данных в Excel или программном чтении значения могут сохраниться. Метод УдалитьОбласть() полностью вырезает данные из итогового документа.
Выясним еще один способ, который часто применяется в типовых конфигурациях. В макете создаются две версии строки: СтрокаПолная и СтрокаБезЦен. В коде выбор области происходит один раз перед циклом обхода товаров.
ИмяОбластиСтроки = ?(НужноСкрыватьЦены, "СтрокаБезЦен", "Строка");
ОбластьСтрока = Макет.ПолучитьОбласть(ИмяОбластиСтроки);
Для Каждого СтрокаТовара Из Товары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Этот метод хорош тем, что позволяет заранее настроить ширину колонок в макете для варианта «без цен», чтобы наименование товара растянулось на всё свободное место и форма выглядела эстетично.
При работе в конфигурации «Управление торговлей 10.3» стоит обратить внимание на встроенные механизмы проверки прав. Проверка через РольДоступна() является жестко заданной. Более гибким решением будет использование регистра сведений «Дополнительные права пользователей».
Посмотрим на пример проверки конкретного права через типовой механизм:
// В УТ 10.3 часто используется проверка через глобальный модуль
ОграничениеПрав = УправлениеПользователями.НужноОграничиватьПраваДоступа();
// Или проверка конкретного права на редактирование цен
ДоступноРедактированиеЦен = ПолучитьЗначениеПраваПользователя(ПланыВидовХарактеристик.ПраваПользователей.РедактированиеЦенВДокументах);
Важные нюансы при скрытии колонок:
ТабДокумент.Область("ИмяКолонкиТовар").ШиринаКолонки = НовоеЗначение;.СуммаПрописью, ее также необходимо исключить из вывода через условие Если.Выбор конкретного метода зависит от ваших предпочтений и сложности макета. Для простых форм идеально подходит программное удаление колонок в конце формирования документа, а для сложных многостраничных отчетов лучше использовать разделение макета на секции с помощью метода Присоединить().