Имя: Пароль:
1C
1С v8
v8: Не открывает базу при выгрузке в dbf
0 Pozdnyakov
 
26.03.12
13:34
Добрый день!
Необходимо создать dbf файл и выгрузить справочник в него, при компиляции выдает: Ошибка при вызове метода контекста (Добавить): Перед выполнением операции нужно открыть базу
я же только что создала её.
В чем может быть причина? Версия 1С 8.2 (обычное приложение), код пишу в модуле формы (нажатие кнопки)


Процедура ВыгрузитьСправочник(Элемент,ПараметрКоманды, ПараметрыВыполненияКоманды)
Файл = Новый XBase;
Файл.Поля.Добавить("Ind"," N" , 2);
Файл.Поля.Добавить("Month", "S", 8);
Файл.Поля.Добавить("Hours", "N", 3);
Файл.Поля.Добавить("Days", "N", 2);
 Файл.СоздатьФайл("с:\start.dbf");
Файл.ОткрытьФайл("с:\start.dbf" );
Если Файл.Открыта() = 1 Тогда
  Предупреждение("База открыта", 2);
 Иначе
  Предупреждение("НЕ смогли открыть Базу!", 2);
КонецЕсли;

Файл.АвтоСохранение = Истина;
Файл.ОткрытьФайл("с:\start.dbf" );
 Файл.КодОшибки();
Выборка = Справочники.КалендарьПлановый.Выбрать();
Пока Выборка.Следующий() Цикл
   Файл.Добавить();
   Файл.Ind = Выборка.Код;
   Файл.Month = Выборка.Месяц;
   Файл.Hours = Выборка.ЧислоЧасов;
   Файл.Days = Выборка.ЧислоДней;
КонецЦикла;

Файл.ЗакрытьФайл();

КонецПроцедуры
1 qeos
 
26.03.12
13:36
а что говорит СП?
2 andrewks
 
26.03.12
13:38
я таки не понял, какого вы пола?
3 hhhh
 
26.03.12
13:38
кто такой Нем? И почему Поздняков и вдруг "создала"?
4 andrewks
 
26.03.12
13:39
ну и каша в коде...
5 vmv
 
26.03.12
13:44
(0) + (4) избавиться от каши можно так

Процедура ПолучитьСводнуюDBF(Элемент)
   Перем ПерефиксТаблицы;
   Перем КаталогDBF, ИмяФайлаDBF, ПолноеИмяФайлаDBF, xB;
       
   ПрефиксТаблицы = Прав(Элемент.Имя, 2);
       
   ИмяФайлаDBF = "DBF_" + ПрефиксТаблицы + ".DBF";  
   
   КаталогДанных = ЭтаФорма.КаталогДанных;
   КаталогDBF    = КаталогДанных + "\" + "DBF";
   Если Не СуществуетФайл(КаталогDBF) Тогда
       СоздатьКаталог(КаталогDBF);
   Иначе
       УдалитьФайлы(КаталогDBF, ИмяФайлаDBF);
   КонецЕсли;
   
   ПолноеИмяФайлаDBF = КаталогDBF + "\" + ИмяФайлаDBF;
   
   xB = Новый xBase();
   
   Если ПрефиксТаблицы = "05" Тогда
       СоздатьСтруктуру_xB_05(xB);
   ИначеЕсли ПрефиксТаблицы = "06" Тогда
       СоздатьСтруктуру_xB_06(xB);
   ИначеЕсли ПрефиксТаблицы = "07" Тогда    
       СоздатьСтруктуру_xB_07(xB);
   ИначеЕсли ПрефиксТаблицы = "08" Тогда
       СоздатьСтруктуру_xB_08(xB);
   КонецЕсли;

   xB.СоздатьФайл(ПолноеИмяФайлаDBF);
   
   Если Не xB.Открыта() Тогда  
       Предупреждение("Не удалось создать и открыть указанный файл >> " + ПолноеИмяФайлаDBF);  
       Возврат;
   КонецЕсли;  
   
   Если ПрефиксТаблицы = "05" Тогда
       ДобавленыЗаписи = ДобавитьЗаписи_xB_05(xB, ПрефиксТаблицы);
   ИначеЕсли ПрефиксТаблицы = "06" Тогда
       ДобавленыЗаписи = ДобавитьЗаписи_xB_06(xB, ПрефиксТаблицы);
   ИначеЕсли ПрефиксТаблицы = "07" Тогда    
       ДобавленыЗаписи = ДобавитьЗаписи_xB_07(xB, ПрефиксТаблицы);        
   ИначеЕсли ПрефиксТаблицы = "08" Тогда
       ДобавленыЗаписи = ДобавитьЗаписи_xB_08(xB, ПрефиксТаблицы);        
   КонецЕсли;
   
   Если ДобавленыЗаписи Тогда
      ЭлементыФормы["ндСводнаяТаблица" + ПрефиксТаблицы].Заголовок = "Сводная таблица " + ПрефиксТаблицы + " >> " + ПолноеИмяФайлаDBF;
   Иначе  
      xB.ОчиститьФайл();    
   КонецЕсли;
   
   xB.ЗакрытьФайл();
     
КонецПроцедуры


Процедура СоздатьСтруктуру_xB_05(xB)
   
   xB.Поля.Добавить("PERIOD_M"   ,"N",2  ,0);
   xB.Поля.Добавить("PERIOD_Y"   ,"N",4  ,0);
   
   xB.Поля.Добавить("ROWNUM"     ,"N",6  ,0);
   
   xB.Поля.Добавить("UKR_GROMAD" ,"N",1  ,0);
   xB.Поля.Добавить("ZO"         ,"N",2  ,0);
   
   xB.Поля.Добавить("NUMIDENT"   ,"S",10 ,0);
   xB.Поля.Добавить("LN"         ,"S",100,0);
   xB.Поля.Добавить("NM"         ,"S",100,0);
   xB.Поля.Добавить("FTN"        ,"S",100,0);
   xB.Поля.Добавить("START_DT"   ,"N",2  ,0);
   xB.Поля.Добавить("END_DT"     ,"N",2  ,0);
   xB.Поля.Добавить("PID_ZV"     ,"S",150,0);
   
КонецПроцедуры
Функция ДобавитьЗаписи_xB_05(xB, ПрефиксТаблицы)
   Перем ТаблицаДанных, КоличествоЗаписейНаЛисте;
   Перем Строка, ТекущийНомерЗаписиНаЛисте;
       
   ТаблицаДанных = ЭтаФорма["Таблица" + ПрефиксТаблицы];
   КоличествоЗаписейНаЛисте = ЭтаФорма["КоличествоЗаписейНаЛисте" + ПрефиксТаблицы];

   ТекущийНомерЗаписиНаЛисте = 0;
   
   Для Каждого Строка Из ТаблицаДанных Цикл
       
       ТекущийНомерЗаписиНаЛисте = ТекущийНомерЗаписиНаЛисте + 1;
       
       Если ТекущийНомерЗаписиНаЛисте > КоличествоЗаписейНаЛисте Тогда
           ТекущийНомерЗаписиНаЛисте = 1;
       КонецЕсли;
       
       xB.Добавить();
       
       xB.УстановитьЗначениеПоля("PERIOD_M"  ,ПреобразоватьВЧисло(Строка.PERIOD_M));
       xB.УстановитьЗначениеПоля("PERIOD_Y"  ,ПреобразоватьВЧисло(Строка.PERIOD_Y));
       
       xB.УстановитьЗначениеПоля("ROWNUM"  ,ПреобразоватьВЧисло(ТекущийНомерЗаписиНаЛисте));
       
       xB.УстановитьЗначениеПоля("UKR_GROMAD"  ,ПреобразоватьВЧисло(Строка.UKR_GROMAD));
       xB.УстановитьЗначениеПоля("ZO"          ,ПреобразоватьВЧисло(Строка.ZO));
       
       xB.УстановитьЗначениеПоля("NUMIDENT",Строка.NUMIDENT);
       xB.УстановитьЗначениеПоля("LN"      ,Строка.LN);
       xB.УстановитьЗначениеПоля("NM"      ,Строка.NM);
       xB.УстановитьЗначениеПоля("FTN"     ,Строка.FTN);
       xB.УстановитьЗначениеПоля("START_DT",ПреобразоватьВЧисло(Строка.START_DT));
       xB.УстановитьЗначениеПоля("END_DT"  ,ПреобразоватьВЧисло(Строка.END_DT  ));
       xB.УстановитьЗначениеПоля("PID_ZV"  ,Строка.PID_ZV);
       
       xB.Записать();
           
   КонецЦикла;
   
   Возврат Истина;
   
КонецФункции
6 vmv
 
26.03.12
13:48
ну или добавить каши, думаю автор не закрывает дбф программно/интерактивно вьювером  или не создает, третьего не дано
7 Pozdnyakov
 
26.03.12
14:56
(4) где каша? коды брала http://mista.ru/tutor_1c/dbf.htm
8 Pozdnyakov
 
26.03.12
14:56
(1)СП предлагает варианты создать файл и открыть,собранного примера я не обнаружила
9 Pozdnyakov
 
26.03.12
14:56
(3)Поздняков??? это где
10 Pozdnyakov
 
26.03.12
14:56
(6) вьюером - это чем?
11 Pozdnyakov
 
26.03.12
14:56
а каша ,это видимо то, что я несколько раз пыталась открывать файл, таким образом я пыталась понять, изменится что либо или нет вситуации, до этого делала вообще без строчки Файл.ОткрытьФайл, она по сути и не должна быть нужна
12 Pozdnyakov
 
26.03.12
14:56
(5) то есть разделить одну процедуру на процедуру создания самого файла и уже записи данных? спасибо за идею
13 andrewks
 
26.03.12
15:04
(9) у вас в нике
14 andrewks
 
26.03.12
15:04
а ник, видимо, по наследству достался
15 Vakhrin
 
26.03.12
15:23
лан... перенесу из дубля:

Процедура ВыгрузитьСправочник(Элемент,ПараметрКоманды, ПараметрыВыполненияКоманды)
Файл = Новый XBase;
Файл.Поля.Добавить("Ind"," N" , 2);
Файл.Поля.Добавить("Month", "S", 8);
Файл.Поля.Добавить("Hours", "N", 3);
Файл.Поля.Добавить("Days", "N", 2);
Файл.АвтоСохранение = Истина;
Файл.СоздатьФайл("с:\start.dbf");

Выборка = Справочники.КалендарьПлановый.Выбрать();
Пока Выборка.Следующий() Цикл
   Файл.Добавить();
   Файл.Ind = Выборка.Код;
   Файл.Month = Выборка.Месяц;
   Файл.Hours = Выборка.ЧислоЧасов;
   Файл.Days = Выборка.ЧислоДней;
КонецЦикла;

Файл.Записать();
Файл.ЗакрытьФайл();

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