Имя: Пароль:
1C
1С v8
Бухгалтерская задача 2.28
0 wwwqwert2014
 
10.08.14
22:13
Решил задачу, но есть пара моментов, которые хотел бы спросить.
Правильно ли делать проверку деления на нуль?
Вроде не должно возникнуть такой ситуации, когда происходит деление. На мой взгляд... Или должно? Вот кусок кода:
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладОтправителя;
        Если ВыборкаДетальныеЗаписи.КоличествоОстатокДТ<> 0 Тогда
            Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстатокДт * (ВыборкаДетальныеЗаписи.Количество / ВыборкаДетальныеЗаписи.КоличествоОстатокДт);
        Иначе
            СообщениеПользователю = Новый СообщениеПользователю;
            СообщениеПользователю.Текст = "Ошибка деления на 0";
            СообщениеПользователю.Сообщить();
            Отказ = Истина;
            Продолжить;    
        КонецЕсли;




И еще такой вопрос. В условии этой задачи необходимо сделать отчет по собранным комплектам. Так как неизвество, какая частный ситуация может возникнуть (есть стандартные комплекты, но нет нестандартных ) или наоборот, поле Номенклатура я сделал следующим образом:


ВЫБРАТЬ
    ВЫБОР
        КОГДА УправленческийОборотыСтандарт.Субконто1 = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
            ТОГДА УправленческийОборотыНестандарт.Субконто1
        ИНАЧЕ УправленческийОборотыСтандарт.Субконто1
    КОНЕЦ КАК Номенклатура,
    ЕСТЬNULL(УправленческийОборотыСтандарт.КоличествоОборотДт, 0) + ЕСТЬNULL(УправленческийОборотыНестандарт.КоличествоОборотДт, 0) КАК Собрано,
    ЕСТЬNULL(УправленческийОборотыСтандарт.КоличествоОборотДт, 0) КАК КоличествоСтандарт,
    ЕСТЬNULL(УправленческийОборотыНестандарт.КоличествоОборотДт, 0) КАК КоличествоНестандарт
ИЗ
    РегистрБухгалтерии.Управленческий.Обороты(&НачалоПериода, &КонецПериода, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), , Субконто3 = ЗНАЧЕНИЕ(Перечисление.ВидКомплекта.Стандартный), КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОсновноеПроизводство), ) КАК УправленческийОборотыСтандарт
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты(&НачалоПериода, &КонецПериода, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), , Субконто3 = ЗНАЧЕНИЕ(Перечисление.ВидКомплекта.Нестандартный), КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОсновноеПроизводство), ) КАК УправленческийОборотыНестандарт
        ПО УправленческийОборотыСтандарт.Субконто1 = УправленческийОборотыНестандарт.Субконто1

Само условие задачи здесь http://i65.fastpic.ru/big/2014/0810/c9/3adb70124abd47840e3671ea5f2413c9.png
База здесь
http://rghost.ru/57398494
1 zak555
 
10.08.14
22:17
1. а что на счете количественного учёта количество может быть равно 0, а сумма не ноль ?
2 zak555
 
10.08.14
22:56
2. отчёт делать на скд, где схема будет по счету 20, с развороту по аналитике стдарт/нестандарт и корсета 41 с разворотом по кораналитке
т.е. анализировать нужно проводку
Дт 41 КоличестовВыпущено Комплектов Кт 20 ВидСборки
3 Reaper_1c
 
10.08.14
23:43
(0) Остаток 3 штуки на 100 рублей. Считай не сдал.
4 wwwqwert2014
 
11.08.14
10:05
По поводу первого вопроса - относительно проверки деления на нуль - спасибо, я понял.
По поводу второго вопроса, можете подробнее сказать, что вы имели в виду?
5 wwwqwert2014
 
11.08.14
10:08
(3) Вы хотите сказать что у меня не решена проблема копеек?
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстатокДт * (ВыборкаДетальныеЗаписи.Количество / ВыборкаДетальныеЗаписи.КоличествоОстатокДт);

Ну вот. Осталось 3 штуки и 3 штуки мы списываем на 1000 рублей
Сумма = 1000 * (3/3)
6 zak555
 
11.08.14
10:15
(5)

Если СколькоНужно = Остаток Тогда
    Движение.Сумма= ВыборкаДетальныеЗаписи.СуммаОстатокДт;
КонецЕсли;
7 wwwqwert2014
 
11.08.14
15:42
(6) По-моему записи в (5) и (6) дадут одинаковый результат в Движение.Сумма
8 Timon1405
 
11.08.14
15:44
(5) а теперь спишите-ка эти три штуки по одной...
9 wwwqwert2014
 
11.08.14
18:13
Осталось 3 Ручки, которые в сумме стоят 100 рублей. По одной их списываю 3мя расходными накладными:
Первая:
Движение.Сумма = 100 * (1/3);
Движение.Сумма = 33,3333333.

После проводки будет остаток 66,6666667.

Вторая:
Движение.Сумма = 66,6666667 * (1/2)
После проводки будет остаток
33,33333335

Третья:
10 wwwqwert2014
 
11.08.14
18:13
Третья:
Движение.Сумма = 33,33333335 * (1/1).
После проводки будет остаток 0
11 wwwqwert2014
 
11.08.14
18:14
Где проблема копеек? По-моему если я взял деление в скобки, проблема копеек решается
12 Timon1405
 
11.08.14
18:19
Так какой разрядности у вас "Движение.Сумма", в первых двух проводках 7 цифр после запятой, а в последней стало вдруг 8?
13 Timon1405
 
11.08.14
18:22
*даже только в первой 7 после запятой. почему вы списали в первом случае 33,3333333, а не 33,33333333 ?
14 wwwqwert2014
 
11.08.14
21:39
Ок. Возьмем для упрощения что разрядность будет равна 3 знакам после запятой.
Первая Проводка:
Движение.Сумма = 100 * (1/3) = 33.33
ПослеПроводки будет Остаток 66.67

Вторая проводка:
Движение.Сумма = 66.67 * (1/2) = 33.34
После проводки будет Остаток 33,33

Третья последняя Проводка:
Движение.Сумма = 33.33 * (1/1) = 33.33
После проводки результат будет 0, т.е. никакой проблемы копеек нет
15 wwwqwert2014
 
11.08.14
21:39
Sorry, опечатался, разрядность 2 знака после запятой
16 zak555
 
11.08.14
21:43
пусть 3 товара суммарно равный 99.98 р

вот и спиши
17 wwwqwert2014
 
12.08.14
08:21
Точность 2.
Если списываем 3 товара одновременно тогда спишется сразу 99.98 * (3/3) = 99.98. Проблемы копеек не будет.
Списываем по одному.
1.
Движение.Сумма = 99.98 * (1/3) = 33.33.
После проводки остаток: 66.65.
2. Движение.Сумма = 66.65 * (1/2) = 33.33
После проводки остаток: 33.32
3. Движение.Сумма = 33.32 * (1/1) = 33.32.
После проводки остаток: 0.
Проблемы копеек нет.
18 Woodpecker
 
12.08.14
08:31
(0) а где эти задачи берете?
19 Escander
 
12.08.14
08:38
(1) если криво списывают - такое возможно
20 wwwqwert2014
 
12.08.14
08:41
(18) сборник актуальных билетов для подготовки к спецу по платформе.
По поводу проблемы копеек. Я прочитал здесь: http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=579267
и пришел к выводу что проблема копеек возникает в таком случае:
СебестоимостьДляСписания = (СебестоимостьОстатка / КоличествоОстатка) * СписываемоеКоличество
Если же считать по такой формуле, то проблемы копеек не будет:
СебестоимостьДляСписания = (СписываемоеКоличество / КоличествоОстатока) * СебестоимостьОстатока
Я прав?
21 AlexTimin
 
12.08.14
08:42
(18) Сборник задач по подготовке к спецу
22 Адинэснег
 
12.08.14
08:48
сумма 1, количество 300
23 Адинэснег
 
12.08.14
08:49
*30
24 Соло
 
12.08.14
09:46
(20) не прав. Вообще-то рекомендуется делить в последнюю очередь, но и это не всегда избавляет от проблемы, а вот проверка СписываемоеКоличество = КоличествоОстатка с выводом СебестоимостьДляСписания = СебестоимостьОстатока  решает проблему всегда (ну кроме движений задним числом)
25 wwwqwert2014
 
12.08.14
11:08
(22) Движение.Сумма = 1* (300/300) = 1 * 1;

(24)
По поводу проверки СписываемоеКоличество = КоличествоОстаток:
Когда СписываемоеКоличество = КоличествоОстаток, должна списываться СуммаОстаток. Это прозойдёт в том случае, когда будет проверка через Если:
Если СписываемоеКоличество = КоличествоОстаток Тогда
Движение.Сумма = СуммаОстаток;
КонецЕсли;

Если эту проверку не делать, а сделать через деление:
Движение.Сумма = СуммаОстаток *(СписываемоеКоличество/КоличествоОстаток). Когда числитель и знаменатель равны между собой, тогда
Движение.Сумма = СуммаОстаток.
Ведь это получается одно и то же. Или всё-таки нет? Если нет, то почему? Сколько я примеров приводил, вроде бы все отрабатывает тип-то без проблемы копеек или же все-таки нет? (24) Вы пишете, что такой подход Движение.Сумма = (СписываемоеКоличество/КоличествоОстаток)* СуммаОстаток не всегда избавляет от проблемы. А когда не избавит?
26 wwwqwert2014
 
12.08.14
14:27
Кто что думает?
27 Ndochp
 
12.08.14
14:39
(25) Всегда избавляет, врут они.
Точнее в типовых этот алгоритм кривой часто встречается. Допустим, тебе нужно распределить по трем строчкам доп расходы пропорционально количеству. 1С считает КоличествоОстаток один раз и умножает количество в строке на КоличествоОстаток в цикле, получает копейки на выходе и относит их на последнюю строку.
(было так по крайней мере, новые типовые не смотрел на эту тему)
Если же по честному после каждого куска пересчитывать КоличествоОстаток как сумму в оставшихся строках, то все будет хорошо.
28 miliko
 
12.08.14
14:51
обычно точность суммы 2 знака(копейки), а количество точность 6 знаков (миллиграмм от килограмма) и как сводить )