Обмен между базами через XML (создается ФабрикаXDTO) В процедурах выгрузки/загрузки создается ФабрикаXDTO из схемы, которая хранится в макете как файл. Файл настроек схемы надо использовать один и тот же в обработках Загрузки/Выгрузки
Из Фабрики создается объект, его заполняю выгружаемыми данными
Фабрику сохраняю в XML. В процедуре загрузки из читаю фабрику из XML и пробегаю по объектам
Очень удобно!
Код 1C v 8.х Функция СоздатьФайлСхемы()
ФайлСхемы = Новый Файл( КаталогВременныхФайлов( ) + "schema.xsd" ) ;
Если ФайлСхемы. Существует( ) Тогда
УдалитьФайлы( ФайлСхемы. ПолноеИмя) ;
КонецЕсли ;
Ссылка = ПолучитьМакет( "schema_xsd" ) ;
Ссылка. Записать( ФайлСхемы. ПолноеИмя) ;
Возврат ФайлСхемы. ПолноеИмя;
КонецФункции
Функция ВыгрузитьДокументы()
ФайлыXSD = Новый Массив( ) ;
ФайлыXSD. Добавить( СоздатьФайлСхемы( ) ) ;
Фабрика = СоздатьФабрикуXDTO( ФайлыXSD) ;
ФайлОбмена = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
Пока Выборка. Следующий( ) Цикл
Документ = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "Документ" ) ) ;
Документ. ID = Строка( Док. УникальныйИдентификатор( ) ) ;
Документ. ВидДокумента = Док. Метаданные( ) . Имя;
Документ. Дата = Док. Дата;
Документ. Номер = Док. Номер;
Документ. Статус = ? ( Док. Проведен, "Проведен" , ? ( Док. ПометкаУдаления, "ПометкаУдаления" , "НеПроведен" ) ) ;
Документ. Комментарий = Док. Комментарий;
КонецЦикла
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML( "UTF-8" , "1.0" , Ложь ) ;
МойXML = Новый ЗаписьXML;
МойXML. ОткрытьФайл( ИмяФайла, ПараметрыЗаписиXML) ;
МойXML. ЗаписатьОбъявлениеXML( ) ;
Фабрика. ЗаписатьXML( МойXML, ФайлОбмена) ;
МойXML. Закрыть( ) ;
ОбщегоНазначенияКлиентСервер. СообщитьПользователю( "Создан файл обмена " + ИмяФайла) ;
КонецФункции
Процедура ЗагрузитьДокументы()
ФайлыXSD = Новый Массив( ) ;
ФайлыXSD. Добавить( СоздатьФайлСхемы( ) ) ;
Фабрика = СоздатьФабрикуXDTO( ФайлыXSD) ;
ФайлОбмена = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
ОбменXML = Новый ЧтениеXML;
ОбменXML. ОткрытьФайл( ИмяФайла) ;
ФайлОбмена = Фабрика. ПрочитатьXML( ОбменXML, Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
Для Каждого Документ Из ФайлОбмена. Документ Цикл
ОбработкаПрерыванияПользователя( ) ;
Если Документ. ВидДокумента = "ПоступлениеТоваров" И
ЗначениеЗаполнено( Поставщик) И
Документ. Контрагент. ИНН Поставщик. ИНН Тогда
КонецЕсли ;
КонецЦикла
ФайлОбмена = "" ;
ОбменXML. Закрыть( ) ;
УдалитьФайлы( ИмяФайла) ;
КонецПроцедуры
Файл схемы примерно такой (разукрашка съела скобки, но смысл должен быть понятен ))
Код xs:schema xmlns:tns="http://anton.fly7.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://anton.fly7.ru" attributeFormDefault="unqualified" elementFormDefault="qualified">
xs:complexType name="ФайлОбмена">
xs:sequence>
xs:element name="Документ" type="tns:Документ" nillable="true" maxOccurs="unbounded"/>
xs:sequence>
xs:complexType>
xs:complexType name="Документ">
xs:sequence>
xs:element name="ID" type="xs:string"/>
xs:element name="ВидДокумента" type="xs:string"/>
xs:element name="Статус" type="xs:string"/>
xs:element name="Дата" type="xs:dateTime"/>
xs:element name="Номер" type="xs:string"/>
xs:element name="Контрагент" type="tns:Контрагент"/>
xs:element name="Свойства" type="tns:ТаблицаСвойства" nillable="true" minOccurs="0"/>
xs:sequence>
xs:complexType>
xs:complexType name="Контрагент">
xs:sequence>
xs:element name="ID" type="xs:string"/>
xs:element name="Наименование" type="xs:string"/>
xs:element name="ИНН" type="xs:string"/>
xs:sequence>
xs:complexType>
xs:complexType name="ТаблицаСвойства">
xs:sequence>
xs:element name="СтрокаСвойства" type="tns:СтрокаСвойство" nillable="true" maxOccurs="unbounded"/>
xs:sequence>
xs:complexType>
xs:complexType name="СтрокаСвойство">
xs:sequence>
xs:element name="Наименование" type="xs:string" nillable="true"/>
xs:element name="Значение" type="xs:string" nillable="true"/>
xs:sequence>
xs:complexType>
xs:schema>
Автор:
Абазин Антон Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Загрузка данных из текстовых файлов, выбирая 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( ) ;
КонецЦикла ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Автор:
Журавлев Михаил Викторович Категория:
Конвертация данных, Обмен, Перенос Загрузка данных из текстовых файлов с выборкой через 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