Имя: Пароль:
1C
1С v8
Как оптимизировать условие с "ИЛИ"?
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
Независимо от того, куда вы едете — это в гору и против ветра!