перенос данных из Dbf

Тема в разделе "1C и всё что с ней связано", создана пользователем lira89, 30 мар 2010.

  1. lira89

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    Код (Text):
    //*******************************************
    Процедура Выполнить()
    ДатаОбр = РабочаяДата();
    ДБФ      = СоздатьОбъект("Xbase");

    Табл=СоздатьОбъект("ТаблицаЗначений"); 
    Табл.НоваяКолонка("КодФак","Число",2,0,"Код факультета",7);
    Табл.НоваяКолонка("КратНаимен","Строка",15,,"Краткое наименование",15);
    Табл.НоваяКолонка("ПолноеНаимен","Строка",25,,"Полное наименование",25);
    Табл.НоваяКолонка("КратНаименБел","Строка",15,,"Краткое наименование на белорусском языке",15);
    Табл.НоваяКолонка("ПолноеНаименБел","Строка",25,,"Полное наименование на белорусском языке",25);

    ИмяФайла="FACULTS.DBF";
    ИмяПути = СокрЛП(КаталогИБ())+"perenos\";
    ПутьДБ=ИмяПути + ИмяФайла;                      
    Если ФС.СуществуетФайл(ПутьДБ)=1 тогда  
    Сообщить("Файл существует");
    ДБФ.ОткрытьФайл(ПутьДБ);
    ДБФ.Первая();
    Пока ДБФ.ВКонце()=0 Цикл
    Сообщить("Записываем в аблицу значений");
    Табл.НоваяСтрока();
    Табл.КодФак   = ДБФ.ПолучитьЗначениеПоля(1);
    Табл.КратНаимен   = ДБФ.ПолучитьЗначениеПоля(2);
    Табл.ПолноеНаимен   = ДБФ.ПолучитьЗначениеПоля(3);
    Табл.КратНаименБел = ДБФ.ПолучитьЗначениеПоля(4);
    Табл.ПолноеНаименБел = ДБФ.ПолучитьЗначениеПоля(5);
    ДБФ.Следующая();
    КонецЦикла;  
    КонецЕсли;      
    ДБФ.ЗакрытьФайл();

    Табл.Сортировать("ПолноеНаимен");

    Ном1=0;
    Ном=0;
    СпрФакультеты = СоздатьОбъект("Справочник.Факультеты");
    СпрФакультеты.ИспользоватьДату(ДатаОбр);
    СпрФакультеты.ПорядокНаименований();
    СпрФакультеты.ВыбратьЭлементы();
    Пока СпрФакультеты.ПолучитьЭлемент() = 1 Цикл
    Если СпрФакультеты.ЭтоГруппа() = 1 Тогда
    Продолжить;
    КонецЕсли;

    Призн=0;
    Табл.ВыбратьСтроки();
    Пока Табл.ПолучитьСтроку() = 1 Цикл
    Если ЗаноситьДанные=1 Тогда       
    Сообщить("ЗаноситьДанные=1");
    СпрФакультеты.КодФак =       Табл.КодФак;  
    СпрФакультеты.КратНаимен =   Табл.КратНаимен;
    СпрФакультеты.ПолноеНаимен = Табл.ПолноеНаимен;
    СпрФакультеты.КратНаименБел = Табл.КратНаименБел;
    СпрФакультеты.ПолноеНаименБел = Табл.ПолноеНаименБел;
    Сообщить("Записали в справочник");      
    СпрФакультеты.Записать();
    Призн=1;
    КонецЕсли;
    КонецЦикла;  
    Если Призн=0 Тогда  
    Ном1=Ном1+1;  
    Сообщить("Перешли на след номер");
    КонецЕсли;
    КонецЦикла;  

    КонецПроцедуры
    Не могу найти проблему: вроде бы все считывает из файла, но справочник остается пустым. Никаких ошибок не возникает. Реализация 7,7. Подскажите пожалуйста решение.
     
  2. kaa

    kaa Гость

    1. Посмотреть в отладчике заполняется Табл или нет
    2. А есть ли в справочнике СпрФакультеты элементы ибо если нет то в цикл и не заходит
    3. А не может ли быть что ЗаноситьДанные всегда равно 0
     
  3. Chemist

    Chemist Гость

    А где создание нового элемента справочника?

    После:
    Если ЗаноситьДанные=1 Тогда

    Ставишь:
    СпрФакультеты.Новый();
     
  4. nikakoy

    nikakoy New Member

    Регистрация:
    1 дек 2008
    Сообщения:
    2
    Симпатии:
    0
    сам смысл кода...
    перебор элементов справочника и перезапись каждого из них по всем строкам таблицы... если элементы есть, то у каждого значения из последней строки таблицы....
    о_О
    или я чего то не понимаю???
     
  5. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Если есть желание переписать элементы справочника, написано неправильно, если добавить новые, то тоже неправильно
     
  6. TimeDontWait

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    Ето зачем ?
    Для записи используй в цикле
    Код (Text):
    СпрФакультеты.Новый();
    СпрФакультеты.использоватьДату(НекаяДата);
     
  7. lira89

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    Спасибо всем, я учла все замечания и все заработало :ya_lamo:
    Однако у меня появился еще один вопрос насчет подчиненного справочника. При загрузке из dbf двух справочников (один из них подчиненный) в отладчике все проходит отлично, однако в базе подчиненный справочник, после выбора соответствующего элемента из главного справочника, остается пустым. Я плохо ориентируюсь с методами справочников, которые определяют владельцев и т .п., возможно кто-нибудь поможет исправить этот недочет. В конфигураторе в справочниках установлена связка подчиненности. Ниже код, все таже реализация 7.7. Модуль выполнен в обработке. Заранее благодарна
    Код (Text):
    Процедура Выполнить()
    ДатаОбр = РабочаяДата();
    ДБФ      = СоздатьОбъект("Xbase");
    Табл=СоздатьОбъект("ТаблицаЗначений"); 
    Табл.НоваяКолонка("КодФак","Строка",2,0,"Код факультета",7);
    Табл.НоваяКолонка("КратНаимен","Строка",15,,"Краткое наименование",15);
    Табл.НоваяКолонка("Наименование","Строка",25,,"Полное наименование",25);
    Табл.НоваяКолонка("КратНаименБел","Строка",15,,"Краткое наименование на белорусском языке",15);
    Табл.НоваяКолонка("ПолноеНаименБел","Строка",25,,"Полное наименование на белорусском языке",25);
    ИмяФайла="FACULTS.DBF";  
    ИмяПути = СокрЛП(КаталогИБ())+"perenos\";
    ПутьДБ=ИмяПути + ИмяФайла;                      
    Если ФС.СуществуетФайл(ПутьДБ)=1 тогда  
    Сообщить("Файл существует");
    ДБФ.ОткрытьФайл(ПутьДБ);
    ДБФ.Первая();
    Пока ДБФ.ВКонце()=0 Цикл
    Сообщить("Записываем в таблицу значений");
    Табл.НоваяСтрока();
    Табл.КодФак   =СокрЛП(ДБФ.ПолучитьЗначениеПоля(1));
    Табл.КратНаимен   = СокрЛП(ДБФ.ПолучитьЗначениеПоля(2));
    Табл.Наименование   = СокрЛП(ДБФ.ПолучитьЗначениеПоля(3));
    Табл.КратНаименБел = СокрЛП(ДБФ.ПолучитьЗначениеПоля(4));
    Табл.ПолноеНаименБел = СокрЛП(ДБФ.ПолучитьЗначениеПоля(5));
    ДБФ.Следующая();
    КонецЦикла;  
    //Табл.Сортировать("Наименование");
    Таб=СоздатьОбъект("Таблица");
    Таб.ВывестиСекцию("Шапка");
    Ном=0;
    СпрФакультеты = СоздатьОбъект("Справочник.Факультеты"); // справочник владелец
    //СпрФакультеты.ПорядокНаименований();
    Табл.ВыбратьСтроки();
    Пока Табл.ПолучитьСтроку() > 0 Цикл  
    Если СпрФакультеты.НайтиПоРеквизиту("КодФак",Табл.КодФак,1)=1 тогда
    Сообщить("Запись факультета"""+Табл.Наименование+""" с кодом"""+Табл.КодФак+""" уже существует.");
    Продолжить;    
    Иначе
    Сообщить("ЗаноситьДанные");
    СпрФакультеты.Новый();
    СпрФакультеты.ИспользоватьДату(ДатаОбр);
    СпрФакультеты.КодФак =СокрЛП(Табл.КодФак);  
    СпрФакультеты.КратНаимен =   СокрЛП(Табл.КратНаимен);
    СпрФакультеты.Наименование = СокрЛП(Табл.Наименование);
    СпрФакультеты.КратНаименБел = СокрЛП(Табл.КратНаименБел);
    СпрФакультеты.ПолноеНаименБел = СокрЛП(Табл.ПолноеНаименБел);
    Ном=Ном+1;
    Сообщить("Записали в справочник");      
    СпрФакультеты.Записать();   

    Таб.ВывестиСекцию("Факультеты");
    КонецЕсли;
    КонецЦикла;  
    //  Таб.Показать();
    Иначе
    Сообщить ("Файла с факультетами в папке """+ИмяПути +""" не существует!!!");
    СтатусВозврата(0);
    КонецЕсли;    
    ДБФ.ЗакрытьФайл();
    /////////ДОБАВЛЕНИЕ ЗАПИСЕЙ В СПРАВОЧНИК "ГРУППЫ" (подчиненный справочник )
    ДБФ1     = СоздатьОбъект("Xbase");
    Табл1=СоздатьОбъект("ТаблицаЗначений");
    Табл1.НоваяКолонка("КодГруппы","Строка",5,0,"Код группы",7);
    Табл1.НоваяКолонка("ФормаОбучения","Строка",1,,"Формы обучения",5);
    Табл1.НоваяКолонка("КодКвалификации","Строка",3,,"Код квалификации",5);
    Табл1.НоваяКолонка("ГодГруппы","Число",4,,"Год группы",5);
    Табл1.НоваяКолонка("Наименование","Строка",10,,"Наименование группы",10);
    Табл1.НоваяКолонка("ЧислоСтудентов","Число",2,,"Число студентов в группе",3);
    Табл1.НоваяКолонка("ФамСтаросты","Строка",25,,"Фамилия и инициалы старосты",25);
    Табл1.НоваяКолонка("КодФакультета","Строка",2,0,"Код факультета",7);
    ИмяФайла="УчГруппы.DBF";
    ИмяПути = СокрЛП(КаталогИБ())+"perenos\";
    ПутьДБ=ИмяПути + ИмяФайла;                      
    Если ФС.СуществуетФайл(ПутьДБ)=1 тогда  
    Сообщить("Файл существует");
    ДБФ.ОткрытьФайл(ПутьДБ);
    ДБФ.Первая();
    Пока ДБФ.ВКонце()=0 Цикл
    Сообщить("Записываем в таблицу значений учебную группу");
    Табл1.НоваяСтрока();
    Табл1.КодГруппы    = СокрЛП(ДБФ.ПолучитьЗначениеПоля(1));
    Табл1.ФормаОбучения    = СокрЛП(ДБФ.ПолучитьЗначениеПоля(2));
    Табл1.КодКвалификации    = СокрЛП(ДБФ.ПолучитьЗначениеПоля(3));
    Табл1.ГодГруппы    = СокрЛП(ДБФ.ПолучитьЗначениеПоля(4));
    Табл1.Наименование  = СокрЛП(ДБФ.ПолучитьЗначениеПоля(5));
    Табл1.ЧислоСтудентов  = СокрЛП(ДБФ.ПолучитьЗначениеПоля(6));
    Табл1.ФамСтаросты    = СокрЛП(ДБФ.ПолучитьЗначениеПоля(7));
    Табл1.КодФакультета    = СокрЛП(ДБФ.ПолучитьЗначениеПоля(8));
    ДБФ.Следующая();
    КонецЦикла;  
    Ном1=0;
    СпрУчебГруппы = СоздатьОбъект("Справочник.Группы");
    //           СпрУчебГруппы.Родитель(СпрФакультеты);
    СпрФакультеты.ВыбратьЭлементы();
    Пока СпрФакультеты.ПолучитьЭлемент()=1 Цикл
    СпрУчебГруппы.ИспользоватьВладельца(СпрФакультеты.ТекущийЭлемент());
    Табл1.ВыбратьСтроки();
    Пока Табл1.ПолучитьСтроку() > 0 Цикл   
    Если СпрФакультеты.КодФак = Табл1.КодФакультета тогда
    Если СпрУчебГруппы.НайтиПоРеквизиту("КодГруппы",Табл1.КодГруппы,0)=1 тогда
    Сообщить("Запись группы"""+Табл1.Наименование+""" с кодом"""+Табл1.КодГруппы+""" уже существует.");
    Продолжить;    
    Иначе
    Сообщить("ЗаноситьДанные учебных групп");
    СпрУчебГруппы.Новый();
    //  СпрУчебГруппы.Владелец = СпрФакультеты.ТекущийЭлемент();
    СпрУчебГруппы.ИспользоватьДату(ДатаОбр);
    СпрУчебГруппы.КодГруппы =Табл1.КодГруппы;  
    СпрУчебГруппы.ФормаОбучения =Табл1.ФормаОбучения;
    СпрУчебГруппы.Квалификация = Табл1.КодКвалификации;
    СпрУчебГруппы.ГодНачала = Табл1.ГодГруппы;
    СпрУчебГруппы.Наименование = Табл1.Наименование;  
    СпрУчебГруппы.ЧислоСтудентов = Табл1.ЧислоСтудентов;
    СпрУчебГруппы.Староста = Табл1.ФамСтаросты;  
    СпрУчебГруппы.КодФакультета = Табл1.КодФакультета;
    Ном1=Ном1+1;
    Сообщить("Записали в справочник учебную группу");      
    СпрФакультеты.Записать();
    Таб.ВывестиСекцию("Группы");   
    КонецЕсли;  
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;  
    Иначе
    Сообщить ("Файла УчебныеГруппы в папке """+ИмяПути +""" не существует!!!");
    СтатусВозврата(0);
    КонецЕсли;    
    ДБФ1.ЗакрытьФайл();  
    Таб.Показать();                 

    КонецПроцедуры
     
  8. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Весь код сотри, оставь только то, что вызывает сомнения или вопросы. Никому не интересно читать сотню бессмысленных строк
     
  9. TimeDontWait

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    Убери коментарий
    ИспользоватьВладельца() - для поиска, выборки, перебора
    Владелец - для записи
    И почему
    Ты ведь записываеш в справочник СпрУчебГруппы...
     
  10. kazak85

    kazak85 Гость

    а есть у кого нить пример переноса из dbf только для 8 версии???
     
  11. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    kazak85, а какие у вас возникли проблемы?
     
  12. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Вместо
    СпрУчебГруппы.ЗАписать();
     
  13. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Смотрел тему. Хотел принять участие. Глянул по диагонали тексты. Расхотел.

    lira89! Хорошая Вы девочка, любознательная такая, спрашиваете так активно. Но уж скажу прямо, глядя на тему: это то, что называется "нагружаете".
    Влоб начинаете с текста модуля, что правила не рекомендуют. А чтоб мало не показалось, получите ишчо на 2 листа.
    Вам пишут: "Весь код сотри, оставь только то, что вызывает сомнения или вопросы. Никому не интересно читать сотню бессмысленных строк".
    Получается, что Вы не совета просите, а просите поковыряться вместо себя. Да, бывает, что проблема в программе не находится. Тогда подайте обществу вопрос компактно и красиво.

    Примите мое ворчание как пожелание успешной работы.
     
  14. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    kazak85
    Есть конечно. Но он и в СП есть.
     

    Вложения:

    • DBF.rar
      Размер файла:
      24,2 КБ
      Просмотров:
      8
  15. kazak85

    kazak85 Гость

    у меня получаеться dbf с кучей колонок из которых надо выбрать 4 и перенести их в справочник контрагенты
     
  16. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Я бы повторил еще раз : так в чем все же проблема ?
     
  17. kazak85

    kazak85 Гость

    у меня записывает только 1 элемент таблицы, а остальные просто опускает
     
  18. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Странный человек :)
    Неужели ты думаешь, что такое описание достаточно, чтобы дать дельный совет ?
     
  19. lira89

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    Спасибо за замечание. Просто с моим очень маленьким опытом сложно было выделить какую-то определенную часть (особенно когда точно не знаешь где ошибка). В следующий раз буду внимательнее и не буду так "нагружать" :) , сама понимаю, что рыться в большом коде (да еще и в чужом) не очень хочется :) .
    И спасибо всем за советы и замечания, очень помогают ;) .
     
  20. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Использование отладчика весьма способствует локализации проблемы :rolleyes:
     
Загрузка...

Поделиться этой страницей