|
Условие цикла | ☑ | ||
---|---|---|---|---|
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; СоздатьНовыйДокумент = Истина; КонецЦикла; Для Каждого МассивСтрок Из МассивДокументов Цикл НовыйДокумент = Документы.Рейс.СоздатьДокумент(); НовыйДокумент.Дата = ТекущаяДата(); Для Каждого Строка Из МассивСтрок Цикл // РеквДока = СтрокаДока = НовыйДокумент.Реализация.Добавить(); СтрокаДока.Вес = Строка.Вес; СтрокаДока.Документ = Строка.Документ; СтрокаДока.Объем = Строка.Объем; КонецЦикла; НовыйДокумент.Записать(); МассивСсылок.Добавить(НовыйДокумент.Ссылка); КонецЦикла; Совсем плохо ? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |