Как удалить лишние дубли команд из панели навигации формы в 1С?

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

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

Проанализируем типичный случай: разработчик создал механизм просмотра документов по клиенту (использовав анализ зависимостей), и после этого на форме элемента справочника "Контрагенты" появилось три одинаковых команды для перехода к этим документам. Разберем по шагам, как диагностировать причину и устранить дубли.

Решение №1: Проверка и настройка командного интерфейса формы

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

Рассмотрим, как это сделать:

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

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

Решение №2: Анализ автоматически генерируемых команд

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

Проанализируем ситуацию. Допустим, вы создали регистр сведений "ОказанныеУслуги", чтобы хранить в нем документы по клиентам. Если у этого регистра одно из измерений имеет тип СправочникСсылка.Контрагенты и для этого измерения установлено свойство "Ведущее", то платформа автоматически создаст команду "Оказанные услуги" на форме элемента справочника "Контрагенты" для быстрого перехода к записям регистра.

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

Что делать в этом случае:

  1. Определите, какие объекты связаны с вашей формой (анализ структуры метаданных покажет подчиненные справочники, регистры, журналы документов с отбором).
  2. Проверьте их свойства (информер по метаданным поможет увидеть все настройки). Особое внимание уделите свойству "Ведущее" у измерений регистров.
  3. Если вы обнаружили, что платформа сама генерирует нужную вам команду, просто удалите ту команду, которую вы создали вручную (из общих команд или из команд формы).
  4. Если же вам по какой-то причине не подходит автоматически созданная команда (например, нужно изменить ее представление или добавить особый обработчик), тогда лучше отключить автоматическую генерацию. Это можно сделать, сняв флаг "Ведущее" у измерения регистра, но будьте осторожны — это может повлиять на другие механизмы платформы, например, на контроль ссылочной целостности. Более правильным будет скрыть платформенную команду через редактор командного интерфейса (как в Решении №1) и оставить свою, кастомизированную.

Решение №3: Ревизия программного добавления команд

Иногда команды необходимо добавлять в интерфейс динамически, в зависимости от каких-либо условий. Это делается программно в модуле формы, как правило, в обработчике события ПриСозданииНаСервере.

Ошибка, приводящая к дублям, заключается в том, что код добавления команды выполняется без предварительной проверки на ее существование. Форма может быть переинициализирована на сервере несколько раз за свой жизненный цикл, и каждый раз код будет добавлять новую команду.

Посмотрим на пример неправильного кода:


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

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

Вот исправленный, корректный вариант кода:


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

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

Решение №4: Радикальные методы диагностики

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

  1. Пересоздание формы. Иногда структура формы в конфигурации может быть частично повреждена. Самый надежный способ это исправить — создать новую форму для объекта с нуля. Создайте новую основную форму элемента, а затем аккуратно перенесите на нее все необходимые реквизиты, элементы и код из старой формы. Если на новой, еще пустой форме дубли команд не появляются, значит, проблема была именно в настройках старой формы. Если же дубли есть и на абсолютно чистой форме, значит, причина точно в метаданных (см. Решение №2).
  2. Очистка кэша и пользовательских настроек. В редких случаях причиной могут быть закэшированные настройки интерфейса. Попробуйте очистить кэш конфигурации. Также можно сбросить настройки внешнего вида для конкретного пользователя. Для этого в режиме "1С:Предприятие" на проблемной форме нажмите "Еще" -> "Изменить форму...". В открывшемся окне снова нажмите "Еще" и выберите пункт "Установить стандартные настройки".

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

← На главную