Как удалить команду объекта конфигурации в 1С, не снимая ее с поддержки?

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

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

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

Использование расширений конфигурации для управления командами

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

Метод 1: Отключение видимости команды через расширение

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

Разберем этот процесс по шагам:

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

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

Метод 2: Замещение команды через расширение с пустым кодом

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

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

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

Предположим, у нас есть типовая команда МояТиповаяКоманда. Чтобы ее заместить, мы создадим в расширении модуль (например, модуль команды или модуль менеджера) и добавим в него следующий код:


&Вместо
Процедура МояТиповаяКоманда()
    // Этот код будет выполняться вместо типового.
    // Оставляем его пустым, чтобы команда ничего не делала.
КонецПроцедуры

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

Метод 3: Программное управление видимостью элементов формы

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

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

  1. Определите имя элемента командной панели. Это может быть самой сложной частью.
    • Мы можем использовать "Журнал действий пользователя" или редактор форм в режиме предприятия, чтобы подсмотреть имена элементов. В пользовательском режиме при взаимодействии с элементами интерфейса их имена могут записываться в журнал.
    • Более надежный способ – использовать режим отладки. Откройте форму в режиме отладки, установите точку останова в событии ПриОткрытии формы (или после ее инициализации) и изучите коллекцию Элементы формы, чтобы найти нужный элемент командной панели и его программное имя.
    • Также можно просмотреть xml формы в режиме разработчика, но это требует более глубокого понимания структуры форм.
  2. Позаимствуйте форму в расширение. Как и в первом методе, нам необходимо позаимствовать форму, на которой находится целевая команда.
  3. Создайте обработчик события ПриОткрытии формы в расширении. Если у формы уже есть обработчик ПриОткрытии, мы можем расширить его, добавив свой код. Если нет, создадим новый. Для этого в расширении откройте позаимствованную форму, в окне свойств формы перейдите на вкладку "События", найдите событие ПриОткрытии и нажмите кнопку "Лупа" для создания нового обработчика (или расширения существующего).
  4. Добавьте код для скрытия элемента. В обработчике события ПриОткрытии (или в другом подходящем событии, которое происходит после инициализации элементов формы) напишите код для поиска и скрытия нужного элемента.

Пример кода для скрытия элемента, как показано в сообщении 13 форума:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Обязательно вызываем типовой обработчик, если он есть,
    // чтобы не нарушить функциональность типовой формы.
    #Если &НаКлиенте Тогда
        Расширения.ВызватьПроцедуруКлиента("ПриОткрытии", ЭтотОбъект, Отказ);
    #КонецЕсли

    // Пример: Ищем элемент по его программному имени и скрываем его
    ПеременнаяСИменемЭлемента = "КомандаПечатьПаспорта"; // Замените на реальное имя вашего элемента
    Элемент = Элементы.Найти(ПеременнаяСИменемЭлемента);

    Если Элемент <> Неопределено Тогда
        Элемент.Видимость = Ложь;
    КонецЕсли;

    // Также можно работать с группами элементов
    ПеременнаяСИменемГруппы = "ГруппаКомандОбъекта"; // Если команды находятся в группе
    ГруппаЭлементов = Элементы.Найти(ПеременнаяСИменемГруппы);

    Если ГруппаЭлементов <> Неопределено Тогда
        // Можно скрыть всю группу команд
        // ГруппаЭлементов.Видимость = Ложь;

        // Или пройтись по элементам группы, если это необходимо
        Для Каждого ПодЭлемент Из ГруппаЭлементов.Элементы Цикла
            Если ПодЭлемент.Имя = "КонкретнаяКомандаВГруппе" Тогда
                ПодЭлемент.Видимость = Ложь;
                Прервать; // Если нашли нужную команду и скрыли
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

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

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

Метод 4: Управление видимостью команд через функциональные опции

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

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

  1. Определить, связана ли команда с функциональной опцией. В конфигураторе найдите команду и посмотрите ее свойства. Если она связана с какой-либо функциональной опцией, это будет указано. Также можно посмотреть свойства функциональных опций (Общие -> ФункциональныеОпции) и выяснить, какие объекты/команды они контролируют.
  2. Изменить значение параметра функциональной опции. Функциональные опции обычно управляются значением константы или другого параметра. Через расширение мы можем изменить значение этой константы или параметра, чтобы отключить функциональную опцию.

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

Метод 5: Изменение состава команд "Ввод на основании"

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

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

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

Пример (концептуальный):


// В модуле менеджера объекта "ЗаказПокупателя" в расширении

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

    Для Индекс = МассивВидов.ВГраница() По 0 СШагом -1 Цикла
        Если МассивВидов[Индекс].ИмяОбъектаМетаданных = "Документ.РеализацияТоваровУслуг" Тогда
            МассивВидов.Удалить(Индекс);
        КонецЕсли;
    КонецЦикла;

    Возврат МассивВидов;
КонецФункции

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

Важные моменты и заключение

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

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

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

Если в какой-то момент вам потребуется вернуть команду обратно или полностью избавиться от внесенных изменений, это легко сделать. Само расширение можно удалить или отключить в пользовательском режиме через раздел "Администрирование" -> "Печатные формы, отчеты и обработки" -> "Расширения". Просто снимите флаг "Активно" для расширения или используйте команду "Удалить".

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

← На главную