gifts2017

Команда "Найти в списке" для управляемого приложения (Управление торговлей 11, Розница 2, Управление небольшой фирмой и т.д.)

Опубликовал Александр Юрин (madway) в раздел Программирование - Работа с интерфейсом

Алгоритм позволяющий добавить такую привычную и крайне необходимую возможность для управляемого приложения, как команда "найти в списке". Минимальное изменение конфигурации - Только добавление новой команды.

Первый вариант:

Используем прилагаемый файл конфигурации.

Останится отредактировать только параметр Тип параметра команды у команды. Как сделать, описано ниже.

Второй вариант:

1) Создаем команду с именем (например): НайтиВСписке

2) Далее настройка параметров команды

Параметр Группа

 Устанавливаем значение Командная панель формы.Важное

Параметр Тип параметра команды

Нажимаем кнопку выбора.

В открывшемся окне раскрываем все папки кроме "ПеречислениеСсылка" и "ТочкаМаршрутаБизнессПроцессаСсылка".

Нажимаем комбнацию "Ctrl + A". Нажимаем "Пробел". Должны появится флажки у выделенных объектов.

Нажимаем ОК.

Параметр Картинка

Так как в режиме управляемого приложения установить стандартную картинку "Найти в списке" не даст конфигуратор,  нам необходимо перевести конфигурацию в "Обычное приложение".

Переходим в корневой узел конфигурации.

Открываем свойства.

Находим параметр "Основной режим запуска".

Меняем его на "обычное приложение".

Теперь можно выбрать для нашей команды стандартную картинку "Найти в списке"

3) Добавляем код для нашей команды

&НаСервере
Функция ПолучитьДанныеМенеджераНаСервере(Ссылка)

   
Менеджер = Новый Структура();
    Если
Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
       
Менеджер.Вставить("ТипОбъекта", "Справочник");
    ИначеЕсли
Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
       
Менеджер.Вставить("ТипОбъекта", "Документ");
    ИначеЕсли
ПланывидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
       
Менеджер.Вставить("ТипОбъекта", "ПланВидовХарактеристик");
    ИначеЕсли
Задачи.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
       
Менеджер.Вставить("ТипОбъекта", "Задача");
    ИначеЕсли
БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
       
Менеджер.Вставить("ТипОбъекта", "БизнесПроцесс");
    КонецЕсли;

   
Менеджер.Вставить("ИмяМенеджера", Ссылка.Метаданные().Имя);
   
Менеджер.Вставить("ИмяФормыСписка", Ссылка.Метаданные().ОсновнаяФормаСписка.ПолноеИмя());

    Возврат
Менеджер;

КонецФункции

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    Перем
ТипОбъекта;

   
//Разрешить использовать не основные формы списка объект для позиционирования
   
РазрешитьИспользоватьНеОсновныеФормыСписка = Истина;

   
//Заменять идентифицированную форму списка на основную форму списка.
    //При значении Истина, рекомендую флаг РазрешитьИспользоватьНеОсновныеФормыСписка установить в Ложь;
   
ЗаменятьОткрытуюФормуНовой = Ложь;
   
//---------------------------------------------------------------------------

   
ДанныеМенеджера = ПолучитьДанныеМенеджераНаСервере(ПараметрКоманды);
    Если
ДанныеМенеджера.Свойство("ТипОбъекта", ТипОбъекта) <> Неопределено Тогда

       
ПараметрыФормы = Новый Структура;
       
ПараметрыФормы.Вставить("ТекущаяСтрока", ПараметрКоманды);
       
ИмяФормы =          ""+ТипОбъекта+"."+ДанныеМенеджера.ИмяМенеджера+".ФормаСписка";
       
ИмяОбъекта =        ""+ТипОбъекта+"."+ДанныеМенеджера.ИмяМенеджера;
       
ИмяФормыВыбора =    ""+ТипОбъекта+"."+ДанныеМенеджера.ИмяМенеджера+".ФормаВыбора";
       
ИмяФормыСписка =    ДанныеМенеджера.ИмяФормыСписка;

        Если
ИмяФормы = ПараметрыВыполненияКоманды.Источник.ИмяФормы Тогда
           Возврат;
        ИначеЕсли
ПараметрыВыполненияКоманды.Источник.ИмяФормы = ИмяФормыВыбора Тогда
           Возврат;
        КонецЕсли;

       
Окна = ПолучитьОкна();
        Для
Н = 0 По Окна.Количество() - 1 Цикл
           
ФормаОкна = Окна[н].ПолучитьСодержимое();
            Если
ФормаОкна = Неопределено Тогда
                Продолжить;
            ИначеЕсли
ФормаОкна.ИмяФормы = ИмяФормыСписка Тогда
               
//Нашли основную форму списка
               
ОсновнаяФормаСписка = ФормаОкна;
               
НашеОкно = Окна[н];
               
ФормаНашегоОкна = ФормаОкна;
                Прервать;
            ИначеЕсли
РазрешитьИспользоватьНеОсновныеФормыСписка
                И Найти(ФормаОкна.ИмяФормы, ИмяОбъекта) И Найти(НРег(ФормаОкна.ИмяФормы), "формасписка") Тогда
               
//Нашли форму списка нашего объекта, но не основную
               
ИмяФормы = ФормаОкна.ИмяФормы;
               
НашеОкно = Окна[н];
               
ФормаНашегоОкна = ФормаОкна;
            КонецЕсли;
        КонецЦикла;

        Если
НашеОкно <> Неопределено Тогда
            Если
ЗаменятьОткрытуюФормуНовой Тогда
               
