Синтаксический анализ JSON - выражения средствами 1С 7.7 Код 1C v 7.x
Перем Л_Лев_Фиг_Скобка, Л_Прав_Фиг_Скобка, Л_Лев_Кв_Скобка, Л_Прав_Кв_Скобка, Л_Кавычка, Л_Экран, Л_Двоеточие, Л_Запятая, Л_Число, Л_Строка, Л_Константа, Л_Финиш;
Перем Цифры1 _9, Цифры0 _9, ПервыеСимволыКонстант, ОдносимвольныеЛексемы;
Перем НомЛексемы, ТекЛексема;
Перем JSON_Error;
Перем В_Массив, В_Объект, В_Значение;
Перем НомерСимвола;
Перем ФлагОшибки;
Перем СписокСтроковыхКонстант;
Перем СтекЛексем;
Перем АнализируемаяСтрока;
Перем ТекКаталог, ТекФайл;
Функция ПолучитьОбъект_ТЗ() Далее
Функция ПолучитьМассив_ТЗ() Далее
Функция ТекущиеСимволы(Сколько)
Возврат Сред( АнализируемаяСтрока, НомерСимвола, Сколько) ;
КонецФункции
Функция ПрошлыйСимвол(Сдвиг)
Возврат Сред( АнализируемаяСтрока, НомерСимвола - Сдвиг, 1 ) ;
КонецФункции
Процедура ДобавитьЛексему(Лексема, Значение, Сдвиг)
СтекЛексем. НоваяСтрока( ) ;
СтекЛексем. Лексема = Лексема;
СтекЛексем. Значение = Значение;
НомерСимвола = НомерСимвола + Сдвиг;
КонецПроцедуры
Процедура ОбвестиОбласть(Обл)
Обл. РамкаСнизу( 1 ) ;
Обл. РамкаСверху( 1 ) ;
Обл. РамкаСлева( 1 ) ;
Обл. РамкаСправа( 1 ) ;
КонецПроцедуры
Процедура НапечататьТЗ(Таб, ТЗ, НомС, НомК)
Перем Тип, Обл1 , НС, КС, Ключ, Зн, Обл2 ;
Тип = ТЗ. ПолучитьЗначение( 1 , 1 ) ;
НомС = НомС + 1 ;
Обл1 = Таб. Область( НомС, НомК) ;
ОбвестиОбласть( Обл1 ) ;
Если Тип = В_Значение Тогда
ТипЗн = ТЗ. ПолучитьЗначение( 2 , 1 ) ;
Обл1 . Текст = ТЗ. ПолучитьЗначение( 2 , 2 ) ;
Обл1 . ГоризонтальноеПоложение( 1 ) ;
Если ТипЗн = Л_Число Тогда
Обл1 . ГоризонтальноеПоложение( 2 ) ;
ИначеЕсли ТипЗн = Л_Константа Тогда
Обл1 . Полужирный( 1 ) ;
ИначеЕсли ТипЗн = Л_Строка Тогда
Обл1 . Контроль( 4 ) ;
КонецЕсли ;
Возврат ;
ИначеЕсли ( Тип = В_Объект) Или ( Тип = В_Массив) Тогда
Обл1 . Текст = Тип;
Обл1 . Полужирный( 1 ) ;
Обл1 . ЦветФона( 12648447 ) ;
Обл1 . РамкаСнизу( 5 ) ;
КС = ТЗ. КоличествоСтрок( ) ;
Для НС = 2 По КС Цикл
НомС = НомС + 1 ;
Обл2 = Таб. Область( НомС, НомК) ;
Обл2 . Текст = ТЗ. ПолучитьЗначение( НС, 1 ) ;
Если Тип = В_Массив Тогда
Обл2 . ГоризонтальноеПоложение( 2 ) ;
КонецЕсли ;
ОбвестиОбласть( Обл2 ) ;
НомС = НомС - 1 ;
НапечататьТЗ( Таб, ТЗ. ПолучитьЗначение( НС, 2 ) , НомС, НомК + 1 ) ;
КонецЦикла ;
Иначе
Сообщить( "Фигня " + Тип, "!" ) ;
КонецЕсли ;
КонецПроцедуры
Процедура ВыравнятьТЗ(Таб, ОграничениеШирины)
Перем НомерКол, НомерСтр, МаксШирина, Обл, ТекШирина, ТекДлина;
Для НомерКол = 1 По Таб. ШиринаТаблицы( ) Цикл
МаксШирина = 0 ;
Для НомерСтр = 1 По Таб. ВысотаТаблицы( ) Цикл
Обл = Таб. Область( НомерСтр, НомерКол) ;
ТекШирина = Обл. ШиринаСтолбца( ) ;
ТекДлина = СтрДлина( СокрЛП( Обл. Текст) ) ;
МаксШирина = Макс( МаксШирина, ТекШирина, ТекДлина) ;
КонецЦикла ;
Таб. Область( , НомерКол) . ШиринаСтолбца( Мин( МаксШирина, ОграничениеШирины) ) ;
КонецЦикла ;
КонецПроцедуры
Процедура Напечатать_ТЗ(ТЗ)
Перем Таб, НС, НК, МаксШирина, ТекДлина, Обл;
Таб = СоздатьОбъект( "Таблица" ) ;
МаксНК = 1 ;
НС = 0 ;
НК = 1 ;
НапечататьТЗ( Таб, ТЗ, НС, НК) ;
ВыравнятьТЗ( Таб, 30 ) ;
Таб. Область( 1 , 1 , Таб. ВысотаТаблицы( ) , Таб. ШиринаТаблицы( ) ) . ВертикальноеПоложение( 2 ) ;
Таб. Опции( 0 , 0 ) ;
Таб. Показать( "JSON" ) ;
КонецПроцедуры
Функция Ошибка()
ФлагОшибки = 1 ;
Возврат 0 ;
КонецФункции
Функция ЧитатьКонстанту(ПервСимвол)
Перем КонстантаСтр, ДлинаКонстанты;
КонстантаСтр = СписокСтроковыхКонстант. Получить( ПервСимвол) ;
ДлинаКонстанты = СтрДлина( КонстантаСтр) ;
Если ТекущиеСимволы( ДлинаКонстанты) = КонстантаСтр Тогда
ДобавитьЛексему( Л_Константа, КонстантаСтр, ДлинаКонстанты) ;
Возврат 1 ;
Иначе
Возврат Ошибка( ) ;
КонецЕсли ;
КонецФункции
Процедура ДописатьСимвол(Стр)
Стр = Стр + ТекущиеСимволы( 1 ) ;
НомерСимвола = НомерСимвола + 1 ;
КонецПроцедуры
Функция ЧитатьЧисло()
Перем ЧислоСтр;
ЧислоСтр = "" ;
Если ТекущиеСимволы( 1 ) = "-" Тогда
ДописатьСимвол( ЧислоСтр) ;
КонецЕсли ;
Если Найти( Цифры1 _9, ТекущиеСимволы( 1 ) ) > 0 Тогда
ДописатьСимвол( ЧислоСтр) ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
ИначеЕсли ТекущиеСимволы( 1 ) = "0" Тогда
ДописатьСимвол( ЧислоСтр) ;
Иначе
Возврат Ошибка( ) ;
КонецЕсли ;
Если ТекущиеСимволы( 1 ) = "." Тогда
ДописатьСимвол( ЧислоСтр) ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
КонецЕсли ;
Если ВРег( ТекущиеСимволы( 1 ) ) = "E" Тогда
ДописатьСимвол( ЧислоСтр) ;
Если Найти( "+-" , ТекущиеСимволы( 1 ) ) > 0 Тогда
ДописатьСимвол( ЧислоСтр) ;
КонецЕсли ;
Пока Найти( Цифры0 _9, ТекущиеСимволы( 1 ) ) > 0 Цикл
ДописатьСимвол( ЧислоСтр) ;
КонецЦикла ;
КонецЕсли ;
ДобавитьЛексему( Л_Число, ЧислоСтр, 0 ) ;
Возврат 1 ;
КонецФункции
Функция ЧитатьСтроку()
Перем СтрокаСтр;
СтрокаСтр = "" ;
НомерСимвола = НомерСимвола + 1 ;
Пока ( ТекущиеСимволы( 1 ) < > Л_Кавычка) Или ( ( ТекущиеСимволы( 1 ) = Л_Кавычка) И ( ПрошлыйСимвол( 1 ) = Л_Экран) И ( ПрошлыйСимвол( 2 ) < > Л_Экран) ) Цикл
ДописатьСимвол( СтрокаСтр) ;
КонецЦикла ;
ДобавитьЛексему( Л_Строка, СтрокаСтр, 1 ) ;
Возврат 1 ;
КонецФункции
Функция ПрочитатьФайл(ИмяФайла)
Перем Т, НомерСтрокиФайла, СтрокаРез;
Т = СоздатьОбъект( "Текст" ) ;
Т. Открыть( ИмяФайла) ;
СтрокаРез = "" ;
Для НомерСтрокиФайла = 1 По Т. КоличествоСтрок( ) Цикл
СтрокаРез = СтрокаРез + Т. ПолучитьСтроку( НомерСтрокиФайла) ;
КонецЦикла ;
Возврат СтрокаРез;
КонецФункции
Функция СледующаяЛексема()
НомЛексемы = НомЛексемы + 1 ;
СтекЛексем. ПолучитьСтрокуПоНомеру( НомЛексемы) ;
ТекЛексема = СтекЛексем. Лексема;
Возврат 1 ;
КонецФункции
Функция ОшибкаЛексемы()
Перем РезСтр, НомСтр, ТЛ, ТС;
Сообщить( "Ошибочная лексема № " + НомЛексемы + " : <" + ТекЛексема + ">" , "!" ) ;
РезСтр = "" ;
Для НомСтр = НомЛексемы + 1 По СтекЛексем. КоличествоСтрок( ) Цикл
СтекЛексем. ПолучитьСтрокуПоНомеру( НомСтр) ;
ТЛ = СтекЛексем. Лексема;
Если ТЛ = Л_Строка Тогда
ТС = "<" + ТЛ + "(" + СтекЛексем. Значение + ")>" ;
ИначеЕсли ТЛ = Л_Константа Тогда
ТС = "<" + ТЛ + "(" + СтекЛексем. Значение + ")>" ;
Иначе
ТС = "<" + ТЛ + ">" ;
КонецЕсли ;
РезСтр = РезСтр + ТС + "," ;
КонецЦикла ;
Сообщить( Лев( РезСтр, 400 ) , "!" ) ;
Возврат 0 ;
КонецФункции
Процедура ДобавитьПару(ТЗ, Ключ, Значение)
ТЗ. НоваяСтрока( ) ;
ТЗ. Ключ = Ключ;
ТЗ. Значение = Значение;
КонецПроцедуры
Функция НоваяТЗ(Тип)
Перем _ТЗ;
_ТЗ = СоздатьОбъект( "ТаблицаЗначений" ) ;
_ТЗ. НоваяКолонка( "Ключ" ) ;
_ТЗ. НоваяКолонка( "Значение" ) ;
ДобавитьПару( _ТЗ, Тип, "" ) ;
Возврат _ТЗ;
КонецФункции
Функция ПолучитьПроизвольноеЗначение_ТЗ()
Перем ТЗ;
Если ( ТекЛексема = Л_Строка) Или ( ТекЛексема = Л_Число) Или ( ТекЛексема = Л_Константа) Тогда
ТЗ = НоваяТЗ( В_Значение) ;
ДобавитьПару( ТЗ, ТекЛексема, СтекЛексем. Значение) ;
СледующаяЛексема( ) ;
Возврат ТЗ;
ИначеЕсли ТекЛексема = Л_Лев_Фиг_Скобка Тогда
Возврат ПолучитьОбъект_ТЗ( ) ;
ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда
Возврат ПолучитьМассив_ТЗ( ) ;
КонецЕсли ;
Возврат ОшибкаЛексемы( ) ;
КонецФункции
Функция ДобавитьКлючЗначение(ТЗ)
Перем НовКлюч, НовЗначение;
Если ТекЛексема < > Л_Строка Тогда
Возврат 0 ;
КонецЕсли ;
НовКлюч = СтекЛексем. Значение;
СледующаяЛексема( ) ;
Если ТекЛексема < > Л_Двоеточие Тогда
Возврат ОшибкаЛексемы( ) ;
КонецЕсли ;
СледующаяЛексема( ) ;
НовЗначение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если НовЗначение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
ДобавитьПару( ТЗ, НовКлюч, НовЗначение) ;
Возврат 1 ;
КонецФункции
Функция ПолучитьОбъект_ТЗ()
Перем ТЗ;
ТЗ = НоваяТЗ( В_Объект) ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Если ДобавитьКлючЗначение( ТЗ) = 0 Тогда
Возврат 0 ;
КонецЕсли ;
Пока ТекЛексема = Л_Запятая Цикл
СледующаяЛексема( ) ;
Если ДобавитьКлючЗначение( ТЗ) = 0 Тогда
Возврат 0 ;
КонецЕсли ;
КонецЦикла ;
Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Возврат 0 ;
КонецФункции
Функция ПолучитьМассив_ТЗ()
Перем ТЗ, _Ключ, _Значение;
ТЗ = НоваяТЗ( В_Массив) ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
_Значение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если _Значение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
_Ключ = 0 ;
ДобавитьПару( ТЗ, _Ключ, _Значение) ;
Пока ТекЛексема = Л_Запятая Цикл
СледующаяЛексема( ) ;
_Значение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если _Значение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
_Ключ = _Ключ + 1 ;
ДобавитьПару( ТЗ, _Ключ, _Значение) ;
КонецЦикла ;
Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Возврат 0 ;
КонецФункции
Функция ПрочитатьОбъект_ТЗ()
Перем Рез;
НомЛексемы = 0 ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Лев_Фиг_Скобка Тогда
Рез = ПолучитьОбъект_ТЗ( ) ;
ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда
Рез = ПолучитьМассив_ТЗ( ) ;
Иначе
Рез = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
КонецЕсли ;
Если ( Рез = 0 ) Или ( ТекЛексема < > Л_Финиш) Тогда
ОшибкаЛексемы( ) ;
Возврат 0 ;
КонецЕсли ;
Возврат Рез;
КонецФункции
Функция СгенерироватьТЗ(НачАнализируемаяСтрока)
Перем НачальныйСимвол, Рез;
АнализируемаяСтрока = НачАнализируемаяСтрока;
СтекЛексем = СоздатьОбъект( "ТаблицаЗначений" ) ;
СтекЛексем. НоваяКолонка( "Лексема" , "Строка" ) ;
СтекЛексем. НоваяКолонка( "Значение" , "Строка" ) ;
ФлагОшибки = 0 ;
НомерСимвола = 1 ;
Пока НомерСимвола < = СтрДлина( АнализируемаяСтрока) Цикл
НачальныйСимвол = ТекущиеСимволы( 1 ) ;
Если Найти( " " + Симв( 9 ) , НачальныйСимвол) > 0 Тогда
НомерСимвола = НомерСимвола + 1 ;
ИначеЕсли НачальныйСимвол = Л_Кавычка Тогда
ЧитатьСтроку( ) ;
ИначеЕсли Найти( ОдносимвольныеЛексемы, НачальныйСимвол) > 0 Тогда
ДобавитьЛексему( НачальныйСимвол, "" , 1 ) ;
ИначеЕсли Найти( ПервыеСимволыКонстант, НачальныйСимвол) > 0 Тогда
Если ЧитатьКонстанту( НачальныйСимвол) = 0 Тогда
Прервать;
КонецЕсли ;
ИначеЕсли Найти( "-" + Цифры0 _9, НачальныйСимвол) > 0 Тогда
Если ЧитатьЧисло( ) = 0 Тогда
Прервать;
КонецЕсли ;
Иначе
Сообщить( "========= " + НомерСимвола, "!" ) ;
Сообщить( НачальныйСимвол, "!" ) ;
Сообщить( "<" + НачальныйСимвол + "> " + КодСимв( НачальныйСимвол) , "!" ) ;
Сообщить( ТекущиеСимволы( 100 ) , "!" ) ;
Возврат 0 ;
КонецЕсли ;
КонецЦикла ;
Если ФлагОшибки < > 0 Тогда
Сообщить( "Ошибка парсинга JSON - выражения" , "!" ) ;
Возврат 0 ;
ИначеЕсли СтекЛексем. КоличествоСтрок( ) = 0 Тогда
Сообщить( "Пустой стек" , "!" ) ;
Возврат 0 ;
КонецЕсли ;
ДобавитьЛексему( Л_Финиш, "" , 0 ) ;
Возврат ПрочитатьОбъект_ТЗ( ) ;
КонецФункции
Функция JSON_Error(Стр = "" )
Если Стр < > "" Тогда
Сообщить( "JSON-ОШИБКА: " + Стр, "!" ) ;
КонецЕсли ;
Возврат JSON_Error;
КонецФункции
Функция JSON_Type(Парам)
Если ТипЗначенияСтр( Парам) < > "ТаблицаЗначений" Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Парам. КоличествоКолонок( ) < > 2 Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Парам. КоличествоСтрок( ) < 2 Тогда
Возврат JSON_Error( ) ;
КонецЕсли ;
Возврат Парам. ПолучитьЗначение( 1 , 1 ) ;
КонецФункции
Функция JSON_GetValue(Парам, Keys)
Перем Тип, До, После, ПозЗакр, Л1 , П2 , Инд, ИндСтр, НС, КвоСтрок;
Тип = JSON_Type( Парам) ;
ПозЗакр = Найти( Keys, "]" ) ;
Если ПозЗакр = 0 Тогда
ПозЗакр = СтрДлина( Keys) + 1 ;
КонецЕсли ;
До = Лев( Keys, ПозЗакр) ;
После = Сред( Keys, ПозЗакр + 1 ) ;
Л1 = Лев( До, 1 ) ;
П2 = Найти( До, "]" ) ;
Если Тип = JSON_Error Тогда
Возврат JSON_Error( "Параметра" ) ;
КонецЕсли ;
КвоСтрок = Парам. КоличествоСтрок( ) ;
Если До = "" Тогда
Если ( Тип = В_Массив) Или ( Тип = В_Объект) Тогда
Возврат JSON_Error( ) ;
ИначеЕсли Тип = В_Значение Тогда
Возврат Парам. ПолучитьЗначение( 2 , 2 ) ;
Иначе
Возврат JSON_Error( "№ 1" ) ;
КонецЕсли ;
ИначеЕсли До = ".length" Тогда
Если ( Тип = В_Массив) Или ( Тип = В_Объект) Тогда
Возврат Парам. КоличествоСтрок( ) - 1 ;
Иначе
Возврат JSON_Error( "Длина скаляра" ) ;
КонецЕсли ;
ИначеЕсли Л1 = "[" Тогда
Если П2 = 0 Тогда
Возврат JSON_Error( "Индексация: <" + До + ">" ) ;
КонецЕсли ;
Инд = Сред( До, 2 , П2 - 2 ) ;
Если ( Найти( "'"" " , Лев( Инд, 1 ) ) > 0 ) И ( Найти( "'"" " , Прав( Инд, 1 ) ) > 0 ) Тогда
ИндСтр = Сред( Инд, 2 , СтрДлина( Инд) - 2 ) ;
Если Тип < > В_Объект Тогда
Возврат JSON_Error( "Строковый индекс <" + ИндСтр + "> только для Объекта" ) ;
КонецЕсли ;
НС = 0 ;
Если Парам. НайтиЗначение( ИндСтр, НС, 1 ) = 1 Тогда
Возврат JSON_GetValue( Парам. ПолучитьЗначение( НС, 2 ) , После) ;
КонецЕсли ;
Возврат JSON_Error( "Нет индекса <" + ИндСтр + ">" ) ;
КонецЕсли ;
ИндЧис = 0 + Инд;
Если "" + ИндЧис < > Инд Тогда
Возврат JSON_Error( "Ошибка 1 числового индекса <" + Инд + ">" ) ;
ИначеЕсли Цел( ИндЧис) < > ИндЧис Тогда
Возврат JSON_Error( "Ошибка 2 числового индекса <" + Инд + "> (нецелый)" ) ;
ИначеЕсли ИндЧис < 0 Тогда
Возврат JSON_Error( "Ошибка 3 числового индекса <" + Инд + "> (отрицательный)" ) ;
ИначеЕсли ИндЧис > ( КвоСтрок - 2 ) Тогда
Возврат JSON_Error( "Ошибка 4 числового индекса <" + Инд + "> (" + ИндЧис + ">" + ( КвоСтрок - 2 ) + ")" ) ;
КонецЕсли ;
Возврат JSON_GetValue( Парам. ПолучитьЗначение( ИндЧис + 1 , 2 ) , После) ;
Иначе
Возврат JSON_Error( "Ошибка 5 <" + До + ">" ) ;
КонецЕсли ;
КонецФункции
Процедура ПриОткрытии()
Перем Рез1 , ТипУзла1 , Зн1 , Значение;
ОчиститьОкноСообщений( ) ;
СтатусВозврата( 0 ) ;
Рез1 = СгенерироватьТЗ( ПрочитатьФайл( ТекКаталог + "j1.json" ) ) ;
Напечатать_ТЗ( Рез1 ) ;
ТипУзла1 = JSON_Type( Рез1 ) ;
Сообщить( "Тип узла: " + ТипУзла1 ) ;
Зн1 = JSON_GetValue( Рез1 , ".length" ) ; Сообщить( "1) Размер: " + Зн1 ) ;
Зн3 = JSON_GetValue( Рез1 , "['1']" ) ; Сообщить( "3) ['1']: <" + Зн3 + ">" ) ;
Зн4 = JSON_GetValue( Рез1 , "[1]" ) ; Сообщить( "4) [1]: <" + Зн4 + ">" ) ;
Зн5 = JSON_GetValue( Рез1 , "['Массив'][6]" ) ; Сообщить( "5) [*]: <" + Зн5 + ">" ) ;
Зн6 = JSON_GetValue( Рез1 , "['Соответствие']['ДопустимоеИмяСвойства']" ) ; Сообщить( "6) [*]: <" + Зн6 + ">" ) ;
КонецПроцедуры
Процедура ДобавитьСтроковуюКонстанту(КонстантаСтр)
Перем ПервыйСимвол;
ПервыйСимвол = Лев( КонстантаСтр, 1 ) ;
ПервыеСимволыКонстант = ПервыеСимволыКонстант + ПервыйСимвол;
СписокСтроковыхКонстант. Установить( ПервыйСимвол, КонстантаСтр) ;
КонецПроцедуры
РасположениеФайла( ТекКаталог, ТекФайл) ;
Л_Лев_Фиг_Скобка = "{" ;
Л_Прав_Фиг_Скобка = "}" ;
Л_Лев_Кв_Скобка = "[" ;
Л_Прав_Кв_Скобка = "]" ;
Л_Двоеточие = ":" ;
Л_Запятая = "," ;
Л_Экран = "\" ;
Л_Кавычка = """ " ;
Л_Финиш = "" ;
Л_Число = "number" ;
Л_Строка = "string" ;
Л_Константа = "const" ;
ОдносимвольныеЛексемы = Л_Лев_Фиг_Скобка + Л_Прав_Фиг_Скобка + Л_Лев_Кв_Скобка + Л_Прав_Кв_Скобка + Л_Двоеточие + Л_Запятая;
Цифры1 _9 = "123456789" ;
Цифры0 _9 = "0" + Цифры1 _9;
В_Массив = "###array" ;
В_Объект = "###object" ;
В_Значение = "###value" ;
СписокСтроковыхКонстант = СоздатьОбъект( "СписокЗначений" ) ;
ПервыеСимволыКонстант = "" ;
ДобавитьСтроковуюКонстанту( "null" ) ;
ДобавитьСтроковуюКонстанту( "false" ) ;
ДобавитьСтроковуюКонстанту( "true" ) ;
JSON_Error = "ERROR" ;
В качестве примера взят файл j1.json :
{
"999": 88,
"Null": null,
"Сэкраном": "\"",
"Ложь": false,
"ОдинСимв": "1",
"1": "11111",
"Пустышка": "",
"Истина": true,
"Число (плавающая точка)": 1.001e-2,
"Число (плавающая)": -1.001e-2,
"Число (фиксированная точка)": -1000.001,
"Дата": "2011-01-01T12:00:00Z",
"Строка (двойная кавычка)": "Двойная кавычка",
"Строка (одинарная кавычка)": "Одинарная кавычка",
"Маскируемые символы": " \\ \/ \b \t \n \f \r \" ",
"Заковыристая строка": "\\n\\",
"Проблемные символы": "Спец. символы: \u0000, \u0001, \u0002, ... , \u001e, \u001f; Юникод символы: \u0421\u0430\u0448\u0430\u0020\u003a\u0029",
"Кириллические символы": "’АБВГҐДЂЃЕ?ЁЄЖЗЅИ?ІЇЙЈКЛЉМНЊОПРСТЋЌУЎФХЦЧЏШЩЪЫЬЭЮЯ",
"Идентификатор": "a763cfbb-f94f-4c67-8e13-0e96a3a7f353",
"Пустой массив": [],
"Пустой объект": {},
"Массив": [
null,
false,
true,
1.001e-2,
-1000.001,
"2011-01-01T12:00:00Z",
"Двойная кавычка",
"Одинарная кавычка",
"a763cfbb-f94f-4c67-8e13-0e96a3a7f353",
[
"Первый элемент",
"Второй элемент"
],
{
"Имя": "Александр",
"Отчество": "Владимирович",
"Фамилия": "Переверзев"
},
{
"ДопустимоеИмяСвойства": true,
"Недопустимое Имя Свойства": false
}
],
"Структура":
{
"Имя": "Александр",
"Отчество": "Владимирович",
"Фамилия": "Переверзев"
},
"Соответствие":
{
"ДопустимоеИмяСвойства": true,
"Недопустимое Имя Свойства": false
},
"Ссылка":
{
"Ссылка": "00000000-0000-0000-0000-000000000000",
"Представление": "Неизвестная ссылка"
},
"COMSafeArray": [
0,
1,
2,
3,
4,
5
]
}
Категория:
HTML, JS, VML Полнотекстовый Поиск - пример поиска контрагентов в базе У клиента огромная база клиентов и соответственно огромный штат менеджеров. Дошло до того, что менеджеры в поисках новых клиентов( знакомство, интернет, реклама и т.д.) очень часто звонят одним и тем же клиентам по несколько раз. Стали вести базу звонков... Но в базе одного и того же клиента могли назвать по разному - как-только вздумается...
Понадобился поиск по нечеткому названию и для этого решено было использовать полнотекстовый поиск 1С :
Механизм полнотекстового поиска в 1С позволяет быстро находить необходимую для пользователя информацию. Данный вид поиска особенно эффективен, если информационная база располагает большим объемом информации, а также точно не известно, где находятся интересующие пользователя данные или как часто бывает, их точное название не известно.
Смысл обработки в том, что менеджер копирует названия клиентов в список слева, нажимает Выполнить поиск и справа видит найденных в базе контрагентов (подходящих по нечеткости). Порог нечеткости менеджеры могут устанавливать сами.
Приведу краткий пример реализации данного поиска, код:
Код 1C v 8.х
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если ПолнотекстовыйПоиск. ПолучитьРежимПолнотекстовогоПоиска( ) < > РежимПолнотекстовогоПоиска. Разрешить Тогда
Отказ = Истина ;
Сообщение = Новый СообщениеПользователю( ) ;
Сообщение. Текст = НСтр( "ru = 'Использование полнотекстового поиска не разрешено. Вы можете включить его в диалоге "" Управление полнотекстовым поиском"" '" , "ru" ) ;
Сообщение. Сообщить( ) ;
Возврат ;
КонецЕсли ;
тчРезультата. Очистить( ) ;
текдок = Новый ТекстовыйДокумент;
текдок. УстановитьТекст( ТестПоиска) ;
Для Ном= 1 по текдок. КоличествоСтрок( ) цикл
Стр = СокрЛП( текдок. ПолучитьСтроку( Ном) ) ;
СписокПоиска = ПолнотекстовыйПоиск. СоздатьСписок( Стр) ;
СписокПоиска. ПолучатьОписание = Истина ;
СписокПоиска. РазмерПорции = 5 ;
СписокПоиска. ПорогНечеткости = ПорогНечеткости;
МассивОтбор = Новый Массив( ) ;
МассивОтбор. Добавить( Метаданные. Справочники. Контрагенты) ;
СписокПоиска. ОбластьПоиска = МассивОтбор;
СписокПоиска. ПерваяЧасть( ) ;
Для каждого Результат Из СписокПоиска Цикл
нСтр= тчРезультата. Добавить( ) ;
нСтр. ТекстПоиска= Стр;
нСтр. Контрагент= Результат. Значение;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ПриОткрытии()
ПорогНечеткости= 15 ;
КонецПроцедуры
Результат обработки:
Категория:
Встроенные Функции Загрузка данных в 1С из PDF В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert.
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = "," ) Экспорт
МассивСтрок = Новый Массив( ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
ТекЗнч = СокрЛП( Лев( Стр, Поз- 1 ) ) ;
Если ЗначениеЗаполнено( ТекЗнч) Тогда
МассивСтрок. Добавить( ТекЗнч) ;
КонецЕсли ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
тч. Очистить( ) ;
НайденныеФайлы = НайтиФайлы( ПутьКPDF, "*.pdf" , ложь ) ;
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ. Добавить( ) ;
Нстр. ФайлPDF = стр. Имя;
КонецЦикла ;
ЭтаФорма. Обновить( ) ;
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП( ПутьКPDF+ "\" + стр. ФайлPDF) ;
txt = СтрЗаменить( pdf, "pdf" , "txt" ) ;
Команд = ПутьКPDF2TXT+ "\pdf2txt.exe " + pdf+ " " + txt;
ЗапуститьПриложение( Команд, ПутьКPDF, Истина ) ;
стр. ФайлTXT = txt;
Исключение
стр. ФайлTXT = "!!!_ОШИБКА" ;
КонецПопытки ;
ЭлементыФормы. ТЧ. ТекущаяСтрока = стр;
ЭлементыФормы. ТЧ. ОбновитьСтроки( стр) ;
КонецЦикла ;
мТекущийПользователь = глЗначениеПеременной( "глТекущийПользователь" ) ;
мСкладПоУмолчанию = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнойСклад" ) ;
мОсновноеПодразделение = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновноеПодразделение" ) ;
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов" ) ;
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам" ) ;
мВидНоменклатурыПоУмолчанию = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнойВидНоменклатуры" ) ;
мОтражатьВРеглУчете = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете" ) ;
мОтражатьВБухУчета = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете" ) ;
мОтражатьВНалУчете = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете" ) ;
Для каждого стр Из ТЧ Цикл
Состояние( "Загружаю: " + стр. ФайлTXT) ;
текдок= Новый ТекстовыйДокумент;
текдок. Прочитать( стр. ФайлTXT, "UTF-8" ) ;
ЗагрузкаТЧ= Ложь ;
ДокВозвратТоваровОтПокупателя = Документы. ВозвратТоваровОтПокупателя. СоздатьДокумент( ) ;
ДокВозвратТоваровОтПокупателя. Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя. Дата = ОбщегоНазначения. ПолучитьРабочуюДату( ) ;
ДокВозвратТоваровОтПокупателя. УстановитьНовыйНомер( ) ;
ДокВозвратТоваровОтПокупателя. ВидПоступления = Перечисления. ВидыПоступленияТоваров. НаСклад;
ДокВозвратТоваровОтПокупателя. СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя. Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя. ВалютаДокумента = Справочники. Валюты. НайтиПоКоду( "643" ) ;
ДокВозвратТоваровОтПокупателя. УчитыватьНДС = ИСТИНА ;
ДокВозвратТоваровОтПокупателя. СуммаВключаетНДС = ИСТИНА ;
Для Ном= 1 по текдок. КоличествоСтрок( ) цикл
ТСтр = текдок. ПолучитьСтроку( Ном) ;
ТекСтр = СокрЛП( ТСтр) ;
Если Найти( ТекСтр, "Всего по накладной" ) > 0 Тогда
ЗагрузкаТЧ= Ложь ;
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя. Товары Цикл
ОбработкаТабличныхЧастей. РассчитатьКоличествоМестТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
ОбработкаТабличныхЧастей. РассчитатьСуммуТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
ОбработкаТабличныхЧастей. РассчитатьСуммуНДСТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
КонецЦикла ;
Попытка
ДокВозвратТоваровОтПокупателя. Записать( РежимЗаписиДокумента. Проведение) ;
Исключение
ДокВозвратТоваровОтПокупателя. Записать( РежимЗаписиДокумента. Запись) ;
КонецПопытки ;
стр. Документ = ДокВозвратТоваровОтПокупателя. Ссылка;
стр. Инфо = "Все ОК" ;
ЭлементыФормы. ТЧ. ТекущаяСтрока = стр;
ЭлементыФормы. ТЧ. ОбновитьСтроки( стр) ;
Прервать ;
КонецЕсли ;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить( ТекСтр, "подложке " , "подложке" ) ;
ТекСтр = СтрЗаменить( ТекСтр, " " , "|" ) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( ТекСтр, "|" ) ;
Если СтрМ. Количество( ) > 2 Тогда
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя. Товары. Добавить( ) ;
НоваяСтрока. Номенклатура = Справочники. Номенклатура. НайтиПоКоду( СтрМ[2 ]) ;
НоваяСтрока. ЕдиницаИзмерения = НоваяСтрока. Номенклатура. БазоваяЕдиницаИзмерения;
НоваяСтрока. Коэффициент = 1 ;
НоваяСтрока. Количество = Число( СтрМ[6 ]) ;
НоваяСтрока. Цена = Число( СтрМ[7 ]) ;
НоваяСтрока. Сумма = Число( СтрМ[8 ]) ;
НоваяСтрока. СуммаНДС = Число( СтрМ[11 ]) ;
НоваяСтрока. Качество = Справочники. Качество. Новый ;
Попытка
НоваяСтрока. СтавкаНДС = Перечисления. СтавкиНДС["НДС" + Лев( СокрЛП( СтрМ[9 ]) , 2 ) ];
Исключение
НоваяСтрока. СтавкаНДС = НоваяСтрока. Номенклатура. СтавкаНДС;
КонецПопытки ;
Исключение
Сообщить( "Не загружено: " + ТекСтр) ;
КонецПопытки ;
Иначе
Продолжить;
КонецЕсли ;
Иначе
КонецЕсли ;
Если Найти( ТекСтр, "Товарная накладная" ) > 0 Тогда
ТекСтр = СтрЗаменить( ТекСтр, " " , "|" ) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( ТекСтр, "|" ) ;
Если СтрМ. Количество( ) > 1 Тогда
ДокВозвратТоваровОтПокупателя. НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1 ];
ТекДата = СтрМ[2 ];
ДокВозвратТоваровОтПокупателя. ДатаВходящегоДокументаЭлектронногоОбмена = Дата( Прав( ТекДата, 4 ) + Сред( ТекДата, 4 , 2 ) + Лев( ТекДата, 2 ) ) ;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Грузополучатель:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекОрганизация = Справочники. Организации. НайтиПоРеквизиту( "ИНН" , текИНН) ;
Если ТекОрганизация= Справочники. Организации. ПустаяСсылка( ) Тогда
ДокВозвратТоваровОтПокупателя. Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя. Организация = ТекОрганизация;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Поставщик:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекПоставщик = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , текИНН) ;
ДокВозвратТоваровОтПокупателя. Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя. ДоговорКонтрагента = ТекПоставщик. ОсновнойДоговорКонтрагента;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Плательщик:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекПлательщик = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , текИНН) ;
КонецЕсли ;
КонецЕсли ;
Если текстр= "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ= Истина ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытия. Каталог = "" ;
ДиалогОткрытия. МножественныйВыбор = Ложь ;
ДиалогОткрытия. Заголовок = "Выберите каталог с PDF2TXT" ;
Если ДиалогОткрытия. Выбрать( ) Тогда
ПутьКPDF2TXT = ДиалогОткрытия. Каталог;
ПутьКPDF = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытия. Каталог = "" ;
ДиалогОткрытия. МножественныйВыбор = Ложь ;
ДиалогОткрытия. Заголовок = "Выберите каталог с PDF2TXT" ;
Если ДиалогОткрытия. Выбрать( ) Тогда
ПутьКPDF = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры
Категория:
Загрузка данных в 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 ) ;
НоваяСтрока[ИмяКолонки] = Стр;
КонецЕсли ;
КонецЦикла ;
Возврат ТаблицаЗначений;
КонецФункции
Категория:
JSON, XML, TXT, CSV, DBF Импорт в 1С из текстовых файлов (TXT, CSV) Не редко возникает необходимость загрузить в справочники или документы 1С данные из текстового файла. Приведенный пример внешней обработки позволит преобразовать текстовый файл с известным разделителем данных в поле табличного документа для последующей обработки уже внутри 1С:Предприятия. Обработка содержит функцию разбора строки на массив данных, настраиваемый разделитель строки текста на "столбцы", процедуру чтения данных из текстового файла.
Разбор строки в массив с использованием функций из конфигурации 1С
Для разложения строки в массив в конфигурация 1С:Бухгалтерия, 1С:Торговля и 1С:УПП имеется замечательная функция - Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт. Функция "расщепляет" строку на подстроки, используя заданный разделитель. Разделитель может иметь любую длину. Если в качестве разделителя задан пробел, рядом стоящие пробелы считаются одним разделителем, а ведущие и хвостовые пробелы параметра "Стр" игнорируются. Подробнее можно прочесть внутри конфигурации - "Общие модули" -> "Общего назначения". Функция возвращает массив значений, элементы которого - подстроки.
Чтение текстового файла (txt) в 1С
Операцию импорта - экспорта текстовых файлов (формат тхт или csv, а также htm, html) очень удобно реализовать при помощи конструкции следующего вида:
1. Функция ПолучитьПотокЧтенияСтрок(Файл) - Назначение: Проверить наличие файла (функция Файл()), Создать текстовый документ (Новый ТекстовыйДокумент()), вызвать метод "Прочитать" для открытия потока чтения файла. Возвращает поток, готовый для чтения.
2. Процедура ЧтениеТХТФайла(Элемент) - Назначение: В цикле произвести последовательное чтение строк файла текстового документа, разбирая на массив колонок данных и добавляя значения массива в табличное поле;
Исходный код 1С функции создания текстового потока чтения файла ТХТ:
Код 1C v 8.х Функция ПолучитьПотокЧтенияСтрок(Файл)
Попытка
ТекстовыйФайл = Новый Файл( Файл) ;
Если ТекстовыйФайл. Существует( ) = Ложь Тогда
Сообщить( "Файла " + Файл+ " не существует!" ) ;
Возврат Неопределено ;
КонецЕсли ;
ПотокЧтенияСтрок = Новый ТекстовыйДокумент( ) ;
ПотокЧтенияСтрок. Прочитать( ТекстовыйФайл) ;
Исключение
Сообщить( "Файл не прочитан." , СтатусСообщения. Внимание) ;
Сообщить( ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
Возврат ПотокЧтенияСтрок;
КонецФункции
Процедура ЧтениеТХТФайла(Элемент)
Если ПустаяСтрока( ИмяФайла) Тогда
Предупреждение( "Для запуска обработки необходимо предварительно выбрать файл данных." ) ;
Возврат ;
КонецЕсли ;
ПотокСтрок = ПолучитьПотокЧтенияСтрок( ИмяФайла) ;
ТаблицаДокумента. Очистить( ) ;
ТаблицаДокумента. Колонки. Очистить( ) ;
ТаблицаДокумента. Колонки. Добавить( "Номер" , , "Номер" , 5 ) ;
ТаблицаДокумента. Колонки. Добавить( "Артикул" , , "Артикул" , 11 ) ;
ТаблицаДокумента. Колонки. Добавить( "Номенклатура" , , "Номенклатура" , 25 ) ;
ТаблицаДокумента. Колонки. Добавить( "Цена" , , "Цена" , 6 ) ;
КоличествоСтрок = ПотокСтрок. КоличествоСтрок( ) ;
Для Строка = 1 По КоличествоСтрок Цикл
ОбработкаПрерыванияПользователя( ) ;
СтрокаИзФайла = ПотокСтрок. ПолучитьСтроку( Строка) ;
МассивСтрок = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( СтрокаИзФайла, "|" ) ;
Стр= ТаблицаДокумента. Добавить( ) ;
Стр. Номер = Строка;
Стр. Артикул = МассивСтрок[0 ];
Стр. Номенклатура = МассивСтрок[1 ];
Стр. Цена = МассивСтрок[2 ];
Состояние( "Обработка строки файла : "
+ "строка " + Строка + " из " + КоличествоСтрок) ;
КонецЦикла ;
ЭлементыФормы. ТаблицаДокумента. Значение = ТаблицаДокумента;
ЭлементыФормы. ТаблицаДокумента. СоздатьКолонки( ) ;
КонецПроцедуры
В данном примере была произведена загрузка из текстового файла в следующем формате:
Код 7754|Процессор Atom 1.7|10,00
5054|Процессор AMD x64|8,99
7546|Мышь Microsoft|45,88
Категория:
JSON, XML, TXT, CSV, DBF Загрузить данные в 1с из текстового файла с разделителями В этой статье я расскажу, как загружать данные в 1с 8 из простейших текстовых файлов с разделителями. Обычно они имеют расширение csv (Comma-Separated Values). Т. е. название подразумевает, что в каждой строке такого текстового файла значения разделены запятой. Но на самом деле, запятую, в качестве разделителя, использовать не надёжно. Поэтому применяют другие разделители, которые в обычном тексте встречаются редко. Это могут быть символы «^», «~»,«|» и другие. Итак, наша задача состоит в том, чтобы загрузить имеющуюся в csv файле информацию в базу данных 1с. Например, в файле будут содержаться товары интернет - магазина. В качестве образца, я взял выгрузку из магазина на скрипте virtuemart. Посмотрим, как выглядит файл.
Привожу две первых строки из него:
Код ~product_sku~^~category_path~^~product_name~^~product_desc~
~20~^~Книги/Электронные книги~^~Amazon Kindle 4 Touch~^~<p>Популярная электронная книга с ч/б экраном 6", электронной бумагой E-Ink Pearl, разрешением 600x800 пикс. с 16 - ю оттенками серого.</p>~
Посмотрим на файл.
Первая строка служебная. В ней описан формат нашего файла. Т. е. в какой ячейке, что находится. Однако, имейте в виду, что такой строки может и не быть.
Ячейки образуются при помощи разделителя «^», а данные в ячейках обрамляются символом «~».
В любой конфигурации 1с есть иерархический справочник товаров. В него и будем загружать информацию.
Создадим внешнюю обработку. Добавим строковый реквизит «путьКФайлуЗагрузки» для хранения имени файла. Добавим на форму поле ввода, связанное с данным реквизитом. Включим в свойствах поля ввода кнопку выбора и создадим обработчик события «НачалоВыбора» и напишем в нём такой код:
Код 1C v 8.х Процедура путьКФайлуЗагрузкиНачалоВыбора(Элемент, СтандартнаяОбработка)
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
Фильтр = "Comma separated file (*.csv)|*.csv" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите файл" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
путьКФайлуЗагрузки = ДиалогОткрытияФайла. ПолноеИмяФайла;
КонецЕсли ;
КонецПроцедуры
Т. о. мы организовали диалог для выбора файла в нашей обработке.
Хорошо. Теперь, для удобства и наглядности я предлагаю создать временную табличку, в которую мы загрузим текстовый файл, а уже после её заполнения - будем осуществлять загрузку в базу 1с. Для этого, на форму добавим табличное поле «табЗагрузки», с типом значения «ТаблицаЗначений» и командной панелью. В панели поместим кнопку «Заполнить» и создадим обработчик её нажатия «КоманднаяПанель1Заполнить». Также для элемента универсальности, добавим в обработку два строковых реквизита «символОграничения» и «разделительПолей». В них мы будем хранить «^», и «~». Можно в теле модуля формы осуществить их начальную инициализацию:
разделительПолей = "^";
символОграничения = "~";
Это позволит пользователю задать свои значения и при желании сохранить настройку, которая впоследствии не затрется нашей инициализацией.
Код 1C v 8.х Процедура КоманднаяПанель1Заполнить(Кнопка)
Если табЗагрузки. Количество( ) > 0 И Вопрос( "Таблица будет очищена. Вы уверены?" , РежимДиалогаВопрос. ДаНет)
= КодВозвратаДиалога. Нет Тогда
Возврат ;
КонецЕсли ;
ЗаполнитьТаблицу( ) ;
КонецПроцедуры
Процедура ЗаполнитьТаблицу()
текст = Новый ТекстовыйДокумент;
Попытка
текст. Прочитать( путьКФайлуЗагрузки, КодировкаТекста. UTF8) ;
Исключение
Сообщить( "Не удалось прочитать файл: "
+ ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
Возврат ;
КонецПопытки ;
табЗагрузки. Очистить( ) ;
табЗагрузки. Колонки. Очистить( ) ;
квоСтрок = текст. КоличествоСтрок( ) ;
Если Не квоСтрок > 0 Тогда
Сообщить( "Файл пустой" , СтатусСообщения. Внимание) ;
Возврат ;
КонецЕсли ;
стрТекста = текст. ПолучитьСтроку( 1 ) ;
масЗначСтр = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( стрТекста, разделительПолей) ;
табЗагрузки. Колонки. Добавить( "не_загружать" , Новый ОписаниеТипов( "Булево" ) , "Не загружать" ) ;
табЗагрузки. Колонки. Добавить( "номер_строки" , Новый ОписаниеТипов( "Число" ,
Новый КвалификаторыЧисла( 10 , 0 , ДопустимыйЗнак. Неотрицательный) ) , "Номер строки" ) ;
Для каждого зн Из масЗначСтр Цикл
значение = СтрЗаменить( зн, символОграничения, "" ) ;
кол = табЗагрузки. Колонки. Добавить( значение, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
ЭлементыФормы. табЗагрузки. СоздатьКолонки( ) ;
Для номСтр = 2 По квоСтрок Цикл
стрТекста = текст. ПолучитьСтроку( номСтр) ;
масЗначСтр = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( стрТекста, разделительПолей) ;
новСтр = табЗагрузки. Добавить( ) ;
новСтр. номер_строки = номСтр;
номЗнач = 2 ;
Для каждого зн Из масЗначСтр Цикл
новСтр[номЗнач] = СтрЗаменить( зн, символОграничения, "" ) ;
номЗнач = номЗнач + 1 ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Функцию разложения строки с разделителями в массив можно разместить как в одном из общих модулей, так и непосредственно в обработке.
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = "," ) Экспорт
МассивСтрок = Новый Массив( ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока Истина Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока Истина Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Отлично. В итоге, после заполнения, получим примерно такую картинку:
Теперь приступим непосредственно к загрузке товаров. Рядом с кнопкой «заполнить» добавим кнопку «загрузить» и добавим обработчик её нажатия «КоманднаяПанель1Загрузить», а также добавим реквизит «ПапкаЗагрузкиВыгрузкиТоваров» с типом вашего справочника товаров для опциональной их загрузки в определенную папку. Текст обработчика будет такой:
Код 1C v 8.х Процедура КоманднаяПанель1Загрузить(Кнопка)
Если Вопрос( "Вы уверены, что хотите загрузить файл?" , РежимДиалогаВопрос. ДаНет)
= КодВозвратаДиалога. Нет Тогда
Возврат ;
КонецЕсли ;
ВсегоСтрок = табЗагрузки. Количество( ) ;
номСтр = 1 ;
Для каждого стрТЗ Из табЗагрузки Цикл
Состояние( "Обработано: " + Окр( номСтр * 100 / ВсегоСтрок) + "%" ) ;
номСтр = номСтр + 1 ;
ОбработкаПрерыванияПользователя( ) ;
Если стрТЗ. не_загружать Тогда
Продолжить;
КонецЕсли ;
объект1 С = вернутьТовар( стрТЗ) ;
Если объект1 С = Неопределено Тогда
Возврат ;
КонецЕсли ;
Если Не ЗаписатьЭлементСпр( объект1 С) Тогда
Сообщить( "Загрузка прервана!" , СтатусСообщения. ОченьВажное) ;
Возврат ;
КонецЕсли ;
стрТЗ. не_загружать = Истина ;
КонецЦикла ;
КонецПроцедуры
В приведенном коде две новые функции «вернутьТовар» и «ЗаписатьЭлементСпр». Вот их текст:
Код 1C v 8.х Функция вернутьТовар(стрТабФайла)
Артикул = стрТабФайла. product_sku;
Если Не ЗначениеЗаполнено( Артикул) Тогда
Сообщить( "В строке " + стрТабФайла. номер_строки + " не заполнен product_sku" ,
СтатусСообщения. ОченьВажное) ;
Возврат Неопределено ;
КонецЕсли ;
Запрос = Новый Запрос( "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул" ) ;
Запрос. УстановитьПараметр( "Артикул" , Артикул) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
Возврат Выборка. Ссылка. ПолучитьОбъект( ) ;
Иначе
ЭтоНовый = Истина ;
объект1 С = Справочники. Номенклатура. СоздатьЭлемент( ) ;
объект1 С. Артикул = Артикул;
объект1 С. Наименование = стрТабФайла. product_name;
объект1 С. Родитель = вернутьРодителяТовара( стрТабФайла. category_path) ;
Возврат объект1 С;
КонецЕсли ;
КонецФункции
Функция ЗаписатьЭлементСпр(Спр)
Попытка
Спр. Записать( ) ;
Исключение
Сообщить( "При записи элемента справочника " + Спр + " возникла ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецПопытки ;
Возврат Истина ;
КонецФункции
И осталась последняя новая функция для обработки родителя товара вернутьРодителяТовара. Текст её смотрите ниже. Комментарии по тексту.
Код 1C v 8.х Функция вернутьРодителяТовара(стрКатегории)
Родитель = ПапкаЗагрузкиВыгрузкиТоваров;
масРодителей = РазложитьСтрокуВМассивПодстрок( стрКатегории, "/" ) ;
Для каждого Род Из масРодителей Цикл
РодСс = Справочники. Номенклатура. НайтиПоНаименованию( Род, Истина ) ;
Если РодСс. Пустая( ) Тогда
НовРод = Справочники. Номенклатура. СоздатьГруппу( ) ;
НовРод. Наименование = Род;
НовРод. Родитель = Родитель;
Если Не ЗаписатьЭлементСпр( НовРод) Тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = НовРод. Ссылка;
Иначе
Родитель = РодСс;
КонецЕсли ;
КонецЦикла ;
Возврат Родитель;
КонецФункции
Все. Конечно, в реальной жизни еще много чего нужно будет дописать, но не все сразу. Такой шаблон можно использовать как отправную точку.
Скачивать файлы может только зарегистрированный пользователь!
Успехов в разработке!
Источник Категория:
Текстовый документ Поле выбора ~ Как работать с многострочным полем? Код 1C v 8.х Текст= Новый ТекстовыйДокумент;
Текст. УстановитьТекст( ЭлементыФормы. ПолеВвода1 . Значение) ;
Для i= 1 По Текст. КоличествоСтрок( ) Цикл
Строка = Текст. ПолучитьСтроку( i) ;
Массив = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( Строка, Символы. Таб) ;
Попытка
Сообщить( Массив[1 ]) ;
Исключение
КонецПопытки ;
КонецЦикла ;
Категория:
Работа с Формой (Диалог) и её элементами Получение текста web-страницы используя HTTPСоединение Код 1C v 8.х
Сервер = "w1c.ru" ;
Соединение = Новый HTTPСоединение( Сервер) ;
Заголовки = Новый Соответствие;
Заголовки. Вставить( "host" , Сервер) ;
Запрос = Новый HTTPЗапрос( "/work.html" , Заголовки) ;
Ответ = Соединение. Получить( Запрос) ;
Если Ответ. КодСостояния = 200 Тогда
ТекстСтраницы= Ответ. ПолучитьТелоКакСтроку( ) ;
Сообщить( ТекстСтраницы) ;
КонецЕсли ;
Код 1C v 8.х
Сервер = "w1c.ru" ;
НТТР = Новый HTTPСоединение( Сервер) ;
врФайл = КаталогВременныхФайлов( ) + "pr_" + Формат( ТекущаяДата( ) , "ДФ=ddMMyyhhmmss" ) + ".txt" ;
Ответ = НТТР. Получить( "/work.html" , врФайл) ;
Если Ответ. КодСостояния = 200 Тогда
ВходящийФайл = Новый Файл( врФайл) ;
Текст = Новый ТекстовыйДокумент;
Текст. Прочитать( врФайл, КодировкаТекста. UTF8) ;
Для н= 1 По Текст. КоличествоСтрок( ) Цикл
стр= Текст. ПолучитьСтроку( н) ;
Сообщить( стр) ;
КонецЦикла ;
КонецЕсли ;
Категория:
Работа с Интернет, Почтой (Mail), FTP Загрузка данных из CSV файла Код 1C v 8.х // выберем CSV файл
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = “Выберите файл”;
Если ДиалогВыбора.Выбрать() Тогда
ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
КонецЕсли;
//Обработка данных из CSV
// очищаем информацию в таблице и находим файл на диске, а потом считываем его:
//очищаем таблицу и удаляем колонки
Таблица.Очистить();
Таблица.Колонки.Очистить();
ЭлементыФормы.Таблица.Колонки.Очистить();
// чтение файла
ЗагружаемыйФайл = Новый ТекстовыйДокумент;
ЗагружаемыйФайл.Прочитать(ИмяФайла);
//После того как мы получили все данные из файла, мы считываем 1 строку файла
// и формируем колонки на форме с наименованиями из файла
//шапка по умолчанию 1 строка, из первой строки делаем колонки таблицы
Шапка = ЗагружаемыйФайл.ПолучитьСтроку(1);
//раскладываем строку в массив
МассивКолонок = РазложитьСтрокуВМассивПодстрок(Шапка,Разделитель); // процедура из типовой конфигурации, разбивает строку в массив по разделителям
//генерируем колонки
Для Каждого ИмяКолонки Из МассивКолонок Цикл
ИмяБезПробелов = СтрЗаменить(ИмяКолонки,” “,”"); // убираем из имени колонок пробелы
Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки);
НоваяКолонка = ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов, ИмяКолонки);
НоваяКолонка.Данные = ИмяБезПробелов;
КонецЦикла;
// После того, как шапка сформирована можно приступать к обработке самих данных
Для НомерСтроки=2 по ЗагружаемыйФайл.КоличествоСтрок() Цикл
Состояние(“Обрабатывается “+Строка(Формат(?(ЗагружаемыйФайл.КоличествоСтрок()=0,0,((100*НомерСтроки)/ ЗагружаемыйФайл.КоличествоСтрок())),”ЧЦ=3; ЧДЦ=0″))+” %”);
ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break
// получить строку файла с указанным номером и преобразуем её в массив
Строка = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки);
МассивКолонок = РазложитьСтрокуВМассивПодстрок(Строка,Разделитель);// процедура из типовой конфигурации, разбивает строку в массив по разделителям
НоваяСтрока = Таблица.Добавить();
Если МассивКолонок.Количество() <> Таблица.Колонки.Количество() Тогда
Сообщить(“Ошибка со строкой ” + Строка);
Продолжить; // скорее всего в тексте содержит разделитель
КонецЕсли;
Для НомерКолонки = 1 по МассивКолонок.Количество() Цикл
//заполняем строку значениями
ТекущееЗначение = МассивКолонок[НомерКолонки-1];
ИмяКолонки = Таблица.Колонки[НомерКолонки-1].Имя;
НоваяСтрока[ИмяКолонки] = ТекущееЗначение;
КонецЦикла;
КонецЦикла;
Категория:
JSON, XML, TXT, CSV, DBF Загрузка данных из текстовых файлов, выбирая SQL запросом данные из этих файлов Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Рассмотрим вариант как это сделать! Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов. Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл
schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
ОБ_ФайлДанных= Новый Файл( Стр_КаталогДанных) ;
Если НЕ ОБ_ФайлДанных. ЭтоКаталог( ) Тогда
Сообщить( "Необходимо указать каталог данных!" , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецЕсли ;
Если НЕ ОБ_ФайлДанных. Существует( ) Тогда
Сообщить( "Каталог "" " + Стр_КаталогДанных+ """ не существует!" , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецЕсли ;
ОБ_АДОКонект = Новый COMОбъект( "ADODB.Connection" ) ;
ОБ_АДОРекордсетШапка = Новый COMОбъект( "ADODB.Recordset" ) ;
ОБ_АДОРекордсетСтроки = Новый COMОбъект( "ADODB.Recordset" ) ;
Стр_ОкончаниеФайла= "" ;
ФайлыШапок = НайтиФайлы( Стр_КаталогДанных, "Head_*.txt" ) ;
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла= Сред( ФайлШапки. ИмяБезРасширения, 6 ) ;
Стр_таблицаШапки= ФайлШапки. Имя;
Стр_ТаблицаСтрок= "Rows_" + Стр_ОкончаниеФайла+ ".txt" ;
Стр_ИмяФайлСтрок= ДобавлениеСлеша( Стр_КаталогДанных) + Стр_ТаблицаСтрок;
ФайлСтрок= Новый Файл( Стр_ИмяФайлСтрок) ;
Если НЕ ФайлСтрок. Существует( ) Тогда
Сообщить( "Не найден файл строк для файла шапки "" " + Стр_таблицаШапки+ """ ! Пара файлов не обработана" , СтатусСообщения. Важное) ;
Продолжить;
КонецЕсли ;
ФайлСхемыДанных= Новый Файл( ДобавлениеСлеша( Стр_КаталогДанных) + "schema.ini" ) ;
Если ФайлСхемыДанных. Существует( ) Тогда
Попытка
УдалитьФайлы( ФайлСхемыДанных. Путь, ФайлСхемыДанных. Имя) ;
Исключение
Сообщить( "Не возможно удалить файл "" " + ФайлСхемыДанных. ПолноеИмя+ """ для создания новой схемы данных! Проверте атрибуты файла" , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
КонецЕсли ;
Стр_СхемаДанныхТхт= "[" + Стр_таблицаШапки+ "]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|[" + Стр_ТаблицаСтрок+ "]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9" ;
ТекстСхемы= Новый ЗаписьТекста( ФайлСхемыДанных. ПолноеИмя, КодировкаТекста. ANSI) ;
ТекстСхемы. Записать( Стр_СхемаДанныхТхт) ;
ТекстСхемы. Закрыть( ) ;
Попытка
ОБ_АДОКонект. Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Стр_КаталогДанных+ ";Extended Properties='text;FMT=Delimited;HDR=NO'" ) ;
Исключение
Сообщить( "Невозможно открыть соединение!" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Стр_SQL = "S_elect * FROM " + Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка= ОБ_АДОКонект. Execute( Стр_SQL) ;
Исключение
Сообщить( "Ошибка выполнения запроса "" " + Стр_SQL+ """ !" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Пока НЕ ОБ_АДОРекордсетШапка. EOF Цикл
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка. Fields( "NumberNote" ) . Value;
Стр_КодКА= ОБ_АДОРекордсетШапка. Fields( "StoreNum" ) . Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка. Fields( "DataNote" ) . Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка. Fields( "DataDev" ) . Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка. Fields( "DataDes" ) . Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка. Fields( "CountLine" ) . Value;
Сообщить( "Заказ № " + Стр_НомерЗаказа+ " от " + Д_ДатаЗаказа+ " Код контрагента: " + Стр_КодКА+ " Дата доставки: " + Д_ДатаДоставки) ;
Стр_SQL = "S_elect * FROM " + Стр_ТаблицаСтрок+ " WHERE NumberNote='" + Стр_НомерЗаказа+ "'" ;
Попытка
ОБ_АДОРекордсетСтроки= ОБ_АДОКонект. Execute( Стр_SQL) ;
Исключение
Сообщить( "Ошибка выполнения запроса "" " + Стр_SQL+ """ !" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Сч= 0 ;
Сообщить( " № Артикул Количество" ) ;
Пока НЕ ОБ_АДОРекордсетСтроки. EOF Цикл
Сч= Сч+ 1 ;
Стр_Артикул= СокрЛП( ОБ_АДОРекордсетСтроки. Fields( "Articul" ) . Value) ;
Ч_Количество= ОБ_АДОРекордсетСтроки. Fields( "Counts" ) . Value;
Сообщить( "" + Сч+ " " + Стр_Артикул+ " " + Ч_Количество) ;
ОБ_АДОРекордсетСтроки. MoveNext( ) ;
КонецЦикла ;
ОБ_АДОРекордсетШапка. MoveNext( ) ;
КонецЦикла ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Автор:
Журавлев Михаил Викторович Категория:
Конвертация данных, Обмен, Перенос Обмен файлами с FTP сервером средствами Windows Код 1C v 8.х
Процедура ПередатьПоFTP(ИмяФайла,ПутьФТП=Неопределено) Экспорт
Если ПутьФТП = Неопределено Тогда
ТекПутьФТП = ПараметрыСеанса. FTPПуть;
Иначе
ТекПутьФТП = ПутьФТП;
КонецЕсли ;
Скрипт= Новый ТекстовыйДокумент;
Скрипт. ДобавитьСтроку( "open " + ПараметрыСеанса. FTP) ;
Скрипт. ДобавитьСтроку( "user" ) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPЛогин) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPПароль) ;
Скрипт. ДобавитьСтроку( "binary" ) ;
Скрипт. ДобавитьСтроку( "cd " + ТекПутьФТП) ;
Скрипт. ДобавитьСтроку( "put " + ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + ИмяФайла) ;
Скрипт. ДобавитьСтроку( "bye" ) ;
Файл = Новый Файл( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" ) ;
Скрипт. Записать( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" , "windows-1251" ) ;
КомандаСистемы( "ftp -n -s:" + ПараметрыСеанса. ПутьКФайлуОбраза+ "\ftp.txt" ) ;
КонецПроцедуры
Процедура ПолучитьПоFTP(ИмяФайла,ПутьФТП=Неопределено) Экспорт
Если ПутьФТП = Неопределено Тогда
ТекПутьФТП = ПараметрыСеанса. FTPПуть;
Иначе
ТекПутьФТП = ПутьФТП;
КонецЕсли ;
Скрипт= Новый ТекстовыйДокумент;
Скрипт. ДобавитьСтроку( "open " + ПараметрыСеанса. FTP) ;
Скрипт. ДобавитьСтроку( "user" ) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPЛогин) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPПароль) ;
Скрипт. ДобавитьСтроку( "binary" ) ;
Скрипт. ДобавитьСтроку( "cd " + ТекПутьФТП) ;
Скрипт. ДобавитьСтроку( "get" ) ;
Скрипт. ДобавитьСтроку( ИмяФайла) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + ИмяФайла) ;
Скрипт. ДобавитьСтроку( "bye" ) ;
Файл = Новый Файл( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" ) ;
Скрипт. Записать( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" , "windows-1251" ) ;
КомандаСистемы( "ftp -n -s:" + ПараметрыСеанса. ПутьКФайлуОбраза+ "\ftp.txt" ) ;
КонецПроцедуры
Код 1C v 7.x
Функция ОтправитьФайлыЧерезFTP()
Попытка
Шел= СоздатьОбъект( "shell.application" ) ;
ПапкаФТП= Шел. namespace( "ftp://" + СокрЛП( ФТП_Пользователь) + ":" + СокрЛП( ФТП_Пароль) + "@" + СокрЛП( ФТП_УРЛ) + "/" + СокрЛП( ФТП_ПутьИсходящих) ) ;
ПапкаИсточник= Шел. namespace( КаталогИсходящих) ;
ПапкаЗагруженных = Шел. namespace( КаталогЗагруженных) ;
Предупреждение( "Подключение к FTP серверу..." , 1 ) ;
Темы= ПапкаИсточник. items( ) ;
ПапкаЗагруженных. copyhere( Темы) ;
ПапкаФТП. movehere( Темы) ;
Исключение
Предупреждение( "Внимание! Не удалось передать файлы адресату через FTP! Возможно, параметры FTP заданы неверно, либо отсутствует связь." ) ;
Возврат 0 ;
КонецПопытки ;
ФС. УстТекКаталог( КаталогИсходящих) ;
ПопытокПроверки = 3 ;
Для Сч = 1 По ПопытокПроверки Цикл
Если НЕ ( ( СокрЛП( ФС. НайтиПервыйФайл( "*.*" ) ) = "" ) или ( СокрЛП( ФС. НайтиПервыйФайл( "*.*" ) ) = "." ) ) Тогда
Если Сч = ПопытокПроверки Тогда
Предупреждение( "Внимание! Не удалось передать файлы адресату через FTP! Попробуйте совершить обмен позже." ) ;
Возврат 0 ;
КонецЕсли ;
Предупреждение( "Передача файлов...." , 3 ) ;
КонецЕсли ;
КонецЦикла ;
Возврат 1 ;
КонецФункции
Функция ПолучитьФайлыЧерезFTP()
Попытка
Шел= СоздатьОбъект( "shell.application" ) ;
ПапкаФТП= Шел. namespace( "ftp://" + СокрЛП( ФТП_Пользователь) + ":" + СокрЛП( ФТП_Пароль) + "@" + СокрЛП( ФТП_УРЛ) + "/" + СокрЛП( ФТП_ПутьВходящих) ) ;
ПапкаПриемник= Шел. namespace( КаталогВходящих) ;
ПапкаЗагруженных = Шел. namespace( КаталогЗагруженных) ;
Предупреждение( "Подключение к FTP серверу..." , 1 ) ;
Темы= ПапкаФТП. items( ) ;
ПапкаЗагруженных. copyhere( Темы) ;
ПапкаПриемник. movehere( Темы) ;
Исключение
Предупреждение( "Внимание! Не удалось получить файлы через FTP! Возможно, параметры FTP заданы неверно, либо отсутствует связь." ) ;
Возврат 0 ;
КонецПопытки ;
ПопытокПроверки = 3 ;
Для Сч = 1 По ПопытокПроверки Цикл
Если ПапкаФТП. items( ) . count> 0 Тогда
Если Сч = ПопытокПроверки Тогда
Предупреждение( "Внимание! Не удалось получить файлы через FTP! Попробуйте совершить обмен позже." ) ;
Возврат 0 ;
КонецЕсли ;
Предупреждение( "Получение файлов...." , 3 ) ;
КонецЕсли ;
КонецЦикла ;
Возврат 1 ;
КонецФункции
Код 1C v 7.x
ТекстВыгрузки. Записать( КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ТекстВыгрузки = "" ;
ТекстВыгрузки = СоздатьОбъект( "Текст" ) ;
ТекстВыгрузки. ДобавитьСтроку( "open " + "192.168.0.1" ) ;
ТекстВыгрузки. ДобавитьСтроку( "****" ) ;
ТекстВыгрузки. ДобавитьСтроку( "*****" ) ;
ТекстВыгрузки. ДобавитьСтроку( "put " + КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ТекстВыгрузки. ДобавитьСтроку( "bye" ) ;
ТекстВыгрузки. Записать( КаталогПользователя( ) + "ftp.txt" ) ;
ТекстВыгрузки = "" ;
КомандаСистемы( "ftp -s:" + КаталогПользователя( ) + "Ftp.txt>> " + ( КаталогПользователя( ) + "report.txt" ) ) ;
ФС. УдалитьФайл( КаталогПользователя( ) + "ftp.txt" ) ;
ТекстВыгрузки = СоздатьОбъект( "Текст" ) ;
ТекстВыгрузки. Открыть( КаталогПользователя( ) + "report.txt" ) ;
КС = ТекстВыгрузки. КоличествоСтрок( ) - 4 ;
Попытка
строкаКомплете = ТекстВыгрузки. ПолучитьСтроку( КС) ;
Если Найти( Нрег( строкаКомплете) , "226 transfer complete" ) = 0
Тогда а= 1 ; а= а/ 0 ;
КонецЕсли ;
тПротокол = ТекущееВремя( ) + " файл данных успешно отправлен на сервер интернет-магазина" + РазделительСтрок+ тПротокол;
Форма. Обновить( ) ;
ТекстВыгрузки = "" ;
ФС. УдалитьФайл( КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ФС. УдалитьФайл( КаталогПользователя( ) + "report.txt" ) ;
Исключение
тПротокол = ТекущееВремя( ) + " ПРОИЗОШЛА ОШИБКА ВО ВРЕМЯ ЗАГРУЗКИ СФОРМИРОВАННОГО ФАЙЛА НА СЕРВЕР ИНЕТРНЕТ-МАГАЗИНА" + РазделительСтрок+ тПротокол;
тПротокол = ТекущееВремя( ) + ИмяПрайса+ РазделительСтрок+ тПротокол;
Форма. Обновить( ) ;
ТекстВыгрузки. Показать( ) ;
ТекстВыгрузки = "" ;
КонецПопытки ;
Категория:
Работа с Интернет, Почтой (Mail), FTP Краткий пример работы с OpenOffice.org Writer и Microsoft Office Word Обработка демонстрирует простейший пример работы с 2-мя текстовыми процессорами - OpenOffice.org Writer и Microsoft Office Word. Нужно запустить файл обработки, в качестве шаблона она будет использовать файл "Primer.doc", который находится в одном каталоге с обработкой:
Скачивать файлы может только зарегистрированный пользователь!
Файл Шаблона - Primer.doc:
От: {Организация}
Кому: {Контрагент}
Ждем акт сверки взаиморасчетов!
Директор /{Директор}/
Необходимо заменить в шаблоне ключевые слова в скобках {}, на указанные значения, вот примерный код обработки:
Код 1C v 7.x
ПечатьИзШаблона( рдТаблицаЗамен, "Primer.doc" ) ;
Функция ПреобразоватьВURL(ИмяФайла)
Возврат "file:///" + СтрЗаменить( ИмяФайла, "\" , "/" ) ;
КонецФункции
Функция ОбработкаФайлаШаблона(ИмяШаблона) Экспорт
ИмяФайла = КаталогВременныхФайлов( ) + "doc.tmp" ;
Путь = "" ; Имя = "" ;
ФайлОбработки = РасположениеФайла( Путь, Имя) ;
КаталогШаблонов = Путь;
ПолноеИмяШаблона = КаталогШаблонов + ИмяШаблона;
РезультатОбработки = 0 ;
ЕстьШаблон = 0 ;
Если ФС. СуществуетФайл( КаталогШаблонов + ИмяШаблона) = 0 Тогда
Сообщить( "Файл " + ИмяШаблона + " не найден в каталоге шаблонов печатных форм! Обратитесь к системному администратору!" , "!!!" ) ;
Иначе
ЕстьШаблон = 1 ;
КонецЕсли ;
Если ЕстьШаблон = 1 Тогда
ФС. КопироватьФайл( ПолноеИмяШаблона, ИмяФайла, 0 ) ;
КонецЕсли ;
Если ФС. СуществуетФайл( ИмяФайла) = 1 Тогда
РезультатОбработки = 1 ;
Иначе
Сообщить( "Не удалось скопировать шаблон во временный файл." ) ;
КонецЕсли ;
Возврат РезультатОбработки;
КонецФункции
Процедура ОткрытьТекстовыйПроцессор(ИмяФайла, ТаблицаЗамен)
ТекПроцессор = рдТекстовыйПроцессор. ПолучитьЗначение( рдТекстовыйПроцессор. ТекущаяСтрока( ) ) ;
Если ТекПроцессор = "OOoWriter" Тогда
ServiceManager = СоздатьОбъект( "com.sun.star.ServiceManager" ) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
Scr = СоздатьОбъект( "MSScriptControl.ScriptControl" ) ;
Scr. Language= "javascript" ;
Scr. Eval( "Args=new Array()" ) ;
Args = Scr. Eval( "Args" ) ;
Scr. AddObject( "ServiceManager" , ServiceManager) ;
ТекстовыйПроцессор = Desktop. LoadComponentFromURL( ПреобразоватьВURL( ИмяФайла) , "_blank" , 0 , Args) ;
Replace = ТекстовыйПроцессор. CreateReplaceDescriptor( ) ;
Для x= 1 По ТаблицаЗамен. КоличествоСтрок( ) Цикл
Replace. SearchString = ТаблицаЗамен. ПолучитьЗначение( x, 1 ) ;
Replace. ReplaceString = ТаблицаЗамен. ПолучитьЗначение( x, 2 ) ;
ТекстовыйПроцессор. ReplaceAll( Replace) ;
КонецЦикла ;
Иначе
Попытка
ТекстовыйПроцессор = СоздатьОбъект( "Word.Application" ) ;
Исключение
Сообщить( "Не удалось создать объект Microsoft Office Word!" , "!!!" ) ;
Возврат ;
КонецПопытки ;
ТекстовыйПроцессор. Visible = 0 ;
ТекстовыйПроцессор. Documents. Open( ИмяФайла, , - 1 ) ;
Fnd = ТекстовыйПроцессор. ActiveDocument. Range( ) . Find;
Fnd. ClearFormatting( ) ;
Fnd. Forward = - 1 ;
ТаблицаЗамен. ВыбратьСтроки( ) ;
Пока ТаблицаЗамен. ПолучитьСтроку( ) = 1 Цикл
Fnd. Execute( ТаблицаЗамен. Найти, , , , , , , , , ТаблицаЗамен. Заменить, 2 ) ;
КонецЦикла ;
ТекстовыйПроцессор. Visible = - 1 ;
ТекстовыйПроцессор. Activate( ) ;
КонецЕсли ;
КонецПроцедуры
Процедура ПечатьИзШаблона(ТаблицаЗамен, ИмяФайлаШаблона) Экспорт
Если ОбработкаФайлаШаблона( ИмяФайлаШаблона) = 0 Тогда
Возврат ;
КонецЕсли ;
ИмяФайла = КаталогВременныхФайлов( ) + "doc.tmp" ;
ОткрытьТекстовыйПроцессор( ИмяФайла, ТаблицаЗамен) ;
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Как в 7.7 прочитать файл *.csv в UTF-8 Код 1C v 7.x Процедура Сформировать()
Перем Имя, Путь;
Если ФС. ВыбратьФайл( 0 , Имя, Путь, "" , "*.*|*.*" , "*" ) = 0 Тогда
Возврат ;
КонецЕсли ;
Файл= Путь+ Имя;
Стрим= СоздатьОбъект( "ADODB.Stream" ) ;
Стрим. Type= 2 ;
Стрим. charset= "windows-1251" ;
Стрим. Open( ) ;
Стрим. LoadFromFile( Файл) ;
Стрим. charset= "utf-8" ;
Стр= Лев( Стрим. ReadText( ) , 255 ) ;
Сообщить( Стр) ;
КонецПроцедуры
Процедура Сформировать()
Перем Имя, Путь;
Если ФС. ВыбратьФайл( 0 , Имя, Путь, "" , "*.*|*.*" , "*" ) = 0 Тогда
Возврат ;
КонецЕсли ;
Файл= Путь+ Имя;
УТФ16 = КаталогВременныхФайлов( ) + _GetPerformanceCounter( ) + "-unicode.txt" ;
ЦП1251 = КаталогВременныхФайлов( ) + _GetPerformanceCounter( ) + "-cp1251.txt" ;
БАТ= КаталогВременныхФайлов( ) + _GetPerformanceCounter( ) + ".bat" ;
Стр= "@echo off
|chcp 1251 > nul
|chcp 65001 |>> "" " + УТФ16 + """ cmd /u /c "" type "" " + Файл+ """ & chcp 1251 > nul""
|chcp 1251 > nul
|type "" " + УТФ16 + """ > "" " + ЦП1251 + """
|chcp 866 > nul" ;
Текст= СоздатьОбъект( "Текст" ) ;
Текст. ДобавитьСтроку( Стр) ;
Текст. Записать( БАТ) ;
КомандаСистемы( БАТ) ;
Текст= СоздатьОбъект( "Текст" ) ;
Текст. Открыть( ЦП1251 ) ;
Для Сч= 1 По Текст. КоличествоСтрок( ) Цикл
Сообщить( Лев( Текст. ПолучитьСтроку( Сч) , 255 ) ) ;
КонецЦикла ;
ФС. УдалитьФайл( УТФ16 ) ;
ФС. УдалитьФайл( ЦП1251 ) ;
ФС. УдалитьФайл( БАТ) ;
КонецПроцедуры
Посмотрите еще:
Функции перекодировки текста в/из UTF-8 штатными средствами 1с 7.7 Категория:
COM-объекты, WMI, WSH Загрузка данных из текстовых файлов с выборкой через ADO. Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов.
Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
ОБ_ФайлДанных= Новый Файл( Стр_КаталогДанных) ;
Если НЕ ОБ_ФайлДанных. ЭтоКаталог( ) Тогда
Сообщить( "Необходимо указать каталог данных!" , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецЕсли ;
Если НЕ ОБ_ФайлДанных. Существует( ) Тогда
Сообщить( "Каталог "" " + Стр_КаталогДанных+ """ не существует!" , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецЕсли ;
ОБ_АДОКонект = Новый COMОбъект( "ADODB.Connection" ) ;
ОБ_АДОРекордсетШапка = Новый COMОбъект( "ADODB.Recordset" ) ;
ОБ_АДОРекордсетСтроки = Новый COMОбъект( "ADODB.Recordset" ) ;
Стр_ОкончаниеФайла= "" ;
ФайлыШапок = НайтиФайлы( Стр_КаталогДанных, "Head_*.txt" ) ;
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла= Сред( ФайлШапки. ИмяБезРасширения, 6 ) ;
Стр_таблицаШапки= ФайлШапки. Имя;
Стр_ТаблицаСтрок= "Rows_" + Стр_ОкончаниеФайла+ ".txt" ;
Стр_ИмяФайлСтрок= ДобавлениеСлеша( Стр_КаталогДанных) + Стр_ТаблицаСтрок;
ФайлСтрок= Новый Файл( Стр_ИмяФайлСтрок) ;
Если НЕ ФайлСтрок. Существует( ) Тогда
Сообщить( "Не найден файл строк для файла шапки "" " + Стр_таблицаШапки+ """ ! Пара файлов не обработана" , СтатусСообщения. Важное) ;
Продолжить;
КонецЕсли ;
ФайлСхемыДанных= Новый Файл( ДобавлениеСлеша( Стр_КаталогДанных) + "schema.ini" ) ;
Если ФайлСхемыДанных. Существует( ) Тогда
Попытка
УдалитьФайлы( ФайлСхемыДанных. Путь, ФайлСхемыДанных. Имя) ;
Исключение
Сообщить( "Не возможно удалить файл "" " + ФайлСхемыДанных. ПолноеИмя+ """ для создания новой схемы данных! Проверте атрибуты файла" , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
КонецЕсли ;
Стр_СхемаДанныхТхт= "[" + Стр_таблицаШапки+ "]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|[" + Стр_ТаблицаСтрок+ "]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9" ;
ТекстСхемы= Новый ЗаписьТекста( ФайлСхемыДанных. ПолноеИмя, КодировкаТекста. ANSI) ;
ТекстСхемы. Записать( Стр_СхемаДанныхТхт) ;
ТекстСхемы. Закрыть( ) ;
Попытка
ОБ_АДОКонект. Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Стр_КаталогДанных+ ";Extended Properties='text;FMT=Delimited;HDR=NO'" ) ;
Исключение
Сообщить( "Невозможно открыть соединение!" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Стр_SQL = "S_elect * FROM " + Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка= ОБ_АДОКонект. Execute( Стр_SQL) ;
Исключение
Сообщить( "Ошибка выполнения запроса "" " + Стр_SQL+ """ !" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Пока НЕ ОБ_АДОРекордсетШапка. EOF Цикл
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка. Fields( "NumberNote" ) . Value;
Стр_КодКА= ОБ_АДОРекордсетШапка. Fields( "StoreNum" ) . Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка. Fields( "DataNote" ) . Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка. Fields( "DataDev" ) . Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка. Fields( "DataDes" ) . Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка. Fields( "CountLine" ) . Value;
Сообщить( "Заказ № " + Стр_НомерЗаказа+ " от " + Д_ДатаЗаказа+ " Код контрагента: " + Стр_КодКА+ " Дата доставки: " + Д_ДатаДоставки) ;
Стр_SQL = "S_elect * FROM " + Стр_ТаблицаСтрок+ " WHERE NumberNote='" + Стр_НомерЗаказа+ "'" ;
Попытка
ОБ_АДОРекордсетСтроки= ОБ_АДОКонект. Execute( Стр_SQL) ;
Исключение
Сообщить( "Ошибка выполнения запроса "" " + Стр_SQL+ """ !" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Сч= 0 ;
Сообщить( " № Артикул Количество" ) ;
Пока НЕ ОБ_АДОРекордсетСтроки. EOF Цикл
Сч= Сч+ 1 ;
Стр_Артикул= СокрЛП( ОБ_АДОРекордсетСтроки. Fields( "Articul" ) . Value) ;
Ч_Количество= ОБ_АДОРекордсетСтроки. Fields( "Counts" ) . Value;
Сообщить( "" + Сч+ " " + Стр_Артикул+ " " + Ч_Количество) ;
ОБ_АДОРекордсетСтроки. MoveNext( ) ;
КонецЦикла ;
ОБ_АДОРекордсетШапка. MoveNext( ) ;
КонецЦикла ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Автор
Журавлев Михаил Викторович Категория:
JSON, XML, TXT, CSV, DBF