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