В моем случае используется учет по характеристикам, где характеристика - размер обуви. Закупка у поставщика происходит в коробках. На начальных этапах учета нам приходилось вручную разбивать товар по парам.
Работа оказалась очень трудоемкой. Решение было следующее: создали два справочника "раскладка" и "размерный ряд"(чтобы все правильно работало, необходимо, чтобы в характеристике был только размер (например 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 пар.).
Надеюсь, кому-нибудь помог или натолкнул на идею)))
Уже после написания всего, руководством было принято решение перейти на допреквизиты. Код был исправлен, если кому интересно, готов описать.