Имя: Пароль:
1C
1С v8
Массив элементов с типом "файл"
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) Милота-то какая - разработчик, не осиливший сравнение объектов по ссылке, учит остальных как вести бизнес... Тяжело вам там, товарищ председатель совета директоров, программировать заставляют?
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший