"Ввод на основании" в форме "Структуры подчиненности"


Расширение функциональности формы "Структуры подчиненности" за счет добавления кнопки "Ввести на основании".
Представлено два способа.

В некоторых случаях для ускорения заведения документов удобнее воспользоваться формой «Структуры подчиненности»,  если добавить в нее стандартную кнопку командной панели «Ввести на основании».  Таким образом на основании любого выделенного документа в дереве структуры подчиненнности можно будет ввести документы тех типов, для которых он может являться основанием исходя из соответствующей настройки в конфигураторе.

Вариант 1. С добавлением элементов на форму в режиме конфигуратора и добавлением программного кода.

Опишу по шагам:
1. Добавьте на форму «Структуры подчиненности» новые элементы управления Командная  панель и Табличное поле. Табличному полю сопоставьте реквизит типа ДокументСписок.ЛюбойТипДокумента, командной панели в качестве источника назначьте это табличное поле, установите свойство Автозаполнение = Истина. При этом на командной панели появятся стандартные кнопки, среди которых есть «Ввести на основании». Скопируйте эту кнопку и вставьте в самое начало.

2. Удалите новый элемент Табличное поле. При этом скопированная кнопка должна остаться на командной панели и свойство Автозаполнение = Истина.

3. Настройте положение, привязки, оформление командной панели как вам удобно. (Я предпочел разместить в правом верхнем углу.) Чтобы не было видно ненужные автокнопки, можно накрыть их поверх новой Панелью и тоже настроить привязки.

4. Вставьте программный код в двух местах.

В обработчике формы ПередОткрытием
    
   

    Если ЭлементыФормы.Найти("СпискиДокументов") = Неопределено Тогда
ТабличноеПолеСписок = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), //Тип элемента
"СпискиДокументов", //Имя
Ложь, //Видимость
); // Расположение, родитель

ЭлементыФормы.КоманднаяПанельВводаНаОсновании.ИсточникДействий = ТабличноеПолеСписок;
КонецЕсли;

В обработчике Процедура ДеревоДокументовПриАктивизацииСтроки(Элемент)

 ЭлементыФормы.СпискиДокументов.ТипЗначения = Новый ОписаниеТипов("ДокументСписок."+Элемент.ТекущиеДанные.Ссылка.метаданные().Имя);
ЭлементыФормы.СпискиДокументов.ТекущаяСтрока = Элемент.ТекущиеДанные.Ссылка;

Здесь «СпискиДокументов»  — программно создаваемый элемент управления Табличное поле, КоманднаяПанельВводаНаОсновании — добавленная в п.1 командная панель.

Вариант 2. Полностью программный способ.

Вставьте программный код в двух местах.

В обработчике формы ПередОткрытием

 Если ЭлементыФормы.Найти("СпискиДокументов") = Неопределено Тогда
ТабличноеПолеСписок = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), //Тип элемента
"СпискиДокументов", //Имя
Ложь, //Видимость
); // Расположение, родитель

КПВводаНаОсновании = ЭлементыФормы.Добавить(Тип("КоманднаяПанель"), //Тип элемента
"КоманднаяПанельВводаНаОсновании", //Имя
Истина, //Видимость
); // Расположение, родитель


КПВводаНаОсновании.Верх = 0;
КПВводаНаОсновании.Лево = Этаформа.Ширина - 53;
КПВводаНаОсновании.Ширина = 53;
КПВводаНаОсновании.Высота = 25;
КПВводаНаОсновании.ЦветФона = ЦветаСтиля.ЦветФонаКнопки;
КПВводаНаОсновании.Рамка = Новый Рамка(ТипРамкиЭлементаУправления .Подчеркивание,1);
КПВводаНаОсновании.Вспомогательная = Истина;
КПВводаНаОсновании.ПорядокОбхода = 2;
КПВводаНаОсновании.Доступность = Истина;


НоваяКнопка = КПВводаНаОсновании.Кнопки.Добавить("ПодменюВводНаОсновании", ТипКнопкиКоманднойПанели.Подменю, "На основании");
НоваяКнопка.Подсказка = "Ввести на основании";
НоваяКнопка.Пояснение = "Выбор объекта, которого необходимо заполнить на основании данного объекта";
НоваяКнопка.Отображение =  ОтображениеКнопкиКоманднойПанели.Авто;
НоваяКнопка.Картинка = БиблиотекаКартинок.ВводНаОсновании;

КПВводаНаОсновании.Автозаполнение = Истина;
КПВводаНаОсновании.ИсточникДействий = ТабличноеПолеСписок;


КПВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
КПВводаНаОсновании,
ГраницаЭлементаУправления.Низ);
КПВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Лево,
КПВводаНаОсновании,
ГраницаЭлементаУправления.Право);
КПВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭтаФорма.Панель,
ГраницаЭлементаУправления.Право);


ПДляВводаНаОсновании = ЭлементыФормы.Добавить(Тип("Панель"), //Тип элемента
"ПанельДляВводаНаОсновании", //Имя
Истина, //Видимость
); // Расположение, родитель

ПДляВводаНаОсновании.Верх = 0;
ПДляВводаНаОсновании.Лево = Этаформа.Ширина - 20;
ПДляВводаНаОсновании.Ширина = 20;
ПДляВводаНаОсновании.Высота = 25;
ПДляВводаНаОсновании.ЦветФона = ЦветаСтиля.ЦветФонаКнопки;
ПДляВводаНаОсновании.Рамка = Новый Рамка(ТипРамкиЭлементаУправления .Подчеркивание,1);
ПДляВводаНаОсновании.ОтображениеЗакладок = ОтображениеЗакладок .НеИспользовать;
ПДляВводаНаОсновании.ПорядокОбхода = 3;


ПДляВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
ПДляВводаНаОсновании,
ГраницаЭлементаУправления.Низ);
ПДляВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Лево,
ПДляВводаНаОсновании,
ГраницаЭлементаУправления.Право);
ПДляВводаНаОсновании.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭтаФорма.Панель,
ГраницаЭлементаУправления.Право);

КонецЕсли;

В обработчике Процедура ДеревоДокументовПриАктивизацииСтроки(Элемент)

 ЭлементыФормы.СпискиДокументов.ТипЗначения = Новый ОписаниеТипов("ДокументСписок."+Элемент.ТекущиеДанные.Ссылка.метаданные().Имя);
ЭлементыФормы.СпискиДокументов.ТекущаяСтрока = Элемент.ТекущиеДанные.Ссылка;

КнопкиКПВводаНаОсновании = ЭлементыФормы.КоманднаяПанельВводаНаОсновании.Кнопки;

КнопкаПодменюВводаНаОсновании = Неопределено;

Для каждого КнопкаКП Из КнопкиКПВводаНаОсновании Цикл
Если КнопкаКП.ТипКнопки  = ТипКнопкиКоманднойПанели.Подменю И КнопкаКП.Подсказка = "Ввести на основании" И Не КнопкаКП.Имя = "ПодменюВводНаОсновании"   Тогда

КнопкаПодменюВводаНаОсновании = КнопкаКП;
Прервать;

КонецЕсли;
КонецЦикла;

Если Не КнопкаПодменюВводаНаОсновании = Неопределено И КнопкиКПВводаНаОсновании.Получить(0).Кнопки.Найти("Действие") = Неопределено Тогда
КнопкаДействие = КнопкиКПВводаНаОсновании.Получить(0).Кнопки.Добавить("Действие", ТипКнопкиКоманднойПанели .Действие, , КнопкаПодменюВводаНаОсновании.Кнопки.Получить(0).Действие);
КонецЕсли; 

 

 

Всё. Наслаждайтесь удобной функцией! 🙂

3 Comments

  1. help1Ckr

    Печаль, что нельзя добавить не меняя конфигурацию. А так за старания плюс

    Reply
  2. Pim

    Зачем во 2-ом варианте строка «ИндексКнопки = КнопкиКПВводаНаОсновании.индекс(КПВводаНаОсновании);»?

    Reply
  3. zaxarovsky

    (2) Pim, О! Спасибо за поправку! Это лишнее, не заметил. Удалю…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *