• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Работа с Xbase (перенесено)

  • Автор темы VasilyKushnir
  • Дата начала
Статус
Закрыто для дальнейших ответов.
V

VasilyKushnir

Мне надо создать на основании ЗаказНаНесколькоПоставщиков туеву хучу ДБФных файлов (для каждого поставщика - электронная заявка) и чтобы юзер в них ориентировался имя файла: НомерДок(5знаков)+НаименованиеПоставщика(первые 25 знаков). А XBase позволяет имя только до 8 символов... Сейчас: создаю по номеру дока (XBase) потом переименовываю (ФС) с добавлением поставщика. ФС почему-то иногда мутит - переименовывает через раз. Если бы вообще не переименовывала - нет вопросов, значит кривые ручки. А так непонятки...
 
V

VasilyKushnir

Вот:

//Это При Открвтии
Каталог = КаталогИБ() + "Mail\Zakaz\";
ИмяФайлаСокр = Каталог + СокрЛП(текДок.НомерДок) + ".dbf";

текДок.ВыгрузитьТабличнуюЧасть(тзТабл, "Товар, Заказано, ПроизводительСтр, ПоставщикСтр");
текДок.ВыгрузитьТабличнуюЧасть(тзПоставщик, "Товар, Заказано, ПроизводительСтр, ПоставщикСтр");
тзТабл.Сортировать("ПоставщикСтр, Товар");
тзПоставщик.Сортировать("ПоставщикСтр, Товар");
тзПоставщик.Свернуть("ПоставщикСтр",);
тзПоставщик.ВыбратьСтроки();

Пока тзПоставщик.ПолучитьСтроку() = 1 Цикл
сзПоставщики.ДобавитьЗначение(тзПоставщик.ПоставщикСтр); // на форме
КонецЦикла;


// А это Сформировать
дбФайл = СоздатьОбъект("XBase");
дбФайл.ДобавитьПоле("Tovar", "S", 64,);
дбФайл.ДобавитьПоле("Proiz", "S", 64,);
дбФайл.ДобавитьПоле("Zakaz", "N", 12, 3);
дбФайл.КодоваяСтраница(0);

кнУдалитьНеВыбранные (); // удаляет на форме не помеченных поставщиков
дбФайл.СоздатьФайл (ИмяФайлаСокр);
тзТабл.ВыбратьСтроки();
сзРазмер = сзПоставщики.РазмерСписка();
КолЗап = 0;

Для Ин = 1 По сзРазмер Цикл
Поставщик = сзПоставщики.ПолучитьЗначение(Ин);
тзТабл.ВыбратьСтроки();

Пока тзТабл.ПолучитьСтроку() = 1 Цикл
Если тзТабл.ПоставщикСтр <>Поставщик Тогда
Продолжить;
Иначе
дбФайл.Добавить();
дбФайл.Tovar = СокрЛП(тзТабл.Товар.Наименование);
дбФайл.Proiz = СокрЛП(тзТабл.ПроизводительСтр);
дбФайл.Zakaz = тзТабл.Заказано;
дбФайл.Записать();
КолЗап = КолЗап + 1;
Состояние (тзТабл.Товар.Наименование);
КонецЕсли;
КонецЦикла;

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

Если СтрДлина(СокрЛП(текДок.Поставщик.Наименование)) <= 25 Тогда
ИмяФайла = Каталог + СокрЛП(текДок.НомерДок) + "_" + СокрЛП(Поставщик.Наименование) + ".dbf";
Иначе
ИмяФайла = Каталог + СокрЛП(текДок.НомерДок) + "_" + СокрЛП(Лев(Поставщик.Наименование, 25)) + ".dbf";
КонецЕсли;

ИмяФайла = СокрЛП(СтрЗаменить(ИмяФайла, "*", " "));
ФС.КопироватьФайл(ИмяФайлаСокр, ИмяФайла, 0);
дбФайл.ОткрытьФайл(ИмяФайлаСокр,,0);
дбФайл.ОчиститьФайл();
КонецЦикла;

дбФайл.ЗакрытьФайл();
ФС.УдалитьФайл(ИмяФайлаСокр);
дбФайл = 0;
Сообщить ("Выгружено " + КолЗап + " записей");
Форма.Закрыть();
 
M

masol

Что то ты намутил, надо проше используй
ФС.переименоватьфайл(ИмяФайлаСокр,ИмяФайла,)
 
V

VasilyKushnir

Если
ФС.переименоватьфайл(ИмяФайлаСокр,ИмяФайла,)
то мне его потом по новой создавть надо, в данном конкретном случае в доке 83 поставщика, следоват надо 82 дбфа.
 
V

VasilyKushnir

Это капец!
Код скинул уже со строчкой
ИмяФайла = СокрЛП(СтрЗаменить(ИмяФайла, "*", " "));
но у себя не успел проверить. Все заработало.
Один "деятель" у нас стал наводить порядок со справочником Поставщики и что прошел помечал в названии символом "*" и естественно, если он попадал на 25 позицию, ФС воспринимала его как маску. Ну я ему высказал, все что думаю о поведении его растакой матери!
Изрядно поганял - все, как часики. Но все-таки фигово, что ФС не выдает никаких матюков при невозможности выполнения команды. Так что напрасно я грешил на XBase. Оказывается надо было просто деинсталировать устройство krivyeruchki.sys.
 
V

vitfil

Для: VasilyKushnir
:D :D ;)
других слов просто нет!
Немного офф: и виновата ведь во всем 1С! :)
 
M

masol

Так создается же один файл
дбФайл.СоздатьФайл (ИмяФайлаСокр);
а где
//ФС.КопироватьФайл(ИмяФайлаСокр, ИмяФайла, 0); - просто создаешь новый файл с именем имяФайла
//дбФайл.ОткрытьФайл(ИмяФайлаСокр,,0);
//дбФайл.ОчиститьФайл();
//КонецЦикла;

//дбФайл.ЗакрытьФайл();
//ФС.УдалитьФайл(ИмяФайлаСокр);
//дбФайл = 0;
- это непонятно зачем,если можно просто переименовать и ничего не открывать и не удалять
ФС.переименоватьфайл(ИмяФайлаСокр,ИмяФайла,)
 
V

VasilyKushnir

Так создается же один файл
дбФайл.СоздатьФайл (ИмяФайлаСокр);
а где
//ФС.КопироватьФайл(ИмяФайлаСокр, ИмяФайла, 0); - просто создаешь новый файл с именем имяФайла
//дбФайл.ОткрытьФайл(ИмяФайлаСокр,,0);
//дбФайл.ОчиститьФайл();
//КонецЦикла;

Эти действия я произвожу в цикле и переименование не катит - после переименования файла уже нет.


[/quote]
//дбФайл.ЗакрытьФайл();
//ФС.УдалитьФайл(ИмяФайлаСокр);
//дбФайл = 0;
- это непонятно зачем,если можно просто переименовать и ничего не открывать и не удалять
ФС.переименоватьфайл(ИмяФайлаСокр,ИмяФайла,)
[/quote]

А здесь я просто удаляю следы деятельности с ДБФ.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!