Как устранить дублирование справочников в подсистемах расширений 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Как же нам сделать так, чтобы эти справочники отображались корректно, без дублирования, и при этом сохраняли свою функциональность?

Понимание основной причины: Неявное подтягивание команд и свойство "Использовать стандартные команды"

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

Давайте подробнее рассмотрим механизм, который приводит к такому поведению:

  1. Основная конфигурация: В основной конфигурации справочник "Контрагенты" (или любой другой) уже включен в одну или несколько подсистем. Соответственно, для него уже сгенерирована команда открытия списка, и она отображается в командном интерфейсе.
  2. Расширение: Мы создаем расширение и заимствуем в него справочник "Контрагенты". Затем мы добавляем этот заимствованный справочник в какую-либо подсистему внутри нашего расширения.
  3. Конфликт: Платформа видит, что один и тот же справочник должен быть отображен дважды: один раз из основной конфигурации (через ее подсистемы) и один раз из расширения (через подсистемы расширения). Поскольку расширение "накладывается" на основную конфигурацию, обе команды оказываются активными, что и приводит к дублированию в интерфейсе.
  4. "Неявное подтягивание команды": Часто мы думаем, что добавляем в подсистему только сам объект (справочник), но система "неявно подтягивает" и его стандартную команду. Если мы не управляем видимостью этой команды явно, возникает дублирование.

Теперь, когда мы понимаем механизм возникновения проблемы, давайте перейдем к конкретным решениям.

Решение 1: Управление видимостью команды и объекта в целевой подсистеме расширения

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

  1. Заимствуем необходимые объекты в расширение:

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

    Откройте конфигуратор, перейдите в ваше расширение и в окне расширения найдите раздел "Общие" -> "Команды". Убедитесь, что команда для открытия списка вашего справочника (например, "Контрагенты") также заимствована в расширение. Если ее нет, заимствуйте ее.

  2. Настраиваем командный интерфейс подсистемы расширения:

    После того как мы заимствовали и справочник, и его команду, перейдем к настройке командного интерфейса подсистемы, в которую мы добавляем справочник.

    Мы будем управлять видимостью таким образом, чтобы в пользовательском интерфейсе отображалась ссылка по команде, а не сам справочник как объект. Это позволяет избежать дублирования.

    Пошаговая инструкция:

    1. Откройте ваше расширение в конфигураторе.
    2. Разверните ветку Подсистемы.
    3. Откройте ту подсистему, в которую вы добавляете дублирующиеся справочники (или которая их содержит).
    4. Перейдите на вкладку Командный интерфейс.
    5. В секции "Панель навигации" или "Панель действий" найдите ваш справочник (например, Справочники.Контрагенты) и его команду (например, ОткрытьСписокСправочника.Контрагенты, или она может быть представлена как элемент подсистемы с иконкой справочника).
    6. Очень важно: установите видимость для самого справочника (объекта метаданных) в "Ложь" (снимите галочку или переведите в состояние "не отображать").
    7. Одновременно установите видимость для команды этого справочника в "Истина" (убедитесь, что галочка стоит или что она отображается).

    Таким образом, мы явно указываем системе, что объект как таковой в этом месте отображать не нужно, но нужно отобразить команду, которая ведет к списку этого объекта. Поскольку команда из основной конфигурации и команда из расширения (после заимствования) теперь контролируются нами, мы избегаем дублирования.

    Этот подход часто используется в типовых конфигурациях, например, в 1С:Бухгалтерия 3.0, где в подчиненных подсистемах видимость самого справочника может быть отключена, а видимость команды — включена, чтобы пользователь видел ссылку по команде.

Решение 2: Использование корневой подсистемы для управления видимостью

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

Суть этого метода заключается в том, что мы добавляем дублирующиеся объекты или их команды в корневую подсистему расширения, а затем явно отключаем их видимость именно там. Это позволяет нам "перехватить" управление видимостью на более высоком уровне.

  1. Добавляем дублирующие объекты/команды в корневую подсистему расширения:

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

  2. Явно отключаем видимость в корневой подсистеме:

    Перейдите на вкладку Командный интерфейс корневой подсистемы. Найдите там добавленные вами справочники и команды (например, Справочник.Контрагенты и его команду). Для обоих этих элементов установите видимость в "Ложь". То есть, снимите галочки, чтобы они не отображались в этой корневой подсистеме.

  3. Включаем видимость только в нужной подчиненной подсистеме:

    Теперь перейдите в ту конкретную подчиненную подсистему (например, "Закупки", "Продажи" или любую другую), где вы действительно хотите видеть ссылку на справочник "Контрагенты". На вкладке Командный интерфейс этой подчиненной подсистемы убедитесь, что видимость команды (не самого объекта!) Справочник.Контрагенты установлена в "Истина".

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

Дополнительные рекомендации и нюансы

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

  1. Использование Редактора командного интерфейса:

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

  2. Автоматическое размещение команд:

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

  3. Видимость по ролям и функциональные опции:

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

  4. Поведение расширений:

    Расширения могут содержать как заимствованные объекты основной конфигурации, так и собственные. Проблема дублирования команд может возникать из-за особенностей сопоставления объектов по именам при объединении расширений и конфигурации. Это может приводить к появлению дублей команд с одинаковыми внутренними идентификаторами, если не контролировать их видимость.

  5. Проверка в разных режимах:

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

  6. Пользовательские настройки:

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

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

← На главную