Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 17:19

Учимся програмировать - импорт из 2х дбф связанных меж собой по полю(ключу)

Автор metiloff, 27 мая 2016, 06:50

0 Пользователей и 1 гость просматривают эту тему.

metiloff

Добрый день! стаж программирования в 1с - 3 недели+ книжка Радченко.
Сам себе поставил задачу. Есть дбф файл Pasport.dbf  и вторая дбф Prihod.dbf
в первой клиенты фио адрес и тд. вторая содержит даты посещений и номер кабинета.
По отдельности импортнуть в справочник сведения я могу.
Пока НЕ ФайлDBF.ВКонце() Цикл
    Лс= Справочники.ЛС.СоздатьЭлемент();
Лс.Наименование = ФайлDBF.ПолучитьЗначениеПоля("FIO");
Лс.Код= ФайлDBF.ПолучитьЗначениеПоля("INDEX");

Лс.Записать();
//Сообщить(ФайлDBF.NAME_MED);
ФайлDBF.Следующая(); //передвигаем курсор далее

Как импортнуть вторую дбф чтоб привязались все его посещения к нужному человеку ?
пример индекс фио
       АА01   Иванов
       АА02   петров
Индекс2 индекс кабинет дата
001      АА01    2      14.05
002      АА01    3       16.06
003      АА02    2      01.01.2016
Подскажите  в какую сторону гуглить или какие статейки почитать на эту тему

LexaK

вариантов великое множество, сам из ДБФ ни чего не грузил, поэтому кратко расскажу как это себе представляю,
вот одна схема
1. сначала грузите дбф таблицы - элементы, т.е. такие таблицы которые не ссылаются на другие, в вашем примере первый дбф
при его загрузке создаете Соответствие (во многих механизмах именно это как более универсальная) , можно структуру
пример Кода

...
лкДанные = Новый Соответствие;

(ваш цикл по чтению файла ДБФ1)

    (получение полей записи дбф1)
    ПолеИндекс = (Индекс из Дбф1);

    Объект1С = (создаете и заполняете данными из дбф1)
    Обект1С.Записать(); //можно поместить в попытку с анализом ошибки, если будет

    //помещаем созданный объект 1С в коллекцию со своим индексом
    лкДанные.Вставить(ПолеИндекс,Обект1С.Ссылка);

(КонецЦикла)


2. затем грузим таблицы дбф в которых есть ссылки на предыдущие таблицы, ваш пример таб.2


...
(ваш цикл по чтению файла ДБФ2)

    (получение полей записи дбф2)
    ПолеИндекс = (Индекс из Дбф2); //индекс который ссылается на дбф1

    Объект1С = (создаете и заполняете данными из дбф2)
    лкЭлемент = лкДанные.Получить(ПолеИндекс);
   
    //проверяем, есть ли занчение по данному индексу
   Если лкЭлемент = Неопределено Тогда
       Сообщить("Для индекса: " + ПолеИндекс + ", не загруженны исходные данные!")
   Иначе   
       Объект1С.(НужныйРеквизит) = лкЭлемент;
   КонецЕсли;

    Обект1С.Записать(); //можно поместить в попытку с анализом ошибки, если будет

(КонецЦикла)


понятное дело что при загрузке нескольких таблиц дбф, при необходимости надо создать несколько коллекций(соответствий) с данными
и использовать их для промежуточного хранения загружаемых объектов.
Такой механизм используется при конвертации/обмене данных между разными базами 1С.

но так же возможны и другие варианты загрузки,
все зависит от полета мысли программиста, если они(мысли) у него конечно есть. ;)

если помогло нажмите: Спасибо!

metiloff

спасибо, завтра буду разбираться.
А вторую оформить табличной частью ?
Где то видел видео с обучением, там встают на фио контрагента а внизу в табличной части отображаются договора относящиеся к контрагенту. Вот у меня такая же задача отобразить у контрагента его посещения

sttt

Цитата: metiloff от 27 мая 2016, 06:50
Добрый день! стаж программирования в 1с - 3 недели+ книжка Радченко.
Сам себе поставил задачу. Есть дбф файл Pasport.dbf  и вторая дбф Prihod.dbf
в первой клиенты фио адрес и тд. вторая содержит даты посещений и номер кабинета.
По отдельности импортнуть в справочник сведения я могу.
Пока НЕ ФайлDBF.ВКонце() Цикл
    Лс= Справочники.ЛС.СоздатьЭлемент();
Лс.Наименование = ФайлDBF.ПолучитьЗначениеПоля("FIO");
Лс.Код= ФайлDBF.ПолучитьЗначениеПоля("INDEX");

Лс.Записать();
//Сообщить(ФайлDBF.NAME_MED);
ФайлDBF.Следующая(); //передвигаем курсор далее

Как импортнуть вторую дбф чтоб привязались все его посещения к нужному человеку ?
пример индекс фио
       АА01   Иванов
       АА02   петров
Индекс2 индекс кабинет дата
001      АА01    2      14.05
002      АА01    3       16.06
003      АА02    2      01.01.2016
Подскажите  в какую сторону гуглить или какие статейки почитать на эту тему

А еще лучше воспользоваться индексами самой дбф, без всей этой лабутены - типа соответствия...
Индексы позволят загружать и обрабатывать большие данные, без использования оперативной памяти, ее вечно не хватает...


ФайлНаДиске = Новый Файл(ИмяФайла);
Если НЕ(ФайлНаДиске.Существует()) Тогда
      Предупреждение("Файл с таким именем не существует " + ИмяФайла);
      Возврат;
КонецЕсли;

ДБФ = Новый xBase;
ДБФ.Кодировка  = КодировкаXBase.OEM;
ДБФ.ОткрытьФайл(ИмяФайла);
Если ДБФ.Открыта() = 0 Тогда
      Предупреждение("Неудалось открыть файл. Возможно он занят другим приложением!");
      Возврат;
КонецЕсли;
     
ДБФ.Индексы.Добавить("IDX_vE","VAL(EXTENSION)",Ложь,Ложь,"PREFLEN1>0");
ДБФ.СоздатьИндексныйФайл(ИмяИндекса);
ДБФ.ТекущийИндекс = ДБФ.Индексы.IDX_vE;


ДБФ.Ключ.EXTENSION = "1002";
Если ДБФ.НайтиПоКлючу("=") = Истина Тогда
      ТекЗапись=ДБФ.НомерЗаписи();
      Пока СокрЛП(ДБФ.EXTENSION) = "1002" Цикл
            Сообщить("-" + ДБФ.EXTENSION + " - " + ДБФ.НомерЗаписи() + "-");
            ДБФ.Следующая();
      КонецЦикла;
Иначе
      Сообщить("Ненайдено ниодной записи!");
КонецЕсли;

ДБФ.ЗакрытьФайл();
УдалитьФайлы(ИмяИндекса);

metiloff


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск