Остатки подарочных сертификатов в РМК. УНФ 3.0

Клиент столкнулся с тем, что при продаже подарочного сертификата показываются вообще все номера (серии) выбранного подарочного сертификата. Учитывая, что в базе ведутся несколько организаций, показывается очень большой список номеров. Кассиры могут допустить ошибку.

Это происходит потому, что остатки по сериям не учитываются для подарочных сертификатов. Это видно в процедуре ЗаполнитьСписокСерий модуля СерверЛояльностиПоставщикДанныхУНФ:

// Заполняет список серий
//
// Параметры:
//  Результат - Неопределено, ТаблицаЗначений - возвращаемое значение
//  ПараметрыРасчета - - Структура - см. ДесериализоватьПараметрыРасчета().
//
Процедура ЗаполнитьСписокСерий(Результат, ПараметрыРасчета) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	СтруктураСерий = Новый Структура("Номенклатура, Характеристика, Магазин, ЭтоПродажа");
	ЗаполнитьСтруктуруПараметровСерий(ПараметрыРасчета,СтруктураСерий);
	
	СтатусСерииПродан = Ложь;
	Если НЕ СтруктураСерий.ЭтоПродажа Тогда
		СтатусСерииПродан = Истина;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	СерииНоменклатурыОстатки.Серия КАК Серия
	|ПОМЕСТИТЬ втОстаткиСерий
	|ИЗ
	|	РегистрНакопления.СерииНоменклатуры.Остатки(
	|			&ТекущаяДата,
	|			Номенклатура = &Номенклатура
	|				И СтруктурнаяЕдиница = &ТорговыйОбъект
	|				И Характеристика = &Характеристика) КАК СерииНоменклатурыОстатки
	|ГДЕ
	|	СерииНоменклатурыОстатки.КоличествоОстаток > 0
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СерииНоменклатуры.Ссылка КАК Серия,
	|	СерииНоменклатуры.Наименование КАК Наименование
	|ИЗ
	|	Справочник.СерииНоменклатуры КАК СерииНоменклатуры
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
	|			ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПолитикаУчетаСерий КАК втПолитикаУчетаСерий
	|			ПО Номенклатура.ПолитикаУчетаСерий = втПолитикаУчетаСерий.Ссылка
	|		ПО СерииНоменклатуры.Владелец = Номенклатура.Ссылка
	|ГДЕ
	|	НЕ СерииНоменклатуры.ПометкаУдаления
	|	И ВЫБОР
	|			КОГДА СерииНоменклатуры.ГоденДо = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
	|				ТОГДА ИСТИНА
	|			ИНАЧЕ СерииНоменклатуры.ГоденДо > &ТекущаяДата
	|		КОНЕЦ
	|	И ВЫБОР
	|			КОГДА Номенклатура.ИспользоватьУникальныеСерии
	|				ТОГДА СерииНоменклатуры.Продан = &СтатусСерииПродан
	|			ИНАЧЕ ИСТИНА
	|		КОНЕЦ
	|	И ВЫБОР
	|			КОГДА Номенклатура.ТипНоменклатуры = &Запас
	|					И НЕ СерииНоменклатуры.Продан
	|					И НЕ втПолитикаУчетаСерий.ТипПолитики = &ПолитикаУчетаСерий
	|				ТОГДА СерииНоменклатуры.Ссылка В
	|						(ВЫБРАТЬ
	|							втОстаткиСерий.Серия
	|						ИЗ
	|							втОстаткиСерий КАК втОстаткиСерий)
	|			ИНАЧЕ Номенклатура.Ссылка = &Номенклатура
	|		КОНЕЦ";
	Запрос.УстановитьПараметр("Номенклатура", СтруктураСерий.Номенклатура);
	Запрос.УстановитьПараметр("Характеристика", СтруктураСерий.Характеристика);
	Запрос.УстановитьПараметр("ТорговыйОбъект", СтруктураСерий.Магазин);
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
	Запрос.УстановитьПараметр("Запас", Перечисления.ТипыНоменклатуры.Запас);
	Запрос.УстановитьПараметр("СтатусСерииПродан", СтатусСерииПродан);
	Запрос.УстановитьПараметр("ПолитикаУчетаСерий", Перечисления.ТипыПолитикУказанияСерий.СправочноеУказаниеСерий);
	
	РезультатЗапроса = Запрос.Выполнить();
	Если НЕ РезультатЗапроса.Пустой() Тогда
		Выборка = РезультатЗапроса.Выбрать();
		Пока Выборка.Следующий() Цикл
			НоваяСтрока = Результат.Добавить();
			НоваяСтрока.СерияПредставление = Выборка.Наименование;
			НоваяСтрока.ИдентификаторСерий = Строка(Выборка.Серия.УникальныйИдентификатор());
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

Остатки используются только для ТипаНоменклатуры Запас.

Более того, серии по подарочным сертификатам не проходят по регистру СерииНоменклатуры, они делают движения только по оборотному регистру накопления ДвиженияСерииНоменклатуры, в котором не учитываются остатки.

Пришлось написать собственный запрос по регистру ДвиженияСерииНоменклатуры, чтобы определять серии на остатке:

&После("ЗаполнитьСписокСерий")
Процедура дор_ЗаполнитьСписокСерий(Результат, ПараметрыРасчета)
	УстановитьПривилегированныйРежим(Истина);
	СтруктураСерий = Новый Структура("Номенклатура, Характеристика, Магазин, ЭтоПродажа");
	ЗаполнитьСтруктуруПараметровСерий(ПараметрыРасчета,СтруктураСерий);
	
	//По подарочным сертификатам только с остатками
	Если СтруктураСерий.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.ПодарочныйСертификат Тогда
		
		Запрос = Новый Запрос;
		//По регистру движения серий приходится считать остаток
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	Т.Серия КАК Серия,
		|	Т.Серия.Наименование КАК Наименование,
		|	СУММА(ВЫБОР
		|			КОГДА Т.Операция = ЗНАЧЕНИЕ(Перечисление.ОперацииСерийНоменклатуры.Приход)
		|				ТОГДА 1
		|			КОГДА Т.Операция = ЗНАЧЕНИЕ(Перечисление.ОперацииСерийНоменклатуры.Возврат)
		|				ТОГДА 1
		|			КОГДА Т.Операция = ЗНАЧЕНИЕ(Перечисление.ОперацииСерийНоменклатуры.Расход)
		|				ТОГДА -1
		|			ИНАЧЕ 0
		|		КОНЕЦ) КАК Остаток
		|ИЗ
		|	РегистрНакопления.ДвиженияСерииНоменклатуры КАК Т
		|ГДЕ
		|	Т.Период <= &ТекущаяДата
		|	И Т.Номенклатура = &Номенклатура
		|	И Т.СтруктурнаяЕдиница = &ТорговыйОбъект
		|	И Т.Характеристика = &Характеристика
		|
		|СГРУППИРОВАТЬ ПО
		|	Т.Серия,
		|	Т.Серия.Наименование
		|
		|ИМЕЮЩИЕ
		|	СУММА(ВЫБОР
		|			КОГДА Т.Операция = ЗНАЧЕНИЕ(Перечисление.ОперацииСерийНоменклатуры.Приход)
		|				ТОГДА 1
		|			КОГДА Т.Операция = ЗНАЧЕНИЕ(Перечисление.ОперацииСерийНоменклатуры.Возврат)
		|				ТОГДА 1
		|			КОГДА Т.Операция = ЗНАЧЕНИЕ(Перечисление.ОперацииСерийНоменклатуры.Расход)
		|				ТОГДА -1
		|			ИНАЧЕ 0
		|		КОНЕЦ) > 0";
		
		Запрос.УстановитьПараметр("Номенклатура", СтруктураСерий.Номенклатура);
		Запрос.УстановитьПараметр("Характеристика", СтруктураСерий.Характеристика);
		Запрос.УстановитьПараметр("ТорговыйОбъект", СтруктураСерий.Магазин);
		Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());

		Результат.Очистить(); //Корректируем для подарочных сертификатов, оставляем только с остатками
		
		РезультатЗапроса = Запрос.Выполнить();
		Если НЕ РезультатЗапроса.Пустой() Тогда
			Выборка = РезультатЗапроса.Выбрать();
			Пока Выборка.Следующий() Цикл    
				НоваяСтрока = Результат.Добавить();
				//Представление все равно игнорируется...
				НоваяСтрока.СерияПредставление = Выборка.Наименование + " (" + Выборка.Остаток + ")";
				НоваяСтрока.ИдентификаторСерий = Строка(Выборка.Серия.УникальныйИдентификатор());
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Но 1С «порадовала» еще раз. Представление серии игнорируется, поэтому вывести остаток в скобочках после названия серии не получилось, как хотелось. Но зато выводятся только те сертификаты, которые есть на остатки. Правда, можно попробовать еще исключить и те, которые проданы, но переделывать не стал.

Еще раз убеждаюсь, что УНФ писали инопланетяне. В УТ 11, например, выводятся остатки подарочных сертификатов.

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

fixin

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

Читайте также:

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

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