Имя: Пароль:
1C
 
Ошибка при закрытии месяца в УНФ.
0 Zombi
 
16.06.25
07:51
В УНФ при закрытии месяца получили такую ошибку:
Ошибка при выполнении операции над данными:
Microsoft OLE DB Driver for SQL Server: Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric.
HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1

Нашел запрос, на котором валится ошибка. Документ закрытие месяца, процедура РешитьСЛУ(). Просмотрел все таблицы в менеджере таблиц запроса, никаких больших сумм не увидел. Сделал запрос по регистрам запасы, продажи, тоже не увидел больших сумм. В запросе пробовал изменить "КАК ЧИСЛО(23, 10)" на "КАК ЧИСЛО(32, 10)". Не помогло. Что еще можно посмотреть/сделать?
1 Zombi
 
16.06.25
07:52
Типовой текст запроса из процедуры РешитьСЛУ():
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТаблицаВозвратов.Организация КАК Организация,
    ТаблицаВозвратов.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
    ТаблицаВозвратов.СчетУчета КАК СчетУчета,
    ТаблицаВозвратов.Номенклатура КАК Номенклатура,
    ТаблицаВозвратов.Характеристика КАК Характеристика,
    ТаблицаВозвратов.Партия КАК Партия,
    ТаблицаВозвратов.ЗаказПокупателя КАК ЗаказПокупателя,
    ТаблицаВозвратов.ЗаказНаПроизводство КАК ЗаказНаПроизводство,
    ТаблицаВозвратов.НомерУзла КАК НомерУзла,
    ТаблицаВозвратов.КоличествоРаспределено КАК Количество,
    ТаблицаВозвратов.СуммаБезНДСРаспределено КАК СуммаБезНДС,
    ТаблицаВозвратов.СуммаРаспределено КАК Сумма,
    ТаблицаВозвратов.ДокументПродажи КАК ДокументПродажи
ПОМЕСТИТЬ УчетЗатратВозвраты
ИЗ
    &ТаблицаВозвратов КАК ТаблицаВозвратов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    УчетЗапасовИЗатрат.Организация КАК Организация,
    УчетЗапасовИЗатрат.КоррСтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
    УчетЗапасовИЗатрат.КоррСчетУчета КАК СчетУчета,
    УчетЗапасовИЗатрат.КоррНоменклатура КАК Номенклатура,
    УчетЗапасовИЗатрат.КоррХарактеристика КАК Характеристика,
    УчетЗапасовИЗатрат.КоррПартия КАК Партия,
    УчетЗапасовИЗатрат.КоррЗаказПокупателя КАК ЗаказПокупателя,
    УчетЗапасовИЗатрат.КоррЗаказНаПроизводство КАК ЗаказНаПроизводство,
    УзлыКорректировкиСтоимостиСписания.НомерУзла КАК НомерУзла,
    СУММА(ВЫБОР
            КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
                    И НЕ УчетЗапасовИЗатрат.Возврат
                ТОГДА УчетЗапасовИЗатрат.Количество
            КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                    И УчетЗапасовИЗатрат.Возврат
                ТОГДА -УчетЗапасовИЗатрат.Количество
            ИНАЧЕ 0
        КОНЕЦ) КАК Количество,
    СУММА(ВЫРАЗИТЬ(ВЫБОР
                КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
                        И НЕ УчетЗапасовИЗатрат.Возврат
                    ТОГДА УчетЗапасовИЗатрат.СуммаБезНДС
                КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                        И УчетЗапасовИЗатрат.Возврат
                    ТОГДА -УчетЗапасовИЗатрат.СуммаБезНДС
                ИНАЧЕ 0
            КОНЕЦ КАК ЧИСЛО(23, 10))) КАК СуммаБезНДС,
    СУММА(ВЫРАЗИТЬ(ВЫБОР
                КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
                        И НЕ УчетЗапасовИЗатрат.Возврат
                    ТОГДА УчетЗапасовИЗатрат.Сумма
                КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                        И УчетЗапасовИЗатрат.Возврат
                    ТОГДА -УчетЗапасовИЗатрат.Сумма
                ИНАЧЕ 0
            КОНЕЦ КАК ЧИСЛО(23, 10))) КАК Сумма,
    СУММА(ВЫРАЗИТЬ(ВЫБОР
                КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
                        И НЕ УчетЗапасовИЗатрат.Возврат
                    ТОГДА УчетЗапасовИЗатрат.СуммаИнт
                КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                        И УчетЗапасовИЗатрат.Возврат
                    ТОГДА -УчетЗапасовИЗатрат.СуммаИнт
                ИНАЧЕ 0
            КОНЕЦ КАК ЧИСЛО(23, 10))) КАК СуммаИнт,
    СУММА(ВЫРАЗИТЬ(ВЫБОР
                КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
                        И НЕ УчетЗапасовИЗатрат.Возврат
                    ТОГДА УчетЗапасовИЗатрат.СуммаБезНДСИнт
                КОГДА УчетЗапасовИЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                        И УчетЗапасовИЗатрат.Возврат
                    ТОГДА -УчетЗапасовИЗатрат.СуммаБезНДСИнт
                ИНАЧЕ 0
            КОНЕЦ КАК ЧИСЛО(23, 10))) КАК СуммаБезНДСИнт
ПОМЕСТИТЬ УчетЗатратБезУчетаВозвратов
ИЗ
    РегистрНакопления.Запасы КАК УчетЗапасовИЗатрат
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УзлыКорректировкиСтоимостиСписания КАК УзлыКорректировкиСтоимостиСписания
        ПО (УзлыКорректировкиСтоимостиСписания.Регистратор = &Регистратор)
            И УчетЗапасовИЗатрат.Организация = УзлыКорректировкиСтоимостиСписания.Организация
            И УчетЗапасовИЗатрат.СтруктурнаяЕдиница = УзлыКорректировкиСтоимостиСписания.СтруктурнаяЕдиница
            И УчетЗапасовИЗатрат.СчетУчета = УзлыКорректировкиСтоимостиСписания.СчетУчета
            И УчетЗапасовИЗатрат.Номенклатура = УзлыКорректировкиСтоимостиСписания.Номенклатура
            И УчетЗапасовИЗатрат.Характеристика = УзлыКорректировкиСтоимостиСписания.Характеристика
            И УчетЗапасовИЗатрат.Партия = УзлыКорректировкиСтоимостиСписания.Партия
            И УчетЗапасовИЗатрат.ЗаказПокупателя = УзлыКорректировкиСтоимостиСписания.ЗаказПокупателя
            И УчетЗапасовИЗатрат.ЗаказНаПроизводство = УзлыКорректировкиСтоимостиСписания.ЗаказНаПроизводство
ГДЕ
    УчетЗапасовИЗатрат.Период МЕЖДУ &ДатаНач И &ДатаКон
    И УчетЗапасовИЗатрат.Организация = &Организация
    И НЕ УчетЗапасовИЗатрат.ФиксированнаяСтоимость

СГРУППИРОВАТЬ ПО
    УчетЗапасовИЗатрат.Организация,
    УчетЗапасовИЗатрат.КоррСтруктурнаяЕдиница,
    УчетЗапасовИЗатрат.КоррСчетУчета,
    УчетЗапасовИЗатрат.КоррНоменклатура,
    УчетЗапасовИЗатрат.КоррХарактеристика,
    УчетЗапасовИЗатрат.КоррПартия,
    УчетЗапасовИЗатрат.КоррЗаказПокупателя,
    УчетЗапасовИЗатрат.КоррЗаказНаПроизводство,
    УзлыКорректировкиСтоимостиСписания.НомерУзла
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    УчетЗатрат.Организация КАК Организация,
    УчетЗатрат.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
    УчетЗатрат.СчетУчета КАК СчетУчета,
    УчетЗатрат.Номенклатура КАК Номенклатура,
    УчетЗатрат.Характеристика КАК Характеристика,
    УчетЗатрат.Партия КАК Партия,
    УчетЗатрат.ЗаказПокупателя КАК ЗаказПокупателя,
    УчетЗатрат.ЗаказНаПроизводство КАК ЗаказНаПроизводство,
    УчетЗатрат.НомерУзла КАК НомерУзла,
    СУММА(УчетЗатрат.Количество) КАК Количество,
    СУММА(УчетЗатрат.СуммаБезНДС) КАК СуммаБезНДС,
    СУММА(УчетЗатрат.Сумма) КАК Сумма,
    СУММА(УчетЗатрат.СуммаИнт) КАК СуммаИнт,
    СУММА(УчетЗатрат.СуммаБезНДСИнт) КАК СуммаБезНДСИнт
ПОМЕСТИТЬ УчетЗатрат
ИЗ
    (ВЫБРАТЬ
        УчетЗатратЗаВычетомВозвратов.Организация КАК Организация,
        УчетЗатратЗаВычетомВозвратов.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
        УчетЗатратЗаВычетомВозвратов.СчетУчета КАК СчетУчета,
        УчетЗатратЗаВычетомВозвратов.Номенклатура КАК Номенклатура,
        УчетЗатратЗаВычетомВозвратов.Характеристика КАК Характеристика,
        УчетЗатратЗаВычетомВозвратов.Партия КАК Партия,
        УчетЗатратЗаВычетомВозвратов.ЗаказПокупателя КАК ЗаказПокупателя,
        УчетЗатратЗаВычетомВозвратов.ЗаказНаПроизводство КАК ЗаказНаПроизводство,
        УчетЗатратЗаВычетомВозвратов.НомерУзла КАК НомерУзла,
        УчетЗатратЗаВычетомВозвратов.Количество КАК Количество,
        УчетЗатратЗаВычетомВозвратов.СуммаБезНДС КАК СуммаБезНДС,
        УчетЗатратЗаВычетомВозвратов.Сумма КАК Сумма,
        УчетЗатратЗаВычетомВозвратов.СуммаИнт КАК СуммаИнт,
        УчетЗатратЗаВычетомВозвратов.СуммаБезНДСИнт КАК СуммаБезНДСИнт
    ИЗ
        УчетЗатратБезУчетаВозвратов КАК УчетЗатратЗаВычетомВозвратов
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        УчетЗатратВозвраты.Организация,
        УчетЗатратВозвраты.СтруктурнаяЕдиница,
        УчетЗатратВозвраты.СчетУчета,
        УчетЗатратВозвраты.Номенклатура,
        УчетЗатратВозвраты.Характеристика,
        УчетЗатратВозвраты.Партия,
        УчетЗатратВозвраты.ЗаказПокупателя,
        УчетЗатратВозвраты.ЗаказНаПроизводство,
        УчетЗатратВозвраты.НомерУзла,
        УчетЗатратВозвраты.Количество,
        УчетЗатратВозвраты.СуммаБезНДС,
        УчетЗатратВозвраты.Сумма,
        0,
        0
    ИЗ
        УчетЗатратВозвраты КАК УчетЗатратВозвраты
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        УчетЗатратВозвраты.Организация,
        НЕОПРЕДЕЛЕНО,
        ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПустаяСсылка),
        ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка),
        ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка),
        ЗНАЧЕНИЕ(Справочник.ПартииНоменклатуры.ПустаяСсылка),
        ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка),
        ЗНАЧЕНИЕ(Документ.ЗаказНаПроизводство.ПустаяСсылка),
        УчетЗатратВозвраты.НомерУзла,
        -УчетЗатратВозвраты.Количество,
        -УчетЗатратВозвраты.СуммаБезНДС,
        -УчетЗатратВозвраты.Сумма,
        0,
        0
    ИЗ
        УчетЗатратВозвраты КАК УчетЗатратВозвраты) КАК УчетЗатрат

СГРУППИРОВАТЬ ПО
    УчетЗатрат.Организация,
    УчетЗатрат.СтруктурнаяЕдиница,
    УчетЗатрат.СчетУчета,
    УчетЗатрат.Номенклатура,
    УчетЗатрат.Характеристика,
    УчетЗатрат.Партия,
    УчетЗатрат.ЗаказПокупателя,
    УчетЗатрат.ЗаказНаПроизводство,
    УчетЗатрат.НомерУзла

ИНДЕКСИРОВАТЬ ПО
    Организация,
    СтруктурнаяЕдиница,
    СчетУчета,
    Номенклатура,
    Характеристика,
    Партия,
    ЗаказПокупателя,
    ЗаказНаПроизводство,
    НомерУзла
2 Zombi
 
16.06.25
07:57
Пользователи сказали экспериментировали и создавали какой то документ с девятками в поле "Сумма", но потом удалили его. Ну и я тоже не вижу ни документа такого, ни движений в регистрах. ТИИ делал, не помогло.
3 Гена
 
гуру
16.06.25
08:34
Забавно... как что не так - сразу ТиИ )))

УНФ отличается от других конфигураций тем, что в закрытии месяца для расчёта себестоимости в запросах используется переменная СуммаКвадратовОтклонений
Можете проверить глобальным поиском.

Что это означает? Это означает, что на входе в средние квадраты обязаны быть только положительные величины. Иначе результат будет в геометрической прогрессии расходиться вместо схождения, например при отрицательных остатках в каком-нибудь используемом РН. По арифметике. Раскачается +/- до бесконечности. Но так как в кибернетике отсутствует бесконечность, то на каком-то этапе для какого-то физического сектора на диске выйдет:
Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric

Вывод: Ищите отрицательные остатки, запросом гляньте что там с минусом и исправьте проблему.
4 maxab72
 
16.06.25
08:49
Не, СуммаКвадратовОтклонений во-первых равна ((ТаблицаРешений.Сумма) - (УзлыКорректировкиСтоимостиСписания.Сумма + ВременнаятаблицаРешений.Сумма)) * ((ТаблицаРешений.Сумма) - (УзлыКорректировкиСтоимостиСписания.Сумма + ВременнаятаблицаРешений.Сумма)), то есть это реально квадрат, а он может быть отрицательным, если только в расчете мы получим комплексные числа. Во-вторых, СуммаКвадратовОтклонений напрямую с регистрами остатков не связана. Надо искать в другом месте.
5 Гена
 
гуру
16.06.25
08:53
(4) Спорим на штуку рублей?
Кто разобьёт? )
6 Zombi
 
16.06.25
09:06
Отрицательного количества в остатках регистра запасы нет. Есть небольшие минусы по сумме у некоторых позиций. Не из за этого же.
7 Гена
 
гуру
16.06.25
09:11
(6) Легко же проверить: уберите принудительно минусы на начало месяца и перепроведите Закрытие.
8 maxab72
 
16.06.25
09:15
(5) здесь скорее другое. В запросе значения преобразуют в формат 23.10 (к дробной части стандартного формата 15.2 накинули 8 знаков для точности, а так как в регистре УзлыКорректировкиСтоимостиСписания реквизиты с суммами имеют тип 23.10 (фактически 22.10 + знак)). и их соединяют с некоей расчетной таблицей, ТаблицаВозвратов, где результат может быть задан как 23.10 (неотрицательное). То при использовании при заполнении ТаблицаВозвратов в какой либо строке числа с полностью заполненным реквизитом мы и получим переполнение.
То есть надо копать заполнение временной таблицы ТаблицаВозвратов.
9 Zombi
 
16.06.25
09:28
(7) Убрал все минусы. Проблема осталась
10 maxab72
 
16.06.25
09:31
(9) посмотри в отладчике таблицуВозвратов, какие там значения, нет ли чего больше положенного.
11 Zombi
 
16.06.25
09:35
(10) Вроде ничего подозрительного:
12 Гена
 
гуру
16.06.25
09:43
13 Zombi
 
16.06.25
09:54
Ну в регистре запасы и затраты сейчас нет вообще отрицательных значений по количеству или сумме:
14 Kongo2019
 
17.06.25
08:44
Ну так чем дело закончилось нашел? Очень интересно же.
15 Гипервизор
 
17.06.25
08:50
(14) Ну всё ясно же по скрину в (13). Надо Windows активировать. )
16 Zombi
 
17.06.25
10:07
(14) Ищу когда время есть. У меня в этой конторе не так много часов по договору и другие задачи есть.
17 Zombi
 
17.06.25
12:32
Повозился сегодня с сабжем нашел что на 4 итерации одна из 4 тысяч строк в ВТ "ТаблицаРешений" разрастается до большой суммы. Связывазывается эта таблица с РС "УзлыКорректировкиСтоимостиСписания". Запросом в этом регистре что то поймать не получилось, записи в нем существуют в момент расчета себестоимости. Нашел процедуру, где формируются записи этого РС и по номеру узла из виртуальной таблицы нашел, по какой номенклатуре и характеристике раздувается сумма. Открыл по ним РН "Запасы" и увидел такую картину: была отгрузка, потом возврат от клиента и возврат поставщику. Если отменить проведение последней расходной накладной(которая возврат поставщику), месяц закрывается, ошибок нет. Если снова провести этот документ, закрытие месяца опять выдает ошибку (0). Скрин РН "Запасы":
18 Kuzmich123
 
17.06.25
12:44
Прям тоже слежу за темой и переживаю )))

(17) Попробуй создать вручную полностью аналогичный возврат поставщику.
19 Zombi
 
17.06.25
13:10
(18) Создал. Такая же ошибка.
20 Гена
 
гуру
17.06.25
13:37
(19) А давайте проверим одно свойство МНК (метод наименьших квадратов) для почти линейных систем.
Исправьте вручную -434.31 в регистре под последней РН 1629 на 100 вверх или вниз, или побольше. Цель - начальное значение не должно совпадать суммарно с 8434.31, т.е. с самой собой как конечной целью итераций, куда они стремятся. А то мы сразу начинаем с верного значения, а неплохо бы начать поодаль.

Теперь как?
21 Гена
 
гуру
17.06.25
13:43
Гипотеза такая: если функция имеет локальный экстремум недалеко от корня, а первое приближение находится вблизи этого экстремума, то касательная к графику может быть почти горизонтальной, а точка пересечения её с осью x — далеко и от экстремума, и от корня. В этом случае МНК раскачается в итерациях до бесконечности.

А у нас первое приближение 8434.31 вообще совпадает с корнем.
22 Zombi
 
17.06.25
13:54
(20) Сделал, месяц закрылся. Убрал корректировку, ошибка вернулась.
23 Гена
 
гуру
17.06.25
13:58
(22) дык... убирать ничего и не надо...
А какую сумму влепили вместо -434.31 ?
24 Zombi
 
17.06.25
14:32
(23) Я не вместо, я корректировкой регистра добавил запись приход с такими же измерениями и суммой 100
25 Zombi
 
17.06.25
14:35
А чем черевато? Себестоимость не правильная будет по этой позиции же?
26 Гена
 
гуру
17.06.25
14:44
(24) Давайте доведём эксперимент до конца. Уменьшайте дельту. Ловите два резонанса слева и справа, начиная с которых начинает возрастать маятник итераций.