|
Есть ли метод получить ключ соответствия и найти ключ по значению ? | ☑ | ||
---|---|---|---|---|
0
smaharbA
13.10.13
✎
14:04
|
Без перебора и значениевстрокувнутр таковое возможно ?
|
|||
1
smaharbA
13.10.13
✎
14:05
|
+ попутно найти элемент списка значений по представлению опять же без перебора ? (таковой вопрос думаю не впервой)
|
|||
2
Rie
13.10.13
✎
14:08
|
(1) НайтиПоИдентификатору - для списка значений.
(0) Насколько я знаю, только перебором. |
|||
3
smaharbA
13.10.13
✎
14:08
|
(2) идентификатор это не представление
|
|||
4
smaharbA
13.10.13
✎
14:09
|
и еще, что бы не плодить
Пусто=СтрЗаменить(Лев(Формат(1,"ЧЦ='127'; ЧВН=; ЧГ=0"),126),0, " "); Как создать пустую строку одним движением, по типу клюшечного Формат(" ","С1024") |
|||
5
NcSteel
13.10.13
✎
14:23
|
Список можно грузануть в ТЗ, но в общем конечно перебор.
|
|||
6
smaharbA
13.10.13
✎
14:23
|
+(4) конечно можно через назад, но может есть посимпатичнее
Сред(СтрПолучитьСтроку(СтрЗаменить(ЗначениеВСтрокуВнутр(Новый Массив(1025)),"" "{""U""},"," "),2),7) |
|||
7
smaharbA
13.10.13
✎
14:24
|
(5) вся ссуть, избавиться от ТЗ, уж очень она тормозная, нужно всего 2 значения, первое уникальное, но нужен поиск как по одному, так и по другому, и копирование целиком
|
|||
8
smaharbA
13.10.13
✎
14:26
|
поиск несуществующего значения в
Соответствие 28 сек Сп 32 сек ТЗ 80 сек метод Количество() - примерно такое же соотношение |
|||
9
NcSteel
13.10.13
✎
14:27
|
(8) А если индексировать?
|
|||
10
smaharbA
13.10.13
✎
14:27
|
Соответствие=Новый Соответствие;
Сп=Новый СписокЗначений; Таблица=Новый ТаблицаЗначений; Таблица.Колонки.Добавить("Хендл"); Таблица.Колонки.Добавить("Заголовок"); Для Сч=1 По 10 Цикл НС=Таблица.Добавить(); НС.Хендл=Сч; НС.Заголовок="Заголовок "+Сч; Сп.Добавить(Сч,"Заголовок "+Сч); Соответствие.Вставить(Сч,"Заголовок "+Сч); КонецЦикла; Начало=ТекущаяДата(); Для Сч=1 По 10000000 Цикл Колво=Соответствие.Количество(); КонецЦикла; Сообщить(ТекущаяДата()-Начало); Начало=ТекущаяДата(); Для Сч=1 По 10000000 Цикл Колво=Сп.Количество(); КонецЦикла; Сообщить(ТекущаяДата()-Начало); Начало=ТекущаяДата(); Для Сч=1 По 10000000 Цикл Колво=Таблица.Количество(); КонецЦикла; Сообщить(ТекущаяДата()-Начало); |
|||
11
smaharbA
13.10.13
✎
14:28
|
(9) это как ? я не умею (
да и размер структур небольшой будет от 2-х до 15-и максимум пар значений, но в вечном цикле |
|||
12
smaharbA
13.10.13
✎
14:29
|
Вполне бы устроил список, если найти приемлемый метод поиска по представлению
|
|||
13
Rie
13.10.13
✎
14:30
|
(11) У ТЗ - Индексы.
Получится ТЗ с двумя колонками и двумя индексами. |
|||
14
smaharbA
13.10.13
✎
14:32
|
(13) а как задавать индексы и как после по ним искать ?
время на создание индексного выражения и выражения для поиска думаю превысит перебор, учитывая, что строк всего то ничего |
|||
15
smaharbA
13.10.13
✎
14:33
|
вот код (пока болванка)
Если (Не Враппер=Неопределено) и (Не Функции=Неопределено) Тогда Если (ХендлГлавногоОкна=Неопределено) или (ХендлГлавногоОкна=0) Тогда ТаблицаОкон=ФормаПолучитьОкнаПриложения(Ложь); Если ЗначениеЗаполнено(ТаблицаОкон) Тогда ХендлГлавногоОкна=ТаблицаОкон.Получить(0).Хендл; КонецЕсли; КонецЕсли; ФормаПолучитьОкнаРекурсивно(ХендлГлавногоОкна,ТаблицаОкон,Истина); Если ((ХендлФормы=Неопределено) или (ХендлФормы=0)) Тогда Если ЗначениеЗаполнено(ТаблицаОкон) Тогда //ТаблицаОкон.ВыбратьСтроку(); ТекущееОкно=ТаблицаОкон.Найти(ЭтаФорма.Заголовок,"Заголовок"); Если Не ТекущееОкно=Неопределено Тогда ХендлФормы=ТекущееОкно.Хендл; Если (Не Враппер.IsWindowVisible(ХендлФормы)=0) Тогда СВЕРНУТЬ = 6; СКРЫТЬ = 0; Враппер.ShowWindow(ХендлФормы,СКРЫТЬ); //ТаблицаОкон.ВыбратьСтроку(); //ЭтаФорма.Заголовок=ЗаголовокПрежний; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Если ТаблицаОконПрежняя=Неопределено Тогда ТаблицаОконПрежняя=ТаблицаОкон.Скопировать(); КонецЕсли; ТаблицаОконКоличество=ТаблицаОкон.Количество(); ТаблицаОконПрежняяКоличество=ТаблицаОконПрежняя.Количество(); Разница=ТаблицаОконКоличество-ТаблицаОконПрежняяКоличество; Если (ТаблицаОконКоличество=0) или (Разница<0) Тогда ТаблицаОконПрежняя=ТаблицаОкон.Скопировать(); //ЭтаФорма.ПодключитьОбработчикОжидания("ЗакрытьФормуСписка",1.5,Истина); Возврат; ИначеЕсли Разница=0 Тогда Совпадение=Ложь; Для Каждого Строка Из ТаблицаОкон Цикл Найдено=ТаблицаОконПрежняя.Найти(Строка.Хендл,"Хендл"); Если Не Найдено=Неопределено Тогда Если Найдено.Заголовок=Строка.Заголовок Тогда Совпадение=Истина; Продолжить; КонецЕсли; КонецЕсли; Совпадение=Ложь; Прервать; КонецЦикла; Если Совпадение Тогда ТаблицаОконПрежняя=ТаблицаОкон.Скопировать(); //ЭтаФорма.ПодключитьОбработчикОжидания("ЗакрытьФормуСписка",1.5,Истина); Возврат; КонецЕсли; ИначеЕсли Разница>0 Тогда //ТаблицаОконПрежняя=ТаблицаОкон.Скопировать(); Иначе ТаблицаОконПрежняя=ТаблицаОкон.Скопировать(); //ЭтаФорма.ПодключитьОбработчикОжидания("ЗакрытьФормуСписка",1.5,Истина); Возврат; КонецЕсли; КонецЕсли; |
|||
16
NcSteel
13.10.13
✎
14:35
|
Индекс создаешь один раз, а тз потом используешь постоянно.
Так же по особенному не надо использовать код, все как раньше, по при объявлении ТЗ добавляешь индексирование: ИндексыКоллекции.Добавить (CollectionIndexes.Add) ИндексыКоллекции (CollectionIndexes) Добавить (Add) Синтаксис: Добавить(<Колонки>) Параметры: <Колонки> (обязательный) Тип: Строка. Строковое описание колонок индекса в виде: "Колонка1, Колонка2...". Возвращаемое значение: Тип: ИндексКоллекции. Описание: Добавляет индекс в список индексов коллекции. Доступность: Сервер, толстый клиент, внешнее соединение. |
|||
17
smaharbA
13.10.13
✎
14:36
|
все это в обработке ожидания, там еще немного кода, этот "отлавливает" появление новых мди окон
|
|||
18
smaharbA
13.10.13
✎
14:37
|
(16) ТЗ постоянно меняется, создается каждую секунду, а лучше меньше секунды
|
|||
19
smaharbA
13.10.13
✎
14:40
|
(16) спасибо посмотрю, но думается, что в моей задаче, это только дополнительные тормоза будут (, ибо ТЗ создается регулярно часто и небольшая по размеру
|
|||
20
smaharbA
13.10.13
✎
14:45
|
А если создавать 2-у мерный массив, то при поиске первой половины, ко второй можно обращаться по Найдено+1 и соответственно при поиске второй половины по Найдено-1 ?
|
|||
21
kiruha
13.10.13
✎
14:45
|
Соответствие не предполагает уникальность по значению - поэтому нет необходимости искать по нему.
Если же такая уникальность есть - можно сделать 2 соответсвия - во втором ключ и значение поменять местами |
|||
22
smaharbA
13.10.13
✎
14:52
|
Наврал, по Количество()
Массив: 29 Соответствие: 28 Сп: 31 Таблица: 32 а вот по поиску точно (8) |
|||
23
smaharbA
13.10.13
✎
14:54
|
(21) и Список не предполагает уникальности представления (да и значения), тем не менее в клюшках есть поиск и по тому и по другому
|
|||
24
Fragster
модератор
13.10.13
✎
14:55
|
(20) лучше два одномерных и обеспечивать индексы одинаковый к "ключей" и "значений"
|
|||
25
smaharbA
13.10.13
✎
14:55
|
(21) нужен поиск в одном случае, по совпадению как значения так и представления (Хендл и Заголовок окна), так и поиск только по Представлению (заголовок окна)
|
|||
26
smaharbA
13.10.13
✎
14:56
|
(24) вариант
|
|||
27
smaharbA
13.10.13
✎
14:57
|
еще важна быстрота метода Количество()
|
|||
28
Fragster
модератор
13.10.13
✎
14:58
|
вообще судя по "куча кода отлавливает появление mdi окон" - какая-то адская вундервафля
|
|||
29
smaharbA
13.10.13
✎
14:58
|
И еще - есть ли какой метод уменьшить тормознутость методов ПолучитьФорму и ПолучитьФормуСписка, когда знаем максимум только имя формы, для проверки открытости
|
|||
30
kiruha
13.10.13
✎
14:59
|
(24)
Малейшая ошибка - и аут Неустойчивое решение к ошибкам |
|||
31
smaharbA
13.10.13
✎
14:59
|
(28) оно уже работает, замена форм списков и журналов в упп без вмешательства в конфигурацию
|
|||
32
smaharbA
13.10.13
✎
15:02
|
но загрузка процессора в "простое", когда нет нового окна списка/журнала 0.2 - 1 %, при появлении все 15% на момент проверки толи окно открылось и подмены несколько видоизмененным, все тормаза при проверке в методах ПолучитьФорму, а в "простое", нехилую долю отнимает работа с ТЗ.
|
|||
33
Fragster
модератор
13.10.13
✎
15:02
|
(31) мля, ну зачем? слепи свой внешнюю обработку в качестве морды - со всеми нужными формами и обработкой выбора нужной
|
|||
34
smaharbA
13.10.13
✎
15:03
|
(33) и что - говорить усерам - откройте сервис - другие обработки и т.д. ?
|
|||
35
Fragster
модератор
13.10.13
✎
15:03
|
да и опасность "изменения конфигурации" сильно преувеличена
|
|||
36
Fragster
модератор
13.10.13
✎
15:03
|
(34) пропиши в ярлык им параметр открытия внешней оработки с шары
|
|||
37
smaharbA
13.10.13
✎
15:03
|
(35) все и так работает, но нужно немного оптимизировать
|
|||
38
Fragster
модератор
13.10.13
✎
15:04
|
(37) сами придумываем гемор и сами героически его потом разгребаем?
|
|||
39
Fragster
модератор
13.10.13
✎
15:04
|
(29) получить все формы и запомнить 1 раз
|
|||
40
smaharbA
13.10.13
✎
15:08
|
вот результат
http://www.n-d.ru/files/uppforms.png (39) бред, всего одна пустая форма в обработке заменяет все |
|||
41
smaharbA
13.10.13
✎
15:08
|
(36) в терминале где нет проводника ?
|
|||
42
smaharbA
13.10.13
✎
15:11
|
+ ссуть не во вкладках (не только), в установке статусов заказов вошедших в производство, вводе на основании (почти такой же как есть, но немного дозаполняемом при выборе), в поиске без выбора полей и прочих кнопок (таковое работало ранее в семерке) - все снижает возможность ошибок менеджеров не умиляя их прав.
|
|||
43
smaharbA
13.10.13
✎
15:26
|
Вот так выглядит форма обработки, которая подменяет все либо выбранные по списку формы списков документов и журналов
http://www.n-d.ru/files/uppempty.png |
|||
44
Fragster
модератор
13.10.13
✎
17:42
|
(40) в чем бред? ты спрашиваешь, как ускорить? я те говорю, выполни один раз и запомни...
|
|||
45
Fragster
модератор
13.10.13
✎
17:48
|
ну и да - результат может быть сколь угодно "красивым", но если оно так тормозит и грузит клиента, что пользоваться невозможно - то может (33) или (35) будет проще? и без адских велосипедов...
|
|||
46
Зойч
13.10.13
✎
18:00
|
для объекта в 10 строк никакой индекс не нужен.
|
|||
47
smaharbA
13.10.13
✎
18:22
|
(45) пользоваться возможно и "грузит", только при открытии форм, да и то монописуарно со штатным открытием, вопрос был об оптимизации поиска пары значений, к слову замена функций на процедуры и тз на сп снизила загрузку в "простое" с 0.2-1.0 до 0-0.1, думается соответствие снизит еще.
(46) да не нужен, но когда количество итераций стремится к бесконечности задумаешься. (45) клиент ниразу не жалуется, а вот копировать 39 форм и заставлять его жмакать не на те кнопки нагрузит реально. |
|||
48
smaharbA
13.10.13
✎
18:22
|
(33) ты не понял никуя
|
|||
49
smaharbA
13.10.13
✎
18:25
|
еще интересный момент есть простой код
когда он выглядит так Процедура ПолучитьТекущееТабличноеПоле(ТекущееПоле) Если Не ТипЗнч(ТекущееПоле)=Тип("ТабличноеПоле") Тогда Страница=ЭтаФорма.ЭлементыФормы.Организации.ТекущаяСтраница; ТекущееПоле=ЭтаФорма.ЭлементыФормы.Найти(Страница.Имя); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ КОМАНДНЫХ ПАНЕЛЕЙ ФОРМЫ // Процедура печатает выбранный документ // Печатается та форма, которая была отпечатана при нажатии в документе кнопки // печати по умолчанию // Процедура ДействияФормыДействиеПечать(Кнопка) ПолучитьТекущееТабличноеПоле(ТекущееТабличноеПоле); Если ТекущееТабличноеПоле.ТекущаяСтрока = Неопределено тогда Возврат КонецЕсли; УниверсальныеМеханизмы.НапечататьДокументИзФормыСписка(ТекущееТабличноеПоле.ТекущаяСтрока.ПолучитьОбъект()); КонецПроцедуры // ДействиеПечать() Кнопка печати не работает, кнопка действий на командной панели когда так, работает //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ КОМАНДНЫХ ПАНЕЛЕЙ ФОРМЫ // Процедура печатает выбранный документ // Печатается та форма, которая была отпечатана при нажатии в документе кнопки // печати по умолчанию // Процедура ДействияФормыДействиеПечать(Кнопка) ПолучитьТекущееТабличноеПоле(ТекущееТабличноеПоле); Если ТекущееТабличноеПоле.ТекущаяСтрока = Неопределено тогда Возврат КонецЕсли; УниверсальныеМеханизмы.НапечататьДокументИзФормыСписка(ТекущееТабличноеПоле.ТекущаяСтрока.ПолучитьОбъект()); КонецПроцедуры // ДействиеПечать() Процедура ПолучитьТекущееТабличноеПоле(ТекущееПоле) Если Не ТипЗнч(ТекущееПоле)=Тип("ТабличноеПоле") Тогда Страница=ЭтаФорма.ЭлементыФормы.Организации.ТекущаяСтраница; ТекущееПоле=ЭтаФорма.ЭлементыФормы.Найти(Страница.Имя); КонецЕсли; КонецПроцедуры Что это ? |
|||
50
smaharbA
13.10.13
✎
18:26
|
+ При том нажатие на кнопку в первом варианте не приводит ни к каким действиям, вставка сообщить не кажет ничего
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |