|
Массив элементов с типом "файл" | ☑ | ||
---|---|---|---|---|
0
tndr2
27.04.19
✎
15:53
|
Вопрос такой:
Если использовать метод НайтиФайлы("c:\temp", "*.exe") то вернется массив с типом "файл", но если потом обходить этот массив, и пытаться найти в этом массиве элемент, то всегда возвращается неопределено. Псевдокод: МассивФайлов1 = НайтиФайлы("c:\temp", "*.exe"); МассивФайлов2 = НайтиФайлы("c:\temp\1", "*.exe"); Для Каждого ЭлементМассив1 Из МассивФайлов1 Цикл Если МассивФайлов2.Найти(ЭлементМассив1) > 0 Тогда Сообщить("Элемент найден"); КонецЕсли; ... КонецЦикла; Метод "Найти()" - всегда будет возвращать неопределено.... Хотелось бы понять, почему так? |
|||
1
zehn
27.04.19
✎
16:12
|
Потому что это разные элементы.
|
|||
2
tndr2
27.04.19
✎
16:18
|
(1) Не, ну как...
Допустим, в винде, я копирую файлы из одной папки у в другую, потом запускаю обработку в 1С, и она не находит одинаковые файлы в этих каталогах. Собственно почему? Предполагаю - это предположение, ссылочные типы после попыток преобразования ищутся по уиду, простые типы - ну они и в африке простые. Но ведь раз есть такой объект в 1с, как "файл", то он по идее тоже должен быть уникальным, соответственно и поиск тоже должен работать? |
|||
3
zehn
27.04.19
✎
16:21
|
(2) С чего бы это объкту файл быть одинаковым? Все объектные типы сравниваются по ссылке на объект.
Мальчик = Новый Структура("Имя", "Саша"); Девочка = Новый Структура("Имя", "Саша"); Какой ты ожидаешь результат? |
|||
4
tndr2
27.04.19
✎
16:36
|
(3) Ну по ключу "Имя" - я во всех случаях значение получу.
Но это структура. Речь про массивы. Метод НайтиФайлы() возвращает массив элементов с типом "Файл", тип "Файл" имеет определенные свойства, и допустим, что в обеих каталогах, эти свойств идентичны у каждого файла. Почему метод массива Найти() ничего не находит? Как это работает? Каждый раз, когда выполняется НайтиФайлы() к каждому элементу массиву что-то уникальное добавляется, или как? Задача простая; найти неуникальные файлы в разных каталогах, и их удалить. При условии, что их несколько десятков тысяч. |
|||
5
Rie
27.04.19
✎
16:43
|
(4) Элемент массива - это не файл на диске, а некая структура, описывающая его свойства.
Файл1 = Новый Файл("ababua.txt"); Файл2 = Новый Файл("ababua.txt"); Файл на диске - один и тот же. Но Файл1 <> Файл2. Сравнивай имена файлов, а не сами объекты типа Файл. |
|||
6
tndr2
27.04.19
✎
16:48
|
(5) Это понятно
Но выходит, что: 1. Мне надо найти все файлы в каталоге, получить некий массив (который висит в оперативной памяти, вместе со всеми свойствами каждого элемента массива) 2. Мне нужно обойти этот массив, и условно, в другой массив, записать строковое значение некого свойства 3. Потом выгрузить в массив файлы из другого каталога (и он со всеми свойствами будет висеть в оперативной памяти) 4. Начать сравнивать элементы этих массивов. Вопрос, почему, сразу нельзя сравнить объекты обоих массивов, в которых есть элементы с одинаковыми свойствами? |
|||
7
tndr2
27.04.19
✎
16:49
|
Объекты типа "Файл"
|
|||
8
MetaDon
27.04.19
✎
16:59
|
(6) а уникальные по имени или содержимому?
|
|||
9
Rie
27.04.19
✎
17:02
|
(6) Почему нельзя? Потому что людей много, они разные, и желания у них разные. И платформа 1С не может угадать, кому что хочется. Вам хочется по именам искать. Кому-то другому - по расширениям. Или по длине. Или...
Получили массив файлов? Преобразуйте в массив имен: Имена = Новый Массив; Для каждого Файл из Файлы Цикл Имена.Добавить(Файл.Имя); КонецЦикла; И не морочьте себе голову, что там в памяти висит: нет ссылок на массив - сборщик мусора его удалит, когда память потребуется. |
|||
10
tndr2
27.04.19
✎
17:11
|
(9) Верно!
Но, для этого объекта 1С уже определила свойства. Почему бы не сравнить эти свойства сразу? |
|||
11
H A D G E H O G s
27.04.19
✎
18:47
|
Жесть какая.
|
|||
12
tndr2
27.04.19
✎
19:16
|
Ну вот дурацкая ситуация, нет админов, и они не могут написать скрипт, который ежедневно будет копировать файлы из одной папки в другую.
И из второго удалять неактуальные файлы, ибо принимается, что в первой папке всегда набор файлов актуален. Хотим сделать - это из 1с. Файлов много, десятки тысяч. Какой алгоритм? |
|||
13
hhhh
27.04.19
✎
19:26
|
(10) ну ведь там путь разный, и полное имя файла. Как же вы говорите, что все свойства одинаковые. То есть 1с сравнила, но файлы оказались разными.
|
|||
14
Garykom
гуру
27.04.19
✎
19:28
|
(12) Алгоритм простой: нанять программиста.
|
|||
15
H A D G E H O G s
27.04.19
✎
19:46
|
(12) У тебя Найти() в цикле будет занимать 90% времени.
Помести имена файлов в Соответствие, или в ТЗ и потом Индексируй и будет щасте. |
|||
16
H A D G E H O G s
27.04.19
✎
19:46
|
Плач Ярославны на ровном месте какой-то.
|
|||
17
H A D G E H O G s
27.04.19
✎
19:47
|
Хочется еще быстрее - раскидай этот 10К список по 6 фоновым заданиям
|
|||
18
Garykom
гуру
27.04.19
✎
19:48
|
Мне интереснее зачем надо из 1С искать *.exe
|
|||
19
H A D G E H O G s
27.04.19
✎
19:50
|
(18) Это либо для примера, либо мы нашли вирусописателя на 1с.
|
|||
20
Garykom
гуру
27.04.19
✎
19:52
|
(19) Интересно как он будет встроенными в платформу 1С возможностями файлы exe модифицировать?
|
|||
21
Garykom
гуру
27.04.19
✎
19:53
|
(20)+ Я в курсе что это можно в последних версиях, интересно как "вирусописателя" с этим справится
|
|||
22
H A D G E H O G s
27.04.19
✎
20:00
|
(21) Это можно было во всех версиях.
|
|||
23
Garykom
гуру
27.04.19
✎
20:01
|
(22) Без внешних ВК и прочего?
|
|||
24
H A D G E H O G s
27.04.19
✎
20:03
|
(23) ДвоичныеДанные->Base64Строка->ComSafeArray->Base64Строка->ДвоичныеДанные
|
|||
25
Garykom
гуру
27.04.19
✎
20:08
|
(24) Угу и с какой версии появились ДвоичныеДанные->Base64Строка ?
|
|||
26
tndr2
27.04.19
✎
20:20
|
(13) Верно.
Поэтому сначала создается объект типа "Файл", который предназначен для копирования, и далее этот объект, в зависимости от условий, либо копируется, либо нет, но во всех случаях записывается в служебный массив. Массив этих файлов - является актуальным. Потом необходимо из массива файлов, который устарел вычесть массив актуальных файлов, и удалить ненужные. Вопрос, почему функция Массив1.Найти(ЭлементМассива2) всегда = неопределено. Если свойства у каждого файла, из обоих массивов идентичны. Как 1с определяет, что самого объекта из массива1 с типом файл (с ОДИНКАОВЫМИ свойствами), нет в массиве2? |
|||
27
H A D G E H O G s
27.04.19
✎
20:22
|
(25) 8.1 вроде
|
|||
28
H A D G E H O G s
27.04.19
✎
20:24
|
(26)
Файл1=Новый Файл("С:\temp\data.txt"); Файл2=Новый Файл("С:\temp\data.txt"); ФайлыРавны=Файл1=Файл2; Что будет в переменной ФайлыРавны ? |
|||
29
hhhh
27.04.19
✎
20:26
|
(26) наверно по адресу элемента в оперативной памяти. То есть массив где-то располагается в оперативной памяти компьютера. Для поиска задаем адрес ячейки оперативной памяти. Если в массиве есть такой адрес ячейки, значит найдено.
|
|||
30
tndr2
27.04.19
✎
20:32
|
Ладно давайте так:
МассивВычитания = Новый массив(); МассивВычитаемый = Новый массив(); МассивВычитаемый = НайтиФайлы("с:\", *.txt"); ИмяФайла = "с:\qqq.txt"; Файл1 = новый Файл(ИмяФайла); Если Файл.Существует() тогда Массив1.Добавить(Файл1); КонецЕсли; Для каждого НайденныйФайл ИЗ МассивВычитаемый Цикл Если Массив1.Найти(НайденныйФайл) Тогда .... \\\ Чего-то делаем КонецЦикла Но всегда "неопределено" Впорос; Почему? |
|||
31
tndr2
27.04.19
✎
20:34
|
У обоих объектов одинаковый свойства, почему поиск не проходит?
|
|||
32
runoff_runoff
27.04.19
✎
20:37
|
(30) кстати.. попробуйте использовать СравнениеЗначений.Сравнить()..
|
|||
33
tndr2
27.04.19
✎
20:37
|
Окей, вы скажете я создал объект не существующего файла, но блин, это же объект, у него есть свойства, и у существующего файла тоже есть свойства, они идентичны, все это происходит в ОЗУ, но сопоставление не происходит...
|
|||
34
hhhh
27.04.19
✎
20:37
|
(30) потому что это две разные ячейки оперативной памяти компьютера. Файл1 это уже новая ячейка оперативной памяти. Она никогда у вас не будет равна ячейкам МассивВычитаемый. Хоть вы головой об стенку бейтесь, всё равно будет неопределено.
|
|||
35
H A D G E H O G s
27.04.19
✎
20:38
|
(30) Вам бы ЯП подучить. Ну хоть какой-нибудь.
|
|||
36
H A D G E H O G s
27.04.19
✎
20:38
|
(33) Андрей, ты пьян.
|
|||
37
Garykom
гуру
27.04.19
✎
20:39
|
(27) Мне почему то помнится в 8.2 и не в самом начале
|
|||
38
tndr2
27.04.19
✎
20:39
|
(34) А с ссылочными типами в терминах 1С все будет отлично работать)
|
|||
39
H A D G E H O G s
27.04.19
✎
20:39
|
(32) Интересно, что будет с СравнитьЗначение() в (28)
|
|||
40
tndr2
27.04.19
✎
20:40
|
(35) Ну будь любезен, объясни как это работает?
Я не понимаю. |
|||
41
Garykom
гуру
27.04.19
✎
20:46
|
(40) "Две разные ссылки на один объект не равны между собой", хотя если получить объект по каждой и сравнить то они равны.
|
|||
42
H A D G E H O G s
27.04.19
✎
20:49
|
(40) 2 массива разных объектов. Уникальный. Естественно, они не равны друг другу, так как это РАЗНЫЕ объекты, хоть и содержат одинаковые данные.
Почему 1С не сделала сравнение по содержимому - хороший вопрос, который можно задать также Oracle, Microsoft и Borland вместе с Гугл. На то ты и программист здесь, чтобы самостоятельно сравнивать по содержимому. |
|||
43
H A D G E H O G s
27.04.19
✎
20:49
|
Уникальный - > Уникальных.
|
|||
44
runoff_runoff
27.04.19
✎
20:50
|
(39) будет 0, т.е. значения равны..
|
|||
45
Garykom
гуру
27.04.19
✎
20:52
|
Ну вся проблема ТС в том что он вместо строк (с полными путями файлов найденных) зачем то сами файлы из 1С сохраняет, которые внутри в т.ч. могут иметь разные один путь и ссылаться на один объект файл на диске.
|
|||
46
tndr2
27.04.19
✎
20:54
|
(42) Это все замечательно.
Но, вопрос, как 1с сравнивает эти "разные" объекты? По каким критериям, если все свойства этих объектов, определенные самой платформой идентичны. И выходит, что сначала сама платформа гоняет рекурсивно поиск по каталогу, потому выгружает это все в массив для 1с гомнокодера, типа меня, и я еще потом 2 раза должен прогнать этот массив, для того, чтобы сравнить значения... Чего-то не то? Нет? |
|||
47
Garykom
гуру
27.04.19
✎
20:58
|
Файл (File)
ПолноеИмя (FullName) Использование: Только чтение. Описание: Тип: Строка. Содержит полное имя файла (включающее путь к файлу), с которым связан объект. Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). |
|||
48
Garykom
гуру
27.04.19
✎
20:59
|
Вам так надо срочно обратиться к кому то и купить СП
|
|||
49
Garykom
гуру
27.04.19
✎
20:59
|
(48) *таки
|
|||
50
tndr2
27.04.19
✎
21:12
|
Я не понимаю как это работает...
Сам по себе метод НайтиФайлы() - не очень быстрый Кроме того, надо получить свойства файла, типа "ПолноеИмя", а дальше уже что с ним делать... Ну такое себе.. |
|||
51
H A D G E H O G s
27.04.19
✎
21:12
|
(46) Все в порядке, я не вижу проблемы.
|
|||
52
H A D G E H O G s
27.04.19
✎
21:27
|
Как я вижу программистов 1С
https://youtu.be/UNfKzPWJK50?t=634 |
|||
53
tndr2
27.04.19
✎
21:30
|
(51) Ну это достаточно серьезная проблема, если например необходимо актуализировать изображения на сайте.
Оперативно, удалять/добавлять и все это делать средствами учетной системы на 1с. При условии, что файлов много, они часто изменяются и их необходимо копировать для работы разных отделов компании.. |
|||
54
H A D G E H O G s
27.04.19
✎
21:32
|
(53) Напишите ВК, но я сомневаюсь, что узкое горлышко - 1С, а не NTFS.
|
|||
55
H A D G E H O G s
27.04.19
✎
21:33
|
Когда пытаешься поддерживать актуальность файлов в каталоге:
https://youtu.be/UNfKzPWJK50?t=137 |
|||
56
tndr2
27.04.19
✎
21:34
|
Ежова понесло..)))
|
|||
57
Garykom
гуру
27.04.19
✎
21:36
|
(54) Кстати насчет ВК.
Сча Golang изучаю и оно мне нравится кросскомпиляцией под разные платформы. Но как ее прикрутить к 1С в виде ВК? |
|||
58
Garykom
гуру
27.04.19
✎
21:38
|
(57)+ В будущем вот это хочу пощупать https://github.com/covrom/gonec
|
|||
59
Garykom
гуру
27.04.19
✎
21:47
|
||||
60
tndr2
27.04.19
✎
23:37
|
(34) А как же с ссылочными типами, ну или простыми?
Как-то же находит? Что это за такой странный объект - "Файл", у которого порядка 5-6 свойств, по которым платформа не в состоянии определить идентичность? Понятно, что 1С - это учетная система, и что функционал работы с файловой системой ОС - сильно ограничен, но если уж вы дали инструмент работы с файловой системой, так доработайте его до конца..... |
|||
61
Garykom
гуру
27.04.19
✎
23:43
|
(60) Вы хотите странного.
Взяли две пачки листочков бумаги. Написали на листках одной пачке имена и на листках другой пачке тоже имена, причем так что имена между и первой и второй пачкой могут повторяться. Все листочки сложили так что названия не прочитать. И теперь хотите чтобы некто/нечто не разворачивая листочков нашло "одинаковые листочки" (по факту разные но с одинаковыми именами внутри) в двух пачках? |
|||
62
tndr2
27.04.19
✎
23:47
|
(61) Я ничего не хочу
|
|||
63
tndr2
27.04.19
✎
23:48
|
У объекта типа "файл" есть свойства, вот пусть интерпретатор и сравнивает свойства, которые ему передаются
|
|||
64
tndr2
27.04.19
✎
23:53
|
Ссылочные или простые типа он же сравнивает?
|
|||
65
tndr2
28.04.19
✎
00:10
|
(54) лабание внешних компонент - приводит к сложности принятия решений бизнесом.
Ибо если чота_там_не_заработает_ то надо будет заморачиваться, как выйти из сложной ситуации... А "дело" не может себе позволить простаивать Ежов. Твоя зарплата - это работа других более предприимчивых людей. |
|||
66
Мимохожий Однако
28.04.19
✎
06:44
|
(4) Есть программы копирования, которые решают эту задачу за 5 минут настройки. Достаточно установить на компьютер. Например, Cobian Backup различных версий. Это не считая кучи примеров готовых скриптов и батников. ИМХО, буря в стакане бурды.
|
|||
67
Cyberhawk
28.04.19
✎
08:25
|
Так пути (каталоги) поиска-то разные в параметре метода, возвращающем массив описаний файлов.
Попробуй два массива создать, передавая в метод один и тот же каталог, что будет? |
|||
68
Web00001
28.04.19
✎
08:38
|
У нас есть учетная система, что будем делать? Синхронизировать файлы, что же еще? Может использовать rsync или rclone? При наличии программиста 1С который работает за тарелку лапши? Ты что дебил?
|
|||
69
zehn
28.04.19
✎
08:49
|
(65) Милота-то какая - разработчик, не осиливший сравнение объектов по ссылке, учит остальных как вести бизнес... Тяжело вам там, товарищ председатель совета директоров, программировать заставляют?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |