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