Имя: Пароль:
1C
1С v8
v8: 1с 8.2, функция возвращает не то что нужно
0 Dimochka
 
09.04.13
22:34
Есть функция которая в зависимости от условия выводит А или Б или С, а нужно чтобы она выводила А_1,А_2,А_3 и т.д., потом Б_1,Б_2,Б_3 и т.д. и с С аналогично вот функция:
// Рассчитать ABC классификацию.
Функция ABCКлассификация(Данные) Экспорт
Перем ТаблицаЗначений;

Если Данные = Null Тогда
 Возврат Null;
КонецЕсли;

Если ТипЗнч(Данные) <> Тип("ДанныеГрупповойОбработкиКомпоновкиДанных") Тогда
 Сообщить(ТипЗнч(Данные));
 ВызватьИсключение "В функцию ABCКлассификация() можно передавать только объект типа ДанныеГрупповойОбработкиКомпоновкиДанных";
КонецЕсли;

Если Не Данные.ВременныеДанныеОбработки.Свойство("ABCКлассификацияТаблицаЗначений", ТаблицаЗначений) Тогда
 // выполним расчет классификации один раз при первом вызове
 // а потом запомним выполненный расчет и дальше будем этот
 // расчет использовать
 ТаблицаЗначений = Данные.Данные.Скопировать();
 ТаблицаЗначений.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число"));
 Номер = 0;
 ОбщаяСумма = 0;
 Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл
  СтрокаТаблицыЗначений.Номер = Номер;
  Номер = Номер + 1;

  Если СтрокаТаблицыЗначений[0] <> NULL Тогда

   ОбщаяСумма = ОбщаяСумма + СтрокаТаблицыЗначений[0];

  КонецЕсли;

 КонецЦикла;

 ТаблицаЗначений.Сортировать(ТаблицаЗначений.Колонки[0].Имя + " Убыв");
 ТаблицаЗначений.Индексы.Добавить("Номер");
 НакопленнаяСумма = 0;
 ИндексКлассаA = Неопределено;
 ИндексКлассаB = Неопределено;
 Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл

  Если СтрокаТаблицыЗначений[0] <> NULL Тогда

   НакопленнаяСумма = НакопленнаяСумма + СтрокаТаблицыЗначений[0];

  КонецЕсли;

  Если ОбщаяСумма = 0 Тогда

   Процент = 1;

  Иначе

   Процент = НакопленнаяСумма / ОбщаяСумма;

  КонецЕсли;

  Если Процент > 0.75 Тогда
   Если ИндексКлассаA = Неопределено Тогда
     ИндексКлассаA = ТаблицаЗначений.Индекс(СтрокаТаблицыЗначений);
   ИначеЕсли Процент > 0.90 Тогда
     Если ИндексКлассаB = Неопределено Тогда
      ИндексКлассаB = ТаблицаЗначений.Индекс(СтрокаТаблицыЗначений);
     КонецЕсли;
     Прервать;
   КонецЕсли;
  КонецЕсли;
 КонецЦикла;

  Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияТаблицаЗначений", ТаблицаЗначений);
  Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияИндексКлассаA", ИндексКлассаA);
  Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияИндексКлассаB", ИндексКлассаB);
КонецЕсли;

Если Данные.ТекущийЭлемент = Неопределено Тогда

 // Итог по группировке.
 Возврат Null;

Иначе

 Строка = ТаблицаЗначений.Найти(Данные.Данные.Индекс(Данные.ТекущийЭлемент), "Номер");

 Если Строка = Неопределено Тогда

  Возврат Null;

 Иначе

  Индекс = ТаблицаЗначений.Индекс(Строка);

  Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда

   Возврат "А";

  ИначеЕсли Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда

   Возврат "B";

  Иначе

   Возврат "C";

  КонецЕсли;

 КонецЕсли;

КонецЕсли;

КонецФункции
1 Dimochka
 
09.04.13
22:35
Сделал вот так вот:

Если Данные.ТекущийЭлемент = Неопределено Тогда
Возврат Null;
Иначе
Строка = ТаблицаЗначений.Найти(Данные.Данные.Индекс(Данные.ТекущийЭлемент), "Номер");
Если Строка = Неопределено Тогда
Возврат Null;
Иначе
Индекс = ТаблицаЗначений.Индекс(Строка);

СчетчикА=0;
СчетчикБ=0;
ФлагА=0;
ФлагБ=0;
Массив = Новый Массив;
Для а=0 по Данные.ВременныеДанныеОбработки.ABCКлассификацияТаблицаЗначений.Количество()-1 Цикл
  Если ФлагА=0 Тогда
      Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
      Массив="А_"+СокрЛП(а+1);
   Иначе
       ФлагА=1 ;
       а=а-1;
       Счетичик=а;
   КонецЕсли;
ИначеЕсли ФлагБ=0 Тогда
   Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда
       Массив="Б_"+ СокрЛП(а+1);
   Иначе
       ФлагБ=1;
       а=а-1;
       Счетчик=а;
   КонецЕсли;
Иначе
  Массив= "C_"+ СокрЛП(а+1);
КонецЕсли;
КонецЦикла;
а=1;
Возврат Массив;
 
 
 
 
КонецЕсли;
КонецЕсли;
Все равно теперь выводит А_(чилсло элементов массива), а можно как -нибудь посчитать сколько раз выполняется условие?
2 EvgeniuXP
 
09.04.13
22:40
(1) внутри условия складывай переменную и считай сколько раз она выполняется.
3 Dimochka
 
09.04.13
22:42
(2) Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
      Массив="А_"+СокрЛП(а+1);

например как вот тут?
4 Dimochka
 
09.04.13
22:43
1с душу падла выматала )))
5 Живой Ископаемый
 
09.04.13
22:44
чем выматала? тем что делает то, что ты просишь, а на самом деле имеешь в виду другое?
6 EvgeniuXP
 
09.04.13
22:45
(3) к "А" не прибавляй, просто

А = 0;

Цикл

Если Тогда

   А = А + 1;
КонецЕсли;

КонецЦикла;
7 Dimochka
 
09.04.13
22:47
(5) ну я стараюсь просить лучше)) поэтому и спрашиваю тут)))!
8 EvgeniuXP
 
09.04.13
22:48
потом можешь обойти А:

Для сч = 1 По А Цикл

   Массив.Добавить("А_"+сч);

КонецЦикла;
9 Dimochka
 
09.04.13
22:49
(6) А можно как-то сделать следующим образом,

А = 0

Если Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA выполнилось первы раз тогда
Возврат А+1
Если второй А+2 и т.Д ?
10 Живой Ископаемый
 
09.04.13
22:50
2(9) можно, но выполняться будет один раз - первый.
11 EvgeniuXP
 
09.04.13
22:50
можно

Процедура Результат(А)
  Если Тогда
    А = А + 1;
    Возврат;
  КонецЕсли;
КонецПроцедуры
12 Dimochka
 
09.04.13
23:09
(11)
т.е. так должно работать ?
      Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
          А = 0;
          А = А + 1;
    Возврат "А_"+ А;
     
      ИначеЕсли Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда
           Б = 0;
          Б = Б + 1;
    Возврат "Б_"+ Б;
  Иначе
    Ц = 0;
        Ц = Ц + 1;
    Возврат "Ц_"+ Ц;
   
  КонецЕсли;
13 Dimochka
 
09.04.13
23:11
(10) а как сделать чтобы много раз выполнялось ?
14 Dimochka
 
09.04.13
23:12
это функция потом вставляется в скд в ресурсы АБЦ.ABCКлассификация(ГрупповаяОбработка("ГруппаРаспределения")) и по сути возвращает либо А либо Б либо Ц
15 EvgeniuXP
 
09.04.13
23:13
(11) выполняет много раз, а возвращает 1, потом 2, потом 3 и т.д. т.к. передал ссылку.
16 EvgeniuXP
 
09.04.13
23:14
для а, б, ц тогда и передавай три значения, если отдельно надо считать - независимо.
17 EvgeniuXP
 
09.04.13
23:15
четвертый тип строка: "А" или "Б" или "Ц", чтоб знать кому сложить к первому значению, ко второму или третьему.
18 EvgeniuXP
 
09.04.13
23:17
А = 0; Б = 0; Ц = 0;

Результат("А", А, Б, Ц);
Результат("А", А, Б, Ц);
Результат("Б", А, Б, Ц);
Результат("Ц", А, Б, Ц);




Процедура Результат(Знач Тип, А, Б, Ц)
  Если Тип = "А" Тогда
    А = А + 1;
    Возврат;
  ИначеЕсли Тип = "Б" Тогда
    Б = Б + 1;
    Возврат;
   ИначеЕсли Тип = "Ц" Тогда
    Ц = Ц + 1;
    Возврат;
 КонецЕсли;
КонецПроцедуры
19 EvgeniuXP
 
09.04.13
23:18
получишь А = 2, Б = 1, Ц = 1
20 Dimochka
 
09.04.13
23:25
а как связать эти 2 функции в скд?
21 Dimochka
 
09.04.13
23:28
т.е. процедуру и функцию
22 Dimochka
 
10.04.13
11:52
(18) Как связать эту процедуру и функцию в скд ?
23 Godofsin
 
10.04.13
11:57
(22) чего?
24 GANR
 
10.04.13
11:58
(0) отладчик в помощь - форум не видит, что за фактический параметр передается в функцию
25 Dimochka
 
10.04.13
12:25
(24) Передается Сумма(Сумма), т.е сумма продажи кааждого товара за определенный период времени
26 Dimochka
 
10.04.13
12:27
(23) как сделать так чтобы работало все)))? ну серьезно, может там колонку добавить в ТЗ АБЦ, и ее возвращать? есть хоть какие-нибудь идеи.
27 Dimochka
 
10.04.13
12:40
(24)  а потом каждому товару в зависимости от объема продаж возвращается параметр, если первые н-число товаров формируют объем продаж 75% то тогда присваевается А, если от 75 до 95 то  Б иначе С, но так ложно проследить динамику товара по периодам , допустим если в первом месяце товар был А_1 то во втором он мог стать А_2 ил А_3 , поэтому есть необходимость возвращать ен просто А или Б или Ц, а так же номер этих А Б или Ц, если А вернулось 5 штук то первое А будет А_1 второе А_2 и т.д., аналогично с группами Б и Ц
28 Dimochka
 
10.04.13
19:41
ну неужели нету никаких советов (((
29 Dimochka
 
10.04.13
22:56
Тема еще актуальна!
30 Живой Ископаемый
 
10.04.13
22:59
всем плевать.
31 mikecool
 
10.04.13
23:11
(5) автор понял дзен пользователя...
32 Dimochka
 
10.04.13
23:16
ну и ладно, сам что ли не решу))))
33 Jonny_Khomich
 
11.04.13
06:09
(0) Тема вообще улётная))) Я написал функцию, но она возвращает не то что надо)))
(32) Самое верное решение!!!
34 Dimochka
 
11.04.13
12:27
задаче решена:

http://www.1c-pro.ru/topic49899.html
2 + 2 = 3.9999999999999999999999999999999...