Имя: Пароль:
1C
1С v8
Нужна программа для автоподбора файлов.
, ,
0 Ткачев
 
16.07.11
13:53
Подскажите программу для автоподбора файлов по размеру.
т.е. Есть папка на диске, в ней лежат куча файлов, мне надо подобрать из них файлы для записи на DVD диск по максимуму размера.
1 Злопчинский
 
16.07.11
13:55
задача о рюкзаке
2 Нуф-Нуф
 
16.07.11
13:55
конфига какая? релиз?
3 Ткачев
 
16.07.11
13:57
Блин, я раздел все время забываю выставлять, не важно в чем написана эта программа.
4 almar
 
16.07.11
13:58
(0) Winrar ?
5 Ткачев
 
16.07.11
13:59
Если уже в 1с то я сделал что она считает размеры файлов и папок, а дальше что то не могу сообразить как мне подобрать файлы что бы размер не превышал 4,7 Гб.

   СписокФайлов = НайтиФайлы(Каталог, "*.*");
   ТаблицаФайлов = Новый ТаблицаЗначений;
   ТаблицаФайлов.Колонки.Добавить("Имя");
   ТаблицаФайлов.Колонки.Добавить("Размер");
   Для Каждого ПутьФайла Из Списокфайлов Цикл
       Размер = 0;
       Файло = Новый Файл(ПутьФайла.ПолноеИмя);
       НоваяСтрока = ТаблицаФайлов.Добавить();
       Если Файло.ЭтоКаталог() Тогда
           ФайлыВКаталоге = НайтиФайлы(Файло.ПолноеИмя, "*.*", Истина);
           Для Каждого ПутьФайлаКаталога Из ФайлыВКаталоге Цикл
               Файло = Новый Файл(ПутьФайлаКаталога.ПолноеИмя);
               Если Не Файло.ЭтоКаталог() Тогда
                   Размер = Размер + Файло.Размер();
               КонецЕсли;
           КонецЦикла;
       Иначе
           Размер = Файло.Размер();
       КонецЕсли;
       НоваяСтрока.Имя = ПутьФайла.Имя;
       НоваяСтрока.Размер = Размер;
   КонецЦикла;
   ТаблицаФайлов.Сортировать("Размер Убыв");
6 Ткачев
 
16.07.11
14:00
(4)Нее, мне надо набор целых файлов, что бы они максимально влезли на DVD диск.
7 Ткачев
 
16.07.11
14:37
Если выражаясь языком 1с, есть комплект "Подарок" он состоит из набора товаров, вот как подобрать туда автоматически комплектующие, что бы их сумма была максимально приближенной к цене подарка и не превышала ее.
Товары находятся в таблице значений с колонками "Товар" и "Цена".
8 Конфигуратор1с
 
16.07.11
14:50
(7) добавить в тз колонки количество и сумма, а потом отсортировать по сумме и в цикле пока сумма<нужнойсуммы подбирать
9 Злопчинский
 
16.07.11
14:58
плин.. может сделать онлайн сервис для таких....?
10 Ткачев
 
16.07.11
15:42
(8)Можно пример на основе ТаблицаФайлов в(5)?
11 Злопчинский
 
16.07.11
15:56
(7) дополнительные ограничения есть? что лучше: 50+10+10+10+10+10 или 80+20?
12 Ткачев
 
16.07.11
19:56
Если сумма одинаковая, то лучше больше файлов, т.е. > 50+10+10+10+10+10
13 Dem1urg
 
16.07.11
20:12
14 Ткачев
 
16.07.11
20:49
(13)А в 1с бейсик это можно перевести ?
15 Ник второй
 
16.07.11
20:52
можно.
16 Dem1urg
 
16.07.11
20:59
(14) Разрешаю.
17 Ткачев
 
16.07.11
21:09
(15)(16)Ну так помогите, я в этих закорючках используемых в С не понимаю, у меня сейчас все выглядит так:
Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   ОчиститьСообщения();
   Каталог = "C:\Архив";
   Длина = 4706009088;
   МинимальнаяДлина = 4600000000;
   ВременнаяДлина = 0;
   СписокФайлов = НайтиФайлы(Каталог, "*.*");
   ТаблицаФайлов = Новый ТаблицаЗначений;
   ТаблицаФайлов.Колонки.Добавить("Имя");
   ТаблицаФайлов.Колонки.Добавить("Размер");
   Для Каждого ПутьФайла Из Списокфайлов Цикл
       Размер = 0;
       Файло = Новый Файл(ПутьФайла.ПолноеИмя);
       НоваяСтрока = ТаблицаФайлов.Добавить();
       Если Файло.ЭтоКаталог() Тогда
           ФайлыВКаталоге = НайтиФайлы(Файло.ПолноеИмя, "*.*", Истина);
           Для Каждого ПутьФайлаКаталога Из ФайлыВКаталоге Цикл
               Файло = Новый Файл(ПутьФайлаКаталога.ПолноеИмя);
               Если Не Файло.ЭтоКаталог() Тогда
                   Размер = Размер + Файло.Размер();
               КонецЕсли;
           КонецЦикла;
       Иначе
           Размер = Файло.Размер();
       КонецЕсли;
       НоваяСтрока.Имя = ПутьФайла.Имя;
       НоваяСтрока.Размер = Размер;
   КонецЦикла;
   ТаблицаФайлов.Сортировать("Размер Убыв");
   Для Аа = 0 по ТаблицаФайлов.Количество() - 1 Цикл
       ПервыйФайл = ТаблицаФайлов.Получить(Аа);
       РазмерФайла = ПервыйФайл.Размер + ВременнаяДлина;
       Если РазмерФайла <= Длина Тогда
           ИтоговойРазмер = РазмерФайла;
           Сообщить(ПервыйФайл.Имя + " " + РазмерФайла);
           Для Аб = Аа + 1 по ТаблицаФайлов.Количество() - 1 Цикл
               Если Аа = Аб Тогда
                   Продолжить;
               КонецЕсли;
               ДалееФайл = ТаблицаФайлов.Получить(Аб);
               ДалееРазмер = ДалееФайл.Размер;
               Если ИтоговойРазмер + ДалееРазмер <= Длина Тогда
                   Сообщить(ДалееФайл.Имя + " " + ДалееРазмер);
                   ИтоговойРазмер = ИтоговойРазмер + ДалееРазмер;
               КонецЕсли;
           КонецЦикла;
           Если ИтоговойРазмер > МинимальнаяДлина Тогда
               Сообщить("_______________ "  + ИтоговойРазмер + " _______________");
           Иначе
               Сообщить(ИтоговойРазмер);
           КонецЕсли;
           Сообщить(" ");
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры
18 Dem1urg
 
16.07.11
22:20
Сделать за тебя работу? Ну-ну
Если не понятно что-то конкретное, ты не стесняйся, спроси, а предлагать другим сделать за тебя твою работу за просто так...
19 Ткачев
 
17.07.11
08:34
(18)Так Вы сделайте, в базе знаний я не нашел (13), может вашу обработку туда поместят и рейтинг Ваш поднимется, у меня уж больно много временных таблиц получается и как сократить не знаю.
   КолВо = ТаблицаФайлов.Количество() - 1;
   ВремТаб = Новый ТаблицаЗначений;
   ВремТаб.Колонки.Добавить("Имя");
   ВремТаб.Колонки.Добавить("Размер");
   Для Аа = 0 по КолВо Цикл
       ПервыйФайл = ТаблицаФайлов.Получить(Аа);
       РазмерФайла = ПервыйФайл.Размер + ВременнаяДлина;
       Если РазмерФайла <= Длина Тогда
           Для Ав = Аа + 1 По КолВо Цикл
               ИтоговойРазмер = РазмерФайла;
               НоваяСтрока = ВремТаб.Добавить();
               НоваяСтрока.Имя = ПервыйФайл.Имя;
               НоваяСтрока.Размер = РазмерФайла;
               Для Аб = Ав по КолВо Цикл
                   ДалееФайл = ТаблицаФайлов.Получить(Аб);
                   ДалееРазмер = ДалееФайл.Размер;
                   Если ИтоговойРазмер + ДалееРазмер <= Длина Тогда
                       НоваяСтрока = ВремТаб.Добавить();
                       НоваяСтрока.Имя = ДалееФайл.Имя;
                       НоваяСтрока.Размер = ДалееРазмер;
                       ИтоговойРазмер = ИтоговойРазмер + ДалееРазмер;
                   КонецЕсли;
               КонецЦикла;
               Если ИтоговойРазмер > МинимальнаяДлина Тогда
                   Для Ин = 0 по ВремТаб.Количество() - 1 Цикл
                       Стр = ВремТаб.Получить(Ин);
                       Сообщить(Стр.Имя + " " + Стр.Размер);
                   КонецЦикла;
                   Сообщить(ИтоговойРазмер);
                   Сообщить(" ");
               КонецЕсли;
               ВремТаб.Очистить();
           КонецЦикла;
       КонецЕсли;
   КонецЦикла;
20 Ткачев
 
17.07.11
08:39
А что бы не мучатся, вот: http://zalil.ru/31431012
21 Ткачев
 
19.07.11
08:09
Подниму ка я тему, может кто то что то добавит.
22 Ткачев
 
20.07.11
14:43
Все считает, все без дублей:
(5)+
   Кон = 1;
   Для Аа = 1 по ТаблицаФайлов.Количество() Цикл
       Кон = Кон * 2;    
   КонецЦикла;
   Для Аа = 1 По Кон - 1 Цикл
       Результат = 0;
       ИсхЧисло = Аа;
       Аб = 0;
       Пока ИсхЧисло <> 0 Цикл
           Если ИсхЧисло%2 Тогда
               СтрТаб = ТаблицаФайлов.Получить(Аб);
               НовСтр = ВремТаблица.Добавить();
               НовСтр.Имя = СтрТаб.Имя;
               НовСтр.Размер = СтрТаб.Размер;
               Результат = Результат + СтрТаб.Размер;
           КонецЕсли;
           ИсхЧисло = Цел(ИсхЧисло / 2);
           Аб = Аб + 1;
       КонецЦикла;
       Если Результат >= МинимальнаяДлина И Результат <= Длина Тогда
           Для Каждого Стр Из ВремТаблица Цикл
               Сообщить(Стр.Имя + " " + Стр.Размер)
           КонецЦикла;
           Сообщить("-" + Результат + "-");
       КонецЕсли;
       ВремТаблица.Очистить();
   КонецЦикла;
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.