• ⚡️ Последний шанс: Вебинар по пентесту стартует через 30 минут!

    Друзья, ровно через 30 минут (8 июля в 19:00) начинается наш практический вебинар по пентесту и поиску уязвимостей!

    Если вы хотите:
    🕵️‍♀️ Узнать, как находить и эксплуатировать уязвимости в веб-приложениях.
    💡 Получить ценные инсайты от настоящего эксперта.
    🚀 Сделать решительный шаг в мир кибербезопасности.
    То этот вебинар для вас!

    Ведущий вебинара – Александр Медведев – эксперт с более чем 10-летним опытом в сфере информационной безопасности, пятикратный победитель Standoff и обладатель престижных сертификаций: OSWE, OSCP, PNPT, CEH, CWAPT.

    Успейте присоединиться! Зарегистрироваться сейчас

    Возникли сложности с регистрацией? Пишите нам: @Codeby_Academy
    Будем вас ждать!

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

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

Elle

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

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

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

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

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


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

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

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

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

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


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

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

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


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

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

Хотя если обработок много - запрос побыстрее будет.
 
А если база не SQL формата - это влияет на запрос?
 
Если НовыйДок.Название = ф Тогда
Ф=ФСО.НайтиСледующийФайл();
Продолжить;
КонецЕсли;

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

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



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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab