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