• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Поиск в файловой системе

  • Автор темы Elle
  • Дата начала
E

Elle

Внешняя обработка сканирует папки и выбирает, чтобы записать нужные файлы, но может записывать файлы множество раз. Подумала проверку написать найтиПоЗначению но выбивает и выдает ошибку - Объект - документ определенного вида! Можно ли в таком случае использовать этот метод. Или запросом перебрать значение?
Код:
Процедура СканироватьКаталог(Путь) 
Перем А; 
ФСО=СоздатьОбъект("ФС"); 
Ф=ФСО.НайтиПервыйФайл(Путь+"\"+"*.*"); 
Пока Ф<>"" Цикл 
Если (Ф<>".")И(Ф<>"..") Тогда 
ФС.АтрибутыФайла(Путь+Ф,,А); 
Если Сред(А,4,1)="1" Тогда 
СканироватьКаталог(Путь+Ф+"\") 
ИначеЕсли не (Найти(Путь+ф,".ert")=0) Тогда 
НовыйДок = СоздатьОбъект("Документ.ОбъектМетаданных"); 
Если НовыйДок.ВыбратьПоЗначению(НачДата,КонДата,"Название",Ф)=1 Тогда 
Продолжить; 
КонецЕсли;
НовыйДок.Новый(); 
НовыйДок.НазваниеОбъекта = "Внешний отчет"; 
НовыйДок.Путь			= Путь; 
НовыйДок.Название		= ф; 
НовыйДок.Записать(); 
КонецЕсли; 
КонецЕсли; 
Ф=ФСО.НайтиСледующийФайл(); 
КонецЦикла; 
КонецПроцедуры
 
P

puh14

Что-то я не понял что за зверь такой Документ.ОбъектМетаданных в семерке - в восьмерке такой есть. Если "Ф" у вас - это название документа как в конфигураторе , тогда можно написать
НовыйДок = СоздатьОбъект("Документ." + Ф);

а потом и все варианты Найти работают.
 
H

Hryv

Читайте синтакс-помошник
ВыбратьПоЗначению() работает только для
Док = СоздатьОбъект("Документ");

иначе надо делать просто ВыбратьДокументы() и просто в цикле проверять условие
 
P

puh14

Читайте синтакс-помошник
ВыбратьПоЗначению() работает только для
Док = СоздатьОбъект("Документ");

иначе надо делать просто ВыбратьДокументы() и просто в цикле проверять условие

Ну судя по обилию СоздатьОбъект мы имеем дело таки с семеркой, а в синтакси помошнике гворится что эта функция пашет только для докуменов, сделанных через создать объект - и никакого упоминания про то что тип документа неопределен. Выбрать по значению канает либо для документов с графой отбора либо с общими реквизитами.


р.с. пора клаву менять...

Up. НайтиПоЗначению для документа походу вооще не существует - выбрать есть, а найти нет. Чтож это за платформа такая?
 
E

Elle

Документ.ОбъектМетаданных - это зверь, мною написан)))). Ф - присваивается название файла (а в документе это просто реквизит).
Читайте синтакс-помошник
ВыбратьПоЗначению() работает только для
Док = СоздатьОбъект("Документ");

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

puh14

Ну тогда в текущем коде всё верно. НайтиПоЗначению не существует, для справочников есть найтипореквизиту. А вот что будет бысрее работать - запрос или выборка зависит от периода и кол-ва документов. По хорошему запрос быстрее - но выборка проще в написании.

В отдельном журнале реквизит Название есть графой отбора

Так вроде графы отбора действуют на все журналы... А в выбраных значениях графы присутствует "Документ.ОбъектМетаданны.название" ?


Как еще один вариант - перед поиском приведите Ф=СокрЛП(Ф);

А то пара лишних пробелов и готово новое название.
 
H

Hryv

Логично ошибка
Док = СоздатьОбъект("Документ");
Тогда ошибка неверное имя реквизита Если НовыйДок.ВыбратьПоЗначению(НачДата,КонДата,"Название",Ф)=1 Тогда

Я бы примерно так делел
Код:
Процедура СканироватьКаталог(Путь) 
Перем А; 
Док = СоздатьОбъект("Документ"); 
НовыйДок = СоздатьОбъект("Документ.ОбъектМетаданных"); 
...
Пока Ф<>"" Цикл 
...
Если Док.ВыбратьПоЗначению(НачДата,КонДата,"Название",Ф)=1 Тогда 
Продолжить; 
КонецЕсли;
НовыйДок.Новый(); 
...
КонецЦикла; 
КонецПроцедуры
 
P

puh14

В отдельном журнале реквизит Название есть графой отбора.


Посмотрел - а вы уверены, что не путаете графу отбора с графой журнала? тем более что уже на строке в 50 символов включить реквизит в графу отбора не получается, а длина строки путь + название обработки могут быть в разы больше.

Похоже Вам скорее надо действительно либо перебором, либо запросом.
 
E

Elle

Я так и поняла, дествительно реквизит может быть больше 50 символов. Что лучше использовать?
Код:
НовыйДок = СоздатьОбъект("Документ.ОбъектМетаданных");
НовыйДок.ВыбратьДокументы();
Пока НовыйДок.ПолучитьДокумент() = 1 Цикл
Если НовыйДок.Название = ф Тогда
Продолжить;
КонецЕсли;
НовыйДок.Новый();
НовыйДок.ВидОбъекта = Перечисление.ВидОбъекта.ВнешнийОтчет;
НовыйДок.Путь			= Путь;
НовыйДок.Название		= ф;
НовыйДок.Записать();
КонецЦикла;
Так зацикливается на первом значении
Или запрос?
 
P

puh14

Если НовыйДок.Название = ф Тогда
Ф=ФСО.НайтиСледующийФайл();
Продолжить;
КонецЕсли;

Хотя если обработок много - запрос побыстрее будет.
 
E

Elle

А если база не SQL формата - это влияет на запрос?
 
H

Hryv

Если НовыйДок.Название = ф Тогда
Ф=ФСО.НайтиСледующийФайл();
Продолжить;
КонецЕсли;

Не будет работать, так как Продолжить; находится внутри Пока НовыйДок.ПолучитьДокумент() = 1 Цикл, а не Пока Ф<>"" Цикл
 
E

Elle

Не будет работать, так как Продолжить; находится внутри Пока НовыйДок.ПолучитьДокумент() = 1 Цикл, а не Пока Ф<>"" Цикл
Так и не работает, зацикливается. А смисл тогда в конструкции Получить Документ?
 
P

puh14

Не будет работать, так как Продолжить; находится внутри Пока НовыйДок.ПолучитьДокумент() = 1 Цикл, а не Пока Ф<>"" Цикл

Ааа- тьфу, я на первичный код смотрел.



НовыйДок = СоздатьОбъект("Документ.ОбъектМетаданных");
НовыйДок.ВыбратьДокументы();
Найдено = 0;
Пока НовыйДок.ПолучитьДокумент() = 1 Цикл
Если НовыйДок.Название = ф Тогда
Найдено =1;
Прервать;
КонецЕсли;
КонецЦикла;
Если Найдено = 0 Тогда
НовыйДок.Новый();
НовыйДок.ВидОбъекта = Перечисление.ВидОбъекта.ВнешнийОтчет;
НовыйДок.Путь = Путь;
НовыйДок.Название = ф;
НовыйДок.Записать();
КонецЕсли;
 
E

Elle

Ура :) , работает , только нужно пробелы удалить для сравнения Если (СокрЛП(НовыйДок.Название) = ф) Тогда
 
Мы в соцсетях:

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