Версия для печати темы (https://pro1c.org.ua/index.php?s=6e14919ffd771d7c7a14c67e6e961261&showtopic=67066)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ позиционирование после стандартного поиска

Автор: iksteram 30.08.22, 14:40

Управляевые формы. Можно ли сделать в динамическом списке (справочник Номенклатура) что бы после стандартного поиска происходило позиционирование на список (первую строку списка)? Как вариант после нажатия клавиши Enter.? Спасибо.

Автор: AnryMc 30.08.22, 15:13

Цитата(iksteram @ 30.08.22, 15:40) *
что бы после стандартного поиска происходило позиционирование на список (первую строку списка)?


Я "подозреваю" что это события "ПриОчистке" и "ПриИзменении" когда "пусто"...

А позиционирование

&НаКлиенте
Процедура КомандаПерваяСтрока(Команда)
    
    Элементы.ДокументСписок.ТекущаяСтрока = ПолучитьСсылкуПервогоЭлемента();
    
КонецПроцедуры

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




Хотя если документов очень много, будет не реально тормозить.
можно по кнопке Home - должно быстрее
&НаКлиенте
Процедура КомандаПерваяСтрока(Команда)
    
    //устанавливаем фокус на таблицу списка
    ЭтаФорма.ТекущийЭлемент = Элементы.ДокументСписок;
    мГенераторКлавиш = Новый COMОбъект("Wscript.shell");
    мГенераторКлавиш.SendKeys("{Home}");
    
КонецПроцедуры

Автор: iksteram 30.08.22, 16:16

AnryMc @ Сегодня, 16:13 * ,
Проблема впередаче фокуса после поиска, у строки поиска нет событий. думал может можно программно назначить обработчик, тоже не получается

Автор: AnryMc 30.08.22, 16:20

Я делал свою строку поиска...
Реквизит формы "СтрокаДляПоиска" - тип строка,

&НаКлиенте
Процедура СтрокаДляПоискаПриИзменении(Элемент)
    
    Если ЗначениеЗаполнено(СтрокаДляПоиска) Тогда
        
        УстановитьМойОтбор(СтрокаДляПоиска);
        
    Иначе
        
        УдалитьМойОтбор();
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура СтрокаДляПоискаОчистка(Элемент, СтандартнаяОбработка)
    
    УдалитьМойОтбор();
        
КонецПроцедуры

&НаКлиенте
Процедура СтрокаДляПоискаОткрытие(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = ЛОЖЬ;
    
    Если ЗначениеЗаполнено(Элемент.ТекстРедактирования) Тогда
        
        УстановитьМойОтбор(Элемент.ТекстРедактирования);
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура УстановитьМойОтбор(СДП)
    
    ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Наименование", СДП, ВидСравненияКомпоновкиДанных.Содержит,,Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура УдалитьМойОтбор()
    
    ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка(Список, "Наименование");
    
КонецПроцедуры


Цитата(iksteram @ 30.08.22, 17:16) *
Проблема впередаче фокуса после поиска


   //устанавливаем фокус на таблицу списка
    ЭтаФорма.ТекущийЭлемент = Элементы.ДокументСписок;

Автор: iksteram 30.08.22, 16:23

AnryMc @ Сегодня, 17:20 * ,

я знаю как установить фокус, вопрос в какой обработчик это запихнуть? ))

Автор: AnryMc 30.08.22, 16:28

Цитата(iksteram @ 30.08.22, 17:23) *
вопрос в какой обработчик это запихнуть?


Лично я в своё время не нашёл 8,3,15,1700 на более свежих не знаю...

Автор: iksteram 30.08.22, 18:25

AnryMc @ Сегодня, 17:28 * ,

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
...
Элементы.СписокЗапасыСтандартныйПоиск.УстановитьДействие("ПриИзменении", "ВыполнитьДействиеПриИзмененииДанных");

...
КонецПроцедуры // ПриСозданииНаСервере()

&НаКлиенте
Процедура ВыполнитьДействиеПриИзмененииДанных(Элемент)
    
КонецПроцедуры

Автор: AnryMc 31.08.22, 14:38

Цитата(iksteram @ 30.08.22, 19:25) *
можно элементу формы назначить обработчик (программно)


а строка поиска - ДополнениеЭлементаФормы Вид: "Отображение строки поиска", где Родитель: Список (таблица формы) - а не элемент...

Можно еще НАВЕРНО через "ж...у":
Повесить ПодключитьОбработчикОжидания с периодом например 1 секунда и анализировать наверно Элементы.ДокументСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных() есть ли там отбор...

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua