Добрый вечер.
В наличии 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)
тогда СотрудникСклада="Петя"
конецЕсли;
конецЕсли;
конецЕсли;
конецЕсли;
конецЕсли;
конецЕсли;
конецЕсли;
конецЕсли;
конецЕсли;
конецЕсли;
В цикле обходится сразу все 10000 накладных за раз?
Символ = ПРАВ(Номер,1);
ЕСЛИ Символ = "9" ИЛИ Символ = "0" ТОГДА
СотрудникСклада="Петя";
ИНАЧЕЕСЛИ ЕСЛИ Символ = "1" ИЛИ Символ = "4" ТОГДА
СотрудникСклада = "Вася";
ИНАЧЕЕСЛИ
...........................
...........................
...........................
КОНЕЦЕСЛИ;
Символ = "";
СотрудникСклада = "";
! | Правила, пункт 13! |
Символ = ПРАВ(Номер,1);
ЕСЛИ Символ = "9" ИЛИ Символ = "0" ТОГДА
СотрудникСклада="Петя";
ИНАЧЕЕСЛИ ЕСЛИ Символ = "1" ИЛИ Символ = "4" ТОГДА
СотрудникСклада = "Вася";
ИНАЧЕЕСЛИ
...........................
...........................
...........................
КОНЕЦЕСЛИ;
Символ = "";
СотрудникСклада = "";
Скажите, а как быть если накладная состоит из букв и цифр. например ВВ00022
при делении на 3 выдает ошибку.!
Преобразование значения к типу Число не может быть выполнено
отрезать буквы и преобразовать.
Число(Сред(Номер,3))
Спасибо за помощь
Решил таким способом.
Т.е Все кладовщики собирают накладные по очереди и все довольны))
x=(Формат(ПРАВ(номер,9)/3,"ЧДЦ=1"));
если "0"=прав(x,1)
тогда СотрудникСклада="Вася"
иначе
если "3"=прав(x,1)
тогда СотрудникСклада="ПЕтя"
иначе
если "7"=прав(x,1)
тогда СотрудникСклада="Сережа"
ИНАЧЕ СотрудникСклада="";
конецЕсли;
конецЕсли;
конецЕсли;
НомерСотрудника =Формат(Число(Номер)/3 - Цел(Число(Номер)/3),"ЧДЦ=1");
Если НомерСотрудника = "" Тогда
СотрудникСклада="Петя";
ИначеЕсли НомерСотрудника = "0,3" Тогда
СотрудникСклада="Вася"
ИначеЕсли НомерСотрудника = "0,7" Тогда
СотрудникСклада="Сережа"
КонецЕсли;
МассивСотрудников = Новый Массив();
МассивСотрудников.Добавить("Сережа");
МассивСотрудников.Добавить("Вася");
МассивСотрудников.Добавить("Петя");
текНомер = Число(Сред(Номер,3));
текСотрудник = МассивСотрудников[текНомер-Цел(текНомер/3)*3];
НомерСотрудника =Формат(Число(Номер)/3 - Цел(Число(Номер)/3),"ЧДЦ=1");
Если НомерСотрудника = "" Тогда
СотрудникСклада="Петя";
ИначеЕсли НомерСотрудника = "0,3" Тогда
СотрудникСклада="Вася"
ИначеЕсли НомерСотрудника = "0,7" Тогда
СотрудникСклада="Сережа"
КонецЕсли;
откидайте префиксы, в типовой посмотрите:
ОбщегоНазначения.ПолучитьНомерНаПечать(ЭтотОбъект)
Номер = "№АФ00000789";
Пока НЕ (КодСимвола(Лев(Номер, 1)) >= 48 И КодСимвола(Лев(Номер, 1)) <= 57)Цикл
Номер = Сред(Номер, 2);
КонецЦикла;
РезультатЧисло = Число(Номер); //789
НомерСотрудника =Формат(Число(Сред(Номер,3))/3 - Цел(Число(Сред(Номер,3))/3),"ЧДЦ=1");
Если НомерСотрудника = "" Тогда
СотрудникСклада="Вася";
ИначеЕсли НомерСотрудника = "0,3" Тогда
СотрудникСклада="Петя"
ИначеЕсли НомерСотрудника = "0,7" Тогда
СотрудникСклада="Сережа"
КонецЕсли;
А если на склад прийдет еще какой-нибудь "Саша"... или вместо Пети прийдет Галя, и не захочет заходить в программу под Петей.. Будут Вас вызывать, править код.
Деньги Вам платить. Что, в общем, хорошо, конечно..
Указанное условие должно быть где-то подано табличкой ..в справочнике, регистре сведений...
находите номерсотрудника, потом в этой табличке по номерусотрудника находите соотвествующего пользователя. Без условий.
Может правильнее и без изменения структуры конфигурации: таблица значений создается и заполняется где-то при начале работы.
Всем спасибо еще раз за верную критику
Предыдущий пост дал новую идею. А если скажем появится новый кладовщик -четвертый "Александр" то мы этот код делим на 4 и всё?
Или тут вступает другое правило вычисления кладовщика?
некоторая таблица со структурой:
ссылка на пользователя | префикс пользователя | Коэффициент |
ВасяПользователь Вася 0
ПетяПользователь Петя 0,3
СережаПользователь Сережа 0,7
если пользователь добавляется и уже четыре:
ВасяПользователь Вася 0
ПетяПользователь Петя 0,25
СережаПользователь Сережа 0,5
СашаПользователь Саша 0,75
если пользователь добавляется и уже пять:
ВасяПользователь Вася 0
ПетяПользователь Петя 0,2
СережаПользователь Сережа 0,4
СашаПользователь Саша 0,6
ГаляПользователь Галя 0,8
а в формуле номераСотрудника деление на КоличествоКладовщиков.
Формирование коэффициентов для пользователей можно тоже запрограммировать.( А можно и указывать вручную, если таблица не расчитываемой, а в составе конфигурации.
расчет коэффициентов: делим числа от 1 до КоличествоКладовщиков на КоличествоКладовщиков.
1
МассивСотрудников = Новый Массив();
МассивСотрудников.Добавить("Сережа");
МассивСотрудников.Добавить("Вася");
МассивСотрудников.Добавить("Петя");
текНомер = Число(Сред(Номер,3));
текСотрудник = МассивСотрудников[текНомер-Цел(текНомер/3)*3];
МассивСотрудников = Новый Массив();
МассивСотрудников.Добавить("Сережа");
МассивСотрудников.Добавить("Вася");
МассивСотрудников.Добавить("Петя");
текСотрудник = МассивСотрудников[НомерСотрудника % 3];
МассивСотрудников = Новый Массив();
МассивСотрудников.Добавить("Сережа");
МассивСотрудников.Добавить("Вася");
МассивСотрудников.Добавить("Петя");
МассивСотрудников.Добавить("Ваня");
текСотрудник = МассивСотрудников[НомерСотрудника % 4];
reneval,
текСотрудник = МассивСотрудников[НомерСотрудника % МассивСотрудников.Количество()];
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua