Стандарт ISO 8601, составлен таким образом, что:
Строка даты-времени сплошная без пробельных разделителей Латинские символы используются в качестве разделителей /идентификаторов: D - дни, Y - годы, Z - идентификатор UTC и т.д., например можно задать промежуток времени: P4Y3M2D1H - 4 года, 3 месяца, 2 дня и 1 час. Буква T выбрана в качестве уникального разделителя времени, остальные буквы латинского алфавита (почти все) задействованы под разные цели и они не пересекаются. Соответственно упрощается парсинг ISO-8601 строки: имеется заранее известный набор флагов/символов/маркеров, опираясь на которые, можно достаточно быстро разбить строку на нужные составляющие и при этом сохраняется требование к human readability самой строки.
Конвертация даты из формата ISO8601 в дату 1С:
Код 1C v 8.3
Дата1 С = XMLЗначение( Тип( "Дата" ) , "2023-07-24T15:35:34+03:00" ) ;
Функция КонвертироватьДатуISO8601ВДату(Дата) Экспорт
КонвертированнаяДата = Новый Структура( "Дата, Миллисекунды" ) ;
АвтоконвертированнаяДата = XMLЗначение( Тип( "Дата" ) , Дата) ;
Миллисекунды = Сред( Дата, 21 ) ;
Миллисекунды = СокрЛП( СтрЗаменить( Миллисекунды, "Z" , "" ) ) ;
Если НЕ ПустаяСтрока( Миллисекунды) Тогда
ЧислоМиллисекунд = Число( Миллисекунды) ;
Если ЧислоМиллисекунд > = 500 Тогда
АвтоконвертированнаяДата = АвтоконвертированнаяДата - 1 ;
КонецЕсли ;
КонецЕсли ;
КонвертированнаяДата. Дата = АвтоконвертированнаяДата;
КонвертированнаяДата. Миллисекунды = Миллисекунды;
Возврат КонвертированнаяДата;
КонецФункци
Код 1C v 8.2 УП &НаСервере
Функция ПреобразоватьТекстВТЗ(Текст,Разделитель,ЕстьЗакрывающийСимвол)
ТаблицаЗначений = Новый ТаблицаЗначений;
МаксимальноеКвоРазделителей = 0 ;
Для НомерСтроки= 1 по Текст. КоличествоСтрок( ) Цикл
Стр = Текст. ПолучитьСтроку( НомерСтроки) ;
КвоРазделителей = СтрЧислоВхождений( Стр, Разделитель) ;
Если КвоРазделителей > МаксимальноеКвоРазделителей Тогда
МаксимальноеКвоРазделителей = КвоРазделителей;
КонецЕсли ;
КонецЦикла ;
КвоКолонок = ? ( ЕстьЗакрывающийСимвол = Истина , МаксимальноеКвоРазделителей, МаксимальноеКвоРазделителей+ 1 ) ;
Ном = 0 ;
Пока Ном < КвоКолонок Цикл
Ном = Ном+ 1 ;
ИмяКолонки = "Колонка" + Ном;
ТаблицаЗначений. Колонки. Добавить( ИмяКолонки) ;
КонецЦикла ;
Для НомерСтроки= 1 по Текст. КоличествоСтрок( ) Цикл
Стр = Текст. ПолучитьСтроку( НомерСтроки) ;
НоваяСтрока = ТаблицаЗначений. Добавить( ) ;
Ном = 0 ;
Пока Найти( Стр, Разделитель) > 0 Цикл
Ном = Ном+ 1 ;
ПозицияРазделителя = Найти( Стр, Разделитель) ;
ТекЗначение = ЛЕВ( Стр, ПозицияРазделителя - 1 ) ;
Стр = Прав( Стр, СтрДлина( Стр) - ПозицияРазделителя) ;
ИмяКолонки = "Колонка" + Ном;
НоваяСтрока[ИмяКолонки] = ТекЗначение;
КонецЦикла ;
Если ЕстьЗакрывающийСимвол = Ложь Тогда
ИмяКолонки = "Колонка" + ( Ном+ 1 ) ;
НоваяСтрока[ИмяКолонки] = Стр;
КонецЕсли ;
КонецЦикла ;
Возврат ТаблицаЗначений;
КонецФункции
Код 1C v 8.2 УП &НаСервере
Функция ПреобразоватьТекстВТЗ(Текст,Разделитель,ЕстьЗакрывающийСимвол)
ТаблицаЗначений = Новый ТаблицаЗначений;
МаксимальноеКвоРазделителей = 0 ;
Для НомерСтроки= 1 по Текст. КоличествоСтрок( ) Цикл
Стр = Текст. ПолучитьСтроку( НомерСтроки) ;
КвоРазделителей = СтрЧислоВхождений( Стр, Разделитель) ;
Если КвоРазделителей > МаксимальноеКвоРазделителей Тогда
МаксимальноеКвоРазделителей = КвоРазделителей;
КонецЕсли ;
КонецЦикла ;
КвоКолонок = ? ( ЕстьЗакрывающийСимвол = Истина , МаксимальноеКвоРазделителей, МаксимальноеКвоРазделителей+ 1 ) ;
Ном = 0 ;
Пока Ном < КвоКолонок Цикл
Ном = Ном+ 1 ;
ИмяКолонки = "Колонка" + Ном;
ТаблицаЗначений. Колонки. Добавить( ИмяКолонки) ;
КонецЦикла ;
Для НомерСтроки= 1 по Текст. КоличествоСтрок( ) Цикл
Стр = Текст. ПолучитьСтроку( НомерСтроки) ;
НоваяСтрока = ТаблицаЗначений. Добавить( ) ;
Ном = 0 ;
Пока Найти( Стр, Разделитель) > 0 Цикл
Ном = Ном+ 1 ;
ПозицияРазделителя = Найти( Стр, Разделитель) ;
ТекЗначение = ЛЕВ( Стр, ПозицияРазделителя - 1 ) ;
Стр = Прав( Стр, СтрДлина( Стр) - ПозицияРазделителя) ;
ИмяКолонки = "Колонка" + Ном;
НоваяСтрока[ИмяКолонки] = ТекЗначение;
КонецЦикла ;
Если ЕстьЗакрывающийСимвол = Ложь Тогда
ИмяКолонки = "Колонка" + ( Ном+ 1 ) ;
НоваяСтрока[ИмяКолонки] = Стр;
КонецЕсли ;
КонецЦикла ;
Возврат ТаблицаЗначений;
КонецФункции
Код 1C v 8.х Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ДатаНач));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(ДатаКон));
Запрос.УстановитьПараметр("Организация",Организация);
Запрос.Текст = "ВЫБРАТЬ
| ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
| ПоступлениеТоваровУслугТовары.Количество КАК Количество,
| ПоступлениеТоваровУслугТовары.Цена КАК Цена,
| ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК Номер,
| ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
| ПоступлениеТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
| ПоступлениеТоваровУслугТовары.Номенклатура.Код КАК НоменклатураКод,
| ПоступлениеТоваровУслугТовары.Номенклатура.Артикул КАК НоменклатураАртикул
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
| ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И ПоступлениеТоваровУслугТовары.Ссылка.Организация = &Организация
|
|УПОРЯДОЧИТЬ ПО
| Контрагент,
| Номер,
| Дата,
| НоменклатураКод,
| Номенклатура,
| НоменклатураАртикул,
| Количество,
| Цена";
Результат = Запрос.Выполнить().Выбрать();
Текст = Новый ЗаписьТекста("c:\vigruz.txt", КодировкаТекста.ANSI);
РезультатДок = Запрос.Выполнить().Выбрать();
Пока РезультатДок.Следующий() Цикл
ОбработкаПрерыванияПользователя();
// В качестве разделителей необходимо использовать Символы. ВК (CR),ВТаб (VTab),НПП (NBSp),ПС (LF),ПФ (FF),Таб (Tab)
//Если нам нужна строка вида " helpf.pro 07.08.2009 13 " в качестве разделителя используется табуляция
//то пишем так:
Текст.ЗаписатьСтроку(Строка(РезультатДок.Контрагент)+Символы.Таб+Строка(Формат((РезультатДок.Дата),"ДЛФ=D"))+Символы.Таб+Строка(РезультатДок.Номер));
// При загрузке строку можно будет разложить в массив для дальнейшей работы, РазложитьСтрокуВМассивПодстрок( ТекСтр, Символы.Таб). Ссылка на функцию ниже
//Если нужен вид
// helpf.pro
// 07.08.2009
// 13
// здесь в качестве разделителя используется перевод каретки (следующая строка), то пишем
Текст.ЗаписатьСтроку(РезультатДок.Контрагент);
Текст.ЗаписатьСтроку(Символы.ПС);
Текст.ЗаписатьСтроку(Формат((РезультатДок.Дата),"ДЛФ=D"));
Текст.ЗаписатьСтроку(Символы.ПС);
Текст.ЗаписатьСтроку(РезультатДок.Номер);
КонецЦикла;
Текст.Закрыть();
При загрузке для разбора строки используйте:
Функция разбирает строку на подстроки, используя заданный разделитель и возвращает массив
Еще посмотрите пример:
Загрузка данных из Текстового файла Код 1C v 8.х
Функция СтрЧислоБезРазделителей(Чсл) Экспорт
Результат= Формат( Чсл, "ЧГ=0" ) ;
Возврат Результат;
КонецФункции
Дополнительно:
Важно понимать, что здесь используется не символ пробела, а так называемый, «неразрывный пробел», поэтому такая, к примеру, конструкция:
Код 1C v 8.х СтрЗаменить( ПеременнаяЧисло, " " , "" ) ;
работать не будет.
Есть два варианта решения проблемы:
либо указать для замены вместо пробела
Символы.НПП
Код 1C v 8.х СтрЗаменить( ПеременнаяЧисло, Символы. НПП, "" ) ;
либо используя функцию
Формат() .
Код 1C v 8.х Формат( ПеременнаяЧисло, "ЧГ=" ) ;
Значения данного типа содержит дату григорианского календаря (с 01 января 0001 года) и время с точностью до секунды.
Литералы:
Строка цифр, заключенная в одинарные кавычки вида: 'ГГГГММДДччммсс', где:
ГГГГ - четыре цифры года (включая тысячелетие и век);
ММ - две цифры месяца:
ДД - две цифры даты;
чч - две цифры часа (в 24-х часовом формате);
мм - две цифры минут;
сс - две цифры секунд;
Код 1C v 8.х '20050308 '
Дата( 2005 , 1 , 1 )
Дата( 1 , 1 , 1 )
Дата( 2005 , 1 , 1 , 10 , 29 , 50 )
ДАТАВРЕМЯ( 2005 , 01 , 01 )
В литерале типа Дата обязательно должно задаваться значение года, месяца и дня. Для задания даты соответствующей началу отсчета достаточно указать
'00010101' .
Допускается при указании литералов типа Дата опускать последние символы (секунды, минуты, часы и т.д.). Это означает, что данные параметры будут равны нулю (для времени) или единице (для даты).
В литерале даты допускается использование различных разделителей :
Код 1C v 8.х Сообщить( '20040814093941 ') ;
Сообщить( '2004 - 08 - 14 09 : 39 : 41 ') ;
Код 1C v 8.х
СтрокаДата = Формат( ТекущаяДата( ) , "ггггММддЧЧммсс" ) ;
ТекДата = Дата( СтрокаДата) ;
В языке ЗАПРОСов значения типа Дата задаются с помощью ключевого слова ДАТАВРЕМЯ, после которого в скобках последовательно указываются год, месяц, день, час, минута и секунда. Последние три указывать не обязательно:
Код 1C v 8.х ДАТАВРЕМЯ( 2003 , 10 , 12 , 10 , 15 , 34 )
ДАТАВРЕМЯ( 2003 , 10 , 12 )
Код 1C v 7.x ДатаНачала = '01.01 . 2009 ';
Если РабочаяДата( ) > '31.12 . 2009 ' Тогда
КонецЕсли ;