В современных конфигурациях 1С, таких как Управление торговлей 11.4, ERP 2 или Комплексная автоматизация, интерфейс часто строится на базе Библиотеки стандартных подсистем (БСП). Одной из особенностей таких систем является то, что стандартные контекстные меню списков могут быть скрыты или изменены программно для упрощения интерфейса. Рассмотрим способы, которые позволяют вернуть или добавить команду "Создать на основании" при нажатии правой кнопкой мыши на документ в списке.
В типовых решениях управление кнопками командной панели и контекстного меню часто делегировано подсистеме "Подключаемые команды". Это гибкий механизм, который позволяет динамически формировать список доступных действий. Проанализируем, как можно вклиниться в этот процесс с помощью расширения.
Для начала нам необходимо расширить процедуру, отвечающую за определение видов подключаемых команд. Обычно это делается в общем модуле СозданиеНаОсновании или через переопределяемые модули БСП. Разберем пример кода для расширения:
&После("ПриОпределенииВидовПодключаемыхКоманд")
Процедура Расш1_ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд)
Вид = ВидыПодключаемыхКоманд.Добавить();
Вид.Имя = "СозданиеНаОсновании";
// Указываем имя группы, которая будет создана в контекстном меню
Вид.ИмяПодменю = "КонтекстноеПодменюСоздатьНаОсновании";
Вид.Заголовок = НСтр("ru = 'Создать на основании'");
Вид.Порядок = 60;
Вид.Картинка = БиблиотекаКартинок.ВводНаОсновании;
Вид.Отображение = ОтображениеКнопки.Картинка;
КонецПроцедуры
После того как мы определили вид команды, нам нужно создать саму группу в контекстном меню формы списка. Это делается в обработчике ПриСозданииНаСервере формы списка. Рассмотрим программное создание группы:
&НаСервере
&Перед("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добавляем группу (подменю) именно в контекстное меню динамического списка
// Предположим, имя элемента списка на форме - "Список"
НоваяГруппа = Элементы.Добавить("КонтекстноеПодменюСоздатьНаОсновании", Тип("ГруппаФормы"), Элементы.Список.КонтекстноеМеню);
НоваяГруппа.Вид = ВидГруппыФормы.Подменю;
НоваяГруппа.Заголовок = НСтр("ru = 'Создать на основании'");
НоваяГруппа.Картинка = БиблиотекаКартинок.ВводНаОсновании;
КонецПроцедуры
Этот метод хорош тем, что он использует стандартные алгоритмы БСП для заполнения списка документов, которые могут быть созданы на основании текущего. Система сама проверит права доступа и функциональные опции.
Если требуется добавить конкретные документы в меню, не полагаясь на автоматику БСП, или если стандартный механизм не подхватывает нужные объекты, можно пойти по пути ручного создания команд и элементов формы. Разберем этот алгоритм подробнее.
Выясним причину, почему это может быть удобно: вы полностью контролируете, какой документ открывается и какие параметры в него передаются. Рассмотрим пример реализации в расширении формы списка документов продажи:
&НаСервере
Процедура ДобавитьКомандыКонтекстногоМенюНаСервере()
// Создаем команду для Доверенности
КомандаДоверенность = ЭтаФорма.Команды.Добавить("КонтекстнаяКомандаДоверенность");
КомандаДоверенность.Действие = "ВыполнитьСозданиеНаОснованииДоверенности";
КомандаДоверенность.Заголовок = "Доверенность (создать)";
// Создаем кнопку в контекстном меню списка
НоваяКнопка = Элементы.Добавить("КнопкаКонтекстДоверенность", Тип("КнопкаФормы"), Элементы.Список.КонтекстноеМеню);
НоваяКнопка.ИмяКоманды = "КонтекстнаяКомандаДоверенность";
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьСозданиеНаОснованииДоверенности(Команда)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Используем стандартный параметр "Основание" для автоматического заполнения
ПараметрыФормы = Новый Структура("Основание", ТекущиеДанные.Ссылка);
ОткрытьФорму("Документ.ДоверенностьВыданная.ФормаОбъекта", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
Проанализируем важный технический момент. Часто начинающие разработчики пытаются вручную копировать данные из одной формы в другую, используя ДанныеФормыВЗначение и серверные вызовы. Однако платформа 8.3 предоставляет более элегантное решение.
При использовании метода ОткрытьФорму с параметром Основание, платформа автоматически выполняет следующие действия:
ОбработкаЗаполнения в модуле объекта нового документа.Основание.Таким образом, вам не нужно писать код заполнения в форме списка. Весь код логики заполнения должен находиться в модуле объекта целевого документа (приемника). Это обеспечивает единство логики при создании документа из любого места программы.
Если кнопка в меню так и не появилась или при нажатии ничего не происходит, проверим следующие настройки в конфигураторе:
Интерактивное добавление для документа-приемника и право Просмотр для документа-источника.Рассмотрим ситуацию, когда контекстное меню вообще не отображает стандартные команды. Посмотрим на свойства элемента формы Список (или Таблица). В палитре свойств есть флаг Автозаполнение для контекстного меню.
Важно: Если этот флаг снят, платформа "молчит" и не выводит ничего лишнего. Включение этого флага вернет группу "Создать на основании" автоматически, если в метаданных настроены связи. Однако это может добавить и другие пункты (например, "Изменить выделенные"), которые разработчики типовых решений часто скрывают для упрощения работы пользователя.
Таким образом, для качественной реализации задачи в УТ 11.4 рекомендуется использовать именно расширение с добавлением программной группы в ПриСозданииНаСервере, сочетая это с механизмом подключаемых команд БСП. Это позволит сохранить поддержку конфигурации и обеспечит корректную работу интерфейса в соответствии с логикой вендора.