Имя: Пароль:
1C
1С v8
Условие цикла
,
0 Collector
 
02.08.11
10:33
Здравствуйте, Уважаемые!
Подскажите, какое правильное условие для цикла написать, чтобы 1С начала создавать второй, третий и тд документ после того, как набирается ПланВес?

Пока Вес <= ПланВес Цикл
   Для Каждого ТекСтрока из ТаблицаДокументов Цикл
   Если Вес <= ПланВес Тогда
       Если ТекСтрока.Отметка = Истина Тогда            
           СтрокаТЧ = Форма.Объект.Реализация.Добавить();
           СтрокаТЧ.Документ = ТекСтрока.Документ;
           СтрокаТЧ.Вес = ТекСтрока.Вес;
           Вес = ТекСтрока.Вес + Вес;
       КонецЕсли;            
   Иначе Прервать;    
   КонецЕсли;    
   КонецЦикла;
   КонецЦикла;
1 vicof
 
02.08.11
10:38
на г-код можно выкладывать
2 Mort
 
02.08.11
10:39
(0) Блок-схемы себе нарисуй.
3 vicof
 
02.08.11
10:39
Пока Вес <= ПланВес Цикл
 
  Если Вес <= ПланВес Тогда

вот это зачем?

Если ТекСтрока.Отметка = Истина Тогда

вот это зачем?
4 lxs
 
02.08.11
10:39
(1) +1
5 Axel2009
 
02.08.11
10:42
тут не условие нужно, а цикл переписывать.
6 Reset
 
02.08.11
10:43
(5)+1
7 rutony
 
02.08.11
10:46
(0) почти полный аналог задачек на списание по партиям для спеца платформы
8 Collector
 
02.08.11
10:47
(6) По любому так не оставишь)) Не могли бы вы, хоть направить в правильную сторону ?
(7) А есть решение? Можно взглянуть ?
9 vicof
 
02.08.11
10:49
(8) ты бы хоть задачу нормально описал
10 Collector
 
02.08.11
10:52
а что не нормального в моем описании? мне кажется все предельно ясно :-\
11 rutony
 
02.08.11
10:56
(10) Оно фактически отсутствует...
12 Axel2009
 
02.08.11
10:57
(10) в текущем цикле я вижу только то что из существующих документов создается один, причем если веса плана больше чем суммарный вес в табличке, тогда тупо еще раз по тем же документикам создаем строчки, ну чтобы план забить и все.
13 Sammo
 
02.08.11
11:05
Если правильно понимаю, есть некая таблица значений с весами. Нужно раскидать по документам, причем задача оптимального подбора не стоит (максимальное соответсвие вес и план вес).
Тогда простой обход таблицы с заполнением документа. Когда вес становится больше план веса - создаем следующий документ.
Т.е. 1 цикл и 1 условие + обработка после выхода из цикла.
14 Collector
 
02.08.11
11:13
(13) Что за обработка?
15 vicof
 
02.08.11
11:18
(14) эмм...твоя
16 Axel2009
 
02.08.11
11:19
(14) "обработка после выхода из цикла" подразумевается код записи документа, когда вышли из цикла..
псц
17 Sammo
 
02.08.11
11:25
(16) при его наличии :)
18 Reset
 
02.08.11
11:27
Это очередной виток сумрака, когда 1) ТС не описал задачу 2) Аналитики построили предположения 3) ТС выясняет условие своей задачи по предположениям у аналитиков?
19 ice777
 
02.08.11
11:51
Вес=0;
Для Каждого ТекСтрока из ТаблицаДокументов Цикл
   Если ТекСтрока.Отметка = Истина тогда
     Если (Вес+ТекСтрока.Вес) < ПланВес Тогда
         // еще недобран вес
         Вес = ТекСтрока.Вес + Вес;
     Иначе
         // вес набран
         // тут и создай свой док с весом Вес
         ..................

         Вес=ТекСтрока.Вес;
     КонецЕсли;  
   КонецЕсли;    
КонецЦикла;

)
20 Collector
 
02.08.11
15:15
Вот как у меня получилось:

&НаКлиенте
Процедура Обработка(Команда)    
   МассивСсылок = СоздатьНовыйДокумент();
   Для Каждого Док из МассивСсылок Цикл
   ОткрытьЗначение(Док);
    КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СоздатьНовыйДокумент()
МассивСсылок = Новый Массив;    
МассивДокументов = Новый Массив;
МассивСтрок = Новый Массив;
СоздатьНовыйДокумент = Истина;
Вес = 0;
Объем = 0;
Для Каждого ТекСтрока Из ТаблицаДокументов Цикл
     Если СоздатьНовыйДокумент Тогда
           МассивСтрок = Новый Массив;
           МассивДокументов.Добавить(МассивСтрок);
           Вес = 0;
           СоздатьНовыйДокумент = Ложь;
     КонецЕсли;
     МассивСтрок.Добавить(ТекСтрока);
     Вес = Вес + ТекСтрока.Вес;
     Если Вес > ПланВес ИЛИ Объем > ПланОбъем Тогда
           СоздатьНовыйДокумент = Истина;
     КонецЕсли;
