Нюанс с расчетом цен без характеристик в УНФ
У клиента возникла проблема — при перерасчете цен не перерасчитывались цены на саму номенклатуру, только на ее характеристики. А у клиента цены на номенклатуру без характеристики выгружаются на сайт.
Анализ показал, что проблема в тексте запроса в модуле ЦенообразованиеСервер.РасчетДинамическихЦенПоФормуле:

Сделал простое расширение для этого модуля, которое поправляет текст запроса, заменяя «РассчитываемыеЗаписи.Номенклатура.ПроверятьЗаполнениеХарактеристики» на «ЛОЖЬ«.
Получается вот такой запрос:

&После("ДополнитьЗапросПоОчередиРасчетаЗнакСравненияПериода") Процедура дор_ДополнитьЗапросПоОчередиРасчетаЗнакСравненияПериода(Запрос, ПараметрыРасчета) //Отключаем контроль признака ПроверятьЗаполнениеХарактеристики Запрос.Текст = СтрЗаменить(Запрос.Текст, "РассчитываемыеЗаписи.Номенклатура.ПроверятьЗаполнениеХарактеристики", "ЛОЖЬ"); КонецПроцедуры
UPD 2026.08.12: после внедрения на рабочей базе вскрылся нюанс — записи без характеристик зависали в очереди расчета цен, в журнале регистрации появлялась ошибка с событием РасчетОчередиЦен, текст:
Ошибка расчета цен из очереди.
Ошибка при вызове метода контекста (Записать)
{РегистрСведений.ЦеныНоменклатуры.МодульНабораЗаписей(65)}:ВызватьИсключение РезультатПодготовки.ПричинаОтказа;
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(4994)}:ЦеныНоменклатуры.Записать(Истина);
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(6387)}:ЗаписатьЦеныИОчиститьОчередьЦенПоследовательно(ПериодЗаписи, ВидЦенРасчетный, НомерОчередиЦен,
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(6090)}:ЗаписатьЦеныИОчиститьОчередьЦен(ПериодЗаписи, ВидЦенРасчетный, НомерОчередиЦен, ЗаписиРегистраЗаПериода, ДокументУстановки);
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(6355)}:РасчетДинамическихЦенПоФормуле(ПараметрыРасчета, ЦеныРассчитаны, ОписаниеОшибки, Истина);
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(7315)}:РассчитатьЦеныИзОчередиЦен();
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(7306)}:ОчередьРасчетаЦенСтартИтерации();
{ВнешняяОбработка.ПерерасчетЦенУНФ.МодульОбъекта(47)}:ЦенообразованиеСервер.ОчередьРасчетаЦен();
{ВнешняяОбработка.ПерерасчетЦенУНФ.МодульОбъекта(33)}:ВыполнитьКодНаСервере();
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(2218)}:ВнешнийОбъект.ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды);
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(2283)}:ВыполнитьКомандуДополнительногоОтчетаИлиОбработки(
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(374)}:РезультатВыполнения = ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, АдресРезультата);
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(1949)}:ВыполнитьКоманду(Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды", ВнешняяОбработка, ИдентификаторКоманды), Неопределено);
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
Нельзя записать цену для номенклатуры "******" установлено обязательное заполнение характеристик
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ИсключениеВызванноеИзВстроенногоЯзыка]
Причина в модуле набора записей регистра сведений ЦеныНоменклатуры:

Пришлось поставить на него заплатку:
&Вместо("ПодготовитьНаборДляЗаписи") Функция дор_ПодготовитьНаборДляЗаписи(НаборЗаписей) Результат = ПродолжитьВызов(НаборЗаписей); Если Найти(Результат.ПричинаОтказа, "установлено обязательное заполнение характеристик") <> 0 Тогда Результат.Отказ = ложь; Результат.ПричинаОтказа = ""; КонецЕсли; Возврат Результат; КонецФункции
Правда, чтобы цены пересчитались, пришлось сбросить поле КоличествоПопытокСлужебный у вида цены, иначе она не перерасчитывалась:

Среда: УНФ 3.0.12.261 Объем: 1 час.




Свежие комментарии