Нюанс с расчетом цен без характеристик в УНФ

У клиента возникла проблема — при перерасчете цен не перерасчитывались цены на саму номенклатуру, только на ее характеристики. А у клиента цены на номенклатуру без характеристики выгружаются на сайт.

Анализ показал, что проблема в тексте запроса в модуле ЦенообразованиеСервер.РасчетДинамическихЦенПоФормуле:

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

Получается вот такой запрос:

&После("ДополнитьЗапросПоОчередиРасчетаЗнакСравненияПериода")
Процедура дор_ДополнитьЗапросПоОчередиРасчетаЗнакСравненияПериода(Запрос, ПараметрыРасчета)                              
	//Отключаем контроль признака ПроверятьЗаполнениеХарактеристики
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "РассчитываемыеЗаписи.Номенклатура.ПроверятьЗаполнениеХарактеристики", "ЛОЖЬ");
КонецПроцедуры

UPD 2026.08.12: после внедрения на рабочей базе вскрылся нюанс — записи без характеристик зависали в очереди расчета цен, в журнале регистрации появлялась ошибка с событием РасчетОчередиЦен, текст:

Ошибка расчета цен из очереди.
Ошибка при вызове метода контекста (Записать)
{РегистрСведений.ЦеныНоменклатуры.МодульНабораЗаписей(65)}:ВызватьИсключение РезультатПодготовки.ПричинаОтказа;
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(4994)}:ЦеныНоменклатуры.Записать(Истина);
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(6387)}:ЗаписатьЦеныИОчиститьОчередьЦенПоследовательно(ПериодЗаписи, ВидЦенРасчетный, НомерОчередиЦен,
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(6090)}:ЗаписатьЦеныИОчиститьОчередьЦен(ПериодЗаписи, ВидЦенРасчетный, НомерОчередиЦен, ЗаписиРегистраЗаПериода, ДокументУстановки);
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(6355)}:РасчетДинамическихЦенПоФормуле(ПараметрыРасчета, ЦеныРассчитаны, ОписаниеОшибки, Истина);
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(7315)}:РассчитатьЦеныИзОчередиЦен();
{ОбщийМодуль.ЦенообразованиеСервер.Модуль(7306)}:ОчередьРасчетаЦенСтартИтерации();
{ВнешняяОбработка.ПерерасчетЦенУНФ.МодульОбъекта(47)}:ЦенообразованиеСервер.ОчередьРасчетаЦен();
{ВнешняяОбработка.ПерерасчетЦенУНФ.МодульОбъекта(33)}:ВыполнитьКодНаСервере();
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(2218)}:ВнешнийОбъект.ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды);
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(2283)}:ВыполнитьКомандуДополнительногоОтчетаИлиОбработки(
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(374)}:РезультатВыполнения = ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, АдресРезультата);
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(1949)}:ВыполнитьКоманду(Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды", ВнешняяОбработка, ИдентификаторКоманды), Неопределено);

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
Нельзя записать цену для номенклатуры "******" установлено обязательное заполнение характеристик
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ИсключениеВызванноеИзВстроенногоЯзыка]

Причина в модуле набора записей регистра сведений ЦеныНоменклатуры:

Пришлось поставить на него заплатку:

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

Правда, чтобы цены пересчитались, пришлось сбросить поле КоличествоПопытокСлужебный у вида цены, иначе она не перерасчитывалась:

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

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *