При работе с внешними базами данных часто возникает задача автоматической загрузки информации из файлов формата DBF в документы платформы 1С. Для этого встроенный язык 1С предоставляет специализированный объект XBase, который позволяет открывать файлы таблицы, обходить их по строкам и считывать значения полей.
Рассмотрим по шагам, как правильно построить алгоритм загрузки данных, избежав распространенных ошибок с циклом создания документов и обработкой типов данных.
ДиалогВыбораФайла для получения пути к внешнему файлу DBF.XBase и открытие файла методом ОткрытьФайл().КоличествоЗаписей().Документы.ДоговорНаПоставкуГаза.СоздатьДокумент()). Важно выполнять создание объекта до входа в цикл обхода строк, если все данные из файла должны попасть в один документ.Добавить().Записать() у документа и ЗакрытьФайл() у объекта XBase.Разберем готовый пример процедуры, которая считывает сведения из DBF-файла и заполняет табличную часть Реестр нового документа ДоговорНаПоставкуГаза.
Процедура ДействияФормыЗагрузить(Кнопка)
// 1. Выбор каталога или файла
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог";
Если Не ДиалогОткрытия.Выбрать() Тогда
Возврат;
КонецЕсли;
// 2. Инициализация и открытие DBF
ДБФ = Новый XBase;
ДБФ.ОткрытьФайл("D:\281117.DBF");
// 3. Проверка на наличие записей
Если ДБФ.КоличествоЗаписей() = 0 Тогда
Сообщить("Файл данных пуст");
ДБФ.ЗакрытьФайл();
Возврат;
КонецЕсли;
// 4. Переход к первой строке файла
ДБФ.Первая();
// 5. Создание нового документа перед циклом
Док = Документы.ДоговорНаПоставкуГаза.СоздатьДокумент();
Док.Дата = ТекущаяДата();
// 6. Обход записей файла DBF
Пока Истина Цикл
// Добавляем новую строку в табличную часть "Реестр"
НоваяСтрока = Док.Реестр.Добавить();
// Заполняем реквизиты строки значениями из полей DBF
НоваяСтрока.ЛицевойСчет = ДБФ.LS;
НоваяСтрока.ФИО = ДБФ.FIO;
НоваяСтрока.ПочтовыйИндекс = ДБФ.INDEX;
НоваяСтрока.УчастокОбслуживания = ДБФ.RAION;
НоваяСтрока.НаселенныйПункт = ДБФ.NASPUNKT;
НоваяСтрока.Улица = ДБФ.UL;
НоваяСтрока.НомерДома = ДБФ.DOM;
НоваяСтрока.НомерКвартиры = ДБФ.KV;
НоваяСтрока.НомерКомнаты = ДБФ.KOMNATA;
НоваяСтрока.ДатаЗаключенияДоговораНаПоставкуГаза = ДБФ.DDOG;
НоваяСтрока.НомерДоговораНаПоставкуГаза = ДБФ.NDOG;
НоваяСтрока.ДатаВыдачиДоговораНаРуки = ДБФ.DVID;
НоваяСтрока.НомерМобильногоТелефона = ДБФ.T_SOT;
НоваяСтрока.НомерДомашнегоТелефона = ДБФ.T_DOM;
НоваяСтрока.КодАдресаПоФИАС = ДБФ.KOD;
// Переходим к следующей записи
Если Не ДБФ.Следующая() Тогда
// Если записи закончились, выходим из цикла
Прервать;
КонецЕсли;
КонецЦикла;
// 7. Сохранение документа и закрытие DBF-файла
Док.Записать();
ДБФ.ЗакрытьФайл();
Сообщить("Загрузка успешно завершена!");
КонецПроцедуры
Проанализируем ключевые нюансы, с которыми сталкиваются разработчики при обработке DBF-файлов:
СоздатьДокумент() поместить внутрь цикла Пока, программа будет создавать новый документ на каждую прочитанную строку DBF-файла. Чтобы все записи попали в один документ, объект создается строго до входа в цикл обхода.DDOG, DVID) должны корректно считываться объектом XBase. Если даты не отображаются в табличной части, необходимо убедиться, что тип реквизита табличной части совпадает с типом данных источника (тип Дата), а также проверить корректность отображения элемента на форме документа. В некоторых случаях требуется пересоздание элемента формы или явное приведение типов.XBase поддерживает имена полей длиной не более 10 латинских символов (например, NASPUNKT, KOMNATA). Обращение к полям происходит через точку от объекта (ДБФ.FIO).ЗакрытьФайл() после завершения работы, иначе файл останется заблокированным в системе.