Имя: Пароль:
1C
 
Как из строки получить дату
0 Гуслица
 
19.05.17
17:41
А как из формата МесяцГод типа «Ноябрь 2016» сделать начало месяца с типом дата — 01.11.2016?
1 eryomin
 
19.05.17
17:44
а ты не из формата, само значение возьми :)
2 Ц_У
 
19.05.17
17:53
(0) в где? в типовых есть справочник периоды и можно так
Справочники.Периоды.НайтиПоНаименованию("Ноябрь 2016").ДатаНачала
3 Гуслица
 
19.05.17
17:56
(2) спасибо - щас проверю
4 kiruha
 
19.05.17
17:58
проще разобрать
5 kiruha
 
19.05.17
17:59
15 строчек
но еще проще вопрос на мисте
6 Гуслица
 
19.05.17
18:00
(2) - спасибо о "Великий гуру"

У кого настоящие идеи?
7 HEKPOH
 
19.05.17
18:01
(2) прикольно потроллил)
8 Гуслица
 
19.05.17
18:03
(5) Разобрать все месяца?
типа
Если Лев(Период, 3) = "Янв" Тогда
   Месяц = 1
Иначе Если...
?
9 Letum
 
19.05.17
18:03
Вот функция, которая жрет очень много форматов (кроме дат с указанием GMT и прочих поясов):



&НаКлиентеНаСервереБезКонтекста
Функция ДатаИзСтроки(Строка)
    
    Результат = Неопределено;
    
    #Область Определение_Месяцев
    
    Месяцы = Новый Соответствие;
    Месяцы.Вставить("ЯНВ", "01");
    Месяцы.Вставить("ФЕВ", "02");
    Месяцы.Вставить("МАР", "03");
    Месяцы.Вставить("АПР", "04");
    Месяцы.Вставить("МАЙ", "05");
    Месяцы.Вставить("МАЯ", "05");
    Месяцы.Вставить("ИЮН", "06");
    Месяцы.Вставить("ИЮЛ", "07");
    Месяцы.Вставить("АВГ", "08");
    Месяцы.Вставить("СЕН", "09");
    Месяцы.Вставить("ОКТ", "10");
    Месяцы.Вставить("НОЯ", "11");
    Месяцы.Вставить("ДЕК", "12");
    Месяцы.Вставить("JAN", "01");
    Месяцы.Вставить("FEB", "02");
    Месяцы.Вставить("MAR", "03");
    Месяцы.Вставить("APR", "04");
    Месяцы.Вставить("MAY", "05");
    Месяцы.Вставить("JUN", "06");
    Месяцы.Вставить("JUL", "07");
    Месяцы.Вставить("AUG", "08");
    Месяцы.Вставить("SEP", "09");
    Месяцы.Вставить("OCT", "10");
    Месяцы.Вставить("NOV", "11");
    Месяцы.Вставить("DEC", "12");
    
    #КонецОбласти     
    
    #Область Определение_Вариантов_порядка_частей_даты
    
    Варианты = Новый Массив;
    Варианты.Добавить("К");
    Варианты.Добавить("Ф");
    Варианты.Добавить("Г");
    Варианты.Добавить("М");
    Варианты.Добавить("Д");
    Варианты.Добавить("ч");
    Варианты.Добавить("м");
    Варианты.Добавить("с");
    
    Варианты.Добавить("ДМ");    
    Варианты.Добавить("МГ");
    Варианты.Добавить("ГМ");
    Варианты.Добавить("чм");
    
    Варианты.Добавить("ДМГ");
    Варианты.Добавить("ГМД");
    Варианты.Добавить("чмс");
    
    Варианты.Добавить("ДМчм");
    Варианты.Добавить("чДМГ");
    Варианты.Добавить("чГМД");
    Варианты.Добавить("ГМДч");
    Варианты.Добавить("ДМГч");
    Варианты.Добавить("чмДМ");
    Варианты.Добавить("чмМД");
    
    Варианты.Добавить("ДМГчм");
    Варианты.Добавить("ГМДчм");
    Варианты.Добавить("чмДМГ");
    Варианты.Добавить("чмГМД");
    Варианты.Добавить("МДчмГ");
    
    Варианты.Добавить("ДМГчмс");
    Варианты.Добавить("ГМДчмс");
    Варианты.Добавить("чмсДМГ");
    Варианты.Добавить("чмсГМД");
    Варианты.Добавить("МДчмсГ");
    
    #КонецОбласти
    
    #Область Поиск_частей_строк_с_назначением_ролей
    
    ЧастиСтроки = Новый Массив;
    
    ТекущаяПодстрока = "";
    ТекущийВидСимвола = "";
    ПредыдущийВидСимвола = "";
    
    Для Счетчик = 1 по СтрДлина(Строка) + 1 Цикл
        
        Символ = ?(Счетчик = СтрДлина(Строка) + 1, ".", ВРЕГ(Сред(Строка, Счетчик, 1)));
        
        Если Символ >= "0" И Символ <= "9" Тогда
            ВидСимвола = "Цифры";
        ИначеЕсли Символ >= "А" И Символ <= "Я" Тогда
            ВидСимвола = "Буквы";
        ИначеЕсли Символ = ":" Тогда
            ВидСимвола = ":";
        Иначе
            ВидСимвола = "Разрыв";
        КонецЕсли;
        
        Если ТекущийВидСимвола <> ВидСимвола Тогда
            
            ОписаниеЭлемента = Новый Структура("Подстрока, Роли", ТекущаяПодстрока , Новый Массив);
            
            Если ТекущийВидСимвола = "Цифры" Тогда
                
                ЧислоПодстроки = Число(ТекущаяПодстрока);
                
                Если СтрДлина(ТекущаяПодстрока) = 8 Тогда
                    Если Число(Лев(ТекущаяПодстрока, 4))  > 1000 И   Число(Сред(ТекущаяПодстрока, 5,2))< 13 И Число(Сред(ТекущаяПодстрока, 7,2))< 32 Тогда
                        ОписаниеЭлемента.Роли.Добавить("Ф");    
                    КонецЕсли;
                КонецЕсли;
                
                Если СтрДлина(ТекущаяПодстрока) = 14 Тогда
                    Если Число(Лев(ТекущаяПодстрока, 4))  > 1000 И   Число(Сред(ТекущаяПодстрока, 5,2))< 13 И Число(Сред(ТекущаяПодстрока, 7,2))< 32 И Число(Сред(ТекущаяПодстрока, 9,2))< 24 И Число(Сред(ТекущаяПодстрока, 11,2))< 61 И Число(Сред(ТекущаяПодстрока, 13,2))< 61 Тогда
                        ОписаниеЭлемента.Роли.Добавить("К");
                    КонецЕсли;
                КонецЕсли;
                
                Если СтрДлина(ТекущаяПодстрока) = 4 Тогда
                    ОписаниеЭлемента.Роли.Добавить("Г");
                КонецЕсли;
                Если СтрДлина(ТекущаяПодстрока) <= 2 Тогда
                    
                    Если ВидСимвола <> ":" И ПредыдущийВидСимвола <> ":" Тогда
                        Если ЧислоПодстроки <= 31 Тогда
                            ОписаниеЭлемента.Роли.Добавить("Д");
                        КонецЕсли;
                        Если ЧислоПодстроки <= 12 Тогда
                            ОписаниеЭлемента.Роли.Добавить("М");
                        КонецЕсли;
                        ОписаниеЭлемента.Роли.Добавить("Г");
                    КонецЕсли;
                    
                    Если ЧислоПодстроки < 24 И ПредыдущийВидСимвола <> ":" Тогда
                        ОписаниеЭлемента.Роли.Добавить("ч");
                    КонецЕсли;
                    Если ЧислоПодстроки < 60 Тогда
                        ОписаниеЭлемента.Роли.Добавить("м");
                    КонецЕсли;
                    Если ЧислоПодстроки < 60 И ВидСимвола <> ":" Тогда
                        ОписаниеЭлемента.Роли.Добавить("с");
                    КонецЕсли;
                    
                КонецЕсли;
                
                ЧастиСтроки.Добавить(ОписаниеЭлемента);
                
            ИначеЕсли ТекущийВидСимвола = "Буквы" Тогда
                
                Для Каждого КлючИЗначение Из Месяцы Цикл
                    Если Найти(ВРЕГ(ТекущаяПодстрока), КлючИЗначение.Ключ) > 0 Тогда
                        ОписаниеЭлемента.Подстрока = КлючИЗначение.Значение;
                        ОписаниеЭлемента.Роли.Добавить("М");
                        ЧастиСтроки.Добавить(ОписаниеЭлемента);
                        Прервать;
                    КонецЕсли;
                КонецЦикла;                
                
                Если ЧастиСтроки.Количество() > 0 Тогда
                    ПредыдущееОписание = ЧастиСтроки[ЧастиСтроки.Количество()- 1];
                    Если ВРЕГ(ТекущаяПодстрока) = "Г" или  ВРЕГ(ТекущаяПодстрока) = "ГОД" или  ВРЕГ(ТекущаяПодстрока) = "ГОДА" Тогда
                        ПредыдущееОписание.Роли.Очистить();
                        ПредыдущееОписание.Роли.Добавить("Г");
                    КонецЕсли;
                    Если ВРЕГ(ТекущаяПодстрока) = "Ч" ИЛИ  ВРЕГ(ТекущаяПодстрока) = "ЧАС" Тогда
                        ПредыдущееОписание.Роли.Очистить();
                        ПредыдущееОписание.Роли.Добавить("ч");
                    КонецЕсли;
                    Если ВРЕГ(ТекущаяПодстрока) = "М" ИЛИ ВРЕГ(ТекущаяПодстрока) = "МИН" Тогда
                        ПредыдущееОписание.Роли.Очистить();
                        ПредыдущееОписание.Роли.Добавить("м");
                    КонецЕсли;
                    Если ВРЕГ(ТекущаяПодстрока) = "С" ИЛИ ВРЕГ(ТекущаяПодстрока) = "СЕК" Тогда
                        ПредыдущееОписание.Роли.Очистить();
                        ПредыдущееОписание.Роли.Добавить("ч");
                    КонецЕсли;
                    
                КонецЕсли;
                
            КонецЕсли;
            
            ТекущаяПодстрока = "";
            
            ПредыдущийВидСимвола = ТекущийВидСимвола;
        
            ТекущийВидСимвола = ВидСимвола;
            
        КонецЕсли;
        
        ТекущаяПодстрока = ТекущаяПодстрока + Символ;
        
    КонецЦикла;
    
    #КонецОбласти     
    
    #Область Поиск_варианта
    
    Для Каждого Вариант ИЗ Варианты Цикл
        
        ВариантСоответствует = Истина;
        
        Если СтрДлина(Вариант) = ЧастиСтроки.Количество() Тогда
            Для Счетчик = 1 по СтрДлина(Вариант) Цикл
                Если ЧастиСтроки[Счетчик - 1].Роли.Найти(Сред(Вариант, Счетчик, 1)) = Неопределено Тогда
                    ВариантСоответствует = Ложь;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        Иначе
            ВариантСоответствует = Ложь;
        КонецЕсли;
        
        Если ВариантСоответствует Тогда
            
            Год = 0;
            Месяц = 1;
            День = 1;
            Час = 0;
            Минута = 0;
            Секунда = 0;
            
            Для Счетчик = 1 по СтрДлина(Вариант) Цикл
                
                Символ = Сред(Вариант, Счетчик, 1);
                
                Если Символ = "Г" Тогда
                    Год = Число(ЧастиСтроки[Счетчик - 1].Подстрока);
                    Если Год < 50 Тогда
                        Год = Год + 2000;
                    ИначеЕсли Год < 100 Тогда
                        Год = Год + 1900;
                    КонецЕсли;
                ИначеЕсли Символ = "М" Тогда
                    Месяц = Число(ЧастиСтроки[Счетчик - 1].Подстрока);
                ИначеЕсли Символ = "Д" Тогда
                    День = Число(ЧастиСтроки[Счетчик - 1].Подстрока);
                ИначеЕсли Символ = "ч" Тогда
                    Час = Число(ЧастиСтроки[Счетчик - 1].Подстрока);
                ИначеЕсли Символ = "м" Тогда
                    Минута = Число(ЧастиСтроки[Счетчик - 1].Подстрока);
                ИначеЕсли Символ = "с" Тогда
                    Секунда = Число(ЧастиСтроки[Счетчик - 1].Подстрока);
                ИначеЕсли Символ = "Ф" Тогда
                    Год = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 1, 4));
                    Месяц = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 5, 2));
                    День = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 7, 2));
                ИначеЕсли Символ = "К" Тогда
                    Год = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 1, 4));
                    Месяц = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 5, 2));
                    День = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 7, 2));
                    Час = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 9, 2));
                    Минута = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 11, 2));
                    Секунда = Число(Сред(ЧастиСтроки[Счетчик - 1].Подстрока, 13, 2));
                КонецЕсли;
                
            КонецЦикла;
            
            Если Год = 0 Тогда
                Год = Год(ТекущаяДата());
            КонецЕсли;
            
            Результат =  Дата(Год, Месяц, День, Час, Минута, Секунда);
            
            Прервать;
            
        КонецЕсли;
        
    КонецЦикла;
    
    #КонецОбласти
    
    #Область ВызовИсключения
    // Если нужно разрешить возвращать неопределено, область можно удалить.    
    Если Результат = Неопределено Тогда
        ВызватьИсключение "Не найден Формат даты";
    КонецЕсли;
    #КонецОбласти
    
    Возврат Результат;
    
КонецФункции
10 Гуслица
 
19.05.17
18:04
(7) Ха ха по ходу внучка петросяна или дочька Галустяна
11 X Leshiy
 
19.05.17
18:05
(10) А нам смешно :)
12 Гуслица
 
19.05.17
18:05
(9) Уххх мощно
надеялся на что то попроще
13 Гуслица
 
19.05.17
18:05
(11) Я этому рад
14 X Leshiy
 
19.05.17
18:07
(13) Ну отрежь год, а месяц тупо сравни.

Делов на 10 минут.
15 Letum
 
19.05.17
18:08
(12) Что может быть проще - скопипастил и юзаешь.
16 Неверный Параметр И
 
19.05.17
18:12
(12) Пока Не ВвестиДату(Переменная, "Введите дату для " + ДатаСтрокой) Цикл КонецЦикла;
17 Ц_У
 
19.05.17
18:15
(7) слишком толсто получилось?
18 Гуслица
 
19.05.17
18:19
Всем спасибо!
Перебрал.

и тебе Ц_У
зы ' поменяй род занятий с программиста на юмориста
19 kiruha
 
19.05.17
18:19
(9) Можно проще через обратное преобразование Формат
20 Ц_У
 
19.05.17
18:20
(18)
а тебе, Гуслица тогда посоветовать "вон из профессии!" ?
21 Гуслица
 
19.05.17
18:21
(19) если знаешь такую функцию - поделись
22 Гуслица
 
19.05.17
18:22
(20) это с какого ТЫ МНЕ ТОГДА советуешь это?
23 Неверный Параметр И
 
19.05.17
18:23
(22) У вас в Коптево все такие тугие?
24 kiruha
 
19.05.17
18:23
(21)
Делаешь формат для разных вариантов, результат в соответствие
25 Гуслица
 
19.05.17
18:25
(23) Не знаю как у вас в Коптево, но у нас все замечтательно
26 Ц_У
 
19.05.17
18:25
(22) я еще советую на прием к психиатору сходить и сдать анализы на бешенство
27 Гуслица
 
19.05.17
18:26
(26) Это потому что ты меня укусил?)
собака)
28 Ц_У
 
19.05.17
18:27
(27) как пройдет пубертатный период сможем общаться, а сейчас - вон из профессии!
29 kiruha
 
19.05.17
18:29
Для НомерМесяца=1 По 12 Цикл
Для Каждого ВидФормата из ВидыФорматов
   МесяцыСтрокой.Вставить(НомерМесяца,Формат(ДатаИзМесяца(НомерМесяца),ВидФормата));
КонецЦикла
КонецЦикла;
30 kiruha
 
19.05.17
18:30
короче и универсальнее
31 kiruha
 
19.05.17
18:31
только ошибка :

Для НомерМесяца=1 По 12 Цикл
Для Каждого ВидФормата из ВидыФорматов
   МесяцыСтрокой.Вставить(Формат(ДатаИзМесяца(НомерМесяца),ВидФормата),НомерМесяца);
КонецЦикла
КонецЦикла;
32 Гуслица
 
19.05.17
18:33
(28) долго искал это слово? ""пубертатный период""
)))
33 Гуслица
 
19.05.17
18:35
(31) Спасибо,
но я уже сделал так:
Функция РазложитьДату(Период)

                Мес = "";
                Год = "";
                М=0;
                Мес = НРег(Лев(Период));
                Год = Прав(Период);
                
                Если Мес = "янв" Тогда
                               М = 1;
                ИначеЕсли Мес = "фев" Тогда
                               М = 2;
                ИначеЕсли Мес = "мар" Тогда
                               М = 3;
                ИначеЕсли Мес = "апр" Тогда
                               М = 4;
                ИначеЕсли Мес = "май" Тогда
                               М = 5;
                ИначеЕсли Мес = "июн" Тогда
                               М = 6;
                ИначеЕсли Мес = "июл" Тогда
                               М = 7;
                ИначеЕсли Мес = "авг" Тогда
                               М = 8;
                ИначеЕсли Мес = "сен" Тогда
                               М = 9;
                ИначеЕсли Мес = "окт" Тогда
                               М = 10;
                ИначеЕсли Мес = "ноя" Тогда
                               М = 11;
                ИначеЕсли Мес = "дек" Тогда
                               М = 12;
                КонецЕсли;
                Возврат Дата(Год,М,1);
КонецФункции
34 Ц_У
 
19.05.17
18:36
(32) к счастью, мое образование позволяет использовать больший словарный запас, чем "собака", а вот ты видимо искал определение, прежде чем ответить. За сим разрешите откланяться.
35 eryomin
 
19.05.17
18:36
Функция ВернутьДату(МесяцГод)
    мДата = НачалоГода(ТекущаяДата());
    мСписок = Новый Структура;
    Для ш = 1 По 12 Цикл
        мСписок.Вставить(Формат(Текдата,"ДФ=ММММ"), ш);
        Текдата = ДобавитьМесяц(Текдата, 1);
    КонецЦикла;
    Стр = СокрЛП(МесяцГод);
    Стр = СтрЗаменить(Стр, " ",Символы.ПС);
    Месяц = мСписок[СтрПолучитьСтроку(Стр,1)];
    Год = Число(СтрПолучитьСтроку(СтрЧислоСтрок(Стр)));
    Возврат Дата(Год,Месяц,1);
КонецФункции // ВернутьДату()
36 Гуслица
 
19.05.17
18:36
(34) Собака - друг человека.
Так что я тебе комплимент сделал)
37 kiruha
 
19.05.17
18:38
(35)
+1
только можно еще много других форматов добавлять
38 Гуслица
 
19.05.17
18:40
(35)
Спасибо, грамотно
39 eryomin
 
19.05.17
18:40
ТекДата = мДата
40 Гуслица
 
19.05.17
18:41
(39) - понял
41 Letum
 
19.05.17
18:42
(19) "21 ноября 2017г.", "июнь.17", "2017.06.12" и т.д. задолбаешься все возможные варианты прописывать.
42 Letum
 
19.05.17
18:46
В принципе, от задачи зависит необходимая мощность решения.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn