Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) цикл for each в 1с77 (число прочтений - 6064 )
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
цикл for each в 1с77
20. Февраля 2017 :: 15:11
Печать  
Всем здрасте 8)

Когда-то эта тема поднималась
и многоуважаемые гуру на нее отвечали
но не могу найти (давно это было).....

Задача
* средствами 1с77 и 1с++ (ВыполняемыйМодуль)
* выполнить код (цикл) foreach

Код (C++)
Выбрать все
FSO = CreateObject("Scripting.FileSystemObject");
Subfolders = FSO.GetFolder(КаталогИБ()).Subfolders;
for each Folder in Subfolders do
    СписокЗначений.ДобавитьЗначение(Folder.Path)
endfor 



дело в том что такой цикл не работает:

Код (C++)
Выбрать все
FSO = CreateObject("Scripting.FileSystemObject");
Subfolders = FSO.GetFolder(КаталогИБ()).Subfolders;
for i=0 in Subfolders.Count-1 do
   // error = Item[i] = здесь не работает итератор [i]
    СписокЗначений.ДобавитьЗначение(Subfolders.Item[i].Path)
endfor 



Плиз, киньте в меня куском кода
с идеей, а то мозги уже поломал.
Спасибо.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: цикл for each в 1с77
Ответ #1 - 20. Февраля 2017 :: 15:33
Печать  
Там не массив, а Dictionary. Скобки нужны круглые.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: цикл for each в 1с77
Ответ #2 - 20. Февраля 2017 :: 15:53
Печать  
Дык, пробовал = исключение FSO
На MSDN есть примеры только for each,

Для for i=0 нигде не нашел......

  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: цикл for each в 1с77
Ответ #3 - 20. Февраля 2017 :: 16:02
Печать  
решение было найдено (когда-то давно, здесь на форуме)
именно через "ВыполняемыйМодуль"

только вот не могу найти
или сам сообразить
как это всё завернуть внутрь выполняемого модуля.....
  
Наверх
 
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 123
Зарегистрирован: 26. Ноября 2008
Re: цикл for each в 1с77
Ответ #4 - 20. Февраля 2017 :: 23:17
Печать  
Код
Выбрать все
	Спfolders=СоздатьОбъект("СписокЗначений");
	Subfolders = ФС.НайтиПервыйФайл(КаталогИБ());
	Пока ПустаяСтрока(Subfolders) = 0 Цикл
		АтрибутыФайла="";
		ФС.АтрибутыФайла(КаталогИБ()+Subfolders,,АтрибутыФайла);
		Если 0+Сред(АтрибутыФайла,4,1)=1 Тогда
			Спfolders.ДобавитьЗначение(КаталогИБ()+Subfolders);
		КонецЕсли;
		Subfolders = ФС.НайтиСледующийФайл();
	КонецЦикла;
 

  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: цикл for each в 1с77
Ответ #5 - 21. Февраля 2017 :: 07:27
Печать  
стандартнsй "ФС" почему-то ловит только первій каталог
потом не хочет. какой-то глюк.
поетому питаюсь решить задачу средствами windows

вот код, которsй не хочет работать:

Код
Выбрать все
Процедура	ДобавитьФайлыИзКаталога(СписокФайлов,знач сПутьПоика)//,знач сМаскаИмени)

        сМаскаИмени="*";

	Если  ФС.ФайлСуществует(сПутьПоика+"\.") = 0 Тогда
		Возврат // нет такого каталога
	КонецЕсли;

	сФайл = ФС.НайтиПервыйФайл(сПутьПоика+"\"+сМаскаИмени);
	Пока ПустоеЗначение(сФайл)=0 Цикл
		Если (сФайл<>".") и (сФайл<>"..") Тогда

//вот так = не хочет, что для каталогов, что для файлов - видает одно и то же = глюк ?????
//	                Если ФС.ФайлСуществует(сПутьПоика+"\"+сФайл+"\.") = 0 Тогда

//ето работает , но - см.комментарий ниже....
		        сАтрибутыФайла="";
		        ФС.АтрибутыФайла(сПутьПоика+"\"+сФайл,,сАтрибутыФайла);
                	  Если 0+Сред(сАтрибутыФайла,4,1)=0 Тогда
                                // simple filo
				СписокФайлов.ДобавитьЗначение(сПутьПоика+"\"+сФайл,сФайл);
			Иначе //каталог, recur
                               ДобавитьФайлыИзКаталога(СписокФайлов,знач сПутьПоика+"\"+сФайл)//,сМаскаИмени)
			КонецЕсли;
		КонецЕсли;
// ПРОБЛЕМА ЗДЕСЬ!!!!
// ФАЙЛІ ЛОВИТ ВСЕ,
// НО ЛОВИТ НЕ ВСЕ(!) КАТАЛОГИ А ТОЛЬКО ПЕРВИЙ ПОПАВШИЙСЯ !!!!
// ГЛЮК ПЛАТФОРМИ ? (27)
		сФайл = ФС.НайтиСледующийФайл();
	КонецЦикла;
КонецПроцедуры
 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: цикл for each в 1с77
Ответ #6 - 21. Февраля 2017 :: 08:01
Печать  
kos писал(а) 20. Февраля 2017 :: 15:53:
Для for i=0 нигде не нашел......

Ага, там ключи не числовые. Попробуй так:
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "vbscript";
Скрипт.AddCode(
     "Function GetFolders()
     |      set dict = CreateObject(""Scripting.Dictionary"")
     |      set FSO = CreateObject(""Scripting.FileSystemObject"")
     |      set Subfolders = FSO.GetFolder(""" + КаталогИБ() + """).Subfolders
     |      i = 0
     |      For Each Subfolder In Subfolders
     |            dict.add i, Subfolder
     |            i = i + 1
     |      next
     |      set GetFolders = dict
     |End Function");
dict = Скрипт.Eval("GetFolders()");
for i=0 to dict.Count-1 do
     Subfolder = dict.Item(i);
    СписокЗначений.ДобавитьЗначение(dict.Item(i).Path);
enddo;

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: цикл for each в 1с77
Ответ #7 - 21. Февраля 2017 :: 08:14
Печать  
спасибо, дорогой, то что нужно !!!!
  
Наверх
 
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 123
Зарегистрирован: 26. Ноября 2008
Re: цикл for each в 1с77
Ответ #8 - 21. Февраля 2017 :: 09:07
Печать  
kos писал(а) 21. Февраля 2017 :: 07:27:
стандартнsй "ФС" почему-то ловит только первій каталог
потом не хочет. какой-то глюк.
поетому питаюсь решить задачу средствами windows

вот код, которsй не хочет работать:

Код
Выбрать все
Процедура	ДобавитьФайлыИзКаталога(СписокФайлов,знач сПутьПоика)//,знач сМаскаИмени)

        сМаскаИмени="*";

	Если  ФС.ФайлСуществует(сПутьПоика+"\.") = 0 Тогда
		Возврат // нет такого каталога
	КонецЕсли;

	сФайл = ФС.НайтиПервыйФайл(сПутьПоика+"\"+сМаскаИмени);
	Пока ПустоеЗначение(сФайл)=0 Цикл
		Если (сФайл<>".") и (сФайл<>"..") Тогда

//вот так = не хочет, что для каталогов, что для файлов - видает одно и то же = глюк ?????
//	                Если ФС.ФайлСуществует(сПутьПоика+"\"+сФайл+"\.") = 0 Тогда

//ето работает , но - см.комментарий ниже....
		        сАтрибутыФайла="";
		        ФС.АтрибутыФайла(сПутьПоика+"\"+сФайл,,сАтрибутыФайла);
                	  Если 0+Сред(сАтрибутыФайла,4,1)=0 Тогда
                                // simple filo
				СписокФайлов.ДобавитьЗначение(сПутьПоика+"\"+сФайл,сФайл);
			Иначе //каталог, recur
                               ДобавитьФайлыИзКаталога(СписокФайлов,знач сПутьПоика+"\"+сФайл)//,сМаскаИмени)
			КонецЕсли;
		КонецЕсли;
// ПРОБЛЕМА ЗДЕСЬ!!!!
// ФАЙЛІ ЛОВИТ ВСЕ,
// НО ЛОВИТ НЕ ВСЕ(!) КАТАЛОГИ А ТОЛЬКО ПЕРВИЙ ПОПАВШИЙСЯ !!!!
// ГЛЮК ПЛАТФОРМИ ? (27)
		сФайл = ФС.НайтиСледующийФайл();
	КонецЦикла;
КонецПроцедуры
 



Чушь какую-то транслируешь.
Поменьше покемонов лови, и глюки пропадут сами собой.
Код
Выбрать все
	Спfolders=СоздатьОбъект("СписокЗначений");
	Subfolders = ФС.НайтиПервыйФайл(КаталогИБ()+"*.*");
	Пока ПустаяСтрока(Subfolders) = 0 Цикл
		АтрибутыФайла="";
		ФС.АтрибутыФайла(КаталогИБ()+Subfolders,,АтрибутыФайла);
		Если 0+Сред(АтрибутыФайла,4,1)=1 Тогда
			Спfolders.ДобавитьЗначение(КаталогИБ()+Subfolders);
		КонецЕсли;
		Subfolders = ФС.НайтиСледующийФайл();
	КонецЦикла;
	ВыбЗнач="";
	Спfolders.ВыбратьЗначение(ВыбЗнач); 


  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: цикл for each в 1с77
Ответ #9 - 21. Февраля 2017 :: 09:16
Печать  
делюсь работающим результатом:

Код
Выбрать все
Процедура	ДобавитьФайлыИзКаталога(Скрипт,ФСО,СписокФайлов,знач сПутьПоика,знач сМаскаИмени)

	Если  ФСО.FolderExists(сПутьПоика) = 0 Тогда
		Возврат
	КонецЕсли;

	сФайл = ФС.НайтиПервыйФайл(сПутьПоика+"\"+сМаскаИмени);
	Пока ПустоеЗначение(сФайл)=0 Цикл
		Если (сФайл<>".") и (сФайл<>"..") Тогда
			сПолныйПуть = ФСО.GetAbsolutePathName(сПутьПоика+"\"+сФайл);
			Если ФСО.FolderExists(сПолныйПуть) = 0 Тогда
				СписокФайлов.ДобавитьЗначение(сПолныйПуть,сФайл);
			КонецЕсли;
		КонецЕсли;
		сФайл = ФС.НайтиСледующийФайл();
	КонецЦикла;

	dict = Скрипт.Eval("GetSubFolders("""+сПутьПоика+""")");
	for i=0 to dict.Count-1 do
		Subfolder = dict.Item(i);
		ДобавитьФайлыИзКаталога(Скрипт,ФСО,СписокФайлов,Subfolder.Path,сМаскаИмени)
	enddo;

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

Функция		глНайтиВсеФайлы(сПолныйПутьСМаскойФайлов) Экспорт
	перем ФСО,сПутьПоика,сМаскаИмени;
	Если пустоеЗначение(сПолныйПутьСМаскойФайлов)=1 Тогда
		Возврат глНайтиВсеФайлы(КаталогИБ()+"*")
	КонецЕсли;

	СписокФайлов = СоздатьОбъект("СписокЗначений");

	ФСО = CreateObject("Scripting.FileSystemObject");
	Если ФСО.FolderExists(сПолныйПутьСМаскойФайлов) = 0 Тогда
		сПутьПоика = ФСО.GetParentFolderName(сПолныйПутьСМаскойФайлов);
		сМаскаИмени = сред(сПолныйПутьСМаскойФайлов,СтрДлина(сПутьПоика)+1);
	Иначе
		сПутьПоика = сПолныйПутьСМаскойФайлов;
		сМаскаИмени = "*";
	КонецЕсли;
	Пока Лев(сМаскаИмени,1) = "\" Цикл
		сМаскаИмени = Сред(сМаскаИмени,2);
	КонецЦикла;
	Пока Прав(сПутьПоика,1) = "\" Цикл
		сПутьПоика = Сред(сПутьПоика,1,СтрДлина(сПутьПоика)-1);
	КонецЦикла;

	Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
	Скрипт.Language = "vbscript";
	Скрипт.AddCode(
     "Function GetSubFolders(strPath)
     |      set dict = CreateObject(""Scripting.Dictionary"")
     |      set FSO = CreateObject(""Scripting.FileSystemObject"")
     |      set Subfolders = FSO.GetFolder(strPath).Subfolders
     |      i = 0
     |      For Each Subfolder In Subfolders
     |            dict.add i, Subfolder
     |            i = i + 1
     |      next
     |      set GetSubFolders = dict
     |End Function");

	ДобавитьФайлыИзКаталога(Скрипт,ФСО,СписокФайлов,сПутьПоика,сМаскаИмени);

	возврат СписокФайлов;
КонецФункции 

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: цикл for each в 1с77
Ответ #10 - 21. Февраля 2017 :: 10:10
Печать  
Цитата:
                 Иначе //каталог, recur
                               ДобавитьФайлыИзКаталога(СписокФайлов,знач сПутьПоика+"\"+сФайл)//,сМаскаИмени)
странный вызов. что за "знач" ?
  

1&&2&&3
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: цикл for each в 1с77
Ответ #11 - 21. Февраля 2017 :: 10:14
Печать  
trad писал(а) 21. Февраля 2017 :: 10:10:
Цитата:
                 Иначе //каталог, recur
                               ДобавитьФайлыИзКаталога(СписокФайлов,знач сПутьПоика+"\"+сФайл)//,сМаскаИмени)
странный вызов. что за "знач" ?


это очепятка... писал прям здесь а не в конфигураторе
правильно - в моем предыдущем посте.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: цикл for each в 1с77
Ответ #12 - 21. Февраля 2017 :: 13:13
Печать  
на самом деле, все выше написанное - лишнее
глюка в платформе нет.

Просто ты используешь глобальный экземпляр объекта ФС, а экземпляр имеет состояние.
В каждом рекурсивном вызове ДобавитьФайлыИзКаталога должен работать свой экземпляр, со своим состоянием.

//*******************************************
Процедура ОбходФайловФКаталоге(Путь)
     
     МаскаИмени = "*";
     
     лФС = СоздатьОбъект("ФС");
   
     ИмяФайла = лФС.НайтиПервыйФайл(Путь+МаскаИмени);
     Пока ПустаяСтрока(ИмяФайла) = 0 Цикл
           
           Если ИмяФайла="." Тогда
           ИначеЕсли ИмяФайла=".." Тогда
           Иначе
                 
                 Атрибуты = "";
                 лФС.АтрибутыФайла(Путь+ИмяФайла,,Атрибуты);
                 ЭтоКаталог = Сред(Атрибуты,4,1);
                 
                 Если ЭтоКаталог = "1" Тогда
                       ОбходФайловФКаталоге(Путь+ИмяФайла+"\");
                 Иначе
                       
                       Сообщить(ИмяФайла);
                       
                 КонецЕсли;
                 
           КонецЕсли;
           ИмяФайла = лФС.НайтиСледующийФайл();
           
     КонецЦикла;
     
КонецПроцедуры

//*******************************************
Процедура Сформировать()
     
     ОбходФайловФКаталоге(КаталогИБ());
     
КонецПроцедуры
  

1&&2&&3
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: цикл for each в 1с77
Ответ #13 - 21. Февраля 2017 :: 13:36
Печать  
trad писал(а) 21. Февраля 2017 :: 13:13:
глюка в платформе нет.

Просто ты используешь глобальный экземпляр объекта ФС, а экземпляр имеет состояние.
В каждом рекурсивном вызове ДобавитьФайлыИзКаталога должен работать свой экземпляр, со своим состоянием


О как! Спасибо за наводку, понял.
  
Наверх
 
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 123
Зарегистрирован: 26. Ноября 2008
Re: цикл for each в 1с77
Ответ #14 - 21. Февраля 2017 :: 21:19
Печать  
trad писал(а) 21. Февраля 2017 :: 13:13:
В каждом рекурсивном вызове ДобавитьФайлыИзКаталога должен работать свой экземпляр, со своим состоянием.


Где у него там рекурсивный вызов?
При чем тут рекурсия?
В данном случае и глобальный объект ФС и создатьобъект работают абсолютно одинаково.
Просто человек швыряется кодом как спамом, у него везде разбросаны слеши, корявые маски (типа "/." - и потом удивляется почему только
один нашелся?, а сколько? дайте две? - пиши "/.*"), безумные опечатки - он не в конфигураторе код пишет и проверяет в работе, а в форуме (???)
Ну и в отладчике его явно забанили.
Тема - полное фуфло.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать