При работе с расширениями в платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда объекты метаданных, такие как справочники, начинают дублироваться в интерфейсе пользователя после их добавления в подсистемы расширения. Эта проблема особенно актуальна для стандартных справочников, например, "Контрагенты" и "Договоры контрагентов". Давайте разберем, почему это происходит и как мы можем эффективно решить эту задачу.
Основная сложность заключается в механизме формирования командного интерфейса и так называемом "неявном подтягивании команд". Когда мы добавляем справочник в подсистему, система автоматически создает команду для открытия его списка. Если тот же справочник уже включен в подсистему в основной конфигурации, а затем мы заимствуем его в расширение и добавляем в подсистему расширения, то может произойти дублирование, так как система обрабатывает обе инструкции по отображению команд.
Как же нам сделать так, чтобы эти справочники отображались корректно, без дублирования, и при этом сохраняли свою функциональность?
Мы выяснили, что одна из ключевых причин дублирования связана со свойством объекта метаданных "Использовать стандартные команды". Если это свойство установлено для справочника (что является поведением по умолчанию), платформа автоматически генерирует команды для работы с этим справочником (например, команду открытия списка). Когда справочник уже включен в какую-либо подсистему основной конфигурации, а мы затем заимствуем его в расширение и добавляем в подсистему расширения, система видит две инструкции по отображению команд для одного и того же объекта. Это приводит к дублированию.
Давайте подробнее рассмотрим механизм, который приводит к такому поведению:
Теперь, когда мы понимаем механизм возникновения проблемы, давайте перейдем к конкретным решениям.
Это одно из наиболее эффективных решений, которое позволяет нам сохранить отображение справочника, но избежать дублирования за счет явного контроля над командами. Мы будем использовать механизм заимствования не только самого справочника, но и его стандартной команды.
Заимствуем необходимые объекты в расширение:
Для начала нам нужно убедиться, что в наше расширение заимствован не только сам справочник (например, Справочник.Контрагенты), но и его стандартная команда. Команда для открытия списка справочника обычно имеет формат Справочник.ИмяСправочника.СтандартнаяКомандаОткрытиеСписка. Если мы работаем с управляемыми формами, команда обычно ассоциируется с самим объектом.
Откройте конфигуратор, перейдите в ваше расширение и в окне расширения найдите раздел "Общие" -> "Команды". Убедитесь, что команда для открытия списка вашего справочника (например, "Контрагенты") также заимствована в расширение. Если ее нет, заимствуйте ее.
Настраиваем командный интерфейс подсистемы расширения:
После того как мы заимствовали и справочник, и его команду, перейдем к настройке командного интерфейса подсистемы, в которую мы добавляем справочник.
Мы будем управлять видимостью таким образом, чтобы в пользовательском интерфейсе отображалась ссылка по команде, а не сам справочник как объект. Это позволяет избежать дублирования.
Пошаговая инструкция:
Подсистемы.Командный интерфейс.Справочники.Контрагенты) и его команду (например, ОткрытьСписокСправочника.Контрагенты, или она может быть представлена как элемент подсистемы с иконкой справочника).Таким образом, мы явно указываем системе, что объект как таковой в этом месте отображать не нужно, но нужно отобразить команду, которая ведет к списку этого объекта. Поскольку команда из основной конфигурации и команда из расширения (после заимствования) теперь контролируются нами, мы избегаем дублирования.
Этот подход часто используется в типовых конфигурациях, например, в 1С:Бухгалтерия 3.0, где в подчиненных подсистемах видимость самого справочника может быть отключена, а видимость команды — включена, чтобы пользователь видел ссылку по команде.
Существует еще один подход, который может быть полезен, особенно если мы хотим иметь более централизованный контроль над отображением дублирующихся элементов.
Суть этого метода заключается в том, что мы добавляем дублирующиеся объекты или их команды в корневую подсистему расширения, а затем явно отключаем их видимость именно там. Это позволяет нам "перехватить" управление видимостью на более высоком уровне.
Добавляем дублирующие объекты/команды в корневую подсистему расширения:
В конфигураторе откройте ваше расширение. Найдите самую верхнюю подсистему (иногда ее называют "Общие", или это может быть корневая подсистема, созданная самим расширением для группировки). В состав этой корневой подсистемы добавьте те справочники и/или их команды, которые дублируются.
Явно отключаем видимость в корневой подсистеме:
Перейдите на вкладку Командный интерфейс корневой подсистемы. Найдите там добавленные вами справочники и команды (например, Справочник.Контрагенты и его команду). Для обоих этих элементов установите видимость в "Ложь". То есть, снимите галочки, чтобы они не отображались в этой корневой подсистеме.
Включаем видимость только в нужной подчиненной подсистеме:
Теперь перейдите в ту конкретную подчиненную подсистему (например, "Закупки", "Продажи" или любую другую), где вы действительно хотите видеть ссылку на справочник "Контрагенты". На вкладке Командный интерфейс этой подчиненной подсистемы убедитесь, что видимость команды (не самого объекта!) Справочник.Контрагенты установлена в "Истина".
Этот метод позволяет нам "отменить" стандартное поведение отображения в корневом элементе, а затем выборочно включить его там, где это действительно нужно, избегая конфликтов и дублирования.
При работе с командным интерфейсом и расширениями мы рекомендуем учитывать следующие моменты, чтобы избежать подобных проблем в будущем:
Использование Редактора командного интерфейса:
Все настройки видимости объектов и команд в подсистемах выполняются через Редактор командного интерфейса в конфигураторе. Это мощный инструмент, который позволяет нам настроить состав панелей навигации и действий, а также установить видимость элементов по ролям. Всегда внимательно работаем с ним, чтобы убедиться, что наши изменения применяются корректно.
Автоматическое размещение команд:
Платформа 1С автоматически размещает команды и устанавливает их видимость по определенным правилам. Например, команды создания новых элементов часто скрыты по умолчанию, так как просмотр списков требуется чаще, чем создание новых объектов. Мы должны быть в курсе этих автоматических правил и вмешиваться в них, когда требуется нестандартное поведение.
Видимость по ролям и функциональные опции:
Помимо настроек в командном интерфейсе, видимость объектов может зависеть от назначенных пользователю ролей и от включенных функциональных опций. Мы должны убедиться, что для используемых ролей разрешена видимость как самой подсистемы, так и объекта, а также что соответствующие функциональные опции не отключают отображение. Это комплексный механизм, и все его части должны быть настроены согласованно.
Поведение расширений:
Расширения могут содержать как заимствованные объекты основной конфигурации, так и собственные. Проблема дублирования команд может возникать из-за особенностей сопоставления объектов по именам при объединении расширений и конфигурации. Это может приводить к появлению дублей команд с одинаковыми внутренними идентификаторами, если не контролировать их видимость.
Проверка в разных режимах:
Всегда рекомендуется проверять поведение расширения и командного интерфейса как на локальной файловой базе, так и на серверной базе через тонкий клиент или веб-клиент. Результаты могут отличаться из-за особенностей кэширования и работы платформы в разных режимах. То, что корректно работает в файловой базе, может дать сбой или проявиться по-другому на веб-клиенте.
Пользовательские настройки:
Следует помнить, что даже если мы, как разработчики, настроили видимость элементов в конфигураторе, пользователь может самостоятельно изменить состав видимых разделов через "Настройка панели разделов" в режиме 1С:Предприятия, если у него есть соответствующие права. Наше решение направлено на исправление базового поведения, но пользовательские настройки могут его переопределить.
Применяя эти методы и рекомендации, мы можем эффективно устранять проблемы дублирования справочников и других объектов в подсистемах расширений 1С, обеспечивая чистый и функциональный интерфейс для пользователей.