Имя: Пароль:
1C
1С v8
Ошибка арифметического переполнения при преобразовании numeric
0 фпк1сл
 
31.01.16
21:52
Добрый день!
Конфигурация УТ 11.1.10.145, платформа 8.3.6.2237, SQL Server 2008.
При проведении документа "Расчет себестоимости товаров" за апрель, выскакивает ошибка
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.РасчетСебестоимостиТоваров.МодульОбъекта(2181)}: Ошибка при вызове метода контекста (ВыполнитьПакет)
        Выборка = Запрос.ВыполнитьПакет()[1].Выбрать();
по причине:
Ошибка выполнения запроса
по причине:
Ошибка при выполнении операции над данными:
Microsoft SQL Server Native Client 10.0: Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric.
HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1
Все  другие документы проводятся нормально. Подскажите пожалуйста, все чем может быть проблема, куда смотреть?
1 фпк1сл
 
31.01.16
21:53
Я понимаю, что где-то в результате запроса получается большое число, вот только как найти, откуда это число возникает?
2 cw014
 
01.02.16
07:37
Пройтись отладчиком + ТИИ
3 фпк1сл
 
01.02.16
11:57
Отладчик мне ничего не покажет, программа завершается в момент Выборка = Запрос.ВыполнитьПакет()[1].Выбрать(); , значит я не узнаю, что её выбивает. В файловом варианте база тоже не запускается, размер слишком большой.
4 Timon1405
 
01.02.16
12:04
обновитесь, говорят, на 11.1.10.150 проблема уходит.
5 Михаил Козлов
 
01.02.16
12:14
(3) Можно попробовать в консоли удалять из пакета по 1. Или выполнять по 1.
6 Карупян
 
01.02.16
12:16
профайлером (или тж) засечь запрос и посмотреть
7 фпк1сл
 
01.02.16
15:21
Обновляться буду в крайнем случае, попробую в технологическом журнале посмотреть на криминал. Профайлером не имею представления как пользоваться.
8 фпк1сл
 
02.02.16
16:16
Обновление не дало результатов. В ТЖ и профайлер смотрел - ничего не понял. Подскажите, может по какому нибудь регистру посмотреть какие нибудь значения подозрительные?
9 mikecool
 
02.02.16
16:19
(8) первый запрос из пакета генерит не перевариваемое число - посмотри, какие там числовые поля и попытайся понять, откуда мб такое большое
10 Timon1405
 
02.02.16
17:16
(8) поищите большой ресурс "ПостояннаяРазница" в регистре ВыручкаИСебестоимостьПродаж в консоли запросов
11 Tateossian
 
02.02.16
18:37
(0) Скорее всего, это происходит где-то при делении, попробуй все такие места явно обработать через ВЫРАЗИТЬ( КАК ЧИСЛО(xx,yy))
12 Cyberhawk
 
02.02.16
18:53
ИР тебе в помощь - там и разбивка запроса на подзапросы, и отбор ТЖ по конкретному запросу
13 фпк1сл
 
03.02.16
09:26
(11) В том то дело, все место обработаны через Выразить, запрос полностью типовой.

