Имя: Пароль:
1C
1С v8
Запись движений в регистр (Округления)
, , ,
0 informts
 
30.08.13
09:24
Есть некая сумма распределения, которая пропорционально весу номенклатуры распределяется. Все вычисления делаются в запросе и загружаются в таблицу движений. Все хорошо, но иногда вылазит разница на 2-3 копейки. Как можно обойти этот момент, только перебирать в цикле и считать отклонение??
1 Wobland
 
30.08.13
09:25
нужно осмыслить генезис разницы
2 Irbis
 
30.08.13
09:26
Последнее движение не рассчитывать, а закрывать на весь остаток.
3 informts
 
30.08.13
09:32
Движения.Отгрузка.Загрузить(ТаблицаДвижений);
Как тут последнее движение получишь?
4 informts
 
30.08.13
09:33
Только в цикле если перебирать? а не хотелось бы...
5 Irbis
 
30.08.13
09:35
(3) Значит в ТаблицаДвижений
или открыть

РегистрНакопленияНаборЗаписей.<Имя регистра накопления> (AccumulationRegisterRecordSet.<Имя регистра накопления>)
Количество (Count)
Синтаксис:
Количество()
Возвращаемое значение:
Тип: Число.
Описание:
Получает количество записей в наборе.
Пример:
Сообщить("Записей в наборе - " ) + НаборЗаписей.Количество());
6 Maxus43
 
30.08.13
09:36
тут простая математика, в типовой УПП 1.2 например считается в коде, но с той же ошибкой, ошибкой округления
7 Serg_1960
 
30.08.13
09:39
Есть три штуки какой-то хрени по цене... да не важно по какой цене. А теперь попробуй распределить 100 рублей на сумму этой хрени... и получи удовольствие от осознания своего бессилия :))
8 kiruha
 
30.08.13
09:45
Есть много способов вешать отклонение на записи.
В свое время упорядочивал по сумме и кидал по копейке на самые большие
У каждого свои минусы.
Лучше разрядность ресурса увеличить
9 Maxus43
 
30.08.13
09:46
(8) с ценой не наувеличиваешся. Точность 2 знака после запятой
10 kiruha
 
30.08.13
09:47
Если нет возможности - распределять в табличной части - далее пусть пользователь ручками правит, если не нравится что то
11 masenshi
 
30.08.13
10:10
(0) Делаешь подзапрос к своему запросу и закидываешь разницу между суммой округленных значений и стоимостью до округления на максимальную номенклатуру (в подзапросе ее и получишь). Прокатит если номенклатура не повторяется или сгруппирована. А иначе дальше думать к чему привязать копейки.
12 roman52
 
30.08.13
10:16
мимокрокодил, в ЗУПе:
Общий модуль ЗаполнениеРегламентированнойОтчетности
Процедура ОкруглитьСлагаемыеПоСумме(Данные, ИмяКолонки, Сумма, Точность = 0, ИмяКлюча = "ФизЛицо") Экспорт
13 masenshi
 
30.08.13
10:30
(11)
вот накалякал 100% рабочий пример

ВЫБРАТЬ "Ном1" КАК Номенклатура, 1.22 КАК Вес , 100 КАК Стоимость, 2.47 КАК ВесВсего
ПОМЕСТИТЬ а
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Ном2" КАК Номенклатура, 0.85 КАК Вес , 100 КАК Стоимость, 2.47 КАК ВесВсего
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Ном3" КАК Номенклатура, 0.4 КАК Вес , 100 КАК Стоимость, 2.47 КАК ВесВсего

;
ВЫБРАТЬ
    а.Номенклатура,
    а.Вес/а.ВесВсего * а.Стоимость КАК Цена, //расределяю
    ВЫРАЗИТЬ(а.Вес/а.ВесВсего * а.Стоимость КАК ЧИСЛО(15,2)) КАК ЦенаОкр, //если суммируем то будет не 100 а 99,99
    а.Стоимость
    
    ПОМЕСТИТЬ подзапрос
    
ИЗ
    а КАК а
;
ВЫБРАТЬ
МАКСИМУМ(а.Номенклатура) КАК Номенклатура,
СУММА(ЦенаОкр) КАК СтоимостьОкр,
а.Стоимость - СУММА(ЦенаОкр) КАК Разница //Вот она наша копейка
ПОМЕСТИТЬ б

ИЗ подзапрос КАК а

СГРУППИРОВАТЬ ПО а.Стоимость

;

ВЫБРАТЬ
    а.Номенклатура,
    а.Цена,
    а.ЦенаОкр + ЕСТЬNULL(б.Разница, 0) КАК  ЦенаОкрПравильно, // ЕСТЬNULL использовать обязательно
    а.Стоимость
ИЗ
    подзапрос КАК а
    ЛЕВОЕ СОЕДИНЕНИЕ б КАК б
    ПО а.Номенклатура = б.Номенклатура
14 kiruha
 
30.08.13
11:00
(13)
А если там много позиций и накопится не один десяток копеек ?
15 masenshi
 
30.08.13
11:17
(14) Все копейки разнесутся. Я лишь показал самый простой пример чтобы было максимально понятно.

Если много позиций, то они могут быть сгруппированы при распределении стоимости. Так я делал.
16 masenshi
 
30.08.13
11:19
(14) имел ввиду если дублируется номенклатура, то она может быть сгруппирована, а если много уникальных позиций, то какая может быть проблема? Миллион позиций - миллион копеек?
17 informts
 
30.08.13
11:33
Пока сделал так, после записи в регистр посчитал отклонение и на первую строку записи кинул отклонение.
18 kiruha
 
30.08.13
11:54
(17)
Кидай по копейке - так лучше
5 копеек отклонение - на первые 5 позиций по копейке