Имя: Пароль:
1C
1С v8
Пересчёт количества при изменении единицы измерения
0 WildSery
 
16.04.14
15:06
Меня интересует вот это место модуля ОбщийМодуль.ОбработкаТабличныхЧастей:

Процедура ПриИзмененииЕдиницыТабЧасти()
...
Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.ЕдиницаИзмеренияМест) Тогда
  СтрокаТабличнойЧасти.Количество = СтрокаТабличнойЧасти.Количество * СтароеЗначениеКоэффициента / НовоеЗначениеКоэффициента;
КонецЕсли;

Нафига нужна заполненность ЕдиницаИзмеренияМест для пересчёта?
При том, что она очищается при записи документа, если мест = 0.

Получается, было у меня 1 шт. (0.2 коробки, ноль мест). Меняю штуки на коробки - становится 1 коробка.
1 Shurjk
 
16.04.14
15:09
По моему ты далеко не весь текст обработчика привел.
2 WildSery
 
16.04.14
15:11
(1) Код типовой, посмотрите у себя в УПП, пожалуйста.
Я указал место, которое не понимаю, и подозреваю, что тут ошибка.
3 Shurjk
 
16.04.14
15:23
(2) УПП у меня нет под рукой, а в УТ он там в случае если указана единица мест то рассчитывает количество мест, а потом перерасчитывает цену, а не количество.
4 WildSery
 
16.04.14
15:47
(3) Если я правильно прочитал ваш ответ, то при изменении единицы измерения в УТ количество вообще не пересчитывается?
5 WildSery
 
16.04.14
15:51
Вот немного пошире процедура (не вижу смысла всю публиковать)

СтароеЗначениеКоэффициента = СтрокаТабличнойЧасти.Коэффициент;
НовоеЗначениеКоэффициента  = СтрокаТабличнойЧасти.ЕдиницаИзмерения.Коэффициент;

Если НовоеЗначениеКоэффициента <> СтароеЗначениеКоэффициента Тогда
    СтрокаТабличнойЧасти.Коэффициент = НовоеЗначениеКоэффициента;
    Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.ЕдиницаИзмеренияМест) Тогда
        СтрокаТабличнойЧасти.Количество = СтрокаТабличнойЧасти.Количество * СтароеЗначениеКоэффициента / НовоеЗначениеКоэффициента;
    КонецЕсли;

    РассчитатьКоличествоМестТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект);

    Для Каждого ИмяРеквизитаЦены Из СтруктураРеквизитовЦен Цикл
        Если СтароеЗначениеКоэффициента > 0 И ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента(ИмяРеквизитаЦены.Ключ, МетаданныеДокумента, ИмяТабличнойЧасти) Тогда
            СтрокаТабличнойЧасти[ИмяРеквизитаЦены.Ключ] = СтрокаТабличнойЧасти[ИмяРеквизитаЦены.Ключ] * НовоеЗначениеКоэффициента / СтароеЗначениеКоэффициента;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

После пересчёта количества (если оно случилось), пересчитываем число мест (нахуа?), а затем уже пересчёт цены, причём без проверки заполненности единицы мест.
6 Shurjk
 
16.04.14
15:52
(4) Нет но цена ставиться уже за другую еденицу измерения.
7 hhhh
 
16.04.14
16:29
(5) количество мест - это для грузчиков и кладовщика. Им цена ни к чему.

И то что вы написали в вопросе: вы перепутали ЕдиницаИзмерения и ЕдиницаИзмеренияМест
8 Azverin
 
16.04.14
16:34
(0) если не въезжаешь, то не заполняй поле ЕдиницаИзмеренияМест
9 WildSery
 
17.04.14
09:56
(7) Нет, я ничего не путаю.
(8) Ещё раз попробую задать вопрос другими словами.
Я НЕ ЗАПОЛНЯЮ ЕдиницуИзмеренияМест.
ЕдиницаИзмерения стоит штуки. Количество 1 штука.
Я меняю ЕдиницуИзмерения на коробки. Получается 1 коробка, пересчёта количества нет.
10 Azverin
 
