Имя: Пароль:
1C
 
красиво преобразовать номер в названия дня недели
0 Gray-bird
 
24.02.09
10:21
Есть отчет, куда надо вставить название дня недели в текстовом виде.
Функция НомерДняНедели(<Дата>) возвращает числовой номер дня недели.
Понятно, что можно написать код вида:

если НомерДняНедели(<Дата>)=1 тогда Д="понедельник";
иначеесли НомерДняНедели(<Дата>)2 тогда Д="вторник";

и т.д., но это, как то не элегантно, тем более эта фигня будет вызываться внутри цикла, при заполнении строк отчета.
Есть соображения, более красивого написания?
1 miki
 
24.02.09
10:22
через СЗ красивше будет
2 ДенисЧ
 
24.02.09
10:22
WWWW (НННН), выводит наименование дня недели, соответсвующее указанной дате. Наименования дней недели берутся из файла прописи.

Это из Формат()
3 Shaman100M
 
24.02.09
12:24
массив можно завести
НаименованиеДняНедели[НомерДняНедели(<Дата>)]
4 Virusaka_P
 
24.02.09
12:51
Не изобретайте велосипед. Правильный ответ в (2)
Формат(ТекДата,"ДНННН")
5 Shaman100M
 
24.02.09
14:56
(4) иногда, если ехать оч далеко, его стоит изобрести заново, чтоб по-быстрее ехал, в десятки раз по-быстрее.
6 Fragster
 
гуру
24.02.09
14:59
(5) а вот ты и сравни, что быстрее - вычислить номер дня недели, затем получить с помощью если/иначеесли слово, или сразу получить слово?
7 Fragster
 
гуру
24.02.09
15:00
кстати говоря, встроенные функции написаны не на внутреннем языке 1с, соответственно, работают в разы быстрее, чем то же самое, но написанное на встроенном языке
8 Gray-bird
 
24.02.09
15:01
(6) Зато вариант с если/иначеесли позволяет придумать свои названия для дней недели. :)
Пусть бухгалтера радуются!
9 Fragster
 
гуру
24.02.09
15:02
(8) да, как и свой файл прописи
10 ДенисЧ
 
24.02.09
15:02
(8) Формат тоже позволяет.
11 Shaman100M
 
24.02.09
15:27
(6) естественно, прежде чем написать сюда, сравнил.

Процедура Выполнить()
   Перем А1[7];
   
   А1[1]    = "Понедельник";
   А1[2]    = "Вторник";
   А1[3]    = "Среда";
   А1[4]    = "Четверг";
   А1[5]    = "Пятница";
   А1[6]    = "Суббота";
   А1[7]    = "Воскресенье";
   
   Счт1    = _GetPerformanceCounter();
   Для М1    = 1 По 20000 Цикл
       Для М2    = 1 По 7 Цикл
           ДеньНеделиТекст    = "";
       КонецЦикла;
   КонецЦикла;
   Счт2    = _GetPerformanceCounter();
   
   ПостВремя    = Счт2    - Счт1;
   
   Счт1    = _GetPerformanceCounter();
   Для М1    = 1 По 20000 Цикл
       Для М2    = 1 По 7 Цикл
           ДеньНеделиТекст    = А1[М2];
       КонецЦикла;
   КонецЦикла;
   Счт2    = _GetPerformanceCounter();
   
   Сообщить("массив: "    + Строка(Счт2    - Счт1    - ПостВремя),);
   
   Счт1    = _GetPerformanceCounter();
   Для М1    = 1 По 20000 Цикл
       Для М2    = 1 По 7 Цикл
           ДеньНеделиТекст    = Формат(М2,"ДНННН");
       КонецЦикла;
   КонецЦикла;
   Счт2    = _GetPerformanceCounter();

   Сообщить("формат: "    + Строка(Счт2    - Счт1    - ПостВремя),);

   Счт1    = _GetPerformanceCounter();
   Для М1    = 1 По 20000 Цикл
       Для М2    = 1 По 7 Цикл
           Если М2    = 1 Тогда
               ДеньНеделиТекст    = "Понедельник";
           ИначеЕсли М2    = 2 Тогда    
               ДеньНеделиТекст    = "Вторник";
           ИначеЕсли М2    = 3 Тогда    
               ДеньНеделиТекст    = "Среда";
           ИначеЕсли М2    = 4 Тогда    
               ДеньНеделиТекст    = "Четверг";
           ИначеЕсли М2    = 5 Тогда    
               ДеньНеделиТекст    = "Пятница";
           ИначеЕсли М2    = 6 Тогда    
               ДеньНеделиТекст    = "Суббота";
           Иначе
               ДеньНеделиТекст    = "Воскресенье";
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
   Счт2    = _GetPerformanceCounter();

   Сообщить("условие: "    + Строка(Счт2    - Счт1    - ПостВремя),);
КонецПроцедуры
12 Shaman100M
 
24.02.09
15:28
+ (11) СЗ тоже медленнее будет.
13 Gray-bird
 
24.02.09
15:39
(11) И чего в результате получилось?
Какова скорость каждого из вариантов?
14 Shaman100M
 
24.02.09
15:42
+ (11) да, забыл про НомерДняНедели(). Но его добавление в цикл быстродействия массива существенно не замедлит.

(13)

массив: 78
формат: 1358
условие: 323
15 Fragster
 
гуру
24.02.09
15:45
а ты прогоняй не на 1-7, а на 01.01.2001 - 31.12.2008 и без внешнего цикла ;)
16 Fragster
 
гуру
24.02.09
15:46
(15) а то тест не отражает реальности
17 Shaman100M
 
24.02.09
15:57
(16) Да ну? Посмотри на код. Там разница только в конечном методе, влияние цикла исключается.
(15) Утверждать, что на прогоне по реальным датам будет другой результат - то же самое, что и утверждать, что скорость методов НомерДняНедели() и Формат() зависит от значения параметра. ;)
18 Fragster
 
гуру
24.02.09
15:58
хм... за 500 лет получилось 1,5 секунды - через формат и 0,3 секунды через массив... отсюда вывод - а стоит ли того?
19 Fragster
 
гуру
24.02.09
16:00
(17) ну так остаток от деления (НомерДняНедели) - от больших чисел дольше считается...
20 Shaman100M
 
24.02.09
16:19
(18) Я ж и говорю, если ехать очень далеко.
Необязательно брать уникальные даты, возьми, например, БД вызовов МТС, там же сотни миллионов записей. А 500 лет это примерно 180тыс.
По времени - исключи влияние отладчика.
(19) если зависимость и будет, то скорее логарифмическая.
21 Gray-bird
 
24.02.09
23:26
Может кто объяснит, обнаружился странный эффект.
Ячейка таблицы отчета, если в ней содержится
"Лев(Формат(День,"ДНННН"),3)+"  "+День" - то в ячейке выводится корректно, три символа дня недели + дата числом. Если же сделать наоборот:
День+"  +Лев(Формат(День,"ДНННН"),3) - то выводится только числовая дата, полностью игнорируя правую часть формулы.
Почему так?
22 Токс3
 
24.02.09
23:32
(21) Что должно получиться, если к дате прибавить слово?
Вобщем, ставь в начало ""+(тут всё твоё)...
23 Gray-bird
 
24.02.09
23:38
Да-а-а, избаловала меня 1с автоматической подгонкой типов друг к другу.
Никакой культуры программирования не осталось.
Понадеялся, что она типа сама всю ячейку соберет...
:)