ОткрытьФорму(ИмяФормы, ПараметрыФормы, , Ложь, НашеОкно);
            Иначе
                Для Каждого
Элемент Из ФормаНашегоОкна.Элементы Цикл
                    Если
ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда
                       
Элемент.ТекущаяСтрока = ПараметрКоманды;
                    КонецЕсли;
                КонецЦикла;
               
НашеОкно.Активизировать();
            КонецЕсли;
        Иначе
           
ОткрытьФорму(ИмяФормы, ПараметрыФормы, , Ложь);
        КонецЕсли;

    КонецЕсли;

 КонецПроцедуры

Вот собственно и все.

Флаг РазрешитьИспользоватьНеОсновныеФормыСписка определяет разрешено ли использовать для позиционирования искомого элемента формы объекта, содержащие в имени текст "ФормаСписка".

А нахрена?! Для примера, документ "Заказ покупателя" в УТ11 имеет две формы списка "ФормаСписка" и "ФормаСпискаДокументов". Основной является "ФормаСписка", однако из интерфейса открывается "ФормаСпискаДокументов".

Для того, чтобы при использовании команды "Найти в списке", при открытой форме "ФормаСпискаДокументов" не открывалась форма "ФормаСписка", а использовалась форма "ФормаСпискаДокументов", была написан этот код.


Флаг ЗаменятьОткрытуюФормуНовой определяет, будет ли заменяться уже открытая форма новой.

Есть некоторые особенности:

  1. Данная команда будет появлять во всех формах. Даже там где она не нужна (форма списка, форма выбора).
  2. Даже если у вас уже открыта форма списка искомого элемента, открытая через диалог, будет открыта новая форма списка.
    Я не понял почему это происходи. Если кто найдет причину, отпишите.  Утранил.
  3. Как видно из кода, искомое значение пересылается во все списки формы списка. Решение не совсем корректное с точки зрения разработки, но зато универсальное. Верно только для уже открытых форм.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Пустая конфигурация с командой для объединения
.cf 6,70Kb
14.03.12
66
.cf 6,70Kb 66 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Александр Юрин (madway) 06.03.12 14:18
Алгоритм позволяющий добавить такую привычную и крайне необходимую возможность для управляемого приложения, как команда "найти в списке". Минимальное изменение конфигурации - Только добавление новой команды.


Перейти к публикации

1. Сергей Сытько (8SiriuS8) 06.03.12 14:18
Молодец.
Добавлю от себя код функции Функция ПолучитьТипОбъектаМетаданных(Ссылка) можно сократить из параметров команды можно достучатся до названия объекта
2. Яков Коган (Yashazz) 06.03.12 21:10
Добавлю: можно сделать всё за один вызов, вытащить все нужные сведения из метаданных и вернуть их структурой. Совершенно незачем дёргать сервер столько раз. Кроме того, правильнее было бы "на сервере без контекста".
3. sergej anonymous (ksv74) 10.03.12 19:58
(2) на сервере без контекста - не работает в модуле общей команды. Наверное, потому что, там контекста нет.

Приведенный код не работает, если основные формы выбора и списка не определены и генерируются по умолчанию.
4. sergej anonymous (ksv74) 10.03.12 20:00
Проще наверное как-то так будет (конечно не идеально - есть простор для фантазии)
&НаСервере
Функция ПолучитьДанныеМенеджераНаСервере(Ссылка)
	Менеджер = Новый Структура();
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","Справочник");
    ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","Документ");
	ИначеЕсли ПланывидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","ПланВидовХарактеристик");
	ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","Задача");
	ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","БизнесПроцесс");
	КонецЕсли;
    Менеджер.Вставить("ИмяМенеджера",Ссылка.Метаданные().Имя);
    Возврат Менеджер;
КонецФункции
...Показать Скрыть
5. sergej anonymous (ksv74) 10.03.12 20:01
Продолжение
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	Перем ТипОбъекта;
	ДанныеМенеджера = ПолучитьДанныеМенеджераНаСервере(ПараметрКоманды);
	Если ДанныеМенеджера.Свойство("ТипОбъекта",ТипОбъекта) <> Неопределено Тогда
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("ТекущаяСтрока",ПараметрКоманды);
		ИмяФормы = ""+ТипОбъекта+"."+ДанныеМенеджера.ИмяМенеджера+".ФормаСписка";
		ИмяФормыВыбора = ""+ТипОбъекта+"."+ДанныеМенеджера.ИмяМенеджера+".ФормаВыбора";
    	Если ИмяФормы = ПараметрыВыполненияКоманды.Источник.ИмяФормы Тогда
        	Возврат;
	    ИначеЕсли ПараметрыВыполненияКоманды.Источник.ИмяФормы = ИмяФормыВыбора Тогда
	        Возврат;
		КонецЕсли;
		Окна = ПолучитьОкна();
		Для н = 0 По Окна.Количество() - 1 Цикл
			Если Окна[н].Основное Тогда
				НашеОкно = Окна[н];
			КонецЕсли;
		КонецЦикла;
		ОткрытьФорму(ИмяФормы,ПараметрыФормы,,Ложь,НашеОкно);	
	КонецЕсли;
 КонецПроцедуры
...Показать Скрыть
8. Александр Потапов (tiniji) 15.03.12 03:35
9. Tsaregorodtsev (TSSV) 19.07.13 13:40
10. Петр Петренко (PetroP) 08.07.14 18:37
Команда не появляется в форме группы справочников.
11. Serge Popoff (WildFire) 24.03.15 12:51
Есть нюанс. Если в форме списка у пользователя заданы ограничения, например, по периоду, то код не сработает, если искомый объект будет попадать под этим ограничения.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа