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

04.09.15

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пустая конфигурация с командой для объединения
.cf 6,70Kb
67
67 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

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

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

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

Нажимаем ОК.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЕсли;

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

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

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

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

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


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

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

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

См. также

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

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

5000 руб.

14.01.2016    55326    17    23    

43

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

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

6000 руб.

16.01.2015    63724    44    59    

82

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

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

2400 руб.

29.06.2020    19573    27    6    

42

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

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

1500 руб.

06.10.2020    10790    7    7    

11

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    20954    mrXoxot    44    

128

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

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

27.05.2024    10412    smielka    37    

105

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

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

27.12.2023    17773    1223    elcoan    53    

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


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

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

Приведенный код не работает, если основные формы выбора и списка не определены и генерируются по умолчанию.
6. пользователь 12.03.12 19:03
Сообщение было скрыто модератором.
...
4. ksv74 91 10.03.12 20:00 Сейчас в теме
Проще наверное как-то так будет (конечно не идеально - есть простор для фантазии)
&НаСервере
Функция ПолучитьДанныеМенеджераНаСервере(Ссылка)
	Менеджер = Новый Структура();
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","Справочник");
    ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","Документ");
	ИначеЕсли ПланывидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","ПланВидовХарактеристик");
	ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","Задача");
	ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
		Менеджер.Вставить("ТипОбъекта","БизнесПроцесс");
	КонецЕсли;
    Менеджер.Вставить("ИмяМенеджера",Ссылка.Метаданные().Имя);
    Возврат Менеджер;
КонецФункции
Показать
5. ksv74 91 10.03.12 20:01 Сейчас в теме
Продолжение
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	Перем ТипОбъекта;
	ДанныеМенеджера = ПолучитьДанныеМенеджераНаСервере(ПараметрКоманды);
	Если ДанныеМенеджера.Свойство("ТипОбъекта",ТипОбъекта) <> Неопределено Тогда
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("ТекущаяСтрока",ПараметрКоманды);
		ИмяФормы = ""+ТипОбъекта+"."+ДанныеМенеджера.ИмяМенеджера+".ФормаСписка";
		ИмяФормыВыбора = ""+ТипОбъекта+"."+ДанныеМенеджера.ИмяМенеджера+".ФормаВыбора";
    	Если ИмяФормы = ПараметрыВыполненияКоманды.Источник.ИмяФормы Тогда
        	Возврат;
	    ИначеЕсли ПараметрыВыполненияКоманды.Источник.ИмяФормы = ИмяФормыВыбора Тогда
	        Возврат;
		КонецЕсли;
		Окна = ПолучитьОкна();
		Для н = 0 По Окна.Количество() - 1 Цикл
			Если Окна[н].Основное Тогда
				НашеОкно = Окна[н];
			КонецЕсли;
		КонецЦикла;
		ОткрытьФорму(ИмяФормы,ПараметрыФормы,,Ложь,НашеОкно);	
	КонецЕсли;
 КонецПроцедуры
Показать
7. пользователь 14.03.12 23:55
Сообщение было скрыто модератором.
...
8. tiniji 164 15.03.12 03:35 Сейчас в теме
Полезная штука. Плюсую.
9. TSSV 1153 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 Цикл
				ФормаОкна = Окна[н].ПолучитьСодержимое();
				Если ФормаОкна = Неопределено Тогда
					Продолжить;
				ИначеЕсли ФормаОкна.ИмяФормы = ИмяФормыСписка Тогда
					//Нашли основную форму списка
					ОсновнаяФормаСписка = ФормаОкна;
					НашеОкно = Окна[н];
					ФормаНашегоОкна = ФормаОкна;
					Прервать;
				ИначеЕсли РазрешитьИспользоватьНеОсновныеФормыСписка
					И Найти(ФормаОкна.ИмяФормы, ИмяОбъекта) И Найти(НРег(ФормаОкна.ИмяФормы), "формасписка") Тогда
					//Нашли форму списка нашего объекта, но не основную
					ИмяФормы = ФормаОкна.ИмяФормы;
					НашеОкно = Окна[н];
					ФормаНашегоОкна = ФормаОкна;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		Если НашеОкно <> Неопределено Тогда
			Если ЗаменятьОткрытуюФормуНовой Тогда
				ОткрытьФорму(ИмяФормы, ПараметрыФормы, , Ложь, НашеОкно);
			Иначе
				Если НЕ НашеОкно.Открыта() Тогда
					НашеОкно.Открыть();
				КонецЕсли;
				Для Каждого Элемент Из ФормаНашегоОкна.Элементы Цикл
					Если ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда
						Элемент.ТекущаяСтрока = ПараметрКоманды;
					КонецЕсли;
				КонецЦикла;
				НашеОкно.Активизировать();
			КонецЕсли;
		Иначе
			ОткрытьФорму(ИмяФормы, ПараметрыФормы, , Ложь);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
Показать
Оставьте свое сообщение