Как эффективно управлять несколькими формами списка для одного документа в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При работе в 1С разработчики и пользователи часто сталкиваются с необходимостью отображать списки документов в различных представлениях. Например, для одного и того же документа «Журнал входного контроля сырья» может потребоваться общая форма списка для всех документов, отдельная форма для документов, связанных с сыпучим сырьем (где важны «размер гранул» и «количество включений»), и другая форма для остального сырья (с полями «внешний вид» и «размеры»). Как наиболее эффективно реализовать такую функциональность, не создавая избыточное количество форм и обеспечивая удобство для пользователей? Давайте разберем несколько подходов.

Автору вопроса необходимо иметь три формы списка для одного документа: 1. общий журнал для всех документов, 2. журнал для документов, заполненных по одной вкладке (например, для сыпучего сырья с реквизитами «размер гранул» и «количество включений»), 3. журнал для документов, заполненных по другой вкладке (для остального сырья с реквизитами «внешний вид» и «размеры»). Основной вопрос заключался в том, как проще всего из основной формы списка вызывать неосновные, или же стоит использовать встроенные возможности пользовательской настройки формы.

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

1. Использование одной универсальной формы списка с динамической настройкой видимости

Один из наиболее гибких и часто рекомендуемых подходов — это создание одной основной формы списка документа, которая будет динамически адаптироваться под различные сценарии отображения. Этот метод позволяет значительно упростить поддержку системы, так как нам приходится работать всего с одной формой, а не с несколькими, что снижает сложность разработки и сопровождения. Для ускорения реализации программных доработок интерфейса пригодится модуль для программного изменения элементов форм.

Суть метода: Мы создаем универсальную форму списка, которая содержит все возможные реквизиты, необходимые для различных представлений. Затем, в зависимости от выбранных пользователем фильтров, настроек, прав доступа или других условий, мы программно управляем видимостью колонок и других элементов на этой форме. Это позволяет одной форме выполнять функции нескольких, предоставляя разные представления данных без создания физически разных форм. Для изучения различных способов доработки динамических списков можно использовать руководство по доработке динамических списков.

Как реализовать динамическую видимость колонок

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

  2. Программное управление видимостью: Основная логика по изменению видимости колонок обычно размещается в обработчиках событий формы ПриСозданииНаСервере или ПриОткрытии. Также можно реализовать отдельные команды (кнопки) на форме, которые будут переключать видимость колонок в зависимости от выбора пользователя.

    Давайте рассмотрим пример. Предположим, у нас есть документ «Журнал входного контроля», и в зависимости от значения реквизита «ТипСырья» (например, «Сыпучее» или «Обычное») нам нужно показывать разные наборы колонок. Мы можем реализовать это следующим образом:

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Пример определения типа сырья для отображения.
        // В реальной системе это может быть параметр, переданный при открытии формы,
        // значение из настроек пользователя, значение реквизита формы и т.д.
        // Для демонстрации предположим, что мы хотим показать колонки для сыпучего сырья по умолчанию.
        ТипОтображаемогоСырья = "Сыпучее"; 
    
        // Сначала скроем все специфические колонки, затем покажем нужные
        Элементы.Список.Колонки.РазмерГранул.Видимость = Ложь;
        Элементы.Список.Колонки.КоличествоВключений.Видимость = Ложь;
        Элементы.Список.Колонки.ВнешнийВид.Видимость = Ложь;
        Элементы.Список.Колонки.Размеры.Видимость = Ложь;
    
        Если ТипОтображаемогоСырья = "Сыпучее" Тогда
            // Показываем колонки, характерные для сыпучего сырья
            Элементы.Список.Колонки.РазмерГранул.Видимость = Истина;
            Элементы.Список.Колонки.КоличествоВключений.Видимость = Истина;
        ИначеЕсли ТипОтображаемогоСырья = "Обычное" Тогда
            // Показываем колонки, характерные для обычного сырья
            Элементы.Список.Колонки.ВнешнийВид.Видимость = Истина;
            Элементы.Список.Колонки.Размеры.Видимость = Истина;
        КонецЕсли;
    
        // Мы также можем управлять видимостью других элементов формы, таких как группы, панели и т.д.,
        // в зависимости от условий. Например:
        // Элементы.ГруппаДополнительныеПараметрыСыпучего.Видимость = (ТипОтображаемогоСырья = "Сыпучее");
    
    КонецПроцедуры
    

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

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

  3. Пользовательские настройки: Помимо программного управления, очень важно помнить, что пользователи могут самостоятельно настраивать список через меню «Еще» -> «Изменить форму» или «Настроить список». Они имеют возможность скрывать или показывать колонки, менять их порядок, устанавливать отборы и группировки, а затем сохранять эти настройки как свои пользовательские варианты. Этот механизм значительно повышает гибкость и удовлетворенность пользователей, позволяя им адаптировать интерфейс под свои специфические нужды без участия программиста.

Изменение состава полей динамического списка

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

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

  2. Использование схемы компоновки данных (СКД): Если динамический список построен на СКД, можно программно изменять ее настройки (доступные поля, отборы, порядок, условное форматирование) в зависимости от условий. Работа с СКД предоставляет мощные возможности по управлению данными и их представлением, позволяя создавать очень гибкие и контекстно-зависимые представления.

