Версия для печати темы (https://pro1c.org.ua/index.php?s=31e3d1a0b8f670f17575b11ccade1556&showtopic=22043)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Цикл отбора кладовщиков.

Автор: candrey 16.02.15, 21:11

Добрый вечер.
В наличии 1С Предприятие 8.2, релиз Управление тороговым предприятием для Украины 1.2. Файловый вариант.
Подскажите с решением проблемы, немогу составить цикл отбора кладовщиков.

Есть три кладовщика Петя. Вася. Сережа. При форматировании расходной накладной зависимости от номера накладной ( точнее её последней цифры) выбивается кладовщик который собирает товар.
Решил проблему таким образом код ниже. Но столкнулся с проблемой что при такой схеме Петя за 10 собраных накладных будет собирать 4 раза, а Вася и Сережа по 3 раза. Получается дискриминация кладовщиков...

Хотелось бы решить так. При первом проходе (при сквозном создании накладных от 0 до 9) собирали Петя- 4 раза. Вася-3 раза и Сережа-3.
При втором проходе (Накладные от 0 до 9) Петя-3 раза. Вася-4 раза Сережа-3 раза.
При следующем проходе Петя-3 раза. Вася-3 раза. Сережа-4 раза (Накладные от 0 до 9). И так по кругу.
Т.е при таком плавающем раскладе (происходит движение кладовщика перебором) все кладовщики в равных долях собирают товар.
Накладные идут от 0 до 10000 по порядку.

Подскажите как изменить код чтоб выполнялось условие формирование в равных долях.?


если "0"=ПРАВ(Номер,1)
тогда СотрудникСклада="Петя"
иначе
если "1"=ПРАВ(Номер,1)
тогда СотрудникСклада="Вася"
иначе
если "2"=ПРАВ(Номер,1)
тогда СотрудникСклада="Сережа"
иначе
если "3"=Прав(Номер,1)
тогда СотрудникСклада="Петя"
иначе
если "4"=Прав(Номер,1)
тогда СотрудникСклада="Вася"
иначе
если "5"=Прав(Номер,1)
тогда СотрудникСклада="Сережа"
иначе
если "6"=Прав(Номер,1)
тогда СотрудникСклада="Петя"
иначе
если "7"=Прав(Номер,1)
тогда СотрудникСклада="Вася"
иначе
если "8"=Прав(Номер,1)
тогда СотрудникСклада="Сережа"
иначе
если "9"=Прав(Номер,1)
тогда СотрудникСклада="Петя"



конецЕсли;
конецЕсли;
конецЕсли;

конецЕсли;
конецЕсли;
конецЕсли;

конецЕсли;
конецЕсли;
конецЕсли;
конецЕсли;


Зарание спасибо.

Автор: Vofka 17.02.15, 8:05

В цикле обходится сразу все 10000 накладных за раз?

Автор: kosalex 17.02.15, 8:19

Символ = ПРАВ(Номер,1);
ЕСЛИ Символ = "9" ИЛИ  Символ = "0" ТОГДА
СотрудникСклада="Петя";
ИНАЧЕЕСЛИ ЕСЛИ Символ = "1" ИЛИ  Символ = "4" ТОГДА
СотрудникСклада = "Вася";
ИНАЧЕЕСЛИ
...........................
...........................
...........................
КОНЕЦЕСЛИ;
Символ = "";
СотрудникСклада = "";



 ! 

Правила, пункт 13!
 

Автор: candrey 17.02.15, 9:46

Цитата(kosalex @ 17.02.15, 8:19) *
Символ = ПРАВ(Номер,1);
ЕСЛИ Символ = "9" ИЛИ  Символ = "0" ТОГДА
СотрудникСклада="Петя";
ИНАЧЕЕСЛИ ЕСЛИ Символ = "1" ИЛИ  Символ = "4" ТОГДА
СотрудникСклада = "Вася";
ИНАЧЕЕСЛИ
...........................
...........................
...........................
КОНЕЦЕСЛИ;
Символ = "";
СотрудникСклада = "";


Спасибо за ответ.
Но при вашем условии получается так же как я описал выше


Петя- берет накладные № 0,3,6,9
Вася-берет накладные № 1,4,7
Сережа-берет накладные № 2,5,8

А нужно
чтоб сдвигались накладные по кладовщикам
т.е

накладные №0-9
Петя- берет накладные № 0,3,6,9
Вася-берет накладные № 1,4,7
Сережа-берет накладные № 2,5,8

Потом накладные №10-19
Петя- берет накладные № 2,5,8
Вася-берет накладные № 0,3,6,9
Сережа-берет накладные № 1,4,7

Потом накладные № 20-29
Петя- берет накладные № 1,4,7
Вася-берет накладные № 2,5,8
Сережа-берет накладные № 0,3,6,9

И так по кругу.

Автор: alex040269 17.02.15, 13:08

Цитата(candrey @ 17.02.15, 9:46) *
чтоб сдвигались накладные по кладовщикам

возьмите остаток от деления на 3!

Автор: candrey 17.02.15, 13:46

Скажите, а как быть если накладная состоит из букв и цифр. например ВВ00022
при делении на 3 выдает ошибку.!

Преобразование значения к типу Число не может быть выполнено



Автор: alex040269 17.02.15, 13:48

отрезать буквы и преобразовать.

Число(Сред(Номер,3))

Автор: candrey 17.02.15, 14:41

Спасибо за помощь icon_beer17.gif

Решил таким способом.
Т.е Все кладовщики собирают накладные по очереди и все довольны))

 x=(Формат(ПРАВ(номер,9)/3,"ЧДЦ=1"));
    
     если "0"=прав(x,1)
         тогда СотрудникСклада="Вася"
     иначе
         если "3"=прав(x,1)  
             тогда СотрудникСклада="ПЕтя"
        иначе
            если "7"=прав(x,1)
                тогда СотрудникСклада="Сережа"

            ИНАЧЕ СотрудникСклада="";
                
          
          
             конецЕсли;
          конецЕсли;
          конецЕсли;


