helpf.pro
Регистрация

v8: Не пойму как подойти к решению

Bell
03.06.2013 11:32Прочитано: 1756
Здравствуйте
Имею таблицу значений (ТЗ)в ней находятся номера Партия (колонки Партия, номер)
123 45 789
Номера идут не по порядку, а с разрывами(интервалами).Номер на единичку всегда больше.
Мне надо получить даные в виде
1-3
4-5
7-9
и загруить из в другую ТЗ_Интервалы (Колонки Партия, НомерС, НомерПо)
Что надо сравнивать в ТЗ что бы получить это ?

Для Каждого СтрокаТЗ из ТЗ Цикл


КонецЦикла;
Yandex
Возможно, вас также заинтересует
Реклама на портале
Mokey
03.06.2013 15:01Ответ № 1
рад бы помочь, но я ничего не понял из вопроса, к сожалению.
Bell
03.06.2013 18:28Ответ № 2
Это можно сравнить с ведением БСО по номерам
Есть остаток номеров на складе с 1 по 100. (100 штук)Номера идут попорядку. Номера могут расходовать и перемещать и перекомплектововать(в любом порядке). Мы допустим израсходовали с 5 по 25. Остаок номеров на складе остался с 1 по 4 и с 26 по 100. В регистре они же храняться ПОШТУЧНО 1234 и 26 27 ... 100. Мне надо при подборе в таблицу значений формы подбора загрузить интервалы 1-4 и 26-100(Что можно было выбирать интервалы) ,Они подбираются в документы (интервалами) , там выставляется вид обработки и т.д.
Я запросом сформировал остаток с регистра остатков и результат загрузил в таблицу значение (ТЗ)(промежуточную).Теперь надо обойти эту таблицу значений (ТЗ) и сформировать интервалы.
Может как то по другому надо
ivan232
04.06.2013 08:06Ответ № 3
Цитата
Имею таблицу значений (ТЗ)в ней находятся номера Партия (колонки Партия, номер)
123 45 789
Номера идут не по порядку, а с разрывами(интервалами).Номер на единичку всегда больше.
Мне надо получить даные в виде
1-3
4-5
7-9

почему нельзя сделать интервалы 1-5, 7-9?
не понял что у тебя хранится в ТЗ, но алгоритм создания интервалов я бы сделал так:
Код 1C v 8.х
 
n = Лев(ОбщийНабор,1);//ОбщийНабор - строка с перечисленными номерами
для к =2 по СтрДлина(ОбщийНабор)-1 цикл
m1 = число(сред(общийнабор,к,1));
m2 = число(сред(общийнабор,к+1,1));
если m2 <> (m1+1) тогда
интервал = n-m1;
n = m2;
конецесли;
к = к+1;
конеццикла;
интервал = n-m2;//последний интервал

Изменено 04.06.13 08:17:25
Bell
04.06.2013 09:44Ответ № 4
(3) ivan232, Да, интервалы я опечатался, будут те которые вы написали 1-5, 7-9
В ТЗ
ИЗМЕРЕНИЯ
Партия (Это документы ли ссылка на спр., не изменяется никогда)
Номер (Это номер партии, он мжет изменяться (Число,10)).
Если можно примените к алгоритму с обходом к ТЗ и прокоментируйте(а то меня смущает ОбщийНабор - что это строка). тк. еще у меня будут манипуляции потому я выгрузжаю в ТЗ.
Для каждого строкаТЗ из ТЗ Цикл

КонецЦикла
Изменено 04.06.13 10:03:25
ivan232
04.06.2013 10:40Ответ № 5
в таком случае - сортируете ТЗ по возрастанию и :
Код 1C v 8.х
 
n = ТЗ[1].Номер;//запоминаем начальный номер
Для к = 2 по ТЗ.Количесвто() Цикл
m1 = ТЗ[к].Номер;
m2 = ТЗ[к+1].Номер;
если m2 <> (m1+1) тогда
интервал = Строка(n) + "-" + Строка(m1);
n = m2;
конецесли;
к = к+1;
конеццикла;
интервал = n-m2;//последний интервал

если использовать "Для каждого строкаТЗ из ТЗ Цикл " то нужно исключить первую и последнюю строку
Bell
06.06.2013 19:09Ответ № 6
При вашем коде выдает ошбику
{Документ.БСО_Акт_Использованных.Форма.ФормаДокумента.Форма(390)}: Индекс находится за границами массива m1 = ТЗ[к].Номер;
и не отображает никаких нитервалов

Сделал так, показывате первый интервал правильно до разрыаа, а потом ошибка с индексом тоже

{Документ.БСО_Акт_Использованных.Форма.ФормаДокумента.Форма(406)}: Индекс находится за границами массива m2 = ТЗ[к+1].Номер;


Код 1C v 8.х
 n = ТЗ[0].Номер;//запоминаем начальный номер
Для к = 1 по ТЗ.Количество() Цикл
m1 = ТЗ[к].Номер;
m2 = ТЗ[к+1].Номер; // ????
если m2 <> (m1+1) тогда
интервал = Строка(n) + "-" + Строка(m1);
n = m2;
Сообщить(Интервал);
конецесли;
к = к+1;
конеццикла;
интервал = n-m2;//последний интервал
Сообщить( Интервал );

Изменено 06.06.13 19:10:08
Mokey
07.06.2013 11:16Ответ № 7
Попробуйте так:
Для к = 1 по ТЗ.Количество()-1 Цикл
чтобы индекс всегда был в пределах массива, просто когда к=ТЗ.Количество(), то ТЗ[к+1] выдаёт ошибку.
Bell
07.06.2013 11:58Ответ № 8
Все таже ошибка с индексом в той же строке М2 = ТЗ[К + 1].Номер;

Если Ввести два и более интервала тогда оошибка в М1 = ТЗ[К].Номер;
Изменено 07.06.13 14:09:03
ivan232
11.06.2013 07:21Ответ № 9
прошу прощения за ошибку - в условии цикла нужно бежать до предпоследнего элемента, а т.к. индексация в таблице значений идет с 0, то нужно использовать следующее условие:
Код 1C v 8.х
 Для к = 1 по ТЗ.Количество()-2 Цикл    
Bell
11.06.2013 10:37Ответ № 10
Ошибка с индексами пропала, но появилась с последним нитевалом
(забаыно, но сейчас даже при ТЗ.Количество()-1) не сообщает ошибку с индексами
Имею интевал 100 по 199 (есть списанные 102-105, 110-120, 135-140)
Получаем результат
100 - 101
106 - 109
121 - 134
-58, должно быть 141-199



Код 1C v 8.х
 Н = ТЗ[0].Номер;
Для К = 1 по ТЗ.Количество()-2 Цикл
М1 = ТЗ[К].Номер;
М2 = ТЗ[К + 1].Номер;
Если М2 <> (М1 + 1) тогда

Интервал = Строка(Н) + " - " + Строка(М1);
Н = М2;
Сообщить(Интервал);

конецесли;
К = К + 1;
конеццикла;
интервал = Н - М2; //????
Сообщить( Интервал );
ivan232
11.06.2013 13:23Ответ № 11
в торопях писал, тут тоже ошибся с написанием:
Код 1C v 8.х
 интервал = Н - М2;   

имел ввиду следующее:
Код 1C v 8.2 УП
 Интервал = Строка(Н) + " - " + Строка(М1);   

и все должно заработать
Bell
11.06.2013 13:40Ответ № 12
Все заработала ,
Ворос №1
А почму ты хочешь отнимать 2 , а не 1 Мы же начинаем с 0
Ворос №2
В последнем интервале надо наверное добавить 1 или на М2 переправить
Изменено 11.06.13 13:43:00
Mokey
11.06.2013 14:02Ответ № 13
Код 1C v 8.х
 Для К = 1 по ТЗ.Количество()-2 Цикл 
..................
К = К + 1;
КонецЦикла;

вот тут проблема, Вы же итератор уже задали в выражении Для К = 1 по ТЗ.Количество()-2 Цикл , а потом ещё принудительно увеличиваете К
Изменено 11.06.13 14:02:55
Bell
11.06.2013 14:11Ответ № 14
Все понял
Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.