17.04.14
10:12
(9) что по-твоему должна сделать программа?
11 WildSery
 
17.04.14
10:15
(10) Пересчитать количество в коробки.
Ведь именно это будет сделано, если штук не 1, а 10.
12 hhhh
 
17.04.14
10:24
(11) количество мест целое. Считается, что неполная коробка. Но она всё-таки есть.
13 Базис
 
naïve
17.04.14
10:25
Это работает у всех уже много лет, если есть ошибка, значит она в данных, а не в конфе. См. коэффициенты единиц измерения, кури ронятие базовой ед. изм.
14 hhhh
 
17.04.14
10:26
(11) "Получается, было у меня 1 шт. (0.2 коробки, ноль мест)." - неправильно. Это одно место.
15 2083
 
17.04.14
10:26
(11) если у тебя в 1 коробке умещается например всего 10 штук чего-нибудь, а у тебя всего 9 штук. Это сколько коробок? Кури коэффициенты ед. изм.
16 WildSery
 
17.04.14
10:58
(12) 1С считает по-другому. Неполная коробка вполне может быть 0 мест.
(13) Курите сами вашу траву. Базовая вообще не при чём, это вообще не единица измерения.

(15) То же самое могу посоветовать вам. Давать советы, не разобравшись в теме, или хотя бы просто не попробовав, нехорошо.
9 штук - это ноль коробок, поскольку Цел(КоличествоМест)

Меня мало беспокоит то, что когда при записи документа очистится ЕдиницаИзмеренияМест, то в Количество можно уже что угодно писать, хоть 1000, мест по-прежнему будет 0, пока пользователь сам вручную не укажет ЕдиницуИзмеренияМест.

Но вот то, что после этого пересчёт количества при изменении ЕдиницыИзмерения отключается, пока я не укажу нахрен не нужную ЕдиницуИзмеренияМест, мне не нравится.
17 hhhh
 
17.04.14
11:07
(16) просто вы тупо не указали нам конфигурацию, поэтому ваши дальнейшие высказывания воспринимаются как бред.
18 hhhh
 
17.04.14
11:13
(16) вот смотрите. Допустим, я пользователь. МНе нужно занести строку: 100 коробок. Я по ошибке внес 100 щтук. Заячем мне нужно, чтобы количество скакало при этом? Ведь бред вы нам предлагаете.
19 hhhh
 
17.04.14
11:13
Пользователь внес количество. Оно потом не должно меняться.
20 WildSery
 
17.04.14
14:14
(17) Просто вы пропустили часть обсуждения, где я упомянул УПП, потому ваш пост воспринимается как бред.
(18) Я вам ничего не предлагаю. Если бы количество не пересчитывалось НИКОГДА, я бы успокоился, списав всё на "методологию 1С". Но ведь оно пересчитывается, но только когда есть единица мест.
Отсюда и ваша фраза "Оно потом не должно меняться" теряет смысл.
21 WildSery
 
17.04.14
14:29
Вообще, весь смысл этой процедуры - после многочисленных проверок ПЕРЕСЧИТАТЬ КОЛИЧЕСТВО и пересчитать цену.
22 WildSery
 
17.04.14
14:33
(18) И кстати, предлагаю вас самостоятельно провести эксперимент:
В Счете на оплату покупателя через подбор выбрать любую номенклатуру (в карточке номенклатуры должна быть заполнена единица мест), а затем закрыть подбор, и в табличной части выбрать другую единицу измерения.
Вы увидите, что количество ПЕРЕСЧИТАЛОСЬ. Поскольку подбор заполняет единицу мест автоматически.
Но при сохранении документа, если мест 0, то единица мест очистится, и пересчёт с этого момента ДЛЯ ЭТОЙ ПОЗИЦИИ отключается (для остальных, где мест > 0, он по-прежнему работает.