Имя: Пароль:
1C
1С v8
Есть ли метод получить ключ соответствия и найти ключ по значению ?
,
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
+ При том нажатие на кнопку в первом варианте не приводит ни к каким действиям, вставка сообщить не кажет ничего