При обновлении конфигурации 1С:ERP Управление предприятием до версии 2.4.10.89 (а также смежных версий КА 2 и УТ 11) многие технические специалисты и пользователи столкнулись с неприятным багом. При оформлении корректировок реализации в табличной части «Расхождения» при расчете разниц начали появляться некорректные («дикие») значения в колонке количества упаковок. Примечательно, что проблема проявляется избирательно: она возникает только при создании повторных (второй и последующих) корректировок к историческим документам («древним» актам), в которых не использовались индивидуальные или общие упаковки номенклатуры.
В этой статье мы подробно разберем, почему возникает данная ошибка, проанализируем внутренние механизмы платформы 1С и покажем, как исправить этот сбой с помощью небольшого изменения в коде конфигурации.
Выясним, почему стандартные механизмы пересчета дают сбой на обновленном релизе. Разберем по шагам логику работы программы.
После установки релиза 2.4.10.89 разработчики фирмы «1С» внесли изменения в обработку табличных частей документов. В модулях обслуживания табличных частей появился принудительный вызов процедуры пересчета базовых единиц на основе упаковок. Рассмотрим фрагмент кода, который добавляется при обновлении и вызывается при работе с ТЧ «Расхождения»:
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
КэшированныеЗначения = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
ОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Объект.Расхождения, СтруктураДействий, КэшированныеЗначения);
Эта процедура предназначена для синхронизации реквизитов КоличествоУпаковок и Количество. В штатном режиме, если у номенклатуры не используются упаковки, действует правило: коэффициент упаковки равен 1, а значит, значение в поле КоличествоУпаковок должно строго равняться значению в поле Количество.
Однако при вызове общего метода ОбработатьТЧ с действием ПересчитатьКоличествоЕдиниц система берет за основу значение из реквизита КоличествоУпаковок и перезаписывает базовое Количество по формуле:
Количество = КоличествоУпаковок * КоэффициентУпаковки
Если в поле КоличествоУпаковок изначально попали искаженные данные, то после автоматического пересчета ломается и основное количество товара в строке. При этом скрытое системное поле Количество до момента пересчета хранило абсолютно верное значение.
Проанализируем специфику ведения учета. В некоторых компаниях принято регулярно корректировать один и тот же документ реализации на протяжении длительного времени (например, ежемесячно корректировать двухлетний акт из-за изменения тарифов или объемов услуг). При создании второй и последующих корректировок система рассчитывает дельту (разницу) не напрямую с исходным документом продажи, а с учетом накопленного итога всех ранее проведенных корректировок.
В модуле менеджера документа КорректировкаРеализации за этот расчет отвечает процедура ЗаполнитьРасхожденияПоРазнице(). Программа собирает накопленный итог по прошлым корректировкам с помощью конструкции:
НовоеРасхождение.КоличествоУпаковок = НовоеРасхождение.КоличествоУпаковок + ДанныеРасхождения.КоличествоУпаковок;
В старых версиях ERP (выпущенных несколько лет назад) реквизит КоличествоУпаковок в документах реализации и корректировок мог оставаться пустым (иметь значение Null или 0), если упаковки для номенклатуры не были настроены, либо заполнялся по иным алгоритмам. При сложении исторических данных, не содержащих корректных значений количества упаковок, в результирующем поле НовоеРасхождение.КоличествоУпаковок формируется ошибочное, некорректное число.
Когда управление передается упомянутой выше процедуре ОбработатьТЧ с действием ПересчитатьКоличествоЕдиниц, система видит искаженное значение КоличествоУпаковок и принудительно перезаписывает им правильное Количество.
Для устранения данной ошибки и обеспечения совместимости с историческими данными необходимо скорректировать логику суммирования накопленных показателей в модуле менеджера документа КорректировкаРеализации.
Мы можем установить защитный алгоритм («предохранитель»), который проверит, используются ли упаковки для текущей номенклатурной позиции. Если тип упаковки не задан (то есть базовой единицей измерения выступает штука, кубический метр и т.д. без дополнительных коэффициентов), то любые расхождения между количеством упаковок и базовым количеством признаются ошибкой округления или наследования исторических данных, и система принудительно приравнивает их друг к другу.
Рассмотрим, как выглядит доработка кода в процедуре ЗаполнитьРасхожденияПоРазнице() модуля менеджера документа КорректировкаРеализации.
Шаг 1. Находим в процедуре ЗаполнитьРасхожденияПоРазнице() строку расчета:
НовоеРасхождение.КоличествоУпаковок = НовоеРасхождение.КоличествоУпаковок + ДанныеРасхождения.КоличествоУпаковок;
Шаг 2. Заменяем её на следующее условие:
Если НЕ ЗначениеЗаполнено(НовоеРасхождение.Номенклатура.ЕдиницаИзмерения.ТипУпаковки)
И НовоеРасхождение.КоличествоУпаковок <> НовоеРасхождение.Количество Тогда
НовоеРасхождение.КоличествоУпаковок = НовоеРасхождение.Количество;
Иначе
НовоеРасхождение.КоличествоУпаковок = НовоеРасхождение.КоличествоУпаковок + ДанныеРасхождения.КоличествоУпаковок;
КонецЕсли;
Этот код анализирует реквизиты номенклатуры. Если у базовой единицы измерения не заполнен ТипУпаковки, а рассчитанное КоличествоУпаковок не совпадает с реальным Количеством, система принудительно выравнивает эти показатели. В противном случае расчет идет по стандартному алгоритму сложения дельт.
Чтобы сохранить конфигурацию на поддержке и избежать сложностей при последующих обновлениях на версии линейки 2.5.х, настоятельно рекомендуется выполнять доработку через механизм расширений. Выполним следующие действия:
ИсправлениеКорректировокРеализации), указав назначение «Адаптация».КорректировкаРеализации, вызовем контекстное меню и выберем пункт Добавить в расширение.ЗаполнитьРасхожденияПоРазнице() и применим к ней аннотацию &Вместо или переопределим логику заполнения через стандартные программные интерфейсы расширений.Такой подход гарантирует стабильность расчетов в исторических цепочках корректировок, предотвратит искажение данных по количеству и суммам в ТЧ «Расхождения» и позволит безболезненно обновлять конфигурацию в будущем.