Как программно настроить расположение и набор колонок справочника при открытии формы

Программист 1С v8.3 (Обычные формы)
← На главную

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

Постановка задачи и выбор стратегии

Рассмотрим ситуацию: при открытии формы списка справочника «Номенклатура» нам необходимо проверить, к какому отделу относится текущий пользователь, и на основании этого сформировать индивидуальный набор колонок. Мы проанализируем, почему стандартные средства настройки формы («Изменить форму» или «Настройка списка») не всегда подходят для решения бизнес-задач, требующих автоматизации, и перейдем к программным методам.

Доступ к элементам формы и коллекции колонок

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

Для обращения к колонкам мы используем конструкцию: ЭлементыФормы.ИмяТабличногоПоля.Колонки. Здесь ИмяТабличногоПоля — это имя элемента формы, который отображает список справочника (по умолчанию оно часто совпадает с именем справочника или называется СправочникСписок).

Управление видимостью вместо удаления

Проанализируем подходы к изменению состава колонок. В обсуждениях часто предлагают использовать метод Удалить() для скрытия ненужных данных. Однако мы рекомендуем использовать свойство Видимость. Это более безопасный подход, так как удаление колонки может привести к ошибкам в других частях кода, где происходит обращение к этой колонке по индексу или имени. Кроме того, скрытую колонку гораздо проще вернуть на экран при изменении условий.

Разберем пример кода, который скрывает или показывает колонки в зависимости от подразделения пользователя:


Процедура ПриОткрытии()
    
    // Получаем текущее подразделение пользователя (условный пример)
    ТекущееПодразделение = УправлениеПользователями.ПолучитьПодразделениеТекущегоПользователя();
    
    // Определяем табличное поле
    ТабличноеПолеСписка = ЭлементыФормы.СправочникСписок;
    
    Если ТекущееПодразделение = Справочники.Подразделения.НайтиПоНаименованию("ОтделПродаж") Тогда
        
        // Показываем артикул и цену, скрываем остатки склада брака
        ТабличноеПолеСписка.Колонки.Артикул.Видимость = Истина;
        ТабличноеПолеСписка.Колонки.Цена.Видимость = Истина;
        ТабличноеПолеСписка.Колонки.ОстатокБрак.Видимость = Ложь;
        
    ИначеЕсли ТекущееПодразделение = Справочники.Подразделения.НайтиПоНаименованию("Склад") Тогда
        
        // Для склада важнее ячейка хранения
        ТабличноеПолеСписка.Колонки.Артикул.Видимость = Истина;
        ТабличноеПолеСписка.Колонки.ЯчейкаХранения.Видимость = Истина;
        ТабличноеПолеСписка.Колонки.Цена.Видимость = Ложь;
        
    КонецЕсли;

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

Изменение порядка колонок

Выясним, как изменить последовательность колонок. Просто установить видимость недостаточно, если бизнес-процесс требует, чтобы определенное поле (например, «Код») шло первым для одного отдела и последним для другого. Для этих целей используется метод Переместить().

Метод Переместить(Колонка, Индекс) позволяет передвинуть выбранную колонку на указанную позицию. Индексация начинается с нуля. Рассмотрим подробнее, как выстроить колонки в нужном порядке:


// Переместим колонку "Артикул" на первое место (индекс 0)
КолонкиСписка = ЭлементыФормы.СправочникСписок.Колонки;
КолонкаАртикул = КолонкиСписка.Артикул;
КолонкиСписка.Переместить(КолонкаАртикул, 0);

// Переместим "Наименование" на второе место
КолонкиСписка.Переместить(КолонкиСписка.Наименование, 1);

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

Работа с заголовками и шириной колонок

Иногда требуется не просто скрыть или переместить колонку, но и переименовать ее заголовки для разных групп пользователей. Например, в одном отделе поле привыкли называть «Клиент», а в другом — «Контрагент». В обычных формах это реализуется через свойство ТекстШапки.

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


Колонка = ЭлементыФормы.СправочникСписок.Колонки.Представление;
Колонка.ТекстШапки = "Заказчик (основной)";
Колонка.Ширина = 30; // Установка ширины в символах
Колонка.ИзменениеРазмера = ИзменениеРазмераКолонки.Изменять;

Программное добавление новых колонок

В некоторых случаях нужных данных нет в реквизитах справочника напрямую (например, данные из регистров сведений). Тогда нам потребуется программно добавить колонку в табличное поле. Это делается методом Добавить(). Однако помните, что после добавления колонки ее нужно наполнить данными.

Разберем ситуацию: нам нужно вывести текущий остаток из регистра в список справочника.

  1. Добавляем колонку в коллекцию Колонки.
  2. Используем событие ПриВыводеСтроки или ПриПолученииДанных для заполнения ячейки.

// В процедуре ПриОткрытии
НоваяКолонка = ЭлементыФормы.СправочникСписок.Колонки.Добавить("ОстатокТовара", "Остаток на складе");
НоваяКолонка.Видимость = Истина;

// В обработчике события ПриВыводеСтроки
Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Получаем остаток (упрощенно)
    Остаток = РегистрыНакопления.ТоварыНаСкладах.Остаток(ДанныеСтроки.Ссылка);
    ОформлениеСтроки.Ячейки.ОстатокТовара.УстановитьТекст(Остаток);
    
КонецПроцедуры

Конфликт с пользовательскими настройками

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

Чтобы избежать этого, рекомендуется:

Использование ролей для гибкости

Вместо жесткой привязки к конкретным подразделениям (через сравнение ссылок или наименований), более профессиональным подходом будет использование ролей. Это позволит администратору системы менять права и видимость колонок без изменения программного кода. Проверим доступность роли с помощью функции РольДоступна().


Если РольДоступна("ПолныеПрава") Тогда
    // Показываем все технические колонки
    ЭлементыФормы.СправочникСписок.Колонки.ID_Системный.Видимость = Истина;
Иначе
    ЭлементыФормы.СправочникСписок.Колонки.ID_Системный.Видимость = Ложь;
КонецЕсли;

Подводя итог, можно сказать, что механизм управления колонками в обычных формах 1С предоставляет разработчику полный контроль над интерфейсом. Сочетая использование свойств Видимость, ТекстШапки и методов Переместить() и Добавить(), мы создаем максимально комфортную рабочую среду для каждого пользователя системы.

← На главную