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

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

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

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

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

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

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

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

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

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

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

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

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

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

Нажимаем ОК.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЕсли;

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

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

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

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

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


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

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

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

11 Comments

  1. madway

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

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

    Reply
  2. sytkosa

    Молодец.

    Добавлю от себя код функции Функция ПолучитьТипОбъектаМетаданных(Ссылка) можно сократить из параметров команды можно достучатся до названия объекта

    Reply
  3. Yashazz

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

    Reply
  4. ksv74

    (2) на сервере без контекста — не работает в модуле общей команды. Наверное, потому что, там контекста нет.

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

    Reply
  5. ksv74

    Проще наверное как-то так будет (конечно не идеально — есть простор для фантазии)

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

    Показать

    Reply
  6. ksv74

    Продолжение

    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    Перем ТипОбъекта;
    ДанныеМенеджера = ПолучитьДанныеМенеджераНаСервере(ПараметрКоманды);
    Если ДанныеМенеджера.Свойство(«ТипОбъекта»,ТипОбъекта) <> Неопределено Тогда
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить(«ТекущаяСтрока»,ПараметрКоманды);
    ИмяФормы = «»+ТипОбъекта+».»+ДанныеМенеджера.ИмяМенеджера+».ФормаСписка»;
    ИмяФормыВыбора = «»+ТипОбъекта+».»+ДанныеМенеджера.ИмяМенеджера+».ФормаВыбора»;
    Если ИмяФормы = ПараметрыВыполненияКоманды.Источник.ИмяФормы Тогда
    Возврат;
    ИначеЕсли ПараметрыВыполненияКоманды.Источник.ИмяФормы = ИмяФормыВыбора Тогда
    Возврат;
    КонецЕсли;
    Окна = ПолучитьОкна();
    Для н = 0 По Окна.Количество() — 1 Цикл
    Если Окна[н].Основное Тогда
    НашеОкно = Окна[н];
    КонецЕсли;
    КонецЦикла;
    ОткрытьФорму(ИмяФормы,ПараметрыФормы,,Ложь,НашеОкно);
    КонецЕсли;
    КонецПроцедуры
    

    Показать

    Reply
  7. tiniji

    Полезная штука. Плюсую.

    Reply
  8. TSSV

    Отличная штука.

    Reply
  9. PetroP

    Команда не появляется в форме группы справочников.

    Reply
  10. WildFire

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

    Reply
  11. SuperSpade
    Reply

Leave a Comment

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