Вопрос о том, как "удалить" команду объекта конфигурации в 1С, не снимая при этом всю конфигурацию с поддержки, является достаточно актуальным для многих разработчиков и администраторов. Прямое удаление команды из метаданных типовой конфигурации, находящейся на поддержке, невозможно, поскольку это равносильно изменению самой конфигурации, что приведет к снятию ее с поддержки. Однако, существуют эффективные методы для полного скрытия или замещения команды, создавая для пользователя впечатление ее отсутствия, при этом сохраняя конфигурацию на поддержке.
Мы рассмотрим несколько подходов, которые позволяют добиться желаемого эффекта, не затрагивая непосредственно основную конфигурацию. Все эти методы основаны на использовании расширений конфигурации – мощного инструмента 1С, позволяющего изменять поведение системы без прямого вмешательства в типовую конфигурацию, что критически важно для сохранения возможности ее обновления.
Расширения конфигурации – это основной инструмент для решения нашей задачи. Они позволяют нам добавлять, изменять и отключать функциональность типовых решений, сохраняя их на поддержке. Создавая расширение, мы можем "позаимствовать" определенные объекты конфигурации (формы, подсистемы, модули) и внести в них свои изменения, которые будут применяться поверх типовой конфигурации. Таким образом, мы не изменяем исходную конфигурацию, а лишь дополняем ее, при этом наши изменения имеют приоритет.
Это наиболее распространенный и часто используемый метод. Мы не удаляем команду физически, но делаем ее невидимой для пользователей. Это можно настроить для определенных ролей или для всех пользователей системы.
Разберем этот процесс по шагам:
Этот метод позволяет полностью убрать команду из поля зрения пользователя, делая ее недоступной через интерфейс системы.
Этот подход полезен, когда нам нужно не просто скрыть команду, но и перехватить ее вызов, чтобы гарантировать отсутствие какого-либо действия при попытке ее выполнения (например, если команда все же может быть вызвана косвенно или через программный интерфейс, что маловероятно для обычных команд интерфейса, но возможно для общих команд).
Мы можем создать в расширении общую команду, которая будет замещать типовую команду, и оставить ее код пустым. При вызове "удаленной" команды ничего не будет происходить, имитируя ее отсутствие.
&Вместо. В модуле команды или в модуле формы/объекта, где обрабатывается команда, создайте процедуру или функцию с таким же именем, как и типовая, но с добавлением аннотации &Вместо. В теле этой процедуры оставьте код пустым.Предположим, у нас есть типовая команда МояТиповаяКоманда. Чтобы ее заместить, мы создадим в расширении модуль (например, модуль команды или модуль менеджера) и добавим в него следующий код:
&Вместо
Процедура МояТиповаяКоманда()
// Этот код будет выполняться вместо типового.
// Оставляем его пустым, чтобы команда ничего не делала.
КонецПроцедуры
Таким образом, когда система попытается выполнить МояТиповаяКоманда, будет вызвана наша пустая процедура из расширения, и никаких действий не произойдет. Это эффективно "обезвреживает" команду.
Иногда команды могут быть частью командных панелей форм, которые не всегда напрямую доступны для изменения. В таких случаях мы можем использовать программный подход для управления видимостью элементов формы.
Этот метод предполагает, что мы программно находим элемент командной панели на форме и устанавливаем его свойство Видимость в Ложь. Это требует некоторого знания о структуре формы и именах элементов.
ПриОткрытии формы (или после ее инициализации) и изучите коллекцию Элементы формы, чтобы найти нужный элемент командной панели и его программное имя.ПриОткрытии формы в расширении. Если у формы уже есть обработчик ПриОткрытии, мы можем расширить его, добавив свой код. Если нет, создадим новый. Для этого в расширении откройте позаимствованную форму, в окне свойств формы перейдите на вкладку "События", найдите событие ПриОткрытии и нажмите кнопку "Лупа" для создания нового обработчика (или расширения существующего).ПриОткрытии (или в другом подходящем событии, которое происходит после инициализации элементов формы) напишите код для поиска и скрытия нужного элемента.Пример кода для скрытия элемента, как показано в сообщении 13 форума:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Обязательно вызываем типовой обработчик, если он есть,
// чтобы не нарушить функциональность типовой формы.
#Если &НаКлиенте Тогда
Расширения.ВызватьПроцедуруКлиента("ПриОткрытии", ЭтотОбъект, Отказ);
#КонецЕсли
// Пример: Ищем элемент по его программному имени и скрываем его
ПеременнаяСИменемЭлемента = "КомандаПечатьПаспорта"; // Замените на реальное имя вашего элемента
Элемент = Элементы.Найти(ПеременнаяСИменемЭлемента);
Если Элемент <> Неопределено Тогда
Элемент.Видимость = Ложь;
КонецЕсли;
// Также можно работать с группами элементов
ПеременнаяСИменемГруппы = "ГруппаКомандОбъекта"; // Если команды находятся в группе
ГруппаЭлементов = Элементы.Найти(ПеременнаяСИменемГруппы);
Если ГруппаЭлементов <> Неопределено Тогда
// Можно скрыть всю группу команд
// ГруппаЭлементов.Видимость = Ложь;
// Или пройтись по элементам группы, если это необходимо
Для Каждого ПодЭлемент Из ГруппаЭлементов.Элементы Цикла
Если ПодЭлемент.Имя = "КонкретнаяКомандаВГруппе" Тогда
ПодЭлемент.Видимость = Ложь;
Прервать; // Если нашли нужную команду и скрыли
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Важно отметить, что работа с программным интерфейсом форм может потребовать более глубокого понимания архитектуры 1С и потенциально может быть более хрупкой при обновлениях, если разработчики типового решения изменят имена или структуру элементов. Однако, для многих случаев это остается эффективным решением.
Если команда, которую мы хотим "удалить", связана с какой-либо функциональной опцией в типовой конфигурации, мы можем воспользоваться этим. Функциональные опции в 1С предназначены для гибкого управления доступностью функционала без изменения кода.
Принцип работы следующий: если функциональная опция отключает соответствующий функционал, то команды, связанные с ним, могут быть автоматически скрыты системой. Чтобы воспользоваться этим методом, мы должны:
Например, если команда печати связана с функциональной опцией "ИспользоватьПечатьДоговоров", которая управляется константой ИспользоватьПечатьДоговоров, мы можем через расширение изменить значение этой константы на Ложь. Это приведет к автоматическому скрытию всех команд, связанных с данной функциональной опцией. Этот метод очень чистый и поддерживаемый, поскольку он использует штатный механизм 1С для управления функционалом.
Для команд, которые представляют собой возможность "Ввести на основании" другого объекта (например, создать документ "Реализация товаров и услуг" на основании "Заказа покупателя"), мы также можем управлять их видимостью через расширение.
Если нам нужно убрать возможность ввода определенного документа на основании другого, мы можем воспользоваться расширением для изменения модуля менеджера исходного объекта. В модуле менеджера часто определяется состав команд ввода на основании.
Мы позаимствуем модуль менеджера соответствующего объекта (например, документа "ЗаказПокупателя") и внесем в него изменения, чтобы удалить или модифицировать вызов, который добавляет команду "Ввести на основании: Реализация товаров и услуг". Это может быть сделано через аннотацию &Вместо или &После, в зависимости от реализации типового функционала.
Пример (концептуальный):
// В модуле менеджера объекта "ЗаказПокупателя" в расширении
&Вместо
Функция ПолучитьДоступныеВидыВводаНаОсновании()
// Вызываем типовой обработчик, если это необходимо
// и затем фильтруем результат.
МассивВидов = Расширения.ВызватьФункциюСервера("ПолучитьДоступныеВидыВводаНаОсновании");
Для Индекс = МассивВидов.ВГраница() По 0 СШагом -1 Цикла
Если МассивВидов[Индекс].ИмяОбъектаМетаданных = "Документ.РеализацияТоваровУслуг" Тогда
МассивВидов.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
Возврат МассивВидов;
КонецФункции
Этот подход требует тщательного анализа типового кода, чтобы понять, как формируется список команд "Ввод на основании", и как наиболее безопасно его модифицировать через расширение.
Мы видим, что в 1С существует множество инструментов для гибкого управления командным интерфейсом и функциональностью без необходимости снимать конфигурацию с поддержки. Ключевым инструментом в этом всегда являются расширения конфигурации.
Важно помнить, что ни один из представленных методов не "удаляет" команду из метаданных типовой конфигурации. Вместо этого, они скрывают ее, замещают ее функциональность или программно отключают ее видимость, создавая для конечного пользователя эффект полного отсутствия команды. Это и является нашей целью при работе с конфигурацией, находящейся на поддержке.
При выборе метода, всегда стоит начинать с наиболее простых и наименее инвазивных: сначала попробовать отключить видимость через свойства командного интерфейса в расширении, затем рассмотреть функциональные опции, и только после этого переходить к более сложным программным способам с использованием &Вместо или прямого управления элементами форм.
Если в какой-то момент вам потребуется вернуть команду обратно или полностью избавиться от внесенных изменений, это легко сделать. Само расширение можно удалить или отключить в пользовательском режиме через раздел "Администрирование" -> "Печатные формы, отчеты и обработки" -> "Расширения". Просто снимите флаг "Активно" для расширения или используйте команду "Удалить".
Таким образом, использование расширений предоставляет гибкий, безопасный и поддерживаемый способ модификации командного интерфейса и логики работы системы 1С, позволяя нам решать сложные задачи без нарушения поддержки типовой конфигурации и обеспечивая стабильность обновлений.