gifts2017

[ОБУЧАЛОВКА] Позиционирование на последнем элементе списка справочника

Опубликовал Сергей (Che) Коцюра (CheBurator) в раздел Программирование - Практика программирования

Для журналов можно задать режим отображения при открытии журнала (в режиме 1С:Предприятие): Меню - Сервис - Параметры-Журналы - "При открытии жирнала переходить в конец = вКл". Вопрос: почему нельзя задать такой вариант для справочников?

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

Например, у нас есть одноуровневый справочник. Как при открытии его списка спозиционироваться в конец списка...? Делаем так:

В форме списка в процедуре ПриОткрытии() размещаем такой код:

 

Процедура ПриОткрытии()
   //спозиционируемся на последнем элементе справочника
   глАктивизироватьПоследний(Контекст);
КонецПроцедуры //ПриОткрытии()


В глобальном модуле определим следующий код:

 

//******************************************************************************
//не мое, единственный способ определения типа контекста
Функция глВернутьТипКонтекста(Знач Конт) Экспорт
  ТипКонтекста="Справочник.ФормаСпискаДокументЖурналОтчет";
   
  Попытка А=Конт.ТекущийЭлемент();
  Исключение ТипКонтекста=СтрЗаменить(ТипКонтекста,"Справочник","");
  КонецПопытки;
   
  Попытка А=Конт.ИерархическийСписок();
  Исключение ТипКонтекста=СтрЗаменить(ТипКонтекста,".ФормаСписка","");
  КонецПопытки;
   
  Попытка А=Конт.Проведен();
  Исключение ТипКонтекста=СтрЗаменить(ТипКонтекста,"Документ","");
  КонецПопытки;
   
  Попытка А=Конт.ТекущийДокумент;
  Исключение ТипКонтекста=СтрЗаменить(ТипКонтекста,"Журнал","");
  КонецПопытки;
   
  Попытка Конт.РасположениеФайла(А,А);
  Исключение ТипКонтекста=СтрЗаменить(ТипКонтекста,"Отчет","");
  КонецПопытки;
   
  Возврат ТипКонтекста;
КонецФункции //глВернутьТипКонтекста()

//******************************************************************************
//позиционирование на последнем элементе списка справочника
Процедура глАктивизироватьПоследний(Знач Конт) Экспорт
 Перем Спр;
 
 Если глВернутьТипКонтекста(Конт)"Справочник.ФормаСписка"
 Тогда //только для справочников!
  Возврат;
 КонецЕсли;
 
 //спозиционируемся на последнем элементе справочника
 Спр = СоздатьОбъект("Справочник."+Конт.Вид());
 
 Реквизит = Конт.Сортировка();
 Если Реквизит = "Код" Тогда Спр.ПорядокКодов();
 ИначеЕсли Реквизит = "Наименование" Тогда Спр.ПорядокНаименований();
 Иначе Спр.ПорядокРеквизита(Реквизит);
 КонецЕсли;
 
 Спр.ОбратныйПорядок(1);
 Спр.ВыбратьЭлементы(0);
 Спр.ПолучитьЭлемент();
 
 Если Спр.Выбран()=0
 Тогда //нет на чем позиционироваться!
  Возврат;
 КонецЕсли;
 
 Конт.АктивизироватьОбъект(Спр.ТекущийЭлемент());
 Спр = "";
КонецПроцедуры //глАктивизироватьПоследний()


Пояснения к коду  глАктивизироватьПоследний():
- проверяем тип контекста;
- определяем пользовательский выбор режима сортировки открытого списка;
- инициализируем выборку справочника нужного вида в обратном порядке, т.е. с конца (в порядке сортировки списка!); тут важно открыть выборку без учета иерархии - это условие обеспечивает работу в подчиненных справочниках!!!
- получаем первый элемент выборки в обратном порядке, т.е. последний элемент списка;
- позиционируемся на нем в списке справочника.

Для чего нужны такие "выкрутасы"? Все очень просто, например, если в справочнике содержится запись неких действий (лог), или некая хронологическая последовательность - зачастую интересуют последние сведения, которые находятся в конце списка...

Если кто-то знает более "красивый" способ спозиционироваться на последнем элементе списка (без привлечения внешних компонент, эмуляции клавиш и т.п.) - просьба озвучить...

См. также

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

Комментарии

1. Александр Рытов (Арчибальд) 30.06.09 09:13
Раз уж мы все равно лезем в модуль формы списка, чего бы нам не вставить в конец процедуры ПриОткрытии() код

//спозиционируемся на последнем элементе справочника
Спр = СоздатьОбъект("Справочник."+Вид());

Реквизит = Сортировка();
Если Реквизит = "Код" Тогда Спр.ПорядокКодов();
ИначеЕсли Реквизит = "Наименование" Тогда Спр.ПорядокНаименований();
Иначе Спр.ПорядокРеквизита(Реквизит);
КонецЕсли;

Спр.ОбратныйПорядок(1);
Спр.ВыбратьЭлементы();
Спр.ПолучитьЭлемент();

Если Спр.Выбран()=1
Тогда
АктивизироватьОбъект(Спр.ТекущийЭлемент());
КонецЕсли;

Спр = "";
2. Александр Рытов (Арчибальд) 30.06.09 09:26
+1 А публикация метода определения типа контекста - зачет. Правда у тебя это уже было ;))
3. Сергей (Che) Коцюра (CheBurator) 30.06.09 13:05
(2) чтоб каждый раз не писать!
4. Александр Рытов (Арчибальд) 30.06.09 13:21
5. Сергей (Che) Коцюра (CheBurator) 30.06.09 18:29
6. Сергей (Che) Коцюра (CheBurator) 14.07.09 03:13
Важное исправление: в коде выборка д.б.
Спр.ВыбратьЭлементы(0); //для работы в подчиненных справочниках
7. Сергей (Che) Коцюра (CheBurator) 03.08.09 19:00
заметочка: п (6) недостаточен для позиционирования на последнем элементе подчиненного справочника...
8. Александр Рытов (Арчибальд) 03.08.09 19:14
9. Сергей (Che) Коцюра (CheBurator) 03.08.09 19:18
(8) да вообщем-то ничего.. это себе NB - чтобы не забыть внести поправочку...
10. Александр Рытов (Арчибальд) 03.08.09 19:42
(9) Для подчиненного по-моему нужно

Спр.ИспользоватьВладельца(ТекущийЭлемент().Владелец);
Спр.ОбратныйПорядок(1);
Спр.ВыбратьЭлементы(0);//Для учета родителей
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа