Как добавить пункт Создать на основании в контекстное меню списка документов в 1С 8.3

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

В современных конфигурациях 1С, таких как Управление торговлей 11.4, ERP 2 или Комплексная автоматизация, интерфейс часто строится на базе Библиотеки стандартных подсистем (БСП). Одной из особенностей таких систем является то, что стандартные контекстные меню списков могут быть скрыты или изменены программно для упрощения интерфейса. Рассмотрим способы, которые позволяют вернуть или добавить команду "Создать на основании" при нажатии правой кнопкой мыши на документ в списке.

Способ 1. Использование механизмов БСП (Подключаемые команды)

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

Для начала нам необходимо расширить процедуру, отвечающую за определение видов подключаемых команд. Обычно это делается в общем модуле СозданиеНаОсновании или через переопределяемые модули БСП. Разберем пример кода для расширения:


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

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


&НаСервере
&Перед("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Добавляем группу (подменю) именно в контекстное меню динамического списка
    // Предположим, имя элемента списка на форме - "Список"
    НоваяГруппа = Элементы.Добавить("КонтекстноеПодменюСоздатьНаОсновании", Тип("ГруппаФормы"), Элементы.Список.КонтекстноеМеню);
    НоваяГруппа.Вид = ВидГруппыФормы.Подменю;
    НоваяГруппа.Заголовок = НСтр("ru = 'Создать на основании'");
    НоваяГруппа.Картинка = БиблиотекаКартинок.ВводНаОсновании;
КонецПроцедуры

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

Способ 2. Ручное создание команд в расширении

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

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


&НаСервере
Процедура ДобавитьКомандыКонтекстногоМенюНаСервере()
    // Создаем команду для Доверенности
    КомандаДоверенность = ЭтаФорма.Команды.Добавить("КонтекстнаяКомандаДоверенность");
    КомандаДоверенность.Действие = "ВыполнитьСозданиеНаОснованииДоверенности";
    КомандаДоверенность.Заголовок = "Доверенность (создать)";
    
    // Создаем кнопку в контекстном меню списка
    НоваяКнопка = Элементы.Добавить("КнопкаКонтекстДоверенность", Тип("КнопкаФормы"), Элементы.Список.КонтекстноеМеню);
    НоваяКнопка.ИмяКоманды = "КонтекстнаяКомандаДоверенность";
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьСозданиеНаОснованииДоверенности(Команда)
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Используем стандартный параметр "Основание" для автоматического заполнения
    ПараметрыФормы = Новый Структура("Основание", ТекущиеДанные.Ссылка);
    ОткрытьФорму("Документ.ДоверенностьВыданная.ФормаОбъекта", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

Важные нюансы передачи данных (Основание)

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

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

  1. Создает новый объект в памяти.
  2. Вызывает обработчик ОбработкаЗаполнения в модуле объекта нового документа.
  3. Передает в этот обработчик ссылку, указанную в параметре Основание.

Таким образом, вам не нужно писать код заполнения в форме списка. Весь код логики заполнения должен находиться в модуле объекта целевого документа (приемника). Это обеспечивает единство логики при создании документа из любого места программы.

Настройка метаданных и прав доступа

Если кнопка в меню так и не появилась или при нажатии ничего не происходит, проверим следующие настройки в конфигураторе:

  1. Права доступа (Роли): У пользователя должно быть право Интерактивное добавление для документа-приемника и право Просмотр для документа-источника.
  2. Ввод на основании: В дереве метаданных у документа-приемника на закладке "Ввод на основании" в списке "Является основанием для" должен быть выбран ваш исходный документ. Если эта связь не указана, платформа не будет считать эти объекты связанными.
  3. Функциональные опции: Убедитесь, что документ, который вы хотите создать, не отключен в настройках системы (например, если в УТ 11 отключена функциональная опция использования договоров, документы по договорам создаваться не будут).

Использование свойства Автозаполнение

Рассмотрим ситуацию, когда контекстное меню вообще не отображает стандартные команды. Посмотрим на свойства элемента формы Список (или Таблица). В палитре свойств есть флаг Автозаполнение для контекстного меню.

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

Таким образом, для качественной реализации задачи в УТ 11.4 рекомендуется использовать именно расширение с добавлением программной группы в ПриСозданииНаСервере, сочетая это с механизмом подключаемых команд БСП. Это позволит сохранить поддержку конфигурации и обеспечит корректную работу интерфейса в соответствии с логикой вендора.

← На главную