8.х 1С 8,2 СКД, конф- рукописная.

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Дмитрий Игоревич, 11 апр 2013.

  1. TopicStarter Overlay
    Дмитрий Игоревич
    Offline

    Дмитрий Игоревич Опытный в 1С

    Регистрация:
    11 апр 2013
    Сообщения:
    152
    Симпатии:
    0
    Баллы:
    26
    Есть функция которая в зависимости от условия выводит А или Б или С, а нужно чтобы она выводила А_1,А_2,А_3 и т.д., потом Б_1,Б_2,Б_3 и т.д. и с С аналогично, это функция потом вставляется в скд в ресурсы методом АБЦ.ABCКлассификация(ГрупповаяОбработка("ГруппаРаспределения")), Где ГруппаРаспределения это Вычисляемое поле с выражением: ВычислитьВыражение("Сумма(Сумма)",) , а функция ABCКлассификация каждому товару в зависимости от объема продаж возвращается параметр, если первые н-число товаров формируют объем продаж 75% то тогда присваевается А, если от 75 до 95 то Б иначе С, но так сложно проследить динамику товара по периодам , допустим если в первом месяце товар был А_1 то во втором он мог стать А_2 ил А_3 , поэтому есть необходимость возвращать не просто А или Б или Ц, а так же номер этих А, Б или Ц, если А вернулось 5 штук то первое А будет А_1 второе А_2 и т.д., аналогично с группами Б и Ц, вот сама функция:

    Код:
    // Рассчитать 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";
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецФункции
    Данная функция возвращает просто или А или Б или Ц, когда изменяю ее следующим образом :
    Код:
    Индекс = ТаблицаЗначений.Индекс(Строка);
    
    Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
    Возврат "А" +Индекс;
    
    ИначеЕсли Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда
    Возврат "B"+Индекс;
    Иначе
    
    Возврат "С" + Индекс;
    КонецЕсли;
    
    то она возвращает А1,А2,А3, Б4,Б5,С6 и т.д., но необходимость в том чтобы она возвращала А1,А2,А3.Б1,Б2,С1 .

    Подскажите как можно это реализовать, если можно то конкретные примеры! буду очень признателен !
  2. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Код:
    индА = 0; индБ = 0; индС = 0; //где-то в начале определите, чтоб не затиралось
    Индекс = ТаблицаЗначений.Индекс(Строка);
    Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
    индА = индА + 1;
    Возврат "А" +индА;
    ИначеЕсли Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда
    индБ = индБ + 1;
    Возврат "B" + индБ;
    Иначе
    индС = индС + 1;
    Возврат "С" + индС;
    КонецЕсли;
    
  3. TopicStarter Overlay
    Дмитрий Игоревич
    Offline

    Дмитрий Игоревич Опытный в 1С

    Регистрация:
    11 апр 2013
    Сообщения:
    152
    Симпатии:
    0
    Баллы:
    26
    К сожалению, так уже пробовал делать, возвращает, А1,А1,А1,Б1,Б1,Б1 и так же с Ц, т.е., я так понимаю что как только встретилось ключевое слово Возврат - происходит выход из функции, и счетчики сбрасываются, пробовал записывать значения в массив, не получилось, пробовал создавать таблицу значений, тоже как то не задалось, но мне кажется что с таблицей значений тут и надо что-то делать.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
    Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
    Возврат "А" +Индекс;
    ИначеЕсли Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда
    Возврат "B"+(Индекс - Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA);
    Иначе
    Возврат "С" + (Индекс - Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB ) ;
    КонецЕсли;
    
  5. TopicStarter Overlay
    Дмитрий Игоревич
    Offline

    Дмитрий Игоревич Опытный в 1С

    Регистрация:
    11 апр 2013
    Сообщения:
    152
    Симпатии:
    0
    Баллы:
    26
    Это гениально))) 3 дня бился с это задачей) Спасибо ОГРОМНОЕ !
  6. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не за что.

Поделиться этой страницей