gifts2017

Размеры товара в розничной торговле обувью

Опубликовал Антон Савин (Sav_Ant) в раздел Программирование - Практика программирования

Пример решения проблемы, возникающей в тех случаях, когда товар покупается коробками, а учет ведется в парах.

   В моем случае используется учет по характеристикам, где характеристика - размер обуви. Закупка у поставщика происходит в коробках. На начальных этапах учета нам приходилось вручную разбивать товар по парам. 

   Работа оказалась очень трудоемкой. Решение было следующее: создали два справочника "раскладка" и "размерный ряд"(чтобы все правильно работало, необходимо, чтобы в характеристике был только размер (например 35)). В справочник "размерный ряд" из прайса поставщика будем заполнять размеры, находящиеся в коробке (например 35-36-37-38-39-40), а в справочнике "раскладка" раскладки этих размеров (например 1-2-2-2-2-1). Далее создаем аналогичные реквизиты номенклатуры, и привязываем их к справочникам соответственно.

   Как заполнять номенклатуру, я объяснять не буду, существует множество способов, в нашей фирме это делается при помощи собственной обработки, заточенной под наши специфики.   

  После того как справочники созданы и реквизиты номенклатуры заполнены, нам необходимо в форме документа Поступление товаров и услуг (мы выбрали поступление, так как при распределении заказа становится проблематично создавать на основании его поступление) создать кнопку, которая будет выполнять команду "РаскладкаКлиент". А в модуль добавить следующие строки:

&НаКлиенте
Процедура РаскладкаКлиент(Команда)
	
	ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
	Для каждого Строка Из ВыделенныеСтроки Цикл
        ТС = Объект.Товары.НайтиПоИдентификатору(Строка);
		
		Наименование = ТС.Номенклатура;//Получаем номенклатуру
		Цена = ТС.Цена;//Получаем цену
		Раскладка = ПоискРаскладки(Наименование);//Получаем раскладку 
		Размер = ПоискРазмеров(Наименование);//Получаем список размеров
	
		//Удаляем разделители и считаем количество
		Раскладка = СтрЗаменить(Раскладка,"-","");
		Размер = СтрЗаменить(Размер,"-","");
		РаскладкаДлина = СтрДлина(Раскладка);
		РазмерДлина = СтрДлина(Размер);
		Сумма=0;
	
		//Разбиваем раскладку в массив
		мРаскладка=новый Массив();
		Для Счетчик = 1 по РаскладкаДлина Цикл 	
			мРаскладка.Добавить(Сред(Раскладка,Счетчик,1));
			Сумма=Число(мРаскладка.Получить(Счетчик-1))+Сумма;
		КонецЦикла;
		//Разбиваем размеры в массив
		мРазмеры=новый Массив();
		Для Счетчик = 1 по РазмерДлина Цикл 	
			мРазмеры.Добавить(Сред(Размер,Счетчик,2));
			Счетчик = Счетчик+1;
		КонецЦикла;
	
		Если ТС.Количество=Сумма Тогда	
		
			//Создаем новые строки
			Объект.Товары.Удалить(ТС);
			Для Счетчик = 1 по РаскладкаДлина Цикл
				НоваяСтрока= Объект.Товары.Добавить();
				НоваяСтрока.Номенклатура= Наименование;     
				НоваяСтрока.Цена = Цена;
				НоваяСтрока.КоличествоУпаковок = мРаскладка.Получить(Счетчик-1);
				НоваяСтрока.Характеристика = ПоискХарактеристики(мРазмеры.Получить(Счетчик-1));
		
				//Обновляем данные
				СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруПересчетаСуммыНДСВСтрокеТЧ(Объект);
				СтруктураДействий = Новый Структура;
				СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", НоваяСтрока.Характеристика);
				СтруктураДействий.Вставить("ПроверитьЗаполнитьСклад", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияСкладаВСтрокеТЧ(Объект, СкладГруппа));
				СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
				СтруктураДействий.Вставить("ЗаполнитьЦенуЗакупки", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныЗакупкиВСтрокеТЧ(Объект));
				СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", Объект.НалогообложениеНДС);
				СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
				СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
				СтруктураДействий.Вставить("ПересчитатьСумму");
				СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Истина));
				СтруктураДействий.Вставить("ОчиститьСуммуВзаиморасчетов");
				СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
				ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, КэшированныеЗначения);
				РассчитатьИтоговыеПоказателиПоступления(ЭтаФорма);
				ОбновитьЗависимыеРеквизитыФормы();
			КонецЦикла;
		Иначе
				Сообщить("Неверное количество")
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПоискРаскладки(ФормальныйПараметр)Экспорт
	Товар = Справочники.Номенклатура.НайтиПоНаименованию(ФормальныйПараметр,Истина);	
	Раскладка = Товар.Раскладка;
	Возврат Раскладка;
КонецФункции

&НаСервереБезКонтекста
Функция ПоискРазмеров(ФормальныйПараметр)Экспорт
	Товар = Справочники.Номенклатура.НайтиПоНаименованию(ФормальныйПараметр,Истина);	
	Размер = Товар.РазмерныйРяд;
	Возврат Размер;
КонецФункции

&НаСервереБезКонтекста
Функция ПоискХарактеристики(ФормальныйПараметр)Экспорт
	Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ФормальныйПараметр,Истина);	
	Возврат Характеристика;
КонецФункции

Теперь при нажатии на эту кнопку выделенные позиции будут разбиваться на размеры (если в позиции более одной коробки одинаковой номенклатуры, то необходимо их разложить, то есть если у нас позиции обувь-3 коробки по 10 пар, то необходимо разложить позицию обувь - 30 пар на три позиции Обувь -10 пар.).

Надеюсь, кому-нибудь помог или натолкнул на идею)))

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. DAnry (DAnry) 08.10.14 14:38
Интересное решение специфической задачи. Акуратно оформлен код.
2. Антон Савин (Sav_Ant) 08.10.14 17:33
(1) DAnry, Даже странно, это моя первая работа)))))
3. Тактик 1С (Taktic) 10.10.14 09:05
В УТ 10.3 я использовал характеристики и документ комплектация.
4. Антон Савин (Sav_Ant) 10.10.14 11:59
(3) Taktic, Если бы проблема стояла в том что нам продают 1 кор., а надо сделать 10 пар, то необходима разукомплектация. Но нам продают пару без характеристик. То есть "обувь (20-25)" = 10 пар. А тут разукомлектация не самый удобный вариант.
5. Андрей Старченко (dr.death) 14.10.14 06:25
Я создал документ "Размерная сетка" в таб части которой та самая раскладка И по кнопочке создаю характеристики (если еще нет таких) и док. прихода
Прикрепленные файлы:
6. John Smith (PiccaHut001) 17.10.14 18:48
Интересное решение. Но не полное. Что делать, если в коробке 11 ботинок? И все разного размера? Разного цвета? А некоторые, и не ботинки даже, а шлёпки или дамские сандалии? Нужен регистр сведений замен, чтобы заменять весь пересорт одной предопределённой номенклатурой. назвать её можна как угодно, например "неликвид".
kostyaomsk; Созинов; +2 Ответить 2
7. Сергей Созинов (Созинов) 17.10.14 22:14
(6) PiccaHut001, соглашусь что решение частичное. Если менеджеры захотят видеть разбивку по цветам - придется усложнять. Но думаю можно допилить.
8. Антон Савин (Sav_Ant) 20.10.14 19:29
(7) Созинов, в нашем случае ведется учет как по цветам так и по фасону (как реквизиты номенклатуры), но когда ты берешь упаковку товара "сапоги черные женские" 12 шт, то как там может оказаться сиреневый сандаль?)))))
9. Антон Савин (Sav_Ant) 20.10.14 19:31
(6) PiccaHut001, разумеется они будут разного размера, для этого и используется размерный ряд показывающий границы этих размеров. А вот разные цвета это перебор, такого не встречал.
10. Антон Савин (Sav_Ant) 20.10.14 19:32
обычно один артикул это один фасон/цвет/пол/сезон/материалы, когда ты берешь упаковку этого артикула, то сложно ожидать увидеть там нечто иное))))
11. voskspb spb (voskspb) 07.12.14 17:31
Добрый день. Подскажите (лучше в личку), как правильно в модуль добавить ваш программный код? Подробнее если можно, Спасибо.
12. Антон Савин (Sav_Ant) 28.07.15 12:14
Провернул подобный алгоритм, но на дополнительных реквизитах, вместо справочников. Если кому интересно, опишу подробнее.