|
Как оптимизировать условие с "ИЛИ"? | ☑ | ||
---|---|---|---|---|
0
Начинающий Программер
12.12.11
✎
08:02
|
Вот такой вот фрагмент кода загрузки из Экселя:
Для i = 4 По 14717 Цикл Номенклатура = Справочники.Номенклатура.СоздатьЭлемент(); Номенклатура.Наименование = Лист.Cells(i, 3).Value; ТекЗначГруппы = СокрЛП(Лист.Cells(i, 1).Value); Если (ТекЗначГруппы = "6") ИЛИ (ТекЗначГруппы = "7") ИЛИ (ТекЗначГруппы = "14") Тогда Номенклатура.Записать(); КонецЕсли; КонецЦикла; Эксель.Quit(); Хотелось бы, что проверка на ИЛИ выглядела следующим образом: Если ТекЗначГруппы = "6" ИЛИ "7" ИЛИ "14" Тогда КонецЕсли; |
|||
1
Александр_
Тверь 12.12.11
✎
08:04
|
(0) вообще очень плохой подход, читать с листа и создавать номенклатуру.
Лучше сначала прочитать входные данные, подготовить их, а уже после что-то с ними делать. Опять же, если данных много можно запихнуть это все на сервер и в запросе выбрать то, что нужно (реально быстрее может оказаться). |
|||
2
Начинающий Программер
12.12.11
✎
08:06
|
(1) Согласен, в окончательном варианте буду в ТЗ загонять, но пока хочу с ИЛИ разобраться:-)
|
|||
3
Александр_
Тверь 12.12.11
✎
08:07
|
создай таблицу значений, в нее прочитай наименование и "ТекЗначГруппы" и дальше уже работай с таблиццей
|
|||
4
Александр_
Тверь 12.12.11
✎
08:07
|
(2) попробуй запихать в таблицу, после запихнуть эту таблицу в запрос и отобрать запросом.
|
|||
5
Wobland
12.12.11
✎
08:08
|
(2) а чем текущее не устраивает? и если вытащи перед созданием номенклатуры
|
|||
6
Нуф-Нуф
12.12.11
✎
08:08
|
в топку.
чтение файла, запихивание в таблицу значений, и потом уже работа с ней (возможно с предварительной обработкой в запросе). |
|||
7
Александр_
Тверь 12.12.11
✎
08:09
|
опять же:
>> Хотелось бы, что проверка на ИЛИ выглядела следующим образом: >>Если ТекЗначГруппы = "6" ИЛИ "7" ИЛИ "14" Тогда >>КонецЕсли; Как выглядит не важно, важно что внутри происходит. Или ты хочешь повысить наглядность кода? |
|||
8
Нуф-Нуф
12.12.11
✎
08:09
|
ну или как минимум проверку делать в самом начале цикла, до создания объекта и заполнения полей.
|
|||
9
Азат
12.12.11
✎
08:10
|
да так-то эксель вообще быстро можно прочитать и в список запихать...
|
|||
10
Начинающий Программер
12.12.11
✎
08:12
|
(7) Если (ТекЗначГруппы = "6") ИЛИ (ТекЗначГруппы = "7") ИЛИ (ТекЗначГруппы = "14") Тогда
--------- Да-да, именно эту строку и хочу оптимизировать, так как надо проверять 5-10 условий и строка кода уходит далеко вправо за экран. Про прогрузку сначала в ТЗ я понял изначально)) |
|||
11
Нуф-Нуф
12.12.11
✎
08:12
|
кстати, в новой платформе есть такая штука как внешние источники данных
|
|||
12
Александр_
Тверь 12.12.11
✎
08:17
|
(10) изумительный ответ, ответ настоящего программиста!
Так ты хочешь оптимизировать быстродействие или чтобы строка кода не уходила далеко вправо экрана? если первое - то в ТЗ и отбирать запросом, если второе то: Вариант 1: ТекЗначГруппы переименовать в Зн Если Зн="6" ИЛИ Зн="7" ИЛИ Зн="14" ИЛИ Зн="15" ИЛИ Зн="16"ИЛИ Зн="17" ИЛИ Зн="18"ИЛИ Зн="19"Тогда КонецЕсли; Вариант 2: Если ТекЗначГруппы="6" ИЛИ ТекЗначГруппы="7" ИЛИ ТекЗначГруппы="14" ИЛИ ТекЗначГруппы="15" ИЛИ ТекЗначГруппы="16" ИЛИ ТекЗначГруппы="17" ИЛИ ТекЗначГруппы="18" ИЛИ ТекЗначГруппы="19"Тогда КонецЕсли; Вариант 3: использовать вариант 1 и вариант 2 одновременно Если Зн="6" ИЛИ Зн="7" ИЛИ Зн="14" ИЛИ Зн="15" ИЛИ Зн="16" ИЛИ Зн="17" ИЛИ Зн="18" ИЛИ Зн="19"Тогда КонецЕсли; |
|||
13
Начинающий Программер
12.12.11
✎
08:17
|
Блин, нафиг я лишний код кинул?
|
|||
14
Александр_
Тверь 12.12.11
✎
08:19
|
(13) блин, вот почему к 14му посту так и не понятно, что же ты хочешь? :)
|
|||
15
Defender aka LINN
12.12.11
✎
08:19
|
"Для i = 4 По 14717" - клево. А если в файле количество строк изменится? :)
|
|||
16
Нуф-Нуф
12.12.11
✎
08:20
|
(13) да правильно что код кинул. чтобы дали понять что это гамнокод и его надо исправлять
|
|||
17
Александр_
Тверь 12.12.11
✎
08:20
|
(15) Этого не может быть, потому что этого не может быть никогда (с)
|
|||
18
Нуф-Нуф
12.12.11
✎
08:21
|
а если конкретнее по сабжу - сделай список значений со своими цифрами и Список.НайтиЗначение
|
|||
19
Начинающий Программер
12.12.11
✎
08:22
|
(12) А я вижу классические ответы форумистов - что угодно, но только не ответ на поставленный вопрос:-) Код привел лишь чтобы довести суть, на загрузку в ТЗ и манипуляцию с ТЗ код уже есть, количество строк тоже ставить буду автоматом, разумеется.
Интересует только один момент, можно ли строку вида Если (ТекЗначГруппы = "6") ИЛИ (ТекЗначГруппы = "7") ИЛИ (ТекЗначГруппы = "14") Тогда привести к виду наподобие Если ТекЗначГруппы = "6" ИЛИ "7" ИЛИ "14" Тогда ? Просто думаю - зачем городить 1-й вариант, если вдруг есть возможность сделать по второму варианту? |
|||
20
Rie
12.12.11
✎
08:23
|
(0) Не вижу смысла в такой "хотелке" - разве что сокращение длины текста программы. Сравнения всё равно будут выполняться. ИЛИ в 1Сике всё равно работает только до первого "попадания", лишних проверок не делается.
А любые ухищрения со списками в _данной ситуации_ (в других ситуациях - может быть по другому) только затормозят работу процедуры. |
|||
21
Начинающий Программер
12.12.11
✎
08:24
|
(18) Вопля, именно подобного я и ждал! Спасибо:-) Сейчас буду городить)
|
|||
22
Начинающий Программер
12.12.11
✎
08:25
|
(20) Сложно читать код, когда таких сравнений штук 10...
|
|||
23
Rie
12.12.11
✎
08:25
|
(18) Если список маленький - СписокЗначений будет не оптимизацией, а "пессимизацией".
|
|||
24
Нуф-Нуф
12.12.11
✎
08:25
|
(21) и сделай свое условие в самом начале цикла
|
|||
25
Defender aka LINN
12.12.11
✎
08:25
|
(18), (21) - лучше Соответствие
|
|||
26
Rie
12.12.11
✎
08:28
|
(25) +1
(22) Альтернативный вариант - Функция для проверки (или преобразования списка в осмысленный ответ, например, Если ВидГруппы(ТекЗначГруппы)="СуперПуперГруппа" Тогда |
|||
27
vde69
12.12.11
✎
08:30
|
если хочешь сделать красиво:
м = новый массив; м.добавить("6"); м.добавить("7"); м.добавить("14"); Для i = 4 По 14717 Цикл Номенклатура = Справочники.Номенклатура.СоздатьЭлемент(); Номенклатура.Наименование = Лист.Cells(i, 3).Value; ТекЗначГруппы = СокрЛП(Лист.Cells(i, 1).Value); Если м.найти(ТекЗначГруппы) <> неопределено Тогда Номенклатура.Записать(); КонецЕсли; КонецЦикла; Эксель.Quit(); ---------------- если хочешь быстро - то тут уже говорили как/ в дополнение почитай http://infostart.ru/public/57401/ |
|||
28
Начинающий Программер
12.12.11
✎
08:54
|
Спасибо за предложенные варианты:-)
|
|||
29
aleks-id
12.12.11
✎
08:58
|
а что, запросом вытянуть из экселя только нужные данные сегодня уже не модно?
|
|||
30
Начинающий Программер
12.12.11
✎
09:03
|
(29) Ну, вообще-то все данные надо вытягивать и записывать. Это я просто код примерный набросал, интересовало только оптимизация "ИЛИ".
|
|||
31
Мимохожий Однако
12.12.11
✎
09:04
|
(29)Сбрось примерчик до кучи
|
|||
32
Начинающий Программер
12.12.11
✎
09:05
|
Кстати, а как программно узнать, что колокни в строке в экселе объединены?
|
|||
33
Rie
12.12.11
✎
09:16
|
(32) MergeCells проверит, содержит ли диапазон объединённые ячейки.
|
|||
34
aleks-id
12.12.11
✎
09:24
|
(31) создал ветку v8: Чтение данных XLS, XLSX запросом (мануал)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |