Почему не появляются команды «Создать на основании» и «Структура подчиненности» в 1С и как их добавить?

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

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

Настройка структуры подчиненности (Связанные документы)

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

  1. Настройка критерия отбора. Найдем в дереве метаданных в ветке «Общие» -> «Критерии отбора» объект СвязанныеДокументы. На вкладке «Данные» в свойстве «Тип» необходимо добавить типы ваших новых документов (как документа-основания, так и подчиненного). Затем перейдем на вкладку «Состав», найдем подчиненный документ и установим флажок напротив того реквизита (например, ДокументОснование), который хранит ссылку на родительский документ.
  2. Настройка общей команды. В типовых конфигурациях для вывода кнопки структуры используется общая команда. Лучшей практикой является копирование типовой команды (например, СтруктураПодчиненности) в новую (например, КФСтруктураПодчиненности). Для новой команды зададим свойство «Тип параметра команды» равным ссылке на ваш документ (например, ДокументСсылка.МойДокумент). Группу размещения укажем как Командная панель формы.Важное, чтобы кнопка появилась на видном месте.

Добавление программного кода в формы

Чтобы БСП подхватила наши настройки и вывела нужные подменю, проанализируем код, который необходимо добавить в модули форм списка и документа.

Для формы списка документа добавим следующие обработчики:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
    ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

Для формы самого документа код будет немного отличаться, так как контекст работы меняется со списка на конкретный объект:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
    ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

В более старых версиях БСП для добавления меню на форму можно было использовать прямой вызов создания подменю в обработчике ПриСозданииНаСервере, например: ВводНаОсновании.ПриСозданииНаСервере(ЭтотОбъект, Элементы.ПодменюСоздатьНаОсновании) и МенюОтчеты.ПриСозданииНаСервере(ЭтотОбъект, Элементы.ПодменюОтчеты). Однако подход через ПодключаемыеКоманды является более современным и универсальным.

Особенности настройки в новых версиях БСП (редакция 3.х)

Посмотрим на специфику современных конфигураций. В БСП версии 3.х недостаточно просто разместить код в форме. Необходимо программно объявить команды в модуле менеджера документа.

Для того чтобы заработал ввод на основании, в модуле менеджера документа-основания следует добавить экспортную процедуру:


Процедура ДобавитьКомандыВводаНаОсновании(КомандыВводаНаОсновании, Параметры) Экспорт
    // Инициализация команды создания подчиненного документа
КонецПроцедуры

Для «Структуры подчиненности», которая часто реализована через подсистему отчетов, в модуле менеджера нужно определить процедуру:


Процедура ДобавитьКомандыОтчетов(КомандыОтчетов) Экспорт
    // Добавление команды отчета "Связанные документы"
КонецПроцедуры

Права доступа и дублирование кнопок

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

Еще один важный момент: после добавления документа в типовую конфигурацию может появиться дублирование кнопки «Создать на основании». Одна кнопка — это стандартная платформенная, вторая — выводится программно подсистемой БСП. Чтобы убрать лишнюю платформенную кнопку, на форме документа в свойствах командной панели нужно снять флаг «Автозаполнение» (и настроить состав панели вручную) или принудительно скрыть стандартную кнопку в настройках формы.

Если вы ведете разработку в расширении, не забудьте, что заимствованный критерий отбора СвязанныеДокументы должен включать ваши объекты из расширения. В некоторых случаях потребуется использование аннотаций &Вместо или &После в общих модулях (например, СтруктураПодчиненностиСлужебный), чтобы зарегистрировать новые типы документов в алгоритмах БСП.

← На главную