Самостоятельная организация подборов в документах

Программирование - Практика программирования

подборы товаров из документа

6
В заметке приводится пример организации подборов в документах.

При написании конфигурации с нуля, я столкнулся с задачей организации подборов в документах. Все что я накопал по этому вопросу, сводилось либо к совсем простеньким подборам, в рамках задачи по управляемым формам на экзамене на Спеца по платформе, что было недостаточно, либо к сложным обработкам, обширный функционал которых был явно избыточен для моей задачи. В итоге, посидев и немного подумав, я сделал свой вариант, который, не претендуя ни на что особенное,  устроил меня в рамках выполняемой задачи. Может, кому-то пригодится и сэкономит время.

В МодулеФормы документа из которого осуществляется подбор разместил две процедуры:

&НаКлиенте
Процедура Подобрать(Команда)
		
	 //Проверка заполнение ревизитов ВидЦены и Склад
	Если НЕ ЗначениеЗаполнено(Объект.ВидЦены) Тогда
		Предупреждение("Заполните Вид цены!");	
	ИначеЕсли НЕ ЗначениеЗаполнено(Объект.Склад) Тогда
		Предупреждение("Заполните Склад!");
	Иначе
		//Создадим и заполним структуру передаваемых параметров
		ПараметрыОтбора = Новый Структура;
		ПараметрыОтбора.Вставить("ВидЦены", Объект.ВидЦены);
		ПараметрыОтбора.Вставить("Склад",Объект.Склад);
		
	Если РасчетыНаСервере.ЗначениеКонстанты() = Истина Тогда	
		//Откроем форму подбора справочника Номенклатура
		ФормаПодбора = ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбораСХарактеристиками", ПараметрыОтбора, Элементы.Товары);
	Иначе
		 ФормаПодбора = ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбораТовБезХарактеристик", ПараметрыОтбора, Элементы.Товары);
	КонецЕсли;
	
	КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура ТоварыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Для Каждого СтрокаТЧ из ВыбранноеЗначение Цикл
		ТекСтрока = Объект.Товары.Добавить();
		ТекСтрока.Номенклатура = СтрокаТЧ.Номенклатура;
		
	Если РасчетыНаСервере.ЗначениеКонстанты() = Истина Тогда
		ТекСтрока.Характеристика = СтрокаТЧ.Характеристика;
	Иначе
		 ТекСтрока.Характеристика = "";
	КонецЕсли;
	
		ТекСтрока.Количество =  СтрокаТЧ.Количество;
		ДанныеСтруктура = Новый Структура("СтавкаНДС, ВидНоменклатуры, ЕденицаИзмерения",,,,);
		Структура =  РасчетыНаСервере.ПолучитьДанныеНоменклатуры(ДанныеСтруктура, ТекСтрока.Номенклатура);
		ТекСтрока.СтавкаНДС = Структура.СтавкаНДС;
		ТекСтрока.ВидНоменклатуры = Структура.ВидНоменклатуры;
		ТекСтрока.ЕденицаИзмерения = Структура.ЕденицаИзмерения;
		
		РасчетыНаКлиенте.ОбработкаЦены(ТекСтрока, ТекСтрока.Характеристика, Объект);
		
		РасчетыНаКлиенте.ПересчитатьСтроку(ТекСтрока, Объект);
	КонецЦикла;
	
КонецПроцедуры

Создал ФормуПодбора, в ней разместил реквизиты формы ИерархияНоменклатуры(ДинамическийСписок:  Основная таблица - СправочникНоменклатура), Список(ТаблицаЗначений ) и ОтобранныеТовары(ТаблицаЗначений)  в модуле формы разместил несколько процедур

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)//Выбор номенклатуры кликом
	ТекСтрока = Элементы.Список.ТекущиеДанные;
	
	Структура = Новый Структура("Номенклатура, Характеристика, Цена", ТекСтрока.Номенклатура,ТекСтрока.Характеристика, ТекСтрока.Цена);
	  		
	СтандартнаяОбработка = ЛОЖЬ;
	//Поиск идентичной номенклатуры в ТаблицеЗначений	
	Строка = ОтобранныеТовары.НайтиСтроки(Новый Структура("Номенклатура, Характеристика, Цена", Структура.Номенклатура, Структура.Характеристика, Структура.Цена));	
	//Если Номенклатура уже записана то просто добавляем 1 к Количеству
	Если Строка.Количество() > 0 Тогда
	     Строка[0].Количество = Строка[0].Количество+1;
		 Строка[0].Сумма = Строка[0].Количество * Строка[0].Цена;
    Иначе//Создаем новый элемент
		 НовСтр = ОтобранныеТовары.Добавить();	
		 НовСтр.Номенклатура = ТекСтрока.Номенклатура;
		 НовСтр.Характеристика = ТекСтрока.Характеристика;
		 НовСтр.Количество = 1;
		 НовСтр.Цена = ТекСтрока.Цена;
		 НовСтр.Сумма = ТекСтрока.Цена;
	КонецЕсли; 
КонецПроцедуры


&НаКлиенте
Процедура СписокНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)//Выбор номенклатуры перетаскиванием	
	ТекСтрока = Элементы.Список.ТекущиеДанные;
	
	Структура = Новый Структура("Номенклатура, Характеристика, Цена", ТекСтрока.Номенклатура,ТекСтрока.Характеристика, ТекСтрока.Цена);
	  		
	СтандартнаяОбработка = ЛОЖЬ;
	//Поиск идентичной номенклатуры в ТаблицеЗначений	
	Строка = ОтобранныеТовары.НайтиСтроки(Новый Структура("Номенклатура, Характеристика", Структура.Номенклатура, Структура.Характеристика));	
	//Если Номенклатура уже записана то просто добавляем 1 к Количеству
	Если Строка.Количество() > 0 Тогда
	     Строка[0].Количество = Строка[0].Количество+1;
		 Строка[0].Сумма = Строка[0].Количество * Строка[0].Цена;
    Иначе//Создаем новый элемент
		 НовСтр = ОтобранныеТовары.Добавить();	
		 НовСтр.Номенклатура = ТекСтрока.Номенклатура;
		 НовСтр.Характеристика = ТекСтрока.Характеристика;
		 НовСтр.Количество = 1;
		 НовСтр.Цена = ТекСтрока.Цена;
		 НовСтр.Сумма = ТекСтрока.Цена;
	КонецЕсли; 
КонецПроцедуры


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)//Параметры передаваемые из Документа для запроса
	 ВидЦены = Параметры.ВидЦены;
	 Склад =Параметры.Склад;
	 Дата = Параметры.Дата;
КонецПроцедуры

&НаКлиенте
Процедура ПеренестиВДокумент(Команда)
	ОповеститьОВыборе(ОтобранныеТовары);
КонецПроцедуры



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


&НаКлиенте
Процедура ИерархияНоменклатурыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Родитель = Элементы.ИерархияНоменклатуры.ТекущаяСтрока;
	ЗаполнитьСписокНаСервере(Родитель);
КонецПроцедуры


Вот собственно и все. 

6

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. CheBurator 3569 14.11.18 04:12 Сейчас в теме
Категорически форма похожа на форму подбора из ТиС 77
3. srub 6 14.11.18 09:29 Сейчас в теме
(1)
Хотите верьте хотите нет, но я не видел ранее этой формы, и решал эту задачу самостоятельно применительно к своей самописной конфигурации. Данная архитектура была выбрана мной чтобы сохранить иерархию с Справочнике Номенклатура, так как использование характеристик сильно затруднило процесс. Я посмотрел как это устроено в Рознице и взял оттуда идею использовать ТаблицуЗначений Иерархия Номенклатуры, дальше все это чисто моя самодеятельность так как в типовой все очень сложно и много того что мне было просто не нужно. Так что это самостоятельное решение не содранное у кого, которое можно критиковать за какие то косяки, но оно меня устраивает применительно к решаемой задаче. Я выложил это здесь чтобы сэкономить кому то нужное время. И отнюдь не всегда внешнее сходство, подразумевает сходство реализации решения))) Вы сравните код, если у Вас есть код той обработки и тогда говорите о сходстве.
4. CheBurator 3569 14.11.18 23:25 Сейчас в теме
да я, вообще-то, и не ругаюсь...
5. srub 6 15.11.18 09:30 Сейчас в теме
(4)
Вас понял)) Есть какие то общие решения удобные для пользователя и такое расположение полей мне показалось очень удобным.))
Оставьте свое сообщение