Импорт данных в 1СВ этой статье будут описаны и продемонстрированы программные методы импортирования данных в программу "1С:Предприятие 7.7" из внешних источников. В практической работе приходится проводить импорт данных в "1С:Предприятие" из различных внешних приложений, обслуживающих базы данных. Встроенный язык программы "1С:Предприятие" и стандартизированные методы построения баз данных позволяют создавать универсальные обработки по импорту данных из внешних источников. Написание универсальной обработки, зачастую, - это сложный, но и достаточно увлекательный процесс. Сложным я могу назвать его потому, что на этапе разработки нужно заранее предусмотреть все возможные варианты импортирования и обработки данных. А увлекательным процесс написания универсальных обработок по импорту данных в 1С мне видится потому, что постоянно ощущаешь огромные выгоды от использования обработки в последующей работе. Не все умеют писать универсальные обработки, и не все получают от этого удовольствие. Но практически все, работающие с программой "1С:Предприятие" сталкивались с необходимостью импорта данных из внешних источников. Поэтому, если обработку для импорта данных в "1С:Предприятие" Вы не можете или не умеете написать самостоятельно, то я могу Вам предложить универсальные внешние обработки по импорту данных в "1С:Предприятие", которые написал я самостоятельно. Их Вы найдёте в статье "Обработки для 1С". Общие программные методы работы с внешними источниками данных описаны в статье "Внешние связи" и будут полезны для программистов. Для начала давайте посмотрим, как проводится работа с файловой системой из программы 1С:Предприятие. //открытие файла заданного типа Функция гФайл_Открыть(Файл,Каталог,ФлагВсе,ФлагТекст=0,ФлагКнига=0,ФлагДокумент=0,ФлагПрезентация=0,ФлагАкробат=0) Экспорт //меню Если ПустоеЗначение(Файл)=0 Тогда А=СоздатьОбъект("СписокЗначений"); А.ДобавитьЗначение(0,"Открыть"); А.ДобавитьЗначение(1,"Выбрать"); Ответ=0; Если А.ВыбратьЗначение(Ответ,,,,1)=0 Тогда Возврат(0); ИначеЕсли Ответ=0 Тогда ЗапуститьПриложение(Каталог+Файл); Возврат(0); ИначеЕсли Ответ=1 Тогда ФС.УстТекКаталог(Каталог); КонецЕсли; КонецЕсли; //формат Список=""; Если ФлагВсе=1 Тогда Список=Список+"|Все файлы|*.*"; КонецЕсли; Если ФлагТекст=1 Тогда Список=Список+"|Текстовые файлы|*.txt"; КонецЕсли; Если ФлагКнига=1 Тогда Список=Список+"|Книги MS Excel|*.xls"; КонецЕсли; Если ФлагДокумент=1 Тогда Список=Список+"|Документы MS Word|*.doc"; КонецЕсли; Если ФлагПрезентация=1 Тогда Список=Список+"|Презентации MS PowerPoint|*.pps"; КонецЕсли; Если ФлагАкробат=1 Тогда Список=Список+"|Документы Adobe Acrobat|*.pdf"; КонецЕсли; Список=Сред(Список,2); // Возврат ФС.ВыбратьФайл(0,Файл,Каталог,"Открыть файл",Список); КонецФункции //процедура определяет название файла и каталога на основании заданной адресной строки Процедура гПуть_Получить(Путь,Файл,Каталог) Экспорт Текст=СтрЗаменить(Путь,"\",РазделительСтрок); //каталог Для i=1 По СтрКоличествоСтрок(Текст-1) Цикл Каталог=Каталог+СтрПолучитьСтроку(Текст,i)+"\"; КонецЦикла; //файл Файл=СтрПолучитьСтроку(Текст,СтрКоличествоСтрок(Текст)); КонецПроцедуры Программу Microsoft Excel сегодня можно называть стандартом работы с электронными таблицами. Именно поэтому довольно часто приходится встречаться с ситуациями, когда массивы данных хранятся именно в файлах формата MS Excel. Для того, чтобы умело импортировать данные из файлов формата MS Excel в базу данных 1С:Предприятия, вы можете воспользоваться следующими примерами. //подключение к MS Excel через OLE Функция гКнига_Открыть(Файл,Каталог,Область,Высота,Ширина) Экспорт Оле=СоздатьОбъект("Excel.Application"); //поиск в открытом приложении Для i=1 По Оле.Workbooks.Count Цикл ТекКнига=Оле.Workbooks(i); Если ТекКнига.Name=Файл Тогда Книга=ТекКнига; Прервать; КонецЕсли; КонецЦикла; //открытие файла Если ПустоеЗначение(Книга)=1 Тогда Книга=Оле.Workbooks.Open(Каталог+Файл); КонецЕсли; Оле.Visible=1; //выбор листа Если Книга.Worksheets.Count=1 Тогда НомерЛиста=1; Иначе Список=СоздатьОбъект("СписокЗначений"); Для i=1 По Книга.Worksheets.Count Цикл Список.ДобавитьЗначение(i,Книга.Worksheets(i).Name); КонецЦикла; Если Список.ВыбратьЗначение(НомерЛиста,"Выбор листа - "+Книга.Name)=0 Тогда Возврат(0); КонецЕсли; КонецЕсли; //лист Лист=Книга.Worksheets(НомерЛиста); Лист.Activate(); //данные Область=Книга.Worksheets(НомерЛиста).Cells.CurrentRegion; Высота=Область.Rows.Count; Ширина=Область.Columns.Count; // Возврат(1); КонецФункции //импорт цен из файла MS Excel //поиск элемента справочника проводится по полному коду Процедура ИмпортироватьЦеныТовара() Перем Файл,Каталог,Область,Высота,Ширина; //открытие Каталог=КаталогПользователя(); Файл=""; Если ФС.ВыбратьФайл(0,Файл,Каталог,"Открыть файл","Файлы MS Excel|*.xls")=0 Тогда Возврат; ИначеЕсли гКнига_Открыть(Файл,Каталог,Область,Высота,Ширина)=0 Тогда Возврат; КонецЕсли; //справочник С=СоздатьОбъект("Справочник.Товары"); С.ИспользоватьРодителя(""); С.ИспользоватьДату(РабочаяДата(),1); //данные Для Стр=2 По Высота Цикл Состояние("Прогресс: "+Цел(Стр/Высота*100)+"%"); //код ТекКод=СокрЛП(Область.Cells(Стр,1).Value); Если С.НайтиПоКоду(ТекКод,2)=0 Тогда Сообщить("Не найден товар по коду: "+ТекКод,"!"); Продолжить; КонецЕсли; //цена ТекЦена=Число(Область.Cells(Стр,2).Value); Если ТекЦена=0 Тогда Продолжить; КонецЕсли; //значение С.УстановитьАтрибут("Цена",ТекЦена); //запись Попытка С.Записать(); Исключение Сообщить("Ошибка записи: "+ОписаниеОшибки(),"!"); КонецПопытки; КонецЦикла; Предупреждение("Импортированы цены для "+Высота+" наименований товаров"); КонецПроцедуры Основными преимуществами текстовых файлов являются их маленький размер и простота хранения данных внутри файла. Пожалуй, именно поэтому многие данные до сего дня передаются посредством текстовых файлов. Учитывая существующую потребность, вам могут потребоваться умения в импортировании данных в 1С из текстового файла. И нижеприведённые примеры помогут вам в приобретении необходимых знаний. Самым распространённым случаем передачи данных текстовым файлом является способ выгрузки данных из системы Клиент-Банк. В примере, приведённом ниже, вы можете увидеть, каким образом производится загрузка данных о банковских операциях в 1С из текстового файла, в который предварительно выгружены данные из системы Банк-Клиент. //импорт данных выписки из текстового файла программы "Банк-Клиент" Процедура ИмпортироватьВыписку() //настройка Н=СоздатьОбъект("Справочник.НастройкиИмпортаВыписки"); Если РСчет.НастройкаИмпортаВыписки.Выбран()=1 Тогда Н.НайтиЭлемент(РСчет.НастройкаИмпортаВыписки); ИначеЕсли Н.Выбрать("Выбор настройки импорта","ДляВыбора")=0 Тогда Возврат; КонецЕсли; //очистка строк Если КоличествоСтрок()>0 Тогда Если Вопрос("Удалить строки?","ОК+Отмена")="Отмена" Тогда Возврат; КонецЕсли; УдалитьСтроки(); КонецЕсли; //файл Файл=Формат(ДатаДок,"Д ДДММГГ"); Файл=СтрЗаменить(Файл,".",""); Файл=СокрЛП(Н.Каталог)+"\"+Файл+".txt"); Если ФС.СуществуетФайл(Файл)=0 Тогда Сообщить("Файл не найден: "+Файл,"!"); Предупреждение("Файл электронной выписки за "+ДатаДок+" не найден!"); Возврат; КонецЕсли; //источник Т=СоздатьОбъект("Текст"); Т.Открыть(Файл); Если Т.КоличествоСтрок()=0 Тогда Сообщить("Файл пустой: "+Файл, "!"); Предупреждение("Файл электронной выписки за "+ДатаДок+" пустой!"); Возврат; КонецЕсли; //установки ОснСчет=СокрЛП(РСчет.НомерСчета); ОснМфо=Формат(РСчет.Банк.Код,"Ч(0)9"); ОснВалюта=СокрЛП(РСчет.Валюта.Код); СтавкаНдс=Константа.БазНдс.Ставка.Получить(ДатаДок); К=СоздатьОбъект("Справочник.Контрагенты"); //выбор Для й=1 По Т.КоличествоСтрок() Цикл Стр=Т.ПолучитьСтроку(й); Если ПустаяСтрока(Стр)=1 Тогда Прервать; КонецЕсли; //перекодировка Если Н.ФлагДос=1 Тогда Стр=OemToAnsi(Стр); Стр=СтрЗаменить(Стр,"\"+Симв(34),Симв(34)); КонецЕсли; //деление Стр=СтрЗаменить(Стр,Симв(34)+" "+Симв(34),РазделительСтрок); //данные Имя1=СтрПолучитьСтроку(Стр,3); Окпо1=СтрПолучитьСтроку(Стр,4); Банк1=СтрПолучитьСтроку(Стр,5); ТекМфо1=СтрПолучитьСтроку(Стр,6); ТекСчет1=СтрПолучитьСтроку(Стр,7); Имя2=СтрПолучитьСтроку(Стр,8); Окпо2=СтрПолучитьСтроку(Стр,9); Банк2=СтрПолучитьСтроку(Стр,10); ТекМфо2=СтрПолучитьСтроку(Стр,11); ТекСчет2=СтрПолучитьСтроку(Стр,12); ТекВалюта=СтрПолучитьСтроку(Стр,13); ТекСумма=СтрПолучитьСтроку(Стр,14); ТекИнфо=СтрПолучитьСтроку(Стр,16); //проверка Если Не(Оснвалюта=ТекВалюта) Тогда Сообщить("Строка "+й+": Не найдена Валюта "+РСчет.Валюта.Наименование+" по коду: "+ОснВалюта,"!"); Продолжить; ИначеЕсли Не(ОснМфо=ТекМфо1) И Не(ОснМфо=ТекМфо2) Тогда Сообщить("Строка "+й+": Не найден Банк "+РСчет.Банк.Наименование+" по коду МФО: "+ОснМфо,"!"); Продолжить; ИначеЕсли Не(ОснСчет=ТекСчет1) И Не(ОснСчет=ТекСчет2) Тогда Сообщить("Строка "+й+": Не найден РСчет по коду: "+ОснСчет,"!"); Продолжить; КонецЕсли; //строка НоваяСтрока(); Если (ОснМфо=ТекМфо1) И (ОснСчет=ТекСчет1) Тогда //приход УстановитьАтрибут("ПриходРасход",Перечисление.ПлюсМинус.Плюс); УстановитьАтрибут("Счет",Н.СчетД); КодКлиента=Окпо2; ИмяКлиента=Имя2; Иначе //расход УстановитьАтрибут("ПриходРасход",Перечисление.ПлюсМинус.Минус); УстановитьАтрибут("Счет",Н.СчетК); КодКлиента=Окпо1; ИмяКлиента=Имя1; КонецЕсли; //содержание УстановитьАтрибут("Содержание",ТекИнфо); //сумма УстановитьАтрибут("ВидНдс",Константа.БазНдс); УстановитьАтрибут("СуммаСНдс",ТекСумма); УстановитьАтрибут("Ндс",СуммаСНдс*СтавкаНдс/(1+СтавкаНдс)); //субконто НазначитьТип("Субконто",ВидыСубконто.Контрагенты); Если К.НайтиПоРеквизиту("ЕДРПОУ",КодКлиента,1)=1 Тогда УстановитьАтрибут("Субконто",К.ТекущийЭлемент()); ИначеЕсли Н.ФлагСоздать=1 Тогда К.Новый(); К.Наименование=ИмяКлиента; К.ПолнНаименование=ИмяКлиента; К.Едрпоу=КодКлиента; К.Записать(); Сообщить("Строка "+й+": Новый контрагент: "+ИмяКлиента); //контрагент УстановитьАтрибут("Субконто",К.ТекущийЭлемент()); Иначе Сообщить("Строка "+й+": Не найден Контрагент по коду ЕГРПОУ: "+КодКлиента,"!"); КонецЕсли; КонецЦикла; Предупреждение("Обработка выполнена"); КонецПроцедуры Старый добрый формат dBase по-прежнему используется для хранения массивов данных. Чего уж говорить, если обычная версия 1С:Предприятия (не SQL) сама хранит базы данных в файлах с расширением DBF? Формат файлов DBF, на мой взгляд, очень удобен для передачи данных в базу 1С, поскольку преимуществами файла формата dBase являются маленький размер и матричная система хранения данных. Программист 1С может встретиться с необходимостью импортировать данные в 1С из файла DBF, в который экспортированы данные о банковских операциях из системы Банк-Клиент. В нижеприведённом примере вы можете увидеть пример обработки файла DBF, из которого в 1С импортируется банковская выписка. //импорт банковских операций в базу 1С из внешнего файла DBF, созданного в системе Банк-Клиент Процедура КнопкаИмпорт() Перем Файл,Каталог; Если Вопрос("Импортировать данные?","ОК+Отмена")="Отмена" Тогда Возврат; ИначеЕсли ФС.ВыбратьФайл(0,Файл,Каталог,"Открыть файл","Файлы Клиент-Банк (dbf)|*.dbf|Все файлы|*.*")=0 Тогда Возврат; КонецЕсли; //удаление строк Если КоличествоСтрок()>0 Тогда Если Вопрос("Удалить все строки табличной части документа?","Да+Нет")="Да" Тогда УдалитьСтроки(); КонецЕсли; КонецЕсли; //создание нового файла Б=СоздатьОбъект("XBase"); Б.ОткрытьФайл(Каталог+Файл,,1); Если Б.Открыта()=0 Тогда Сообщить("Не удалось открыть файл DBF","!"); Возврат; КонецЕсли; //справочник С=СоздатьОбъект("Справочник.Контрагенты"); //строки Счетчик=0; Для й=1 По Б.КоличествоЗаписей() Цикл Б.Перейти(й); //проверка Если Не(Б.OperData=ДатаДок) Тогда Продолжить; ИначеЕсли Не(Б.KodVal=980) Тогда Продолжить; ИначеЕсли Не(Число(Б.Kod_Cred)=Число(Фирма.РегКод)) Тогда Продолжить; ИначеЕсли Не(Число(Б.Mfo_Cred)=Число(Фирма.Банк.Код)) Тогда Продолжить; ИначеЕсли Не(Число(Б.Acc_Credit)=Число(Фирма.Счет)) Тогда Продолжить; КонецЕсли; //строка НоваяСтрока(); УстановитьАтрибут("Сумма",Б.OperSum); УстановитьАтрибут("Примечание",СокрЛП(Б.Naznach)); //контрагент Если С.НайтиПоРеквизиту("РегКод",Б.Kod_Deb,1)=0 Тогда С.Новый(); С.Наименование=СокрЛП(Б.Naim_Deb); С.РегКод=Б.Kod_Deb; С.Записать(); КонецЕсли; УстановитьАтрибут("Контрагент",С.ТекущийЭлемент()); //счётчик Счетчик=Счетчик+1; КонецЦикла; //закрытие файла Б.ЗакрытьФайл(); //извещение Предупреждение("Импортировано строк: "+Счетчик); КонецПроцедуры С недавних пор набирает популярность новый формат передачи многомерных массивов данных, который носит название eXtensible Markup Language или XML. Возможности нового языка разметки, используемого для хранения данных, огромны настолько, что его стали использовать даже для. передачи данных в программу 1С:Предприятие. Поэтому современный специалист по платформе 1С обязан уметь импортировать данные в 1С из файла, имеющего формат XML. //процедура формирует печатную таблицу с данными, содержащимися в файле формата XML Процедура Сформировать() Перем Файл,Каталог; Если ФС.ВыбратьФайл(0,Файл,Каталог,"Открытие документа XML","Документы XML|*.xml")=0 Тогда Возврат; КонецЕсли; //таблица Т=СоздатьОбъект("Таблица"); Т.ИсходнаяТаблица(""); Т.ВывестиСекцию("Шапка"); //документ Анализатор=СоздатьОбъект("AddIn.XMLParser"); Д=Анализатор.СоздатьДокумент(); Д.Загрузить(Каталог+Файл); //узлы Узел=Д.ВыбратьУзел("Данные"); Для i=1 По Узел.КоличествоПодчиненных() Цикл ТекУзел=Узел.ПолучитьПодчиненныйПоНомеру(i); Состояние(ТекУзел.Текст); //строка тЭлемент=ТекУзел.Наименование; тЗначение=ТекУзел.Значение; Т.ВывестиСекцию("Строка"); КонецЦикла; //таблица Т.Опции(1,1,1,0); Т.ПовторятьПриПечатиСтроки(1,1); Т.ТолькоПросмотр(1); Т.Показать("XML"); КонецПроцедуры РезюмеВ статье описаны программные методы, позволяющие импортировать данные в программу "1С:Предприятие 7.7" из внешних источников. Образцы практического применения описанных методов Вы сможете найти в статье "Обработки для администрирования 1С".
- Дополнительная информация по теме кодирования в 1С:
-
- Смотрите также:
- Учёт и формирование доверенностей в 1С
- Отчёты для 1С
- Скачать программы для 1С
- Как заработать в Интернете
|