Прошу прокомментировать код. Верно или нет?

Автор: topitop 17.02.15, 15:28

    НомерСотрудника =Формат(Число(Номер)/3 - Цел(Число(Номер)/3),"ЧДЦ=1");
    
    Если  НомерСотрудника = "" Тогда
        СотрудникСклада="Петя";
    ИначеЕсли НомерСотрудника = "0,3" Тогда
        СотрудникСклада="Вася"
    ИначеЕсли НомерСотрудника = "0,7" Тогда
        СотрудникСклада="Сережа"
    КонецЕсли;


Проверял, вроде работает как нужно.

Автор: alex040269 17.02.15, 15:33

МассивСотрудников = Новый Массив();
МассивСотрудников.Добавить("Сережа");
МассивСотрудников.Добавить("Вася");
МассивСотрудников.Добавить("Петя");

текНомер = Число(Сред(Номер,3));
текСотрудник = МассивСотрудников[текНомер-Цел(текНомер/3)*3];

Автор: candrey 17.02.15, 19:37

Цитата(topitop @ 17.02.15, 15:28) *
    НомерСотрудника =Формат(Число(Номер)/3 - Цел(Число(Номер)/3),"ЧДЦ=1");
    
    Если  НомерСотрудника = "" Тогда
        СотрудникСклада="Петя";
    ИначеЕсли НомерСотрудника = "0,3" Тогда
        СотрудникСклада="Вася"
    ИначеЕсли НомерСотрудника = "0,7" Тогда
        СотрудникСклада="Сережа"
    КонецЕсли;


Проверял, вроде работает как нужно.



Попробывал ваш метод выдает ошибку
Цитата
Преобразование значения к типу Число не может быть выполнено
НомерСотрудника =Формат(Число(Номер)/3 - Цел(Число(Номер)/3),"ЧДЦ=1");


У меня номер накладной состоит из букв и цифр. типа №АФ00000789
Как тут поступить?

Автор: ignsv 17.02.15, 19:59

откидайте префиксы, в типовой посмотрите:

ОбщегоНазначения.ПолучитьНомерНаПечать(ЭтотОбъект)


или так например:
    
Номер = "№АФ00000789";    
    Пока НЕ (КодСимвола(Лев(Номер, 1)) >= 48 И КодСимвола(Лев(Номер, 1)) <= 57)Цикл
        Номер = Сред(Номер, 2);
    КонецЦикла;
    РезультатЧисло = Число(Номер);  //789

Автор: candrey 17.02.15, 20:41

Цитата(candrey @ 17.02.15, 19:37) *
Попробывал ваш метод выдает ошибку


У меня номер накладной состоит из букв и цифр. типа №АФ00000789
Как тут поступить?


Надоглядел.Прошу прошения. 09000000.gif

Вот окончательный предложеный код

 НомерСотрудника =Формат(Число(Сред(Номер,3))/3 - Цел(Число(Сред(Номер,3))/3),"ЧДЦ=1");
                              

    Если  НомерСотрудника = "" Тогда
        СотрудникСклада="Вася";
    ИначеЕсли НомерСотрудника = "0,3" Тогда
        СотрудникСклада="Петя"
    ИначеЕсли НомерСотрудника = "0,7" Тогда
        СотрудникСклада="Сережа"
    КонецЕсли;


Верно все исправил?

Автор: Домовик 17.02.15, 23:16

А если на склад прийдет еще какой-нибудь "Саша"... или вместо Пети прийдет Галя, и не захочет заходить в программу под Петей.. Будут Вас вызывать, править код.
Деньги Вам платить. Что, в общем, хорошо, конечно..

Указанное условие должно быть где-то подано табличкой ..в справочнике, регистре сведений...
находите номерсотрудника, потом в этой табличке по номерусотрудника находите соотвествующего пользователя. Без условий.

Может правильнее и без изменения структуры конфигурации: таблица значений создается и заполняется где-то при начале работы.


Автор: candrey 18.02.15, 8:52

Всем спасибо еще раз за верную критику icon_beer17.gif

Предыдущий пост дал новую идею. А если скажем появится новый кладовщик -четвертый "Александр" то мы этот код делим на 4 и всё?
Или тут вступает другое правило вычисления кладовщика?

Автор: Домовик 18.02.15, 10:01

некоторая таблица со структурой:
ссылка на пользователя | префикс пользователя | Коэффициент |




ВасяПользователь Вася 0
ПетяПользователь Петя 0,3
СережаПользователь Сережа 0,7



если пользователь добавляется и уже четыре:

ВасяПользователь Вася 0
ПетяПользователь Петя 0,25
СережаПользователь Сережа 0,5
СашаПользователь Саша 0,75



если пользователь добавляется и уже пять:

ВасяПользователь Вася 0
ПетяПользователь Петя 0,2
СережаПользователь Сережа 0,4
СашаПользователь Саша 0,6
ГаляПользователь Галя 0,8



а в формуле номераСотрудника деление на КоличествоКладовщиков.


Формирование коэффициентов для пользователей можно тоже запрограммировать.( А можно и указывать вручную, если таблица не расчитываемой, а в составе конфигурации.


расчет коэффициентов: делим числа от 1 до КоличествоКладовщиков на КоличествоКладовщиков.

1

Автор: reneval 20.02.15, 23:25

Цитата(alex040269 @ 17.02.15, 15:33) *
МассивСотрудников = Новый Массив();
МассивСотрудников.Добавить("Сережа");
МассивСотрудников.Добавить("Вася");
МассивСотрудников.Добавить("Петя");

текНомер = Число(Сред(Номер,3));
текСотрудник = МассивСотрудников[текНомер-Цел(текНомер/3)*3];


Для 3х:
МассивСотрудников = Новый Массив();
МассивСотрудников.Добавить("Сережа");
МассивСотрудников.Добавить("Вася");
МассивСотрудников.Добавить("Петя");

текСотрудник = МассивСотрудников[НомерСотрудника % 3];


Для 4х:
МассивСотрудников = Новый Массив();
МассивСотрудников.Добавить("Сережа");
МассивСотрудников.Добавить("Вася");
МассивСотрудников.Добавить("Петя");
МассивСотрудников.Добавить("Ваня");

текСотрудник = МассивСотрудников[НомерСотрудника % 4];


и т.д.

Автор: Vofka 22.02.15, 10:58

reneval,

текСотрудник = МассивСотрудников[НомерСотрудника % МассивСотрудников.Количество()];

smile.gif

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua