|
укорочение кода | ☑ | ||
---|---|---|---|---|
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
|
спасибо
я основноезначение не использовала, видимо, поэтому ошибку не заметила |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |