Как преобразовать строку, например, "23.07.2018" в дату? Делаю так:

```1c
    ДокДата = СтрЗаменить("23.07.2018",".",");
    ДокДата = Дата(ДокДата);
```

Но ругается, не преобразовывает. Насколько я знаю, преобразовать модно строку следующего вида "2018.07.23" только потому что, что порядок - Год, месяц, День.
Перебивать даты в экселе под такой порядок - нереально. Слишком много строк. Как решить проблему?? В экселе колонка имеет тип "Текстовый"
---
```1c
    Функция НарытьДату(ДатаСтр, Ошибка)
    ДатаСтр=СокрЛП(ДатаСтр);
    Если СтрДлина(ДатаСтр)>10 тогда
    // Значит там дата со временем, или какая то шляпа, отсекаем все кроме первых 10 символов
    ДатаСтр = Лев(ДатаСтр,10);
    КонецЕсли;
    //ДатаВходящий = СтрЗаменить(ДатаВходящий,Прав(ДатаВходящий, 8),");
    Попытка
    ИскомаяДата = Дата(Прав(ДатаСтр, 4), Сред(ДатаСтр, 4, 2), Сред(ДатаСтр, 1, 2));
    Возврат ИскомаяДата;
    Исключение
    Ошибка = Истина;
    Возврат Ложь;
    КонецПопытки

    КонецФункции
```
---
да. Только он далеко не во всех конфигурациях есть. Я его не нашел в УНФ 1.5, не нашел в УТ - (под рукой которые).
Но зато есть в ERP
для истории вот полный код функции (т.к. сделано еще по другому, чем мы выше обсудили)

```1c
    // Преобразует исходную строку в дату.
    //
    // Параметры:
    // Значение - Строка - Строка, которую необходимо привести к дате.
    // Формат даты должен быть в виде "ДД.ММ.ГГГГ" или "ДД/ММ/ГГ",
    // Например, "23.02.1980" или "23/02/80".
    //
    // Возвращаемое значение:
    // Дата - полученная дата.
    //
    Функция СтрокаВДату(Знач Значение) Экспорт

    ПозицияПробела = СтрНайти(Значение, " ", НаправлениеПоиска.СНачала);
    Если ПозицияПробела > 0 Тогда
    Значение = Лев(Значение, ПозицияПробела - 1);
    КонецЕсли;
    Значение = СтрЗаменить(Значение, " ", ");
    Значение = СокрЛП(СтрЗаменить(Значение, ".", "));
    Значение = СокрЛП(СтрЗаменить(Значение, "/", "));
    Значение = СокрЛП(СтрЗаменить(Значение, "-", "));
    Значение = Сред(Значение, 5) + Сред(Значение, 3, 2) + Лев(Значение, 2);
    Если СтрДлина(Значение) = 6 Тогда
    Год = СтрокаВЧисло(Лев(Значение, 2));
    Значение = ?(Год > 29, "19", "20") + Значение;
    КонецЕсли;

    ОписаниеТипа = Новый ОписаниеТипов("Дата");
    Результат = ОписаниеТипа.ПривестиЗначение(Значение);

    Возврат Результат;

    КонецФункции
```
---
Из синтакс-помощника:
При преобразовании строка должна содержать дату в каноническом формате "ГГГГММДДччммсс"
---
```1c
    Функция ПолучитьДату(СтрокаДаты)
    МассивДаты = СтрРазделить(СтрокаДаты,".");
    Если МассивДаты.Количество() = 3 Тогда//Проверим что получили дату в нужном формате
    НоваяДата = МассивДаты[3]+МассивДаты[2]+МассивДаты[1];
    КонецЕсли;
    Возврат Дата(НоваяДата);
    КонецФункции
```
---
```1c
    Функция НарытьДату(ДатаСтр, Ошибка)
    ДатаСтр=СокрЛП(ДатаСтр);
    Если СтрДлина(ДатаСтр)>10 тогда
    // Значит там дата со временем, или какая то шляпа, отсекаем все кроме первых 10 символов
    ДатаСтр = Лев(ДатаСтр,10);
    КонецЕсли;
    //ДатаВходящий = СтрЗаменить(ДатаВходящий,Прав(ДатаВходящий, 8),");
    Попытка
    ИскомаяДата = Дата(Прав(ДатаСтр, 4), Сред(ДатаСтр, 4, 2), Сред(ДатаСтр, 1, 2));
    Возврат ИскомаяДата;
    Исключение
    Ошибка = Истина;
    Возврат Ложь;
    КонецПопытки

    КонецФункции
```
---
Интереса ради спрошу -
(2) Исключение
        Ошибка = Истина;
        Возврат Ложь;
Почему такая конструкция странная? Почему не используете ОписаниеОшибки() ?
---
я помню что-ли, я этот код писал около 5 лет назад...зачем это надо было, даже не хочу сейчас вспоминать. Да и не важно это.
Важна сама суть, выдирания даты, в контексте некой функции...
---
```1c
    Дата = Дата(Сред(ДатаСтр,7,4)+Сред(ДатаСтр,4,2)+Сред(ДатаСтр,1,2));
```
---
```1c
    Дата("23.07.2018")
```
 работать не будет.

А
```1c
    Дата("23.07.2018 00:00:00")
```
 - будет.
---
Ни та ни другая не будет. См. (3)
---
у меня работает, что я делаю не так?

UPD: Хотя, может от версии зависит. У меня в СП так написано: "Строка должна содержать дату в локальном формате даты или в каноническом виде YYYYMMDDHHMMSS. "
---
Велосипед уже изобретен

```1c
    СтроковыеФункцииКлиентСервер.СтрокаВДату(Значение)
```
---
да. Только он далеко не во всех конфигурациях есть. Я его не нашел в УНФ 1.5, не нашел в УТ - (под рукой которые).
Но зато есть в ERP
для истории вот полный код функции (т.к. сделано еще по другому, чем мы выше обсудили)

```1c
    // Преобразует исходную строку в дату.
    //
    // Параметры:
    // Значение - Строка - Строка, которую необходимо привести к дате.
    // Формат даты должен быть в виде "ДД.ММ.ГГГГ" или "ДД/ММ/ГГ",
    // Например, "23.02.1980" или "23/02/80".
    //
    // Возвращаемое значение:
    // Дата - полученная дата.
    //
    Функция СтрокаВДату(Знач Значение) Экспорт

    ПозицияПробела = СтрНайти(Значение, " ", НаправлениеПоиска.СНачала);
    Если ПозицияПробела > 0 Тогда
    Значение = Лев(Значение, ПозицияПробела - 1);
    КонецЕсли;
    Значение = СтрЗаменить(Значение, " ", ");
    Значение = СокрЛП(СтрЗаменить(Значение, ".", "));
    Значение = СокрЛП(СтрЗаменить(Значение, "/", "));
    Значение = СокрЛП(СтрЗаменить(Значение, "-", "));
    Значение = Сред(Значение, 5) + Сред(Значение, 3, 2) + Лев(Значение, 2);
    Если СтрДлина(Значение) = 6 Тогда
    Год = СтрокаВЧисло(Лев(Значение, 2));
    Значение = ?(Год > 29, "19", "20") + Значение;
    КонецЕсли;

    ОписаниеТипа = Новый ОписаниеТипов("Дата");
    Результат = ОписаниеТипа.ПривестиЗначение(Значение);

    Возврат Результат;

    КонецФункции
```
---
Вот функция используемая в DataCommander 3:

Ест практически любые даты. Например "24Июл." и т.д.

```1c
    Функция ДатаИзСтроки(Строка)

    Результат = Неопределено;

    #Область Определение_Месяцев

    Месяцы = Новый Соответствие;
    Месяцы.Вставить("ЯНВ", "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];
    Если ВРЕГ(ТекущаяПодстрока) = "Г" или ВРЕГ(ТекущаяПодстрока) = "ГОД" или ВРЕГ(ТекущаяПодстрока) = "ГОДА" Тогда
    ПредыдущееОписание.Роли.Очистить();
    ПредыдущееОписание.Роли.Добавить("Г");
    КонецЕсли;
    Если ВРЕГ(ТекущаяПодстрока) = "Ч" ИЛИ ВРЕГ(ТекущаяПодстрока) = "ЧАС" Тогда
    ПредыдущееОписание.Роли.Очистить();
    ПредыдущееОписание.Роли.Добавить("ч");
    КонецЕсли;
    Если ВРЕГ(ТекущаяПодстрока) = "М" ИЛИ ВРЕГ(ТекущаяПодстрока) = "МИН" Тогда
    ПредыдущееОписание.Роли.Очистить();
    ПредыдущееОписание.Роли.Добавить("м");
    КонецЕсли;
    Если ВРЕГ(ТекущаяПодстрока) = "С" ИЛИ ВРЕГ(ТекущаяПодстрока) = "СЕК" Тогда
    ПредыдущееОписание.Роли.Очистить();
    ПредыдущееОписание.Роли.Добавить("c");
    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    ТекущаяПодстрока = ";

    ПредыдущийВидСимвола = ТекущийВидСимвола;

    ТекущийВидСимвола = ВидСимвола;

    КонецЕсли;

    ТекущаяПодстрока = ТекущаяПодстрока + Символ;

    КонецЦикла;

    #КонецОбласти

    #Область Поиск_варианта

    Для Каждого Вариант ИЗ Варианты Цикл

    ВариантСоответствует = Истина;

    Если СтрДлина(Вариант) = ЧастиСтроки.Количество() Тогда
    Для Счетчик = 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 Тогда
    Год = Год(ТекущаяДата());
    КонецЕсли;

    Результат = Дата(Год, Месяц, День, Час, Минута, Секунда);

    Прервать;

    КонецЕсли;

    КонецЦикла;

    #КонецОбласти

    #Область ВызовИсключения
    // Если нужно разрешить возвращать неопределено, область можно удалить.
    Если Результат = Неопределено Тогда
    ВызватьИсключение "Не найден Формат даты";
    КонецЕсли;
    #КонецОбласти

    Возврат Результат;

    КонецФункции
```
---
```1c
    МассивПодстрок = РазложитьСтрокуНаПодстроки (ДатаСтрокой,".");

    День = День(МассивПодстрок [0]);
    Месяц = Месяц(МассивПодстрок [1]);
    Год = Год(МассивПодстрок [2]);
```
---
СтрМассива.date = "2025-01-03"

```1c
    Год = Лев(СтрМассива.date, 4);
    Месяц = Сред(СтрМассива.date, 6,2);
    Число = Прав(СтрМассива.date, 2);
    Дата1С = Дата(Год+Месяц+Число);
```