// 0 Расчет коэффициентов (количество перехода из состояния в состояние) уравнения.
        |ВЫБРАТЬ
        |    УзлыКорректировки.НомерУзла                                     КАК НомерУзла,
        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.Стоимость)                  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициент,
        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьБезНДС)            КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентБезНДС,
        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ПостояннаяРазница)          КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентПостояннаяРазница,
        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ВременнаяРазница)           КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентВременнаяРазница,
        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходы)        КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходы,
        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходыБезНДС)  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходыБезНДС,
        |
        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
        |        / УзлыКорректировки.Количество КАК Стоимость,
        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
        |        / УзлыКорректировки.Количество КАК СтоимостьБезНДС,
        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
        |        / УзлыКорректировки.Количество КАК ПостояннаяРазница,
        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ВременнаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
        |        / УзлыКорректировки.Количество КАК ВременнаяРазница,
        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходы, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
        |        / УзлыКорректировки.Количество КАК СтоимостьДопРасходы,
        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходыБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
        |        / УзлыКорректировки.Количество КАК СтоимостьДопРасходыБезНДС
        |
        |ПОМЕСТИТЬ ВременнаяТаблицаРешений
        |ИЗ
        |    ВтУзлыКорректировки КАК УзлыКорректировки
        |    ЛЕВОЕ СОЕДИНЕНИЕ ВтПеремещенияСписания КАК ПеремещенияСписания
        |        ПО УзлыКорректировки.НомерУзла = ПеремещенияСписания.НомерУзлаПриемник
        |    ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ВтТаблицаРешений
        |        ПО ПеремещенияСписания.НомерУзлаИсточник = ВтТаблицаРешений.НомерУзла
        |ГДЕ
        |    УзлыКорректировки.Количество <> 0
        |    И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) > -999999999.999999999
        |    И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) < 999999999.999999999
        |
        |СГРУППИРОВАТЬ ПО
        |    УзлыКорректировки.НомерУзла,
        |    УзлыКорректировки.Количество
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    НомерУзла
        |;
        |/////////////////////////////////////////////////////////////////////////////
        // 1 Расчет ошибки расчета.
        |ВЫБРАТЬ
        |    ЕСТЬNULL(
        |        МАКСИМУМ(
        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.Стоимость,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициент
        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))) > 0 ТОГДА
        |
        |                    ЕСТЬNULL(ТаблицаРешений.Стоимость,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициент
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))
        |            ИНАЧЕ
        |                -(
        |                    ЕСТЬNULL(ТаблицаРешений.Стоимость,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициент
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))
        |                    )
        |            КОНЕЦ
        |            )
        |        ,0) КАК Отклонение,
        |    ЕСТЬNULL(
        |        МАКСИМУМ(
        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС
        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))) > 0 ТОГДА
        |
        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))
        |            ИНАЧЕ
        |                -(
        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))
        |                    )
        |            КОНЕЦ
        |            )
        |        ,0) КАК ОтклонениеБезНДС,
        |    ЕСТЬNULL(
        |        МАКСИМУМ(
        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница
        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))) > 0 ТОГДА
        |
        |                    ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))
        |            ИНАЧЕ
        |                -(
        |                    ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))
        |                    )
        |            КОНЕЦ
        |            )
        |        ,0) КАК ОтклонениеПостояннаяРазница,
        |    ЕСТЬNULL(
        |        МАКСИМУМ(
        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница
        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))) > 0 ТОГДА
        |
        |                    ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))
        |            ИНАЧЕ
        |                -(
        |                    ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))
        |                    )
        |            КОНЕЦ
        |            )
        |        ,0) КАК ОтклонениеВременнаяРазница,
        |
        |    ЕСТЬNULL(
        |        МАКСИМУМ(
        |            ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА
        |
        |                ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))
        |
        |            ИНАЧЕ
        |                -(
        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))
        |                    )
        |            КОНЕЦ
        |            )
        |        ,0) КАК ОтклонениеДопрасходы,
        |    ЕСТЬNULL(
        |        МАКСИМУМ(
        |            ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА
        |
        |                ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))
        |
        |            ИНАЧЕ
        |                -(
        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))
        |                    )
        |            КОНЕЦ
        |            )
        |        ,0) КАК ОтклонениеДопрасходыБезНДС
        |ИЗ
        |    ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений
        |
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ТаблицаРешений
        |        ПО ВременнаяТаблицаРешений.НомерУзла = ТаблицаРешений.НомерУзла
        |;
        |//////////////////////////////////////////////////////////////
        // 2 Удаление таблиц.
        |УНИЧТОЖИТЬ ВтТаблицаРешений
        |;
        // 3 Суммирование коэффициентов.
        |//////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВременнаяТаблицаРешений.НомерУзла  КАК НомерУзла,
        |    ВЫРАЗИТЬ(
        |        ВременнаяТаблицаРешений.СвободныйКоэффициент
        |            + ВременнаяТаблицаРешений.Стоимость
        |        КАК ЧИСЛО(23,10))              КАК Стоимость,
        |    ВЫРАЗИТЬ(
        |        ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС
        |            + ВременнаяТаблицаРешений.СтоимостьБезНДС
        |        КАК ЧИСЛО(23,10))              КАК СтоимостьБезНДС,
        |    ВЫРАЗИТЬ(
        |        ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница
        |            + ВременнаяТаблицаРешений.ПостояннаяРазница
        |        КАК ЧИСЛО(23,10))              КАК ПостояннаяРазница,
        |    ВЫРАЗИТЬ(
        |        ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница
        |            + ВременнаяТаблицаРешений.ВременнаяРазница
        |        КАК ЧИСЛО(23,10))              КАК ВременнаяРазница,
        |
        |    ВЫРАЗИТЬ(
        |        ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
        |            + ВременнаяТаблицаРешений.СтоимостьДопРасходы
        |        КАК ЧИСЛО(23,10))              КАК СтоимостьДопРасходы,
        |    ВЫРАЗИТЬ(
        |        ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходыБезНДС
        |            + ВременнаяТаблицаРешений.СтоимостьДопРасходыБезНДС
        |        КАК ЧИСЛО(23,10))              КАК СтоимостьДопРасходыБезНДС
        |
        |ПОМЕСТИТЬ ВтТаблицаРешений
        |
        |ИЗ
        |    ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    НомерУзла
        |;
        |//////////////////////////////////////////////////////////////
        // 4 Удаление таблицы.
        |    УНИЧТОЖИТЬ ВременнаяТаблицаРешений
        |";
14 фпк1сл
 
03.02.16
12:58
Запрос выполняется с использованием Менеджера временных таблиц
15 фпк1сл
 
03.02.16
13:02
Еще глупый вопрос, в запросе выполняется первый пакет. Как мне его найти?
16 фпк1сл
 
05.02.16
09:26
я вычислил, что всему виной вот эта строчка в запросе
|    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
Здесь и происходит переполнение.
17 Ёпрст
 
05.02.16
09:35
(16) выкини выразить оттуда
18 Ёпрст
 
05.02.16
09:35
и спи спокойно дальше
19 фпк1сл
 
05.02.16
09:42
(17) Не помогло, все та же ошибка преобразования numeric.
Что интересно, только за апрель документ выжучивается, следующий месяц проводится без проблем.
20 Ёпрст
 
05.02.16
09:43
ну поставь  КАК ЧИСЛО(15,0)
21 фпк1сл
 
05.02.16
09:53
(20) Все так же упрямо выскакивает эта ошибка.
22 НЕА123
 
05.02.16
10:00
СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0)) Как СуммаПР,
Сумма(ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК СуммаСписания,...

может дикие числа.
23 НЕА123
 
05.02.16
10:03
вообще, ИМХО, ВЫРАЗИТЬ в Сумма засунуть.
24 Tateossian
 
05.02.16
10:09
(16) Выведи в отладке содержимое ВтТаблицаРешений в ТЗ и посмотри, что там за числа.
25 фпк1сл
 
05.02.16
10:53
(23) выразил, снова ошибка. (24)  Глазами пробежался по 12к строк, на первый взгляд никакого криминала. Попробую покромсать запрос и выполнять по частям.
26 фпк1сл
 
05.02.16
13:11
Получается, что "ВтТаблицаРешений.ПостояннаяРазница" и "ПеремещенияСписания.Количество" имеют значение Null.
И если подставить, то получается, что выражение
ВЫРАЗИТЬ(СУММА(0 * 0) КАК ЧИСЛО(23,10)) - вызывает арифметическое переполнение.
27 фпк1сл
 
05.02.16
13:50
Был неправ, зайдя дальше обнаружил, что умножение "ВтТаблицаРешений.ПостояннаяРазница" и "ПеремещенияСписания.Количество" на какой то итерации дает переполнение, буду двигаться дальше.
28 фпк1сл
 
09.02.16
15:52
При проведении документа "Расчет себестоимости" формируются записи регистра накопления "Себестоимость товаров". Так вот за 2014 год все формировалось нормально, а с 2015 в колонке "Стоимость (ПР)" - постоянная разница, только по 2-3 номенклатурам начали появляться и расти огромные числа. Подскажите, из-за чего растет постоянная разница строго по 2 позициям номенклатуры?
29 фпк1сл
 
10.02.16
10:10
Пример. Одна организация, два склада.
Документ перемещения формирует две записи в регистре накопления - Количество(10) по двум складам.
Документ Расчет себестоимости товаров формирует одну запись - Стоимость(ПР) : 134 046 229,30.   Откуда такая цифра? Причем некоторые записи идут корректно, в чем разница, так и не понял.