При работе с отраслевыми решениями от компании «1С-Рарус» (например, «1С-Рарус: Розница 2.2») пользователи и программисты иногда сталкиваются с аномальным поведением документов при проведении. Одна из таких сложных и неочевидных проблем — появление некорректных движений по регистрам накопления при оформлении документа «Комплектация номенклатуры». Ошибка проявляется крайне загадочно: на одном складе документ проводится абсолютно корректно, а на другом — в графу «Количество» записывается огромная сумма, равная рассчитанной себестоимости комплектующих.
В рамках этой статьи мы подробно разберем, почему возникает этот программный сбой, как функционируют механизмы расчета себестоимости в конфигурациях от «1С-Рарус», почему проблема привязана к конкретным складам и как правильно исправить ошибку в коде без ущерба для ведения учета.
Для того чтобы понять природу ошибки, проанализируем, как типовая конфигурация «1С:Розница» и надстройка от «1С-Рарус» рассчитывают себестоимость при комплектации. Документ «Комплектация номенклатуры» выполняет две ключевые операции:
Себестоимость нового комплекта напрямую складывается из стоимости списанных комплектующих. Если в системе включен учет себестоимости «по средней», программа должна при проведении документа обратиться к регистру остатков, рассчитать среднюю стоимость каждой комплектующей на текущий момент и перенести эту стоимость на готовый комплект.
Разработчики отраслевого решения от «1С-Рарус» интегрировали собственный, альтернативный механизм расчета себестоимости. Ошибка, при которой себестоимость подменяет количество в движениях, является следствием классического программного бага (так называемого «сдвига параметров» в коде):
ЕстьNULL(СуммаОборот, 0) или некорректно сопоставлены поля выборки запроса, алгоритм распределения дает сбой, записывая числовые показатели стоимости в поля количества.Проанализируем ситуацию, когда замена склада в документе временно решает проблему, а возврат на исходный склад снова вызывает ошибку. Это происходит из-за зависимости алгоритмов проведения от аналитики конкретного склада:
1. Наличие отрицательных остатков (минусов)
Если на одном складе комплектующие есть в наличии в достаточном количестве, алгоритм успешно находит партии списания, вычисляет стоимость и корректно проводит документ. Если же на проблемном складе разрешено списание в минус и фактический остаток комплектующих отрицательный или равен нулю, алгоритм расчета себестоимости не находит данных в базе. В коде «1С-Рарус» не предусмотрена адекватная обработка такой исключительной ситуации, что приводит к некорректной работе математического алгоритма распределения сумм и количеств.
2. Различия в типах складов и магазинов
В «1С:Розница» проведение документов по розничным и оптовым складам регулируется разными ветками кода. На розничных складах учет может вестись в розничных ценах (с наценкой), в то время как на оптовых — по себестоимости. Баг в коде Раруса затрагивает именно ту ветку, которая отвечает за конкретный тип склада (например, розничный магазин с автономным учетом).
Некоторые специалисты, столкнувшись с этой проблемой и не имея времени на детальную отладку, идут по пути наименьшего сопротивления: они просто комментируют строки кода, отвечающие за расчет себестоимости в документе комплектации. Рассмотрим подробнее, к каким катастрофическим последствиям для бизнеса это приводит:
Поэтому комментирование кода — это опасный шаг, который в будущем потребует сложного и дорогостоящего восстановления последовательности партионного учета.
Выясним, как устранить ошибку корректно, не ломая финансовый учет и сохраняя возможность обновления конфигурации.
Для исправления ошибки кода без снятия конфигурации с поддержки мы рекомендуем использовать механизм расширений. Рассмотрим по шагам, как локализовать и перехватить процедуру с ошибкой:
Во-первых, запустим отладчик и установим точку останова в общем модуле расчета себестоимости «1С-Рарус». Нам необходимо отследить момент формирования движений документа КомплектацияНоменклатуры по регистру накопления (например, Рарус_ПартииТоваров или аналогичному отраслевому регистру).
Во-вторых, найдем строку, где происходит запись в набор движений. Код обычно выглядит следующим образом:
Движение = Движения.Рарус_ПартииТоваров.Добавить();
Движение.Период = Дата;
Движение.Количество = ?(УсловиеКоличества, СтоимостьСписания, Выборка.Количество); // Пример ошибочного кода
Движение.Стоимость = СтоимостьСписания;
В-третьих, создадим расширение конфигурации и добавим в него ошибочную процедуру с аннотацией &Вместо или &ИзменениеИВыборка. Пример корректного переопределения записи движений в расширении:
&Вместо("СформироватьДвиженияКомплектации")
Процедура Расш1_СформироватьДвиженияКомплектации(ДокументСсылка, Отказ)
// Вызываем оригинальный расчет, но перехватываем параметры
// Либо полностью замещаем логику с исправлением путаницы переменных:
// Код исправления: гарантируем, что в Количество попадает именно количественный показатель
Движение.Количество = Выборка.КоличествоОборот;
Движение.Стоимость = ?(Выборка.СуммаОборот = Неопределено, 0, Выборка.СуммаОборот);
КонецПроцедуры
Поскольку данная ошибка в расчете средней себестоимости от Раруса является вендорским багом, разработчики отраслевого решения выпускают официальные исправления (патчи) или закрывают проблему в следующих релизах конфигурации.
Проанализируйте историю изменений (Changelog) к последним релизам «1С-Рарус: Розница». Если в списке исправленных ошибок присутствует исправление проведения комплектации, лучшим решением будет обновление системы до актуального релиза. Это позволит избежать написания собственного кода и гарантирует стабильность всей системы.
Если обновление невозможно в ближайшее время, проанализируем состояние учета на складе, где возникает ошибка. В большинстве случаев сбой провоцируется отрицательными остатками комплектующих.
Выполните следующие действия:
После приведения остатков в корректное состояние алгоритм расчета себестоимости по средней цене сможет отработать штатно без обращения к пустым значениям, и движения документа на данном складе станут корректными.