Имя: Пароль:
1C
1С v8
XBase. Перед выполнением операции нужно закрыть базу. А база то закрыта!
, ,
0 batmansoft
 
01.10.14
15:02
Добрый день. Выполняю такую команду:
"    База = Новый XBase(Файл);            
    если НЕ оФайл.Существует() тогда
        База.Поля.Добавить("supplierid","N",2);
        База.Поля.Добавить("supplier","S",30);
        База.Поля.Добавить("customer1","S",30);
        База.Поля.Добавить("customer2","S",30);
        База.Поля.Добавить("customer3","S",30);
        База.Поля.Добавить("customer4","S",30);
        База.Поля.Добавить("customer5","S",30);
        База.Поля.Добавить("customer6","S",30);
        База.Поля.Добавить("customer7","S",30);
        База.Поля.Добавить("customerto","S",30);
        База.СоздатьФайл(Файл);
    иначе
        База.ОткрытьФайл(Файл);
    конецесли;
"
В конце выполню вот такую:
База.ЗакрытьФайл();

Очевидно, первый раз выполняет первую ветку, и все проходит нормлаьно. Запускаю второй раз и вылазит:
"{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ОткрытьФайл)
        База.ОткрытьФайл(Файл);
по причине:
Перед выполнением операции нужно закрыть базу"
Но база то закрыта. Подскажите плз, как лечить?
1 Dmitriy_76
 
01.10.14
15:05
close() не ?
2 palpetrovich
 
01.10.14
15:08
(0) в середине точно нет что-нить типа Возврат?
3 batmansoft
 
01.10.14
15:13
(2) Нет, нету. Проверил отладчиком, База.ЗАкрытьФайл() выполняется.
(1) close не катит:
"{Форма.Форма.Форма(111)}: Метод объекта не обнаружен (close)
    База.close();
"
4 palpetrovich
 
01.10.14
15:26
проверил, все работает:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    ИмяФайла = "d:\test.dbf";
    оФайл = Новый Файл(ИмяФайла);
    База = Новый XBase();      
    если НЕ оФайл.Существует() тогда
        База.Поля.Добавить("supplierid","N",2);
        База.Поля.Добавить("supplier","S",30);
        База.СоздатьФайл(ИмяФайла);
        сообщить("Создан " + ИмяФайла);
    иначе
        База.ОткрытьФайл(ИмяФайла);
        сообщить("Открыт " + ИмяФайла);
    конецесли;
    База.ЗакрытьФайл();    
    
КонецПроцедуры

может "Файл" поменять на, к примеру, "ИмяФайла"?
5 batmansoft
 
01.10.14
15:29
(4) Сделал так:
    оФайл=Новый Файл(ИмяФайла);
    //оФайл.Имя=Файл;
    База = Новый XBase(ИмяФайла);            
    если НЕ оФайл.Существует() тогда
        База.Поля.Добавить("supplierid","N",2);
        База.Поля.Добавить("supplier","S",30);
        База.Поля.Добавить("customer1","S",30);
        База.Поля.Добавить("customer2","S",30);
        База.Поля.Добавить("customer3","S",30);
        База.Поля.Добавить("customer4","S",30);
        База.Поля.Добавить("customer5","S",30);
        База.Поля.Добавить("customer6","S",30);
        База.Поля.Добавить("customer7","S",30);
        База.Поля.Добавить("customerto","S",30);
        База.СоздатьФайл(ИмяФайла);
    иначе
        База.ОткрытьФайл(ИмяФайла);
    конецесли;

тоже самое
6 palpetrovich
 
01.10.14
15:33
(5) проверь мой код
7 palpetrovich
 
01.10.14
15:34
+(6)  запость сюда ИмяФайла
8 batmansoft
 
01.10.14
15:36
(7) ну например D:\Work82\Работа\Обработины\5.DBF
9 batmansoft
 
01.10.14
15:38
(7) странно, твой код работает
10 vlandev
 
01.10.14
15:39
А длинное имя файла не надо в кавычки дополнительно сувать?
11 palpetrovich
 
01.10.14
15:40
(9) дык, пробуй "d:\5.dbf
12 batmansoft
 
01.10.14
15:44
(10)
Сделал так:
"    лИмяФайла=""""+ИмяФайла+"""";
    оФайл=Новый Файл(лИмяФайла);
    //оФайл.Имя=Файл;
    База = Новый XBase(лИмяФайла);            
    если НЕ оФайл.Существует() тогда
        База.Поля.Добавить("supplierid","N",2);
        База.Поля.Добавить("supplier","S",30);
        База.Поля.Добавить("customer1","S",30);
        База.Поля.Добавить("customer2","S",30);
        База.Поля.Добавить("customer3","S",30);
        База.Поля.Добавить("customer4","S",30);
        База.Поля.Добавить("customer5","S",30);
        База.Поля.Добавить("customer6","S",30);
        База.Поля.Добавить("customer7","S",30);
        База.Поля.Добавить("customerto","S",30);
        База.СоздатьФайл(лИмяФайла);
    иначе
        База.ОткрытьФайл(лИмяФайла);
    конецесли;
"
после этого база просто не открылась.
Выдало на дальнейший код:
"{Форма.Форма.Форма(107)}: Ошибка при вызове метода контекста (Добавить)
        База.Добавить();
по причине:
Перед выполнением операции нужно открыть базу
"
13 DS
 
01.10.14
15:46
(12) Не нашел в листинге "База.Добавить();"
14 palpetrovich
 
01.10.14
15:47
(12) а так """"+ИмяФайла+"""  ? ...пробуй, короче, разные варианты :)
15 batmansoft
 
01.10.14
15:47
(13) Вот полный листинг:
"Процедура КнопкаВыполнитьНажатие(Кнопка)
    лИмяФайла=""""+ИмяФайла+"""";
    оФайл=Новый Файл(лИмяФайла);
    //оФайл.Имя=Файл;
    База = Новый XBase(лИмяФайла);            
    если НЕ оФайл.Существует() тогда
        База.Поля.Добавить("supplierid","N",2);
        База.Поля.Добавить("supplier","S",30);
        База.Поля.Добавить("customer1","S",30);
        База.Поля.Добавить("customer2","S",30);
        База.Поля.Добавить("customer3","S",30);
        База.Поля.Добавить("customer4","S",30);
        База.Поля.Добавить("customer5","S",30);
        База.Поля.Добавить("customer6","S",30);
        База.Поля.Добавить("customer7","S",30);
        База.Поля.Добавить("customerto","S",30);
        База.СоздатьФайл(лИмяФайла);
    иначе
        База.ОткрытьФайл(лИмяФайла);
    конецесли;
    База.Кодировка=КодировкаXBase.OEM;
    База.АвтоСохранение=Истина;
    //База.Добавить();
    //База.supplier="Проба";
    //База.ЗакрытьФайл();
    //возврат;
    
    Запрос=Новый Запрос();
    
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Значение
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Объект = &Объект
    |    И ЗначенияСвойствОбъектов.Свойство = &Свойство"
    ;
    Запрос.УстановитьПараметр("Объект",Организация);
    Запрос.УстановитьПараметр("Свойство",Константы.шапСвойствоПризнакОрганизации.Получить());
    Выборка=Запрос.Выполнить().Выбрать();
    если Выборка.Следующий() тогда
        ПризнакОрганизации=Выборка.Значение;    
    иначе
        Предупреждение("Не найден признак организации");;
    конецесли;
    
    
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ЗапросКДанным.Контрагент,
    |    ЗначенияСвойствОбъектов.Значение КАК Признак,
    |    ЗапросКДанным.Счет,
    |    ЗапросКДанным.СуммаНачальныйОстаток,
    |    СУММА(ЗапросКДанным.СуммаОборотДт) КАК СуммаОборотДт,
    |    СУММА(ЗапросКДанным.СуммаОборотКт) КАК СуммаОборотКт,
    |    ЗапросКДанным.СуммаКонечныйОстаток
    |ИЗ
    |    (ВЫБРАТЬ
    |        СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотДт) КАК СуммаОборотДт,
    |        СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаОборотКт,
    |        ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    |        ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
    |        СУММА(ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток) КАК СуммаНачальныйОстаток,
    |        СУММА(ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток) КАК СуммаКонечныйОстаток
    |    ИЗ
    |        РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
    |                &НачДата,
    |                &КонДата,
    |                Период,
    |                ,
    |                Счет = &Счет62
    |                    ИЛИ Счет = &Счет60,
    |                ,
    |                Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
    |    
    |    СГРУППИРОВАТЬ ПО
    |        ХозрасчетныйОстаткиИОбороты.Субконто1,
    |        ХозрасчетныйОстаткиИОбороты.Счет) КАК ЗапросКДанным
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |        ПО (ЗначенияСвойствОбъектов.Свойство = &Свойство)
    |            И ЗапросКДанным.Контрагент = ЗначенияСвойствОбъектов.Объект
    |ГДЕ
    |    НЕ ЗначенияСвойствОбъектов.Значение ЕСТЬ NULL
    |
    |СГРУППИРОВАТЬ ПО
    |    ЗапросКДанным.Счет,
    |    ЗначенияСвойствОбъектов.Значение,
    |    ЗапросКДанным.СуммаНачальныйОстаток,
    |    ЗапросКДанным.СуммаКонечныйОстаток,
    |    ЗапросКДанным.Контрагент
    |
    |УПОРЯДОЧИТЬ ПО
    |    Признак"
    ;
    Запрос.УстановитьПараметр("Организация",Организация);
    Запрос.УстановитьПараметр("НачДата",НачалоДня(НачДата));
    Запрос.УстановитьПараметр("КонДата",КонецДня(КонДата));
    Запрос.УстановитьПараметр("Счет62",ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);
    Запрос.УстановитьПараметр("Счет60",ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
    Запрос.УстановитьПараметр("Свойство",Константы.шапСвойствоПризнакКонтрагента.Получить());
    //ТабличноеПоле1=Запрос.Выполнить().Выгрузить();
    //ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
    Выборка=Запрос.Выполнить().Выбрать();
    пока Выборка.Следующий() цикл
        База.Добавить();
        База.supplier=Организация.Наименование;
        База.supplierid=ПризнакОрганизации;
        База["customer"+Сокрлп(строка(Выборка.Признак))]=Выборка.СуммаКонечныйОстаток;
    конеццикла;
    База.ЗакрытьФайл();
КонецПроцедуры
"
16 DS
 
01.10.14
15:55
Принципиальное отличие данного кода от (4) в том, что в (4) имя файла пихается в XBase только тогда, когда файл существует. Может в этом и собака.
17 batmansoft
 
01.10.14
15:56
вот так еще поробовал
    оФайл=Новый Файл(""""+ИмяФайла+"""");
    //оФайл.Имя=Файл;
    База = Новый XBase(лИмяФайла);            
    если НЕ оФайл.Существует() тогда
        База.Поля.Добавить("supplierid","N",2);
        База.Поля.Добавить("supplier","S",30);
        База.Поля.Добавить("customer1","S",30);
        База.Поля.Добавить("customer2","S",30);
        База.Поля.Добавить("customer3","S",30);
        База.Поля.Добавить("customer4","S",30);
        База.Поля.Добавить("customer5","S",30);
        База.Поля.Добавить("customer6","S",30);
        База.Поля.Добавить("customer7","S",30);
        База.Поля.Добавить("customerto","S",30);
        База.СоздатьФайл(""""+ИмяФайла+"""");
    иначе
        База.ОткрытьФайл(""""+ИмяФайла+"""");
    конецесли;
    База.Кодировка=КодировкаXBase.OEM;
    База.АвтоСохранение=Истина;
тоже самое
18 DS
 
01.10.14
15:59
Проверять отладчиком каждую строку на "База.Открыта()" до просветления.
19 batmansoft
 
01.10.14
16:00
(16) Э... что то не понял. Это как так "имя файла пихается в XBase только тогда, когда файл существует"?
И в том и в другом случае если файл существует, он открывается если нет то создается.
Вся разница в том что в (4) путь к файлу короткий. Неужели в этом дело? Но тогда как быть, если надо открыть файл с длинным путем?
20 palpetrovich
 
01.10.14
16:03
(19) в (16) намек на
База = Новый XBase(лИмяФайла);  
База = Новый XBase();
21 batmansoft
 
01.10.14
16:05
(20) А!!!! Наступило просветление.:) Спасибо, заработало.