Варианты комплектации номенклатуры / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Функция формирует таблицу комплектующих номенклатуры.
//
// Параметры:
//  ВариантКомплектации	 - СправочникСсылка.ВариантыКомплектацииНоменклатуры - ссылка на вариант комплектации.
//  Упаковка			 - СправочникСсылка.УпаковкиЕдиницыИзмерения		 - ссылка на справочник упаковки или неопределено.
//  Количество			 - Число											 - число, количество комплектов.
// 
// Возвращаемое значение:
//  ТаблицаЗначений - таблица комплектующих.
//
Функция ПолучитьКомплектующиеНоменклатуры(ВариантКомплектации, Упаковка = Неопределено, Количество = 1) Экспорт

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

КонецФункции

// Функция возвращает основной вариант комплектации.
//
// Параметры:
//  Номенклатура		 - СправочникСсылка.Номенклатура - 
//  Характеристика		 - СправочникСсылка.ХарактеристикиНоменклатуры - 
// 
// Возвращаемое значение:
//  СправочникСсылка.ВариантыКомплектацииНоменклатуры - на основной вариант комплектации.
//
Функция ПолучитьОсновнуюКомплектацию(Номенклатура, Характеристика) Экспорт

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

	Возврат Результат;

КонецФункции

// Функция формирует массив реквизитов для блокировки редактирования
// 
// Возвращаемое значение:
//  Массив - имена блокируемых реквизитов.
//
Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт

	Результат = Новый Массив;
	Результат.Добавить("Характеристика");
	Результат.Добавить("Товары;ТоварыУстановитьОсновнымКомпонентом,ТоварыУстановитьОсновнымКомпонентомКонтекст,ТоварыЗаполнить");
	Результат.Добавить("КоличествоУпаковок");
	Результат.Добавить("Упаковка");
	Результат.Добавить("ВариантПредставленияНабораВПечатныхФормах");
	Результат.Добавить("ВариантЗаданияЦены; ВариантЗаданияЦены, ВариантЗаданияЦеныНазначаетсяНаНабор");
	Результат.Добавить("ВариантРаспределенияЦены");
	
	Возврат Результат;

КонецФункции

// Функция проверяет принадлежность варианта комплектации номенклатуре\характеристике,
//  и подбирает основной вариант.
//
// Параметры:
//  ВариантКомплектации	 - СправочникСсылка.ВариантыКомплектацииНоменклатуры - 
//  Номенклатура		 - СправочникСсылка.Номенклатура - 
//  Характеристика		 - СправочникСсылка.ХарактеристикиНоменклатуры - 
// 
// Возвращаемое значение:
//  Структура - содержит следующие ключи:
//    * ПринадлежитНоменклатуреХарактеристике - Булево -
//    * ОсновнойВариантКомплектации          - СправочникСсылка.ВариантыКомплектацииНоменклатуры - 
//
Функция ПроверитьПринадлежностьВариантаКомплектации(ВариантКомплектации, Номенклатура, Характеристика) Экспорт

	ТекстЗапроса = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	1
	|ИЗ
	|	Справочник.ВариантыКомплектацииНоменклатуры КАК Таблица
	|ГДЕ
	|	Таблица.Ссылка = &ВариантКомплектации
	|	И Таблица.Владелец = &Номенклатура
	|	И Таблица.Характеристика = &Характеристика
	|;
	|///////////////////////////////////////////////////
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	Таблица.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.ВариантыКомплектацииНоменклатуры КАК Таблица
	|ГДЕ
	|	Таблица.Владелец = &Номенклатура
	|	И Таблица.Характеристика = &Характеристика
	|	И Таблица.Основной
	|";
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ВариантКомплектации", ВариантКомплектации);
	Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
	Запрос.УстановитьПараметр("Характеристика", Характеристика);
	МассивРезультатов = Запрос.ВыполнитьПакет();
	
	ПринадлежитНоменклатуреХарактеристике = Не МассивРезультатов[0].Пустой();

	Выборка = МассивРезультатов[1].Выбрать();
	Если Выборка.Следующий() Тогда
		ОсновнойВариантКомплектации = Выборка.Ссылка;
	Иначе
		ОсновнойВариантКомплектации = Справочники.ВариантыКомплектацииНоменклатуры.ПустаяСсылка();
	КонецЕсли;

	Возврат Новый Структура("ПринадлежитНоменклатуреХарактеристике, ОсновнойВариантКомплектации",
					ПринадлежитНоменклатуреХарактеристике,
					ОсновнойВариантКомплектации);
КонецФункции

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

