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

04.09.15

Разработка - Работа с интерфейсом

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Нажимаем ОК.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЕсли;

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

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

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

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

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


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

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

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61800    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54407    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16700    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10743    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9625    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3669    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12085    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
0. madway 119 06.03.12 14:18 Сейчас в теме
Алгоритм позволяющий добавить такую привычную и крайне необходимую возможность для управляемого приложения, как команда "найти в списке". Минимальное изменение конфигурации - Только добавление новой команды.


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

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

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

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