Алгоритм смены страниц

16.09.15

Разработка - Математика и алгоритмы

Предлагаю свой алгоритм смены страниц с помощью команд Далее/Назад

Иногда приходится создавать группу страниц с навигацией через команды Далее/Назад.
Предлагаю свой алгоритм смены страниц. Если кому-то облегчит труд, буду рад. 

Что нам понадобится:

1. Переменная модуля формы, которая будет хранить порядок страниц, и ее инициализация

&НаКлиенте 
Перем мПорядокСтраниц; //Переменная типа Массив, который хранит ссылки на страницы в упорядоченном виде 

В подвале модуля формы инициализируем переменную 

//очередность страниц в массив важна, на основании нее будет подбираться следующая или предыдущая страница
мПорядокСтраниц = Новый Массив;
мПорядокСтраниц.Добавить(Элементы.НачальнаяСтраница);
мПорядокСтраниц.Добавить(Элементы.Страница2);
мПорядокСтраниц.Добавить(Элементы.Страница3);
мПорядокСтраниц.Добавить(Элементы.ПоследняяСтраница);

2. Две команды формы Вперед, Назад и их обработчики:

&НаКлиенте
Процедура Вперед(Команда)
	СменитьСтраницу(Истина);
КонецПроцедуры

&НаКлиенте
Процедура Назад(Команда)
	СменитьСтраницу();
КонецПроцедуры

3. Процедура смены страницы

&НаКлиенте
Процедура СменитьСтраницу(Вперед=Ложь)
	ГруппаСтраниц				= Элементы.ГруппаСтраниц;//группа страниц, которыми мы управляем
	ИндексТекущейСтраницы		= мПорядокСтраниц.Найти(ГруппаСтраниц.ТекущаяСтраница);
	НовыйИндексТекущейСтраницы	= ИндексТекущейСтраницы;//по умолчанию новый индекс - текущая страница
	
	Если Вперед Тогда
		Если НЕ ИндексТекущейСтраницы=мПорядокСтраниц.ВГраница() Тогда
			//если мы не на последней странице, то можем увеличить индекс 
			НовыйИндексТекущейСтраницы = ИндексТекущейСтраницы+1;
		КонецЕсли; 
	Иначе
		Если ИндексТекущейСтраницы<>0 Тогда
			//если мы не на первой странице, то можем уменьшить индекс 
			НовыйИндексТекущейСтраницы = ИндексТекущейСтраницы-1;
		КонецЕсли; 
	КонецЕсли; 
	
	//Установим новую текущую страницу
	ГруппаСтраниц.ТекущаяСтраница = мПорядокСтраниц[НовыйИндексТекущейСтраницы];
КонецПроцедуры

страница группа страниц смена страницы

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1757    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4430    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7468    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7856    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4448    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8846    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

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

31.08.2021    7814    dusha0020    8    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. DoctorRoza 16.09.15 07:32 Сейчас в теме
Я правильно понял, что Вы этим:

//очередность страниц в массив важна, на основании нее будет подбираться следующая или предыдущая страница
мПорядокСтраниц = Новый Массив;
мПорядокСтраниц.Добавить(Элементы.НачальнаяСтраница);
мПорядокСтраниц.Добавить(Элементы.Страница2);
мПорядокСтраниц.Добавить(Элементы.Страница3);
мПорядокСтраниц.Добавить(Элементы.ПоследняяСтраница);

жестко вводите количество страниц? Ну тогда за такую писанину клавиатурой Вам по сопатке! Динамику, что слабо наваять!?
2. kolo6ok 16.09.15 08:40 Сейчас в теме
(1) DoctorRoza, какие претензии к автору? Что мешает вам динамически обновлять массив?
TreeDogNight; JesteR; Serega-artem; region.eburg; IgorS; VitaliyCeban; +6 Ответить
3. JesteR 151 16.09.15 10:56 Сейчас в теме
(1) Спасибо за критику и за сопатку :)
Я не претендую на оптимальность, можете динамически его заполнять. Всего лишь поделился идеей.
У меня как правило три-пять страниц, мне легче будет руками массив заполнить. Тут надо без фанатизма :).

Вот если вы группу страниц на форму программно добавляете, тогда да, придется массив динамически заполнять.

4. Serega-artem 16 16.09.15 10:56 Сейчас в теме
Код простой, за это плюс!
5. premierex 204 16.09.15 14:24 Сейчас в теме
А зачем вообще массив нужен? Страницы панели сами являются коллекцией!
Индекс текущей страницы определяем как:
ИндексТекущейСтраницы = Панель.Страницы.Индекс(Панель.ТекущаяСтраница);
Верхнюю границу индекса как:
ВерхняяГраница = Панель.Страницы.Количество() - 1;

Хотя, невнимательно код прочитал. Он для управляемых форм...
6. JesteR 151 16.09.15 14:43 Сейчас в теме
(5) premier,
А если очередность страниц должна быть не такой, какая задана в описании формы, а произвольной ?
Например, в зависимости от каких-то параметров, некоторые страницы должны быть пропущены.

premier, ваш вариант для управляемых тоже будет работать, только немного по-другому обращаться к страницам:

Элементы.ГруппаПанель.ПодчиненныеЭлементы
7. premierex 204 16.09.15 14:50 Сейчас в теме
(6) я полагаю, что навигация вперёд - назад предполагает перемещение на соседнюю страницу.
В любом случае, очередность страниц можно изменить и на самой форме (всё равно конфигуратор использовать).
8. JesteR 151 16.09.15 15:05 Сейчас в теме
(7) я полагаю, что навигация вперёд - назад предполагает перемещение на соседнюю страницу.
premier, в большинстве случаев да и я с вами согласен, что ваше решение более простое.

Но в случае динамической очередности, ваш вариант не подходит.
Как написали выше, очередь можно выстроить динамически, в зависимости от выбранного в режиме предприятия параметра.



10. dj_serega 390 18.09.15 08:20 Сейчас в теме
(7) premier,
В любом случае, очередность страниц можно изменить и на самой форме (всё равно конфигуратор использовать)

Не согласен. Есть 5 страниц. Заполнение следующее: 1,2,3,4,5.
4ю видно если реквизит А = 150.
Если реквизит А = 250 тогда мы заполняем так: 1,3,2,5.
Но если реквизит Б = Истина, тогда мы видим страницу 2 :)
9. Yashazz 4709 17.09.15 09:09 Сейчас в теме
И вот за такую, извиняюсь, фигню - столько плюсов? Мдаааа...
11. ivanov660 4332 20.09.15 00:17 Сейчас в теме
Я бы предложил использовать бинарное дерево, когда в каждой точке дерева у вас хранится информация о предыдущем и следующем:
// формируем дерево
мПорядокСтраниц = новый Соответствие();
мПорядокСтраниц.Вставить(Элементы.НачальнаяСтраница,
новый Структура("лево,право",Элементы.НачальнаяСтраница,Элементы.Страница2));
мПорядокСтраниц.Вставить(Элементы.Страница2,
новый Структура("лево,право",Элементы.НачальнаяСтраница,Элементы.Страница3));
...

// направление: лево или право тип строка
Процедура СменитьСтраницу(направление)
Структура = мПорядокСтраниц.Получить(ГруппаСтраниц.ТекущаяСтраница);
// проверка на всякий случай ))) вдруг что-то изменилось, пользователь удалил страницу (у автора алгоритм упадет?) или добавил новую страницу в пользовательском режиме (это уже отдельная история)
Если Структура<>Неопределено Тогда
    ГруппаСтраниц.ТекущаяСтраница = Структура[направление];
КонецЕсли;
КонецПроцедуры
Показать
ivnik; dj_serega; +2 Ответить
Оставьте свое сообщение