// Обновляет количество комплектующих в табличной части по известному количеству комплектов и варианту комплектации.
//
// Параметры:
//  ТаблицаКомплектующих - ДанныеФормыКоллекция	 - Табличная часть заказа на сборку либо документа "Сборка товаров".
//  КоличествоКомплектов - Число				 - для данного количества комплектов будут получены данные о комплектующих по варианту комплектации.
//  ВариантКомплектации	 - СправочникСсылка.ВариантыКомплектацииНоменклатуры - Вариант комплектации.
//
Процедура ОбновитьКоличествоКомплектующихПоКоличествуКомплектов(ТаблицаКомплектующих, КоличествоКомплектов, ВариантКомплектации) Экспорт

	ТаблицаВариантаКомплектации = ПолучитьКомплектующиеНоменклатуры(ВариантКомплектации, , КоличествоКомплектов);

	ТаблицаВариантаКомплектации.Свернуть("Номенклатура, Характеристика, Упаковка", "Количество, КоличествоУпаковок");
	ТаблицаВариантаКомплектации.Индексы.Добавить("Номенклатура, Характеристика, Упаковка");

	// Определим превышения количества по варианту комплектации относительно документа.
	СтруктураПоиска = Новый Структура("Номенклатура, Характеристика, Упаковка");
	ВГраница = ТаблицаКомплектующих.Количество() - 1;
	Для Счетчик = 0 По ВГраница Цикл

		Индекс = ВГраница - Счетчик;
		СтрокаТЧ = ТаблицаКомплектующих[Индекс];

		ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТЧ);
		СтрокиКомплектующих = ТаблицаВариантаКомплектации.НайтиСтроки(СтруктураПоиска);
		Если СтрокиКомплектующих.Количество() = 0 Тогда //комплектующей нет в варианте комплектации
			Продолжить;
		КонецЕсли;

		Комплектующая = СтрокиКомплектующих[0];
		Если Комплектующая.Количество = 0 Тогда

			ТаблицаКомплектующих.Удалить(Индекс);

		Иначе

			ОстатокПоВарианту = Комплектующая.Количество - СтрокаТЧ.Количество;

			Если ОстатокПоВарианту >= 0 Тогда
				Комплектующая.Количество = ОстатокПоВарианту;
				Комплектующая.КоличествоУпаковок = Комплектующая.КоличествоУпаковок - СтрокаТЧ.КоличествоУпаковок;
			Иначе
				СтрокаТЧ.Количество         = Комплектующая.Количество;
				СтрокаТЧ.КоличествоУпаковок = Комплектующая.КоличествоУпаковок;
				Комплектующая.Количество = 0;
			КонецЕсли;

		КонецЕсли;

	КонецЦикла;

	// Обновим количество в существующих строках.
	Для Каждого СтрокаТЧ Из ТаблицаКомплектующих Цикл

		ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТЧ);
		СтрокиКомплектующих = ТаблицаВариантаКомплектации.НайтиСтроки(СтруктураПоиска);
		Если СтрокиКомплектующих.Количество() = 0 Тогда
			Продолжить;
		КонецЕсли;

		Комплектующая = СтрокиКомплектующих[0];
		Если Комплектующая.Количество > 0 Тогда
			СтрокаТЧ.Количество         = СтрокаТЧ.Количество + Комплектующая.Количество;
			СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + Комплектующая.КоличествоУпаковок;
			Комплектующая.Количество = 0;
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

// Инициализирует параметры проверки корректности комплекта.
//
// Параметры:
//	Объект - СправочникОбъект.ВариантыКомплектацииНоменклатуры,
//				ДанныеФормыСтруктура - вариант комплектации, для которого необходимо получить параметры проверки
//										содержимого.
//
// Возвращаемое значение:
//	Структура - см. УчетПрослеживаемыхТоваровЛокализация.ПараметрыПроверкиКорректностиКомплекта.
//
Функция ПараметрыПроверкиКорректностиКомплекта(Объект) Экспорт
	
	ПараметрыПроверки = УчетПрослеживаемыхТоваровЛокализация.ПараметрыПроверкиКорректностиКомплекта();
	ЗаполнитьЗначенияСвойств(ПараметрыПроверки, Объект);
	
	ПараметрыПроверки.Дата			= ТекущаяДатаСеанса();
	ПараметрыПроверки.Номенклатура	= Объект.Владелец;
	
	Возврат ПараметрыПроверки;
	
КонецФункции

#Область Команды

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.КомандыСозданияНаОсновании
//  Параметры - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.Параметры
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	БизнесПроцессы.Задание.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
	
КонецПроцедуры

#КонецОбласти

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтение
	|ГДЕ ИСТИНА
	|;
	|РазрешитьИзменениеЕслиРазрешеноЧтение
	|ГДЕ
	|	ЗначениеРазрешено(Владелец)";

КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

// СтандартныеПодсистемы.ВерсионированиеОбъектов
// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
// Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

#КонецОбласти

#КонецЕсли

#Область ОбработчикиСобытий

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

#КонецОбласти

Связанные материалы