Как правильно реализовать ввод документа на основании через расширение и настроить порядок команд в подменю

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

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

Однако при таком платформенном подходе сразу проявляются два неприятных ограничения:

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

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

Выясним причину поведения общей команды

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

Что касается сводных журналов документов, в типовых конфигурациях (таких как 1С:ERP Управление предприятием, Комплексная автоматизация или Управление торговлей) командные панели таких форм не заполняются платформой автоматически. Их состав формируется программно библиотекой стандартных подсистем в момент создания формы. Платформенная команда с жестко заданным типом ссылки в параметре команды в такой форме просто не активизируется.

Поэтому правильным и стандартизированным решением является отказ от отдельной общей команды платформы в пользу программного подключения команды через интерфейс БСП.

Реализация создания на основании через механизм БСП

Рассмотрим подробнее пошаговый алгоритм добавления команды ввода на основании через расширение конфигурации.

  1. Удаление общей команды: если в расширении была добавлена общая команда, удаляем ее, чтобы избежать дублирования или некорректного поведения интерфейса.
  2. Подключение команды в менеджере основания: заимствуем в расширение модуль менеджера документа-основания (например, Документ.ПриобретениеТоваровУслуг) и расширяем процедуру ДобавитьКомандыСозданияНаОсновании с помощью директивы &После.
  3. Определение логики заполнения: в модуле создаваемого документа перехватываем процедуру ОбработкаЗаполнения с аннотацией &После, где реализуем логику переноса данных из документа-основания в реквизиты и табличные части нового объекта.

Посмотрим на пример вызова подключения в модуле менеджера документа-основания:


&После("ДобавитьКомандыСозданияНаОсновании")
Процедура Расш1_ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры)
    Документы.хх_ИмяСоздаваемогоДокумента.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
КонецПроцедуры

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

Управление позиционированием и сортировкой команды в подменю

Теперь решим главный вопрос: как расположить добавленную команду в нужном месте списка, а не в самом конце? Разберем внутреннее устройство параметра КомандыСозданияНаОсновании.

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

За размещение команды в меню отвечают два ключевых свойства:

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

Посмотрим на пример расширенной настройки позиции команды:


&После("ДобавитьКомандыСозданияНаОсновании")
Процедура Расш1_ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры)
    
    Команда = Документы.хх_ИмяСоздаваемогоДокумента.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
    Команда.Важность = "Обычное";
    Команда.Порядок  = 50;
    
КонецПроцедуры

Если требуется, чтобы команда находилась среди типовых команд группы "Обычное" и выстраивалась строго по алфавиту вместе с ними, достаточно указать Команда.Важность = "Обычное"; и установить такое же значение порядка, какое используется по умолчанию у соседних команд (или не указывать порядок вовсе, если в конфигурации принято базовое значение 0).

Дополнительные параметры строки команды БСП

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

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

Централизованное подключение через переопределяемые модули

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

  1. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании
  2. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту

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

Важные особенности прав доступа и кэширования

При отладке команд ввода на основании важно помнить о двух нюансах:

  1. Права доступа: подсистема подключаемых команд автоматически проверяет права текущего пользователя на интерактивное добавление создаваемого объекта. Если документ добавлен в расширении, но для роли пользователя не выставлены права на чтение и добавление, команда не появится в выпадающем меню даже при полностью корректном коде.
  2. Кэширование данных БСП: состав и параметры подключаемых команд кэшируются на уровне сеанса пользователя. При изменении порядка, представлений или условий видимости в расширении обязательно перезапускайте сеанс «1С:Предприятия», чтобы увидеть обновленное расположение команды.
← На главную