2. Программный вызов различных форм списка с помощью метода ОткрытьФорму()

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

Когда использовать: Этот подход подходит, когда отличия между формами списка настолько велики, что управление ими в одной универсальной форме становится слишком сложным, неэффективным или ведет к избыточному коду. Например, одна форма может быть предназначена только для просмотра документов определенного типа, а другая — для оперативного ввода данных с дополнительными элементами управления и специализированными командами для конкретного вида сырья. Создание нескольких форм будет оправдано, если каждая из них реализует уникальную бизнес-логику.

Как реализовать:

  1. Создание отдельных форм: В конфигураторе для вашего объекта (документа «ЖурналВходногоКонтроля») создайте несколько форм списка. Например, у вас может быть ФормаСпискаОбщая, ФормаСпискаСыпучее и ФормаСпискаОбычное. Каждая из этих форм может иметь свой уникальный набор колонок, команд и даже запросов к данным, если это необходимо.

  2. Добавление команды на основную форму или в интерфейс: Создайте команды (кнопки) на основной форме списка, в общей командной панели или в подсистеме, которые будут вызывать нужную специализированную форму. Например, вы можете добавить кнопки «Список сыпучего сырья» и «Список обычного сырья».

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

    
    &НаКлиенте
    Процедура ОткрытьСписокСыпучегоСырья(Команда)
        ПередаваемыеПараметры = Новый Структура;
        // Можно передать параметры для установки отборов в открываемой форме.
        // Например, если в ФормеСпискаСыпучее есть элемент отбора по типу сырья,
        // мы можем установить его сразу при открытии.
        ПередаваемыеПараметры.Вставить("ОтборПоТипуСырья", "Сыпучее"); 
                
        // Открываем специализированную форму списка для сыпучего сырья
        ОткрытьФорму("Документ.ЖурналВходногоКонтроля.ФормаСпискаСыпучее", ПередаваемыеПараметры);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОткрытьСписокОбычногоСырья(Команда)
        ПередаваемыеПараметры = Новый Структура;
        ПередаваемыеПараметры.Вставить("ОтборПоТипуСырья", "Обычное");
        // Открываем специализированную форму списка для обычного сырья
        ОткрытьФорму("Документ.ЖурналВходногоКонтроля.ФормаСпискаОбычное", ПередаваемыеПараметры);
    КонецПроцедуры
    

    В открываемой форме (например, ФормаСпискаСыпучее) в обработчике ПриСозданииНаСервере мы можем использовать переданные параметры для настройки динамического списка:

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

3. Автоматический выбор формы списка через обработчик ОбработкаПолученияФормы

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

Где находится: Этот обработчик размещается в модуле менеджера объекта (в нашем случае — документа «ЖурналВходногоКонтроля»).

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

Как реализовать:

  1. Создание обработчика в модуле менеджера: Откройте модуль менеджера вашего документа (в дереве метаданных найдите документ «ЖурналВходногоКонтроля», затем в его свойствах перейдите в «Модуль менеджера») и добавьте туда процедуру ОбработкаПолученияФормы.

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

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

  2. Передача дополнительных параметров: При вызове формы из других частей системы (например, через ОткрытьФорму() или при создании команд), мы можем передать эти ДополнительныеПараметры, которые будут доступны в обработчике ОбработкаПолученияФормы. Например:

    
    // Пример вызова формы списка с дополнительными параметрами
    // Эти параметры попадут в Параметры обработчика ОбработкаПолученияФормы
    ПараметрыДляФормы = Новый Структура;
    // Здесь мы указываем, что хотим открыть именно список, а не форму объекта
    ПараметрыДляФормы.Вставить("КлючОбъекта", ""); 
    
    // Это ДополнительныеПараметры, которые попадут в ДополнительныеПараметры обработчика
    ДополнительныеПараметрыОткрытия = Новый Структура("ТипСпискаДляОткрытия", "Сыпучее");
    
    // Открываем форму документа. Обратите внимание на 8-й параметр метода ОткрытьФорму()
    ОткрытьФорму("Документ.ЖурналВходногоКонтроля.ФормаСписка", ПараметрыДляФормы, , , , , , ДополнительныеПараметрыОткрытия);
    

    Когда вызов происходит таким образом, система сначала обращается к обработчику ОбработкаПолученияФормы. Этот обработчик, на основе анализа ДополнительныеПараметрыОткрытия, определяет, какую именно форму списка следует открыть, и устанавливает ее имя в параметр ВыбраннаяФорма. Затем платформа открывает форму с указанным именем.

Дополнительные подходы к управлению отображением списков

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

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

    Используя СКД, вы можете динамически настраивать схему отчета, менять запросы, добавлять параметры и фильтры, что делает его чрезвычайно мощным инструментом для отображения списков.

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

    Например, можно создать функциональную опцию «ПоказыватьСпецификуСыпучегоСырья» и связать видимость колонок «РазмерГранул» и «КоличествоВключений» с этой опцией. Включив или отключив опцию в разделе «НСИ и администрирование», администратор сможет централизованно управлять видимостью этих колонок для всех пользователей или для пользователей с определенными ролями.

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

Важные аспекты, которые следует учитывать

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

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

← На главную