Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: x-base Выгрузка сотрудников в файл дбф
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Змейкин
привет всем помогите!! не могу понять почему пишет "Поле агрегатного объекта не обнаружено (Name) "Дбф я определил(
//*******************************************
Перем Путь, ИмяФайла;
Перем ДБФ;

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

Процедура УстановитьДату(ТЭлемент)

    СпрСотр2=СоздатьОбъект("Справочник.Сотрудники");
        Если СпрСотр2.НайтиЭлемент(ТЭлемент)>0 Тогда
            СпрСотр2.ПризнакИзмененияДоходаДляИндексации.Установить(ДБФ.DatZ,1);
            Сообщить("Установлен признак изменения дохода.");
        Иначе
            Сообщить("Не найден элемент "+ТЭлемент);    
        КонецЕсли;

КонецПроцедуры    

Процедура Загрузить()
    ОткрытьБазу();
    Если ОткрытьБазу()=0 Тогда
        Возврат;
    КонецЕсли;


    
ДБФ.КодоваяСтраница(0);
    Сч=0;
    СпрСотр=СоздатьОбъект("Справочник.Сотрудники");
    СпрСотр.ИспользоватьДату(НачМесяца(ДатаВПериоде));
    // Цикл по записям ДБФ базы
    Пока ДБФ.ВКонце()=0 Цикл
      
        //текИНН = СокрЛП(ДБФ.INN);
        //текДатаУвольнения = ДБФ.Data2;
        
        СпрСотр.ИспользоватьРодителя(ПолучитьПустоеЗначение("Справочник.Сотрудники"));
      
        СпрСотр.Новый();
        СпрСотр.Код =СокрЛП(ДБФ.Code);
        СпрСотр.Наименование= СокрЛП(ДБФ.Name);
    
        СпрСотр.Имя      = СокрЛП(ДБФ.Imya);    //Имя
        СпрСотр.Фамилия  = СокрЛП(ДБФ.Famil);   //Фамилия
        СпрСотр.Отчество = СокрЛП(ДБФ.Otch);    //Отчество
    
        СпрСотр.Адрес = СокрЛП(ДБФ.Adres);   //Адрес
        СпрСотр.Телефон = СокрЛП(ДБФ.Pfone);    //Телефон
        Если ДБФ.Sex="М" Тогда
            СпрСотр.Пол=Перечисление.Пол.Мужской;
        ИначеЕсли ДБФ.Sex="Ж" Тогда
            СпрСотр.Пол=Перечисление.Пол.Женский;
        КонецЕсли;

        //СпрСотр.Фирма=НашаФирма;
        СпрСотр.Должность = СокрЛП(ДБФ.Dol);      //Должность
        
        СпрСотр.ДатаПриема = ДБФ.Data1;           //Дата приема
        Если ПустоеЗначение(ДБФ.Data2)=0 Тогда    //Дата увольнения
            СпрСотр.ДатаУвольнения = ДБФ.Data2;
        КонецЕсли;

        Если ДБФ.Tip=0 Тогда
            СпрСотр.ТипСотрудника = 1;           //Основной
        ИначеЕсли ДБФ.Tip=1 Тогда
            СпрСотр.ТипСотрудника = 0;           //Совместитель
        КонецЕсли;
    
        СпрСотр.Оклад = ДБФ.Okl;                 //Оклад
    
        СпрСотр.КвоЛьгот = ДБФ.KLgot;            //Кво льгот
    

        
        //Паспортные данные
        СпрСотр.ПаспортСерия = СокрЛП(ДБФ.Ser);     //Серия
        СпрСотр.ПаспортНомер = СокрЛП(ДБФ.Nom);     //Номер
        СпрСотр.ВыданДата = СокрЛП(ДБФ.DatPas);  //Дата выдачи
        СпрСотр.ВыданКем = СокрЛП(ДБФ.Vydan);     //Кем выдан

        СпрСотр.ИНН=СокрЛП(ДБФ.INN);

        СпрСотр.Записать();
        Сч=Сч+1;
        //Сообщить(Строка(Сч)+"Добавлен элемент справочника - "+ДБФ.Name+" ИНН: "+текИНН);

        УстановитьДату(СпрСотр.ТекущийЭлемент());
            
        ДБФ.Следующая();    
    КонецЦикла;
    ДБФ.ЗакрытьФайл();
    СпрСотр="";
    СпрСотрР="";
    Сообщить("Загрузка справочника закончена.");

КонецПроцедуры

Процедура Выбрать()
    Если (ФС.ВыбратьФайл(0,ИмяФайла,Путь,"Выбор файла загрузки","DBF файлы|*.DBF")=0) Тогда
        Путь="";
        Возврат;    
    КонецЕсли;    
КонецПроцедуры

Путь=КаталогИБ();

ДатаЗаписи='01.12.2006';
Vofka
В ДБФ-е нету колонки с именем Name, перепроверьте. Если она там есть - переименуйте колонку заново.
pablo
И зачем открывать базу в начале 2 раза? Для пущего эффекта?
Змейкин
да сделал вот выгрузку(обработка ) которая создает дбф таблицу куда я буду загружать из обработки
вот:
но все равно не выгружается(
Перем Путь, ИмяФайла;

Процедура ВыбратьПутьИмя()
    
    Если ФС.ВыбратьФайл(1, ИмяФайла, Путь, "Укажите имя DBF-файла (Запасы.DBF)","Файлы ДБФ (*.dbf)","dbf") <> 1 Тогда
        Возврат
    КонецЕсли;
    
КонецПроцедуры    

//*******************************************
Процедура Выгрузить()
    
    Попытка                  
        Если ФС.СуществуетФайл(Путь+"\"+ИмяФайла) = 1 Тогда
            ФС.УдалитьФайл(Путь+"\"+ИмяФайла);                
        КонецЕсли;
    Исключение
        Сообщить("Невозможно перезаписать файл с предыдущей выгрузкой.","!!!");
        Возврат;
    КонецПопытки;

    ДБФ=СоздатьОбъект("XBase");
        
    // Определяем поля
    ДБФ.ДобавитьПоле("Code","S", 10,);
    ДБФ.ДобавитьПоле("Name","S",30,);

    ДБФ.ДобавитьПоле("Imya","S",20,);    //Имя
    ДБФ.ДобавитьПоле("Famil","S",25,);   //Фамилия
    ДБФ.ДобавитьПоле("Otch","S",20,);    //Отчество

    ДБФ.ДобавитьПоле("Adres","S",100,);   //Адрес
    ДБФ.ДобавитьПоле("Pfone","S",32,);   //Телефон
    ДБФ.ДобавитьПоле("Sex","S",1,);      //Пол
    ДБФ.ДобавитьПоле("Dol","S",25,);      //Должность

    ДБФ.ДобавитьПоле("Dat1","D",8,);    //Дата приема

    ДБФ.ДобавитьПоле("Okl","N",12,2);    //Оклад
    ДБФ.ДобавитьПоле("Av", "N",12,2);     //Аванс
    ДБФ.ДобавитьПоле("Ser","S",12,2);
    ДБФ.ДобавитьПоле("Nom","S",12,2);

    ДБФ.ДобавитьПоле("Inv", "N",1,0);     //Инвалид
    

    ДБФ.ДобавитьПоле("INN","S",10,);      

    Попытка
        ДБФ.СоздатьФайл(Путь+"\"+ИмяФайла);
    Исключение
        Предупреждение("Ошибка создания файла " + Путь+"\"+ИмяФайла);
        Возврат;
    КонецПопытки;
    Если ДБФ.Открыта() = 0 Тогда
        Предупреждение("Ошибка открытия файла " + Путь+"\"+ИмяФайла);
        Возврат;
    КонецЕсли;

    Сч=0;
    СпрСотры=СоздатьОбъект("Справочник.Сотрудники");
    //ДБФ.КодоваяСтраница(0);
    СпрСотры.ИспользоватьДату(ДатаВыборки);
    СпрСотры.ВыбратьЭлементы();
    Пока СпрСотры.ПолучитьЭлемент() > 0 Цикл
        Если СпрСотры.ПометкаУдаления()=1 Тогда
            Продолжить;    
        КонецЕсли;
        
        Если ПустоеЗначение(СпрСотры.ДатаПриема)=1 Тогда
            Продолжить;    
        КонецЕсли;
        Если ПустоеЗначение(СпрСотры.ДатаУвольнения)=0 Тогда
            Если СпрСотры.ДатаУвольнения<'01.01.2007' Тогда
                Продолжить;    
            КонецЕсли;
        КонецЕсли;
        
        ДБФ.Добавить();
        ДБФ.Code  = СпрСотры.Код;
        ДБФ.Name  = СпрСотры.Наименование;
        ДБФ.Famil = СпрСотры.Фамилия;         //Фамилия
        ДБФ.Imya  =    СпрСотры.Имя;         //Имя
        ДБФ.Otch  = СпрСотры.Отчество;         //Отчество
        
        ДБФ.Adres = СпрСотры.Адрес;                         //Адрес
        ДБФ.Pfone = СпрСотры.Телефон;                       //Телефон
        ДБФ.Sex   = СпрСотры.Пол.Идентификатор();                   //Пол
        //ДБФ.Podr  = СпрСотры.Подразделение.Наименование;          //Подразделение
        ДБФ.Dol   = СпрСотры.Должность;//Должность
        ДБФ.Inv  =     СпрСотры.фЭтоИнвалид;
    
        ДБФ.Dat1  = СпрСотры.ДатаПриема;                 //Дата приема
        //ДБФ.Tip   = Совмещ;                                      //Совместительство
        
        ДБФ.Okl   = СпрСотры.Оклад;                                       //Оклад
          ДБФ.Av    = СпрСотры.Аванс;
        //Паспортные данные
        ДБФ.Ser   = СпрСотры.ПаспортСерия;       //Серия
        ДБФ.Nom   = СпрСотры.ПаспортНомер;       //Номер

        ДБФ.INN   = СпрСотры.ИНН;              //Строка 10

        Попытка
            ДБФ.Записать();
            Сч=Сч+1;
            Сообщить("Добавлена запись №" + Строка(Сч));
        Исключение
            Предупреждение("Ошибка записи!");
            Возврат;
        КонецПопытки;
        
    КонецЦикла;
    ДБФ.ЗакрытьФайл();
    Предупреждение("Выгрузка закончена!");
        
КонецПроцедуры

Процедура ПриОткрытии()
    
    Путь=КаталогИБ()+"\ExtForms";
    ИмяФайла="Сотрики.DBF";
    ДатаВыборки= '31.12.2006';
    
КонецПроцедуры

Vofka
Змейкин, а если Name убрать, все остальные поля считываются нормально?
Змейкин
Цитата(pablo @ 20.06.13, 13:48) необходимо зарегистрироваться для просмотра ссылки
И зачем открывать базу в начале 2 раза? Для пущего эффекта?

ой ничаянно


Цитата(Vofka @ 20.06.13, 13:51) необходимо зарегистрироваться для просмотра ссылки
Змейкин, а если Name убрать, все остальные поля считываются нормально?

нет тоже самое я вот выше обработку сделал и просто пытаюсь перезаписать Справочник в эту созданную таблицу но все равно не перезаписывет.
pablo
Перенаберите название этого поля во всех местах заново. Возможно, у вас вкралась в английское слово русская а или е
Змейкин
С именем и полями разобрался только всеравно ничего в файл не записываеться(
Pepe
В процесе выполнения какое сообщение - "ошибка..." или "Добавлена..."?
takefive
попробуйте убрать кириллицу из имени файла
Змейкин
Загрузка справочника успешно завершена

думаю может в коде что то не так не записывает почемуто(


Столбцы добавляются но значениями справочника не записываются
liliput
Попробуйте использовать функции форматирования текста: Строка(), СокрЛП(), Лев(Х,ДлинаСтроки). Может в этом проблема...
pablo
Судя по коду, данные у вас все неправильные. Пройдитесь отладчиком по выгрузке и увидите.
Змейкин
Все затер оставил только имя и код все равно пустые столбцы создаются

 ДБФ=СоздатьОбъект("XBase");

// Определяем поля
ДБФ.ДобавитьПоле("Code","S", 10,);
    ДБФ.ДобавитьПоле("Name","S",30,);
  ДБФ.Добавить();
  ДБФ.Code  = СпрСотры.Код;
  ДБФ.Name  = СпрСотры.Наименование;
Pepe
Попробуйте не использовать в наименованиях полей системные наименования переменных или имен. Больше всего меня смущает ДБФ.Name.
Змейкин
ДБФ=СоздатьОбъект("XBase");

// Определяем поля
ДБФ.ДобавитьПоле("Code","S", 10,);
    ДБФ.ДобавитьПоле("Name0","S",30,);
  ДБФ.Добавить();
  ДБФ.Code  = СпрСотры.Код;
  ДБФ.Name0  = СпрСотры.Наименование;
Цитата(Pepe @ 22.06.13, 10:06) необходимо зарегистрироваться для просмотра ссылки
Попробуйте не использовать в наименованиях полей системные наименования переменных или имен. Больше всего меня смущает ДБФ.Name.

вот добавил 0 в поле name все равно не записывает бред какойто 09000000.gif (
Pepe
Не записывает или записи пустые? Проверьте через КоличествоЗаписей(), КоличествоПолей() (в отладчике) факт занесения информации. Проверить можно через ПолучитьЗначениеПоля () информацию после записи. Можно использовать ф-цию АвтоСохранение(1) после создания базы (не надо использовать Записать()). Можно заменить
Цитата
ДБФ.Code = СпрСотры.Код;
на
ДБФ.УстановитьЗначениеПоля(Code,СпрСотры.Код)
Змейкин
Цитата(Pepe @ 22.06.13, 13:52) необходимо зарегистрироваться для просмотра ссылки
Не записывает или записи пустые? Проверьте через КоличествоЗаписей(), КоличествоПолей() (в отладчике) факт занесения информации. Проверить можно через ПолучитьЗначениеПоля () информацию после записи. Можно использовать ф-цию АвтоСохранение(1) после создания базы (не надо использовать Записать()). Можно заменить на
ДБФ.УстановитьЗначениеПоля(Code,СпрСотры.Код)

Поля создаются а значения в них нет пустые столбцы
ДБФ.УстановитьЗначениеПоля(Code,СпрСотры.Код)
так не видит "code" сделал так
ДБФ.УстановитьЗначениеПоля("Code".СпрСотры.Код)
но тоже не помогло(((((( help.gif
Pepe
Надо в отладчике посмотреть значения ваших переменных. Возможно они пустые и записываются пустые поля.
Змейкин

В самом Справочнике Элементы есть но при просмотре в отладчике по полям пишет ошибка выражения
Pepe
У вас неправильно организована выборка по справочнику.
Цитата
СпрСотры.ИспользоватьДату(ДатаВыборки);
используется для записи периодических реквизитов. Поэтому непонятно задание для выборки.
Змейкин
Цитата(Pepe @ 22.06.13, 23:03) необходимо зарегистрироваться для просмотра ссылки
У вас неправильно организована выборка по справочнику. используется для записи периодических реквизитов. Поэтому непонятно задание для выборки.

Да я даже комментирую датувыборки(на форме Это поле отбора для периодических значений "Тип Дата") периодических элементов и действую. через ВыбратьЭлементы() ПолучитьЭлемент() но запись тоже не происходит колонки записываются а значения нет Не знаю вообще что думать(
Домовик
  ДБФ.Code  = "1";
  ДБФ.Name  = "ИмяПоля";


и смотрим, присвоило или нет. если да - ошибка с прочитыванием справочника, если нет - записи в файл.

а чем вы открываете файл?



вот еще этот прикол непонятен... зачем?
        СпрСотр.ИспользоватьРодителя(ПолучитьПустоеЗначение("Справочник.Сотрудники"));






условия ниже отладчиком пройти тоже. возможно, вы до записи строк в файл не доходите...

  Если СпрСотры.ПометкаУдаления()=1 Тогда
            Продолжить;    
        КонецЕсли;
        
        Если ПустоеЗначение(СпрСотры.ДатаПриема)=1 Тогда
            Продолжить;    
        КонецЕсли;
        Если ПустоеЗначение(СпрСотры.ДатаУвольнения)=0 Тогда
            Если СпрСотры.ДатаУвольнения<'01.01.2007' Тогда
                Продолжить;    
            КонецЕсли;
        КонецЕсли;
igmig65
Во первых зачем записывать дбф каждую строку, тоесть в цикле, это раз.
И еще, не знаю может это влияет и на запись, на открытие влияет точно - имя файла максимум 8 символов.
Ну и как сказано выше, посмотрите заходит в цикл вообще, если да то должно выдавать ваше сообщение - добавлена запись №...
Cthulhu
Цитата(Pepe @ 22.06.13, 22:03) необходимо зарегистрироваться для просмотра ссылки
У вас неправильно организована выборка по справочнику. используется для записи периодических реквизитов. Поэтому непонятно задание для выборки.

"Описание встроенного языка" почему-то несогласно с процитированным. А именно:
Цитата
ИспользоватьДату
Установить дату выборки периодических реквизитов справочника.

Синтаксис:
ИспользоватьДату[<Дата>, <УстСразу>)
Англоязычный синоним: UseDate
Параметры:
<Дата> Необязательный параметр. Выражение со значением типа «дата».
<УстСразу> Необязательный параметр. Число: если 1, то дата, переданная в качестве параметра, будет установлена уже в текущей выборке; если 0 — то дата, переданная в качестве параметра будет установлена при следующей выборке. Значение по умолчанию — 0. Например:если "Цена" — периодический реквизит справочника, тоСпр.ИспользоватьДату(Д1, 1);Спр.ВыбратьЭлементы();А = Спр.Цена; — возвращает значение на дату Д1Спр.ИспользоватьДату(Д2, 1);Б = Спр.Цена; — возвращает значение на дату Д2!Если <УстСразу> — 0 (или опущен), тоСпр.ИспользоватьДату(Д1);Спр.ВыбратьЭлементы();А = Спр.Цена; — возвращает значение на дату Д1Спр.ИспользоватьДату(Д2);Б=Спр.Цена; — тоже возвращает значение на дату Д1!Спр.ВыбратьЭлементы();В=Спр.Цена; — только теперь возвращает значение на Д2.
Возвращаемое значение:
Текущее значение используемой даты (на момент до исполнения метода).
Описание:
Метод ИспользоватьДату устанавливает для объекта типа «справочник» дату, на которую будут в дальнейшем выбираться (или записываться) значения периодических реквизитов справочника.
Это очень важный метод, о котором необходимо всегда помнить при работе со справочниками, имеющими периодические реквизиты. Если он пропущен, то чначения выбранных периодических реквизитов справочника будут не определены.

Замечание: Если к объекту типа «справочник» однажды применен метод ИспользоватьДату, то в дальнейшем, чтобы выбирать значения периодических реквизитов справочника, нельзя применять к этому же объекту методы Получить и Установить, т. е. в такой последовательности эти методы несовместимы.
Замечание: Данный метод имеет следующую особенность применения: его нельзя использовать «через две точки». Например, если в документе с именем "ДокНакл" есть реквизит "Фирма" типа «справочник», у которого есть периодические реквизиты НДС и СН, то следующий оператор:
ДокНакл.Фирма.ИспользоватьДату(Дата);
работать не будет. В данном случае следует просто использовать промежуточную переменную, например:
ФирДок = ДокНакл.Фирма;
ФирДок.ИспользоватьДату(РабочаяДата());
НДСДок = ФирДок.НДС;

Пример:
// Здесь мы работаем в локальном контексте модуля Формы
// редактирования документа.
// Реквизит "Должность" в документе является справочником,
// у которого "МинОкл" - периодический реквизит
Длж = СоздатьОбъект("Справочник.Должности");
Длж.ИспользоватьДату(ДатаДок);
Длж.НайтиЭлемент(Должность);
Сообщить(Длж.Наименование + " Минимальный оклад" + Строка(Длж.МинОкл));
См. также: Получить, Установить, НайтиЭлемент, ВыбратьЭлементы


Цитата(igmig65 @ 25.06.13, 9:30) необходимо зарегистрироваться для просмотра ссылки
Во первых зачем записывать дбф каждую строку, тоесть в цикле, это раз. ...

Затем, что иначе заполненная новая запись не будет сохранена (добавлена) в файл (если не включен режим автосохранения).
Цитата
И еще, не знаю может это влияет и на запись, на открытие влияет точно - имя файла максимум 8 символов.

кстати, да. (прим.: запись - это тоже после открытия))
Змейкин
Загвоздка была в выгрузке в этом куске кода не выбирались из за него элементы
 Пока СпрСотры.ПолучитьЭлемент() > 0 Цикл
        Если СпрСотры.ПометкаУдаления()=1 Тогда
            Продолжить;    
        КонецЕсли;
        
        Если ПустоеЗначение(СпрСотры.ДатаПриема)=1 Тогда
            Продолжить;    
        КонецЕсли;
        Если ПустоеЗначение(СпрСотры.ДатаУвольнения)=0 Тогда
            Если СпрСотры.ДатаУвольнения<'01.01.2007' Тогда
                Продолжить;    
            КонецЕсли;
        КонецЕсли;


Цитата(Домовик @ 24.06.13, 19:53) необходимо зарегистрироваться для просмотра ссылки
  СпрСотр.ИспользоватьРодителя(ПолучитьПустоеЗначение("Справочник.Сотрудники"));

это в загрузке чтобы в дальнейшем хотел сделать чтобы сотрудники записывались в том же порядке как я их выгрузил

Спасибо всем огромное)очень помогли разобраться!!!! icon_beer17.gif
Vofka
Цитата(Змейкин @ 25.06.13, 18:49) необходимо зарегистрироваться для просмотра ссылки
Спасибо всем огромное)очень помогли разобраться!!!!

Жмите палец тем, кто помогал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.