Имя: Пароль:
1C
1С v8
укорочение кода
0 Adgjj
 
24.09.11
15:12
См1 = "НЕТ";
           См2 = "НЕТ";
           См3 = "НЕТ";
           См4 = "НЕТ";
           Для каждого Строка Из ТабСмен Цикл
               
               Если Строка.НомерСмены = 1 Тогда
                   Если Строка.ОсновноеЗначение = 0 Тогда //0 часов
                       См1 = "В";
                   Иначе                                  //12 часов
                       если  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 07.00 до 19.00") Тогда
                           См1 = "1";      
                       иначеесли  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 19.00 до 07.00") Тогда
                           См1 = "2";      
                       КонецЕсли;
                   КонецЕсли;
                                                 
               ИначеЕсли Строка.НомерСмены = 2 Тогда
                   Если Строка.ОсновноеЗначение = 0 Тогда //0 часов
                       См2 = "В";
                   Иначе                                  //12 часов
                       если  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 07.00 до 19.00") Тогда
                           См2 = "1";      
                       иначеесли  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 19.00 до 07.00") Тогда
                           См2 = "2";      
                       КонецЕсли;
                   КонецЕсли;

...
КонецЕсли;
КонецЦикла;
Строчечка = "1 - "+См1+" | 2 - "+См2+" | 3 - "+См3+" | 4 - "+См4;


Здравствуйте! Скажите, пжл, как записать код, чтобы
Если Строка.ОсновноеЗначение = 0 Тогда //0 часов
                       См1 = "В";
                   Иначе                                  //12 часов
                       если  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 07.00 до 19.00") Тогда
                           См1 = "1";      
                       иначеесли  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 19.00 до 07.00") Тогда
                           См1 = "2";      
                       КонецЕсли;
                   КонецЕсли;
не писать для каждого из См1, См2, См3?
1 Rie
 
24.09.11
15:15
(0) Открой для себя Соответствие. Или Массив.
2 Adgjj
 
24.09.11
15:17
спасибо
3 Adgjj
 
24.09.11
15:32
пока не получилось:
СоотвСм = новый Соответствие;
           СоотвСм.Вставить("См1","НЕТ");
           СоотвСм.Вставить("См2","НЕТ");
           СоотвСм.Вставить("См3","НЕТ");
           СоотвСм.Вставить("См4","НЕТ");
                   
           Для каждого Строка Из ТабСмен Цикл
               //Если Строка.НомерСмены = 1 Тогда
                   Если Строка.ОсновноеЗначение = 0 Тогда //0 часов
                       См = "В";
                   Иначе                                  //12 часов
                       если  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 07.00 до 19.00") Тогда
                           См = "1";      
                       иначеесли  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 19.00 до 07.00") Тогда
                           См = "2";      
                       КонецЕсли;
                   КонецЕсли;
                                                 
               //ИначеЕсли Строка.НомерСмены = 2 Тогда
                                                                       
               //ИначеЕсли Строка.НомерСмены = 3 Тогда
                   
               //КонецЕсли;
4 Kookish
 
24.09.11
15:38
Возьми лучше массив, а в качестве индекса используй Строка.НомерСмены. Индекс как раз с 0 начинается.

Массив = Новый Массив(4);

// твой код

Массив[Строка.НомерСмены] = См;
5 Adgjj
 
24.09.11
15:41
спасибо, мне как раз с 1 нужно))
6 popcorn
 
24.09.11
15:42
.......
Если Строка.ОсновноеЗначение = 0 Тогда //0 часов
      Выполнить("См"+Строка.НомерСмены+"=В"
Иначе
........
7 popcorn
 
24.09.11
15:43
+(6) Там я забыл скобку, точку с запятой, и вообще за синтаксис не гарантирую, писал на память. Но идея понятна думаю
8 Rie
 
24.09.11
15:45
(6) Не надо там Выполнить. Зачем учишь извращениям?
9 popcorn
 
24.09.11
15:46
(8) Надо! Хорошая вешь, как раз в тему. Просто надо объяснить что в других случаях его лучше не употреблять
10 Vakhrin
 
24.09.11
15:48
Все в запрос и формирование строки смен по выборке
11 Rie
 
24.09.11
15:49
(9) В _этом_ случае его употреблять не надо.
Поскольку достаточно

Масс[]
12 Rie
 
24.09.11
15:50
+(11)
Масс[ТабСмен.НомерСтроки] = ЧегоТамНадо;

или

Соотв.Вставить(ТабСмен.НомерСтроки) = ЧегоТамНадо;
13 popcorn
 
24.09.11
15:55
не, вот так и массивы не нужны, и переменные те же самые остаются

           См1 = "НЕТ";
           См2 = "НЕТ";
           См3 = "НЕТ";
           См4 = "НЕТ";
           Для каждого Строка Из ТабСмен Цикл
               
               Если Строка.НомерСмены = 1 Тогда
               Если Строка.ОсновноеЗначение = 0 Тогда //0 часов

                   Выполнить("См"+Строка.НомерСмены+"=В");
               Иначе                                  //12 часов

                   если  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 07.00 до 19.00") Тогда
                       Выполнить("См"+Строка.НомерСмены+"=1");      
                   иначеесли  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 19.00 до 07.00") Тогда
                       Выполнить("См"+Строка.НомерСмены+"=2");      
                   КонецЕсли;
               КонецЕсли;
                                                 
            КонецЦикла;
14 popcorn
 
24.09.11
15:55
Тоесть так:

           См1 = "НЕТ";
           См2 = "НЕТ";
           См3 = "НЕТ";
           См4 = "НЕТ";
           Для каждого Строка Из ТабСмен Цикл
               
               Если Строка.ОсновноеЗначение = 0 Тогда //0 часов

                   Выполнить("См"+Строка.НомерСмены+"=В");
               Иначе                                  //12 часов

                   если  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 07.00 до 19.00") Тогда
                       Выполнить("См"+Строка.НомерСмены+"=1");      
                   иначеесли  Строка.Смена = справочники.уатСмены.НайтиПоНаименованию("Смена с 19.00 до 07.00") Тогда
                       Выполнить("См"+Строка.НомерСмены+"=2");      
                   КонецЕсли;
               КонецЕсли;
                                                 
            КонецЦикла;
15 Adgjj
 
24.09.11
16:04
а как после этих манипуляций написать, что
СтрокаПодсказки = "1 - "+См1+" | 2 - "+См2+" | 3 - "+См3+" | 4 - НЕТ";
16 Adgjj
 
24.09.11
16:06
пишется - пока в выполнить сделала - хотя это конечно изврат (не в обиду автору - это все же способ, до которого я сама не додумалась)
может лучше запросом, тем более что ТабСмен как раз из запроса получается
17 Rie
 
24.09.11
16:11
(13) Ну да, а на быстродействие мы плевали с высокой колокольни, у нас 1С на Deep Blue работает...
18 popcorn
 
24.09.11
17:01
(16) почему изврат? Нормально вполне.
(17) Ты даже моргнуть не успеешь как оно выплонится. Если конечно 1с не на перфокартном ЭВМ запущена )))
19 Rie
 
24.09.11
17:09
(18) Потому что использовать Выполнить, когда имеются массивы и соответствия - изврат (да и вообще, Выполнить - это изврат, введенный на случай крайней необходимости).

Просто так, для разнообразия - запусти как нибудь профайлер и сравни

н = 0;
Для л=1 По 1000000 Цикл
  н = 2+2;
КонецЦикла;

Для л=1 По 1000000 Цикл
  н = Вычислить("2+2");
КонецЦикла;

и ощути разницу
20 popcorn
 
24.09.11
17:14
(19) Тогда ты сравни, просто так, для разнообразия:

н = 0;
Для л=1 По 8 Цикл
  н = 2+2;
КонецЦикла;

Для л=1 По 8 Цикл
  н = Вычислить("2+2");
КонецЦикла;


и ощути разницу
21 Rie
 
24.09.11
17:23
(20) То есть, у тебя все задачи - это те, которые на калькуляторе вручную посчитать быстрее будет? Тогда извини, больше вопросов нет.

Впрочем, один всё же есть. Ты свой пример профайлером проверял? И при этом не заметил, что первый цикл выполняется раз в 10 быстрее второго? И что почти всё время выполнения сжирает именно Выполнить?
22 popcorn
 
24.09.11
17:26
(21) НА сколько быстрее? Моргнуть успел? Уверен что нет, какой бы медленный комп у тебя ни был.
23 popcorn
 
24.09.11
17:28
(21) При чем вообще все задачи? в (0) конкретная задача описана, которую не на калькуляторе надо считать. Не притягивай за уши всякую левую хрень типа Для л=1 По 1000000 Цикл ......
24 Rie
 
24.09.11
17:32
(23) О том, что задача из (0) будет выполняться более одного раза - ты не подумал?

Что ж, радует хотя бы то, что пока есть "программисты" вроде тебя - мне обеспечен не только кусок хлеба, но и икорка на него :-)
25 popcorn
 
24.09.11
17:51
(24) Врядли мою работу ты сможешь переделать лучше. Судя по твоим стереотипам и что всё стрежешь под одну гребенку. Вдолбил себе что "Выполнить" это плохо, а то что случаи могут быть разные не понимаешь.
26 0xFFFFFF
 
24.09.11
20:23
(0) жесть какая то нереальная.
27 0xFFFFFF
 
24.09.11
20:24
(0) Мало того что НайтиПоНаименованию - так еще и в цикле и не один раз. Да за такое надо...
28 0xFFFFFF
 
24.09.11
20:28
(0) и накуй вообще нужен этот цикл, если у табзначений есть метод НайтиСтроки?
29 0xFFFFFF
 
24.09.11
20:35
(0) Лови, студент.
////////////////////////////////////////////////////////////////////////////
Функция ОпределитьСмену(ТабСмен, НомерСмены, ДневнаяСмена, НочнаяСмена)

   Если ТабСмен.НайтиСтроки(Новый Структура("ОсновноеЗначение", 0)).Количество()>0 Тогда
       Возврат "В";
   ИначеЕсли ТабСмен.НайтиСтроки(Новый Структура("НомерСмены, Смена", НомерСмены, ДневнаяСмена)).Количество()>0 Тогда
       Возврат "1";
   ИначеЕсли ТабСмен.НайтиСтроки(Новый Структура("НомерСмены, Смена", НомерСмены, НочнаяСмена)).Количество()>0 Тогда
       Возврат "НЕТ";
   КонецЕсли;
КонецФункции
////////////////////////////////////////////////////////////////////////////
ДневнаяСмена = справочники.уатСмены.НайтиПоНаименованию("Смена с 07.00 до 19.00");
НочнаяСмена = справочники.уатСмены.НайтиПоНаименованию("Смена с 19.00 до 07.00");

См1 = ОпределитьСмену(ТабСмен, 1, ДневнаяСмена, НочнаяСмена);
См2 = ОпределитьСмену(ТабСмен, 2, ДневнаяСмена, НочнаяСмена);
См3 = ОпределитьСмену(ТабСмен, 3, ДневнаяСмена, НочнаяСмена);
См4 = ОпределитьСмену(ТабСмен, 4, ДневнаяСмена, НочнаяСмена);
30 0xFFFFFF
 
24.09.11
20:36
Вернее вот - одно условие забыл
////////////////////////////////////////////////////////////////////////////
Функция ОпределитьСмену(ТабСмен, НомерСмены, ДневнаяСмена, НочнаяСмена)

   Если ТабСмен.НайтиСтроки(Новый Структура("ОсновноеЗначение", 0)).Количество()>0 Тогда
       Возврат "В";
   ИначеЕсли ТабСмен.НайтиСтроки(Новый Структура("НомерСмены, Смена", НомерСмены, ДневнаяСмена)).Количество()>0 Тогда
       Возврат "1";
   ИначеЕсли ТабСмен.НайтиСтроки(Новый Структура("НомерСмены, Смена", НомерСмены, НочнаяСмена)).Количество()>0 Тогда
       Возврат "2";
   КонецЕсли;
   Возврат "НЕТ";
КонецФункции
////////////////////////////////////////////////////////////////////////////
ДневнаяСмена = справочники.уатСмены.НайтиПоНаименованию("Смена с 07.00 до 19.00");
НочнаяСмена = справочники.уатСмены.НайтиПоНаименованию("Смена с 19.00 до 07.00");

См1 = ОпределитьСмену(ТабСмен, 1, ДневнаяСмена, НочнаяСмена);
См2 = ОпределитьСмену(ТабСмен, 2, ДневнаяСмена, НочнаяСмена);
См3 = ОпределитьСмену(ТабСмен, 3, ДневнаяСмена, НочнаяСмена);
См4 = ОпределитьСмену(ТабСмен, 4, ДневнаяСмена, НочнаяСмена);
31 0xFFFFFF
 
24.09.11
20:38
... ну и естественно смены сделать предопределенными, ну или признак того, дневная или ночная.
32 Adgjj
 
26.09.11
09:20
(30) спасибо!
33 0xFFFFFF
 
26.09.11
10:11
(32) Кстати, там еще ошибочка
Если ТабСмен.НайтиСтроки(Новый Структура("ОсновноеЗначение", 0)).Количество()>0 Тогда

Заменить на

Если ТабСмен.НайтиСтроки(Новый Структура("НомерСмены, ОсновноеЗначение", НомерСмены, 0)).Количество()>0 Тогда
34 Adgjj
 
26.09.11
13:28
спасибо
я основноезначение не использовала, видимо, поэтому ошибку не заметила
Программист всегда исправляет последнюю ошибку.