Имя: Пароль:
1C
1С v8
Как вывести день недели прописью
0 amadeus2010
 
14.05.12
09:11
Доброе утро помогите разобраться с функцией вывода дня недели прописью.
Загружаю из ексель в 1с документ файл.В нем день недели указан цифрой,а мне надо получить в документе 1с день недели прописью.Вот строка кода

Строка.ДеньПосещения =Формат(СокрЛП(Лист.Cells(ПоСтрокам,4).Value),"ДФ=ддд");

Пытался использовать функцию формат(ТекущаяДата(),"ДФ=ддд").Трассировка показала что эта функция не сработала и день недели остался числом.
1 mikecool
 
14.05.12
09:14
насколько помню - нет в 8.2 такого, отменили
2 amadeus2010
 
14.05.12
09:16
у меня 8.1 УПП 1.2
3 Wobland
 
14.05.12
09:16
Сообщить(формат(ТекущаяДата(),"ДФ=ддд"))
Пн

что я не так делаю?
4 andrewks
 
14.05.12
09:16
нпихрена не понял. у тебя на входе что - строка, дата, число, или что?
5 Maxus43
 
14.05.12
09:17
СокрЛП(Лист.Cells(ПоСтрокам,4).Value) - дак это не дата по факту, вот и всё. строка
6 aleks-id
 
14.05.12
09:17
да число у него на входе. и надо функцию типа ДеньНеделиПрописью(1) которая вернет Понедельник
7 amadeus2010
 
14.05.12
09:18
у меня строка ексель содержащая номер дня недели строка и получить я должен строку
8 Zhuri
 
14.05.12
09:19
за 10 минут что здесь спрашиваеш 8 строк кода условия бы уже раза 4 накрапал...
9 mikecool
 
14.05.12
09:20
а блин, работает
Формат(ТекущаяДата(), "ДФ=дддд")
10 aleks-id
 
14.05.12
09:21
Функция ДеньНеделиПрописью(ДН)
ДниНедели = Новый Массив;
ДниНедели.Добавить("пн");
ДниНедели.Добавить("вт");
ДниНедели.Добавить("ср");
ДниНедели.Добавить("чт");
ДниНедели.Добавить("пт");
ДниНедели.Добавить("сб");
ДниНедели.Добавить("вс");
Возврат ДниНедели[ДН-1];
КонецФункции
11 Maxus43
 
14.05.12
09:23
(10) 28 апреля в високосный год - какой день?)
12 Maxus43
 
14.05.12
09:24
а, задача то простая, день недели указывается. неинтересно
13 aleks-id
 
14.05.12
09:24
(11) не тупи. там цифры от 1 до 7
14 andrewks
 
14.05.12
09:25
(10)читер!
15 andrewks
 
14.05.12
09:25
(8) за 2 мин
16 vmv
 
14.05.12
09:25
(0) я так полагаю это документ "Рейсы", я уже обрадовался думал не будет в понедельник амадеуса и проблем с рейсами)
17 Xapac
 
14.05.12
09:26
(10)+100500 пока читал ветку, не понял ПРОБЛЕМ автора
18 qeos
 
14.05.12
09:26
представлениеПериода
19 vmv
 
14.05.12
09:27
(17) это уже как утренний коффе - у него всегда одна и таже проблема, просто условное оформление разное
20 amadeus2010
 
14.05.12
09:31
потому что задачи разные
21 amadeus2010
 
14.05.12
09:38
большое спасибо (10) добавил вашу функцию в строку кода
Строка.ДеньПосещения =ДеньНеделиПрописью(СокрЛП(Лист.Cells(ПоСтрокам,4).Value));
заработало
22 vmv
 
14.05.12
10:12
уточняем задачу и избавляемся от г-кода

Исходная: у господина амадеуса есть порядковые дни недели в эксель, т.е.

1 день - понедельник
...
7 день - воскресенье

Необходимо: по порядковому номеру дня недели выводить
его символьное представление "понедельник"..."воскресенье
"

решение:

находим недельный период дат в которых неделя начинается с
1-го числа, например  

май 2006 начинался с понедельника, т.е.

1 мая 2006 понедельник
...
7 мая 2006 воскресение

Собственно код для господина амадеуса без г-технологий

   //ПорядковыйНомерДняНедели = СокрЛП(Лист.Cells(ПоСтрокам,4).Value;
   ПорядковыйНомерДняНедели = 1;
   Строка.ДеньПосещения = Формат(Дата(2006, 5, ПорядковыйНомерДняНедели), "ДФ="" дддд """); // "понедельник"
   Строка.ДеньПосещения = Формат(Дата(2006, 5, ПорядковыйНомерДняНедели), "ДФ="" ддд """);  // "Пн"


во сути код в одну строку уложить можно
23 Serg_1960
 
14.05.12
10:13
(так, просто, ради прикола)

Сообщить(Формат(Дата("13.05.2012 10:12:23") + СокрЛП(Лист.Cells(ПоСтрокам,4).Value),"ДФ=дддд"));
24 Serg_1960
 
14.05.12
10:40
(23) Что-то как-то никакой реакции на г-код :( А если так :)

Сообщить(ТРег(Формат(Дата(СокрЛП(Лист.Cells(ПоСтрокам,4).Value) + ".10.2012 00:00:00"),"ДФ=дддд")));
25 amadeus2010
 
14.05.12
12:01
согласен что мой код не катит, поэтому  и спрашивал знатоков 1С как вывести день недели прописью
26 aleks-id
 
14.05.12
12:06
(22) думаешь вызывать 2 функции оптимальнее моего копрокода?
27 Reset
 
14.05.12
12:13
Вариант

Сред("пнвтсрчтптсбвс",НомерДняНедели-1,2)
28 Reset
 
14.05.12
12:13
пардон

Сред("пнвтсрчтптсбвс",(НомерДняНедели-1)*2,2)
29 amadeus2010
 
14.05.12
12:14
В принципе я использовал код (10), а потом вызвал эту функцию в этой части кода
Строка.ДеньПосещения =Перечисления.ДниПосещения[ДеньНеделиПрописью(СокрЛП(Лист.Cells(ПоСтрокам,4).Value))];

Вывел дни недели так как они идут в ексель файле
30 vmv
 
14.05.12
12:16
(26) во-первых, можно использовать только Формат() без Дата() см. (24)

я привел пример с Дата() для наглядности, чтобы прочно осела мысль, что нам нужна дата, которая начинается с понедельника(1) и потом ее в (24)

во-вторых, зачем писать функцию, если все есть в Формат для этой задачи.

сомневаюсь, что она будет быстрее формат, но г добавит точно, при всем уважении
31 Reset
 
14.05.12
12:20
(28) Опять, простите, поторопился.

Два финальных варианта на выбор:

Сред("пнвтсрчтптсбвс",(НомерДняНедели-1)*2+1,2)
//или
Сред("**пнвтсрчтптсбвс",НомерДняНедели*2+1,2)
[*1c]
32 Reset
 
14.05.12
12:21
или даже

Сред("*пнвтсрчтптсбвс",НомерДняНедели*2,2)
33 amadeus2010
 
14.05.12
12:23
(30) т.е предлагаете использовать такой вариант
Сообщить(ТРег(Формат(СокрЛП(Лист.Cells(ПоСтрокам,4).Value),"ДФ=дддд"""""));
34 vmv
 
14.05.12
12:24
(31) по крайней мере это избавляет от создания массива и сокращает код до строчки, правда вычисление представления из строки будет с той же скростью, что по индексу массива, т.к.
в обоих случаях это указатель на строку символов, согласно с++ на котором пашет платформа
35 Reset
 
14.05.12
12:25
(34) Да, в том варианте мне не нравится постоянное пересоздание массива.
36 aleks-id
 
14.05.12
12:30
согласен, криво сделал. создание массива нужно вынести из функции.
но мой код быстрее формата. на 100к итерациях 0.633138 против 0.872828
37 aleks-id
 
14.05.12
12:32
вариант (32) самый быстрый. 0.365601
38 vmv
 
14.05.12
12:36
(37) быстрее потому что указатель на строку создается без создания переменной массива
39 aleks-id
 
14.05.12
12:37
вот только если понадобится выводить день недели полностью то будет облом.

   мнстр = "пн
   |вт
   |ср
   |чт
   |пт
   |сб
   |вс";
   ДеньПосещения = СтрПолучитьСтроку(мнстр,ПорядковыйНомерДняНедели);

0.27
40 vmv
 
14.05.12
12:38
(39) не-а, взять максимальное представление и в более коротких в конце добить пробелы, затем тот же принцип
41 aleks-id
 
14.05.12
12:39
(40) мой последний код лишен этих недостатков ;)
42 vmv
 
14.05.12
12:43
(41) СтрПолучитьСтроку() я открыл для себя этот метод, он был всегда?

хоть какая-то польза от господина амадеуса)
43 aleks-id
 
14.05.12
12:47
(42) вроде давно уже 1с с многострочкой работает.
44 Zhuri
 
14.05.12
12:57
Линейку всем выдали?
45 amadeus2010
 
14.05.12
13:51
небольшое уточнение я преобразую день недели из числа в строку используя этот код
Строка.ДеньПосещения =Перечисления.ДниПосещения[ДеньНеделиПрописью(СокрЛП(Лист.Cells(ПоСтрокам,4).Value))];

Но у нас в конфигурации день недели должен также попасть в регистр сведений закрепление за клиентом.Добавит ли этот код день недели в регистр?