Имя: Пароль:
1C
1С v8
Ошибка арифметического переполнения при расчете себестоимости
0 DrManila
 
07.10.19
10:31
В конце сентября столкнулись с такой проблемой. Не решается СЛУ в процедуре расчета себестоимости, увеличение длины переменной не дает эффект, т.к. отклонение растет с каждой итерацией (хотя на рабочем бэкапе оно падает), т.е. сколько не увеличь столько оно и займет. Проблема появилась "вдруг" 27-го сентября. Всё это время пытался найти решения, пытался повторить положительный опыт найденный тут и на других форумах (исключение отрицательных остатков, исправление регистров...), но ничего не давало эффекта. Восстановили бэкап от 23-го сентября и попытался найти разницу между текущей не рабочей базой и рабочей от 23-го.
Разница была на входе условий для запуска процедуры решения СЛУ, она заключалась в том, что на рабочей базе датой начала использования партионного учета стояла дата "01.01.0001 0:00:00" (явно установили в момент заведения новой базы, а используем мы её с конца 09.2018), а в не рабочей дата начала партионного учета стояла "01.09.2019  0:00:00". Проведя эксперимент с бэкапом от 23.09.19 выяснил, что:
1. Если в настройках учета (в администрировании) выключить, а потом включить партионный учет, то дата начала сменится на текущий месяц.
2. При подобной операции на рабочем бэкапе  воспроизвелась та же ошибка, что получена на боевой, т.е. я предполагаю уже основываясь на проведенном опыте, что именно отключение/включение партионного учета приводит с сбою расчета себестоимости.
Себестоимость считается по ФИФО взвешенная. Партионный учет версии 2.2. УТ версии 11.3.4.21 (есть изменения, процесс подготовки обновления идет, но пока не готовы обновить).
Попытался понять по какому принципу устанавливается дата начала ведения партионного учета (ведь интерфейс не дает её изменить, она не активна) и нашел процедуру соответствующую, вот кусочек кода:
[CODE]    // Включение партионного учета.
            Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПартионныйУчет") Тогда
                КонстантаИмя = "ИспользоватьПартионныйУчет";
                Константы.ИспользоватьПартионныйУчет.Установить(Истина);
            КонецЕсли;
            
            Если (РежимПартионногоУчета = "Версия22") <> ПолучитьФункциональнуюОпцию("ПартионныйУчетВерсии22") Тогда
                
                // Включение партионного учета версии 2.2.
                КонстантаИмя = "ПартионныйУчетВерсии22";
                Константы.ПартионныйУчетВерсии22.Установить(РежимПартионногоУчета = "Версия22");
            
                Если РежимПартионногоУчета = "Версия22" И НЕ ЗначениеЗаполнено(НаборКонстант.ДатаПереходаНаПартионныйУчетВерсии22) Тогда
                    
                    // Если в ИБ есть движения, то установим дату перехода на этот месяц; если движений нет, то пусть дата остается пустой
                    Запрос = Новый Запрос;
                    Запрос.Текст =
                    "ВЫБРАТЬ ПЕРВЫЕ 1
                    |    1
                    |ИЗ
                    |    РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров";
                    
                    УстановитьПривилегированныйРежим(Истина);
                    ЕстьДвиженияСебестоимости = НЕ Запрос.Выполнить().Пустой();
                    УстановитьПривилегированныйРежим(Ложь);
                    
                    Если ЕстьДвиженияСебестоимости Тогда
                        НаборКонстант.ДатаПереходаНаПартионныйУчетВерсии22 = НачалоМесяца(ТекущаяДатаСеанса());
                        СохранитьЗначениеРеквизита("НаборКонстант.ДатаПереходаНаПартионныйУчетВерсии22");
                    КонецЕсли;
                    
                КонецЕсли;
                
            КонецЕсли;[/CODE]
Я совсем слаб в коде 1с (да и в целом в рабоче 1с), поэтому делаю вывод просто из комментария - если движения были в базе, то делаем началом текущего месяца, если не были, то делаем датой 01.01.0001 0:00:00. Проверяет он по регистру себестоимости товаров судя по коду.
Теперь вопросы:
1. Как решить проблему не расчета себестоимости наиболее корректно? В каком направлении двигаться? Попытаться включить партионный учет задним числом? Если да то как? Или в каком направлении смотреть?
2. Почему так легко 1с дает сломать систему расчета себе стоимости? Никаких предупреждений она не выдает, в настройках просто переключатель, не нужно нажимать что-то типа "разрешить изменения", "могут быть последствия" и т.д.
Очень надеюсь на помощь, спасибо.
1 shuhard
 
07.10.19
12:42
(0)[ Почему так легко 1с дает сломать систему расчета себе стоимости?]
купи SAP R3, будет сложно
2 pechkin
 
07.10.19
13:04
пиши в 1с, вместе сделам систему устойчевее
3 DrManila
 
07.10.19
14:31
По поводу писать в 1с я попробую, но первый пункт меня волнует куда больше ), может есть идеи как всё починить?
4 Кодер
 
07.10.19
14:52
(0) Проверь остатки в основных регистрах на конец месяца, если есть минуса - правь их. РАУЗ не любит такое.

(1) Фигня. Есть уже S/4, там должно быть реально сложней.