КонецЦикла;
Для Каждого МассивСтрок Из МассивДокументов Цикл
     НовыйДокумент = Документы.Рейс.СоздатьДокумент();
     НовыйДокумент.Дата = ТекущаяДата();
     Для Каждого Строка Из МассивСтрок Цикл
          // РеквДока =
             СтрокаДока = НовыйДокумент.Реализация.Добавить();
           СтрокаДока.Вес = Строка.Вес;
           СтрокаДока.Документ = Строка.Документ;
           СтрокаДока.Объем = Строка.Объем;
       КонецЦикла;
НовыйДокумент.Записать();      
МассивСсылок.Добавить(НовыйДокумент.Ссылка);
КонецЦикла;
21 Axel2009
 
02.08.11
15:40
(20) а если будет на какойто строке так, что
планвес = 2000
вес = 1990
текстрока.вес = 500
то в документ попадет 2490 вес. это нормально?
22 Collector
 
03.08.11
09:32
(21) Согласен, не нормально. Есть варианты ?
23 Axel2009
 
03.08.11
09:34
(22) ну проверяй общий вес + текущий вес перед добавлением строки
24 Collector
 
03.08.11
09:35
Если (Вес + ТекСтрока.Вес)<ПланВес Тогда
     МассивСтрок.Добавить(ТекСтрока);
     Вес = Вес + ТекСтрока.Вес;
     Иначе
           СоздатьНовыйДокумент = Истина;
     КонецЕсли;
Изменил условие. стало вроде лучше.
25 Collector
 
03.08.11
09:41
Но все равно не то получается. Выходит если Вес=50 ПланВес= 100 ТекСтрока.Вес=60, то он создаст новый документ, хотя за ним следуют, допустим 3 документа, по которым ТекСтрока.Вес=10, надо чтобы эти тоже попали в первый.. Т.е. документом по возможности набирать ПланВес.
26 Sammo
 
03.08.11
09:49
(25) а вот это уже анализ и оптимальное заполнение.
Это совершенно другая задача и решается несколько по другому...
27 Collector
 
03.08.11
09:59
Несколько по другому? Не подскажите алгоритм ?
28 hhhh
 
03.08.11
10:07
(27) ну вот тут

   Иначе Прервать;    
   КонецЕсли;    

ставите

   Иначе Продолжить;    
   КонецЕсли;
29 Axel2009
 
03.08.11
10:25
(27) оптимального алгоритма не существует =)
из (25) пример
ВесПлан = 100;
веса:
50
60
10
20
10
50

точнее существует конечно, но это кросс джоин саму на себя столько раз, сколько записей в таблице, но это очень долгий путь
30 Sammo
 
03.08.11
10:42
(27) Самый простой, и мягко говоря, не очень оптимальный вариант:
1. Сортировать вес по убыванию.
2. Документы не сохранять до конца обработки.
3. Сначала пробуем вес добавить во все уже существующие документы, и только если никуда не влез - пихаем в новый.

Но в общем случае результат будет лучше.
31 Jaffar
 
03.08.11
10:59
(20) а ничего, что Объем не принимает никакого значения, отличного от 0? и происхождение лимитов ПланВес и ПланОбъем не понятно. надеюсь - это не глобальные переменные? можно их параметрами передать, если уж считать на сервере.
32 Collector
 
03.08.11
11:09
(31) На тот момент когда код скинул, объем еще действительно не учавствовал. А ПланВес и ПланОбъем - это значения полей ввода на форме... Юзер сам их туда проставляет..
33 Collector
 
03.08.11
16:24
В общем, получилось вот так:
   
МассивСсылок = Новый Массив;    
МассивДокументов = Новый Массив;
МассивСтрок = Новый Массив;
СоздатьНовыйДокумент = Истина;
Вес = 0;
Объем = 0;
Сч=0;
Пока СЧ<ТаблицаДокументов.Количество() Цикл
Для Каждого ТекСтрока Из ТаблицаДокументов Цикл
Если ТекСтрока.Отметка = Истина Тогда

   Если СоздатьНовыйДокумент Тогда
           МассивСтрок = Новый Массив;
           МассивДокументов.Добавить(МассивСтрок);
           Вес = 0;
           СоздатьНовыйДокумент = Ложь;
       КонецЕсли;
                                        //ИЛИ (Объем+ТекСтрока.Объем) < ПланОбъем
     Если (Вес + ТекСтрока.Вес)<ПланВес Тогда
     МассивСтрок.Добавить(ТекСтрока);
     Вес = Вес + ТекСтрока.Вес;
       //Если Вес > ПланВес ИЛИ Объем > ПланОбъем Тогда
     Сч = Сч+1;          
     ТекСтрока.Отметка = Ложь;
       ИначеЕсли Сч<=ТаблицаДокументов.Количество() тогда
            Продолжить;      
     КонецЕсли;
 КонецЕсли;
КонецЦикла;
Вес = 0;
СоздатьНовыйДокумент = Истина;
КонецЦикла;

Для Каждого МассивСтрок Из МассивДокументов Цикл
     НовыйДокумент = Документы.Рейс.СоздатьДокумент();
     НовыйДокумент.Дата = ТекущаяДата();
     Для Каждого Строка Из МассивСтрок Цикл
          // РеквДока =
             СтрокаДока = НовыйДокумент.Реализация.Добавить();
           СтрокаДока.Вес = Строка.Вес;
           СтрокаДока.Документ = Строка.Документ;
           СтрокаДока.Объем = Строка.Объем;
       КонецЦикла;
НовыйДокумент.Записать();      
МассивСсылок.Добавить(НовыйДокумент.Ссылка);
КонецЦикла;

Совсем плохо ?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn