Представлено два способа.
В некоторых случаях для ускорения заведения документов удобнее воспользоваться формой «Структуры подчиненности», если добавить в нее стандартную кнопку командной панели «Ввести на основании». Таким образом на основании любого выделенного документа в дереве структуры подчиненнности можно будет ввести документы тех типов, для которых он может являться основанием исходя из соответствующей настройки в конфигураторе.
Вариант 1. С добавлением элементов на форму в режиме конфигуратора и добавлением программного кода.
Опишу по шагам:
1. Добавьте на форму «Структуры подчиненности» новые элементы управления Командная панель и Табличное поле. Табличному полю сопоставьте реквизит типа ДокументСписок.ЛюбойТипДокумента, командной панели в качестве источника назначьте это табличное поле, установите свойство Автозаполнение = Истина. При этом на командной панели появятся стандартные кнопки, среди которых есть «Ввести на основании». Скопируйте эту кнопку и вставьте в самое начало.
2. Удалите новый элемент Табличное поле. При этом скопированная кнопка должна остаться на командной панели и свойство Автозаполнение = Истина.
3. Настройте положение, привязки, оформление командной панели как вам удобно. (Я предпочел разместить в правом верхнем углу.) Чтобы не было видно ненужные автокнопки, можно накрыть их поверх новой Панелью и тоже настроить привязки.
4. Вставьте программный код в двух местах.
В обработчике формы ПередОткрытием
Если ЭлементыФормы.Найти("СпискиДокументов") = Неопределено Тогда
ТабличноеПолеСписок = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), //Тип элемента
"СпискиДокументов", //Имя
Ложь, //Видимость
); // Расположение, родитель
ЭлементыФормы.КоманднаяПанельВводаНаОсновании.ИсточникДействий = ТабличноеПолеСписок;
КонецЕсли;
В обработчике Процедура ДеревоДокументовПриАктивизацииСтроки(Элемент)
ЭлементыФормы.СпискиДокументов.ТипЗначения = Новый ОписаниеТипов("ДокументСписок."+Элемент.ТекущиеДанные.Ссылка.метаданные().Имя);
ЭлементыФормы.СпискиДокументов.ТекущаяСтрока = Элемент.ТекущиеДанные.Ссылка;
Здесь «СпискиДокументов» — программно создаваемый элемент управления Табличное поле, КоманднаяПанельВводаНаОсновании — добавленная в п.1 командная панель.
Вариант 2. Полностью программный способ.
Вставьте программный код в двух местах.
В обработчике формы ПередОткрытием
Если ЭлементыФормы.Найти("СпискиДокументов") = Неопределено Тогда
ТабличноеПолеСписок = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), //Тип элемента
"СпискиДокументов", //Имя
Ложь, //Видимость
); // Расположение, родитель
КПВводаНаОсновании = ЭлементыФормы.Добавить(Тип("КоманднаяПанель"), //Тип элемента
"КоманднаяПанельВводаНаОсновании", //Имя
Истина, //Видимость
); // Расположение, родитель
КПВводаНаОсновании.Верх = 0;
КПВводаНаОсновании.Лево = Этаформа.Ширина - 53;
КПВводаНаОсновании.Ширина = 53;
КПВводаНаОсновании.Высота = 25;
КПВводаНаОсновании.ЦветФона = ЦветаСтиля.ЦветФонаКнопки;
КПВводаНаОсновании.Рамка = Новый Рамка(ТипРамкиЭлементаУправления .Подчеркивание,1);
КПВводаНаОсновании.Вспомогательная = Истина;
КПВводаНаОсновании.ПорядокОбхода = 2;
КПВводаНаОсновании.Доступность = Истина;
НоваяКнопка = КПВводаНаОсновании.Кнопки.Добавить("ПодменюВводНаОсновании", ТипКнопкиКоманднойПанели.Подменю, "На основании");
НоваяКнопка.Подсказка = "Ввести на основании";
НоваяКнопка.Пояснение = "Выбор объекта, которого необходимо заполнить на основании данного объекта";
НоваяКнопка.Отображение = ОтображениеКнопкиКоманднойПанели.Авто;
НоваяКнопка.Картинка = БиблиотекаКартинок.ВводНаОсновании;
КПВводаНаОсновании.Автозаполнение = Истина;
КПВводаНаОсновании.ИсточникДействий = ТабличноеПолеСписок;
КПВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
КПВводаНаОсновании,
ГраницаЭлементаУправления.Низ);
КПВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Лево,
КПВводаНаОсновании,
ГраницаЭлементаУправления.Право);
КПВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭтаФорма.Панель,
ГраницаЭлементаУправления.Право);
ПДляВводаНаОсновании = ЭлементыФормы.Добавить(Тип("Панель"), //Тип элемента
"ПанельДляВводаНаОсновании", //Имя
Истина, //Видимость
); // Расположение, родитель
ПДляВводаНаОсновании.Верх = 0;
ПДляВводаНаОсновании.Лево = Этаформа.Ширина - 20;
ПДляВводаНаОсновании.Ширина = 20;
ПДляВводаНаОсновании.Высота = 25;
ПДляВводаНаОсновании.ЦветФона = ЦветаСтиля.ЦветФонаКнопки;
ПДляВводаНаОсновании.Рамка = Новый Рамка(ТипРамкиЭлементаУправления .Подчеркивание,1);
ПДляВводаНаОсновании.ОтображениеЗакладок = ОтображениеЗакладок .НеИспользовать;
ПДляВводаНаОсновании.ПорядокОбхода = 3;
ПДляВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
ПДляВводаНаОсновании,
ГраницаЭлементаУправления.Низ);
ПДляВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Лево,
ПДляВводаНаОсновании,
ГраницаЭлементаУправления.Право);
ПДляВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭтаФорма.Панель,
ГраницаЭлементаУправления.Право);
КонецЕсли;
В обработчике Процедура ДеревоДокументовПриАктивизацииСтроки(Элемент)
ЭлементыФормы.СпискиДокументов.ТипЗначения = Новый ОписаниеТипов("ДокументСписок."+Элемент.ТекущиеДанные.Ссылка.метаданные().Имя);
ЭлементыФормы.СпискиДокументов.ТекущаяСтрока = Элемент.ТекущиеДанные.Ссылка;
КнопкиКПВводаНаОсновании = ЭлементыФормы.КоманднаяПанельВводаНаОсновании.Кнопки;
КнопкаПодменюВводаНаОсновании = Неопределено;
Для каждого КнопкаКП Из КнопкиКПВводаНаОсновании Цикл
Если КнопкаКП.ТипКнопки = ТипКнопкиКоманднойПанели.Подменю И КнопкаКП.Подсказка = "Ввести на основании" И Не КнопкаКП.Имя = "ПодменюВводНаОсновании" Тогда
КнопкаПодменюВводаНаОсновании = КнопкаКП;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не КнопкаПодменюВводаНаОсновании = Неопределено И КнопкиКПВводаНаОсновании.Получить(0).Кнопки.Найти("Действие") = Неопределено Тогда
КнопкаДействие = КнопкиКПВводаНаОсновании.Получить(0).Кнопки.Добавить("Действие", ТипКнопкиКоманднойПанели .Действие, , КнопкаПодменюВводаНаОсновании.Кнопки.Получить(0).Действие);
КонецЕсли;
Всё. Наслаждайтесь удобной функцией! 🙂
Печаль, что нельзя добавить не меняя конфигурацию. А так за старания плюс
Зачем во 2-ом варианте строка «ИндексКнопки = КнопкиКПВводаНаОсновании.индекс(КПВводаНаОсновании);»?
(2) Pim, О! Спасибо за поправку! Это лишнее, не заметил. Удалю…