Виды номенклатуры / Модуль объекта

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

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

Процедура ПередЗаписью(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	МетаданныеОбъекта = Метаданные(); // ОбъектМетаданныхСправочник
	
	Если Не ЭтоГруппа Тогда
		
		НаборСвойств              = Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка();
		НаборСвойствХарактеристик = Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка();
		НаборСвойствСерий         = Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка();
		
		ОбъектМетаданныхРеквизит = МетаданныеОбъекта.Реквизиты.ШаблонНаименованияДляПечатиНоменклатуры; // ОбъектМетаданныхРеквизит
		ШаблонНаименованияДляПечатиНоменклатуры = ОбъектМетаданныхРеквизит.ЗначениеЗаполнения;
		ШаблонРабочегоНаименованияНоменклатуры = "";
		ЗапретРедактированияРабочегоНаименованияНоменклатуры = Ложь;
		ЗапретРедактированияНаименованияДляПечатиНоменклатуры = Ложь;
		
		ОбъектМетаданныхРеквизит = МетаданныеОбъекта.Реквизиты.ШаблонНаименованияДляПечатиХарактеристики; // ОбъектМетаданныхРеквизит
		ШаблонНаименованияДляПечатиХарактеристики = ОбъектМетаданныхРеквизит.ЗначениеЗаполнения;
		ШаблонРабочегоНаименованияХарактеристики = "";
		ЗапретРедактированияРабочегоНаименованияХарактеристики = Ложь;
		ЗапретРедактированияНаименованияДляПечатиХарактеристики = Ложь;
		
		ШаблонРабочегоНаименованияСерии = "";
				
		Если ПолучитьФункциональнуюОпцию("ИспользоватьТоварныеКатегории") Тогда
			Если Не ОбъектКопирования.ТоварныеКатегорииОбщиеСДругимВидомНоменклатуры Тогда
				ТоварныеКатегорииОбщиеСДругимВидомНоменклатуры = Истина;
				ВладелецТоварныхКатегорий = ОбъектКопирования.Ссылка;
			КонецЕсли;
		КонецЕсли;
		
		Если ОбъектКопирования.ИспользоватьСерии Тогда
			Если Не ОбъектКопирования.НастройкиСерийБерутсяИзДругогоВидаНоменклатуры Тогда
				НастройкиСерийБерутсяИзДругогоВидаНоменклатуры = Истина;
				ВладелецСерий = ОбъектКопирования.Ссылка;
			КонецЕсли;
		КонецЕсли;
		
		Если ОбъектКопирования.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры Тогда
			ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры;
			ВладелецХарактеристик = ОбъектКопирования.Ссылка;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	Если ЭтоГруппа Тогда
		Возврат;
	КонецЕсли;
		
	МассивНепроверяемыхРеквизитов = Новый Массив;
	Если Не Справочники.ГруппыДоступаНоменклатуры.ИспользуютсяГруппыДоступа()
		ИЛИ Не ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВидовНоменклатуры") Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ГруппаДоступа");
	КонецЕсли;
	
	МассивНепроверяемыхРеквизитов.Добавить("ПолитикиУчетаСерий");
	МассивНепроверяемыхРеквизитов.Добавить("ПолитикиУчетаСерий.Склад");
	МассивНепроверяемыхРеквизитов.Добавить("ПолитикиУчетаСерий.ПолитикаУчетаСерий");
	
	Если ИспользоватьСерии
		И Не НастройкиСерийБерутсяИзДругогоВидаНоменклатуры Тогда
		
		Если Не (ИспользоватьСрокГодностиСерии
			Или ИспользоватьДатуПроизводстваСерии) Тогда
			
			МассивНепроверяемыхРеквизитов.Добавить("ТочностьУказанияСрокаГодностиСерии");
			
		КонецЕсли;
		
		КлючевыеРеквизиты = Новый Массив;
		КлючевыеРеквизиты.Добавить("Склад");
		
		ОбщегоНазначенияУТ.ПроверитьНаличиеДублейСтрокТЧ(ЭтотОбъект, "ПолитикиУчетаСерий", КлючевыеРеквизиты, Отказ,,Ложь);
		
		Если Не Отказ
			И ПолитикаУчетаСерий = Справочники.ПолитикиУчетаСерий.СерииНеИспользуются 
			И ПолитикиУчетаСерий.НайтиСтроки(Новый Структура("ПолитикаУчетаСерий",
															Справочники.ПолитикиУчетаСерий.СерииНеИспользуются)).Количество()
															= ПолитикиУчетаСерий.Количество() Тогда
			ТекстСообщения = НСтр("ru = 'Включено использование серий, но политика учета серий не назначена ни одному складу.'");
			
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,Ссылка,,,Отказ);
		КонецЕсли;
		
		ОписанияИспользованияРеквизитовСерии = Справочники.ВидыНоменклатуры.ОписанияИспользованияРеквизитовСерии();
		
		ЕстьВключеннаяНастройка = Ложь;
		
		Для Каждого ОписаниеРеквизита Из ОписанияИспользованияРеквизитовСерии Цикл
			Если ЭтотОбъект[ОписаниеРеквизита.ИмяНастройки] Тогда
				ЕстьВключеннаяНастройка = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если Не ЕстьВключеннаяНастройка Тогда
			ТекстСообщения = НСтр("ru = 'Включено использование серий, но не настроено, какие реквизиты серии будут использоваться. Необходимо выключить использование хотя бы одного реквизита.'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,Ссылка,,,Отказ);
		КонецЕсли;
		
	Иначе
		
		МассивНепроверяемыхРеквизитов.Добавить("ТочностьУказанияСрокаГодностиСерии");
		МассивНепроверяемыхРеквизитов.Добавить("НастройкаИспользованияСерий");
		МассивНепроверяемыхРеквизитов.Добавить("ПолитикаУчетаСерий");
		
	КонецЕсли;
	
	Если Не НастройкиСерийБерутсяИзДругогоВидаНоменклатуры Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ВладелецСерий");
	Иначе
		МассивНепроверяемыхРеквизитов.Добавить("ВладелецСерий");
		Если Не ЗначениеЗаполнено(ВладелецСерий) Тогда
			ТекстСообщения = НСтр("ru = 'Сделана настройка, что серии используются также, как в другом виде номенклатуры, но при этом не выбран этот вид.'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,"ВариантЗаданияНастроекСерий",, Отказ);
		КонецЕсли;
	КонецЕсли;
	
	Если Не ИспользоватьХарактеристики Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ИспользованиеХарактеристик");
		МассивНепроверяемыхРеквизитов.Добавить("ВладелецХарактеристик");
	ИначеЕсли ИспользованиеХарактеристик <> Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ВладелецХарактеристик");
	Иначе
		МассивНепроверяемыхРеквизитов.Добавить("ВладелецХарактеристик");
		Если Не ЗначениеЗаполнено(ВладелецХарактеристик) Тогда
			ТекстСообщения = НСтр("ru = 'Сделана настройка, характеристики общие с другим видом номенклатуры, но при этом не выбран этот вид.'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,"ИспользованиеХарактеристик","Объект", Отказ);
		КонецЕсли;
	КонецЕсли;
	
	Если Не ТоварныеКатегорииОбщиеСДругимВидомНоменклатуры Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ВладелецТоварныхКатегорий");
	Иначе
		МассивНепроверяемыхРеквизитов.Добавить("ВладелецТоварныхКатегорий");
		Если Не ЗначениеЗаполнено(ВладелецТоварныхКатегорий) Тогда
			ТекстСообщения = НСтр("ru = 'Сделана настройка, товарные категории общие с другим видом номенклатуры, но при этом не выбран этот вид.'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,"НастройкаТоварныхКатегорий",, Отказ);
		КонецЕсли;
	КонецЕсли;	
	
	Если Не Справочники.ГруппыДоступаНоменклатуры.ИспользуютсяГруппыДоступа() Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ГруппаДоступа");
	КонецЕсли;
	
	Если Не ИспользоватьУпаковки Тогда
		МассивНепроверяемыхРеквизитов.Добавить("НаборУпаковок");
	КонецЕсли;
	
	Если Не ПоставляетсяВМногооборотнойТаре Тогда
		МассивНепроверяемыхРеквизитов.Добавить("НоменклатураМногооборотнаяТара");
		МассивНепроверяемыхРеквизитов.Добавить("ХарактеристикаМногооборотнаяТара");
	ИначеЕсли Не Справочники.Номенклатура.ХарактеристикиИспользуются(НоменклатураМногооборотнаяТара) Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ХарактеристикаМногооборотнаяТара");
	КонецЕсли;
	
	СтруктураШаблонов = Новый Структура;
	СтруктураШаблонов.Вставить("ШаблонНаименованияДляПечатиНоменклатуры", ШаблонНаименованияДляПечатиНоменклатуры);
	СтруктураШаблонов.Вставить("ШаблонНаименованияДляПечатиХарактеристики", ШаблонНаименованияДляПечатиХарактеристики);
	СтруктураШаблонов.Вставить("ШаблонРабочегоНаименованияНоменклатуры", ШаблонРабочегоНаименованияНоменклатуры);
	СтруктураШаблонов.Вставить("ШаблонРабочегоНаименованияХарактеристики", ШаблонРабочегоНаименованияХарактеристики);
	
	ШаблонТекстаОшибки = НСтр("ru='В формуле шаблона ""%ИмяШаблона%"" обнаружены ошибки'");
	МетаданныеОбъекта = ЭтотОбъект.Метаданные();
	
	Для Каждого Элемент Из СтруктураШаблонов Цикл
		
		Шаблон = Элемент.Значение;
		
		Если ЗначениеЗаполнено(Шаблон) Тогда
			
			ТекстОшибки = СтрЗаменить(
			ШаблонТекстаОшибки,
			"%ИмяШаблона%",
			МетаданныеОбъекта.Реквизиты[Элемент.Ключ].Синоним);
			
			ОжидаемыйТипРезультата = Новый ОписаниеТипов("Строка");
			ОперандыФормулы = РаботаСФормуламиКлиентСервер.ОперандыТекстовойФормулы(Шаблон);
			ПараметрыСообщенийПроверкиФормулы = РаботаСФормулами.ПараметрыПроверкиФормулы();
			ПараметрыСообщенийПроверкиФормулы.Поле = Элемент.Ключ;
			ПараметрыСообщенийПроверкиФормулы.ПутьКДанным = "Объект";
			ПараметрыСообщенийПроверкиФормулы.СообщениеОбОшибке = ТекстОшибки;
			Если Не РаботаСФормулами.ПроверитьФормулу(Шаблон, ОперандыФормулы, ОжидаемыйТипРезультата, ПараметрыСообщенийПроверкиФормулы) Тогда
				Отказ = Истина;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Если НастройкиКлючаЦенПоХарактеристике = Перечисления.ВариантОтбораДляКлючаЦен.ИспользоватьПоРеквизитам 
		И ИспользованиеХарактеристик <> Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры 
		И РеквизитыХарактеристикДляКлючаЦен.Количество() = 0 Тогда
			
			ТекстСообщения = НСтр("ru = 'Включено использование характеристик в ценообразовании по реквизитам, но не выбран ни один реквизит.'");
						
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,Ссылка,,,Отказ);
		
	КонецЕсли;
	
	Если НастройкиКлючаЦенПоСерии = Перечисления.ВариантОтбораДляКлючаЦен.ИспользоватьПоРеквизитам и Не НастройкиСерийБерутсяИзДругогоВидаНоменклатуры Тогда
		Если РеквизитыСерийДляКлючаЦен.Количество() = 0 Тогда			
			
			ТекстСообщения = НСтр("ru = 'Включено использование серий в ценообразовании по реквизитам, но не выбран ни один реквизит.'");
						
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,Ссылка,,,Отказ);
			
		КонецЕсли;
		
	КонецЕсли;
	
	ПроверитьСовпадающиеРеквизитыДляОтбора(Отказ);
	
	НоменклатураЛокализация.ОбработкаПроверкиЗаполненияВидНоменклатуры(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	
	ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
	
КонецПроцедуры

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ЭтоГруппа Тогда
		Возврат;	
	КонецЕсли;
	
	Справочники.ВидыНоменклатуры.ЗаполнитьРеквизитыПоУмолчанию(ЭтотОбъект);
	Справочники.ВидыНоменклатуры.ОтработатьЛогикуСвязиРеквизитов(ЭтотОбъект);	
	
КонецПроцедуры

Процедура ПередУдалением(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Если ЭтоГруппа Тогда
		Возврат;
	КонецЕсли;
	
	УправлениеСвойствами.ПередУдалениемВидаОбъекта(ЭтотОбъект, "НаборСвойств");
	УправлениеСвойствами.ПередУдалениемВидаОбъекта(ЭтотОбъект, "НаборСвойствСерий");
	УправлениеСвойствами.ПередУдалениемВидаОбъекта(ЭтотОбъект, "НаборСвойствХарактеристик");
	
КонецПроцедуры

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

#Область СлужебныеПроцедурыИФункции

Процедура УстановкаРеквизитовИсторииПереходаНаНовыеФормулы()
	
	Если ПустаяСтрока(ШаблонНаименованияДляПечатиНоменклатурыИсторияПереходаНаНовыеФормулы)
		И НЕ ПустаяСтрока(ШаблонНаименованияДляПечатиНоменклатуры) Тогда
		ШаблонНаименованияДляПечатиНоменклатурыИсторияПереходаНаНовыеФормулы = ШаблонНаименованияДляПечатиНоменклатуры;
	КонецЕсли;
	Если ПустаяСтрока(ШаблонНаименованияДляПечатиХарактеристикиИсторияПереходаНаНовыеФормулы)
		И НЕ ПустаяСтрока(ШаблонНаименованияДляПечатиХарактеристики) Тогда
		ШаблонНаименованияДляПечатиХарактеристикиИсторияПереходаНаНовыеФормулы = ШаблонНаименованияДляПечатиХарактеристики;
	КонецЕсли;
	Если ПустаяСтрока(ШаблонРабочегоНаименованияНоменклатурыИсторияПереходаНаНовыеФормулы)
		И НЕ ПустаяСтрока(ШаблонРабочегоНаименованияНоменклатуры) Тогда
		ШаблонРабочегоНаименованияНоменклатурыИсторияПереходаНаНовыеФормулы = ШаблонРабочегоНаименованияНоменклатуры;
	КонецЕсли;
	Если ПустаяСтрока(ШаблонРабочегоНаименованияСерииИсторияПереходаНаНовыеФормулы)
		И НЕ ПустаяСтрока(ШаблонРабочегоНаименованияСерии) Тогда
		ШаблонРабочегоНаименованияСерииИсторияПереходаНаНовыеФормулы = ШаблонРабочегоНаименованияСерии;
	КонецЕсли;
	Если ПустаяСтрока(ШаблонРабочегоНаименованияХарактеристикиИсторияПереходаНаНовыеФормулы)
		И НЕ ПустаяСтрока(ШаблонРабочегоНаименованияХарактеристики) Тогда
		ШаблонРабочегоНаименованияХарактеристикиИсторияПереходаНаНовыеФормулы = ШаблонРабочегоНаименованияХарактеристики;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

			// Остальные поля заполнятся при записи
			ИзменяемыйОбъект.ДополнительныеСвойства.Вставить("ПропуститьЗаполнениеТЧПолитикиУчетаСерий");
			ИзменяемыйОбъект.ДополнительныеСвойства.Вставить("ПропуститьОбновлениеФлагаИспользованияСерий");
			
			ИзменяемыйОбъект.Записать();
			
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

// Проверяет, есть ли совпадающие реквизиты для быстрого отбора номенклатуры и характеристик.
// Если есть, то выводит сообщение пользователю, т.к. не допускается добавлять один и тот же 
// дополнительный реквизит в панель быстрого отбора и для номенклатуры и для характеристик. 
// Если требуется такая настройка, то следует создать два отдельных доп. реквизита 
// и соответственно указать их для номенклатуры и для характеристик.
//
// Например:
//	Марка (для номенклатуры) и Марка (для характеристик).
//
// Параметры:
//	Отказ - Булево, Неопределено - переменная в которую записывается флаг отказа.
//
Процедура ПроверитьСовпадающиеРеквизитыДляОтбора(Отказ)
	
	Если Не ИспользоватьХарактеристики Тогда
		Возврат;
	КонецЕсли;
		
	СовпадающиеРеквизиты = СовпадающиеРеквизитыОтбораНоменклатурыХарактеристик();
	
	Если СовпадающиеРеквизиты.Количество() > 0 Тогда
		
		Отказ = Истина;
		
		Для каждого ПараметрыРеквизита Из СовпадающиеРеквизиты Цикл
			
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Дополнительный реквизит для отбора номенклатуры в строке %1 совпадает с дополнительным реквизитом для отбора характеристик.'"), 
				ПараметрыРеквизита.НомерСтроки);
			
			Поле = "РеквизитыБыстрогоОтбораНоменклатуры[" + Формат(ПараметрыРеквизита.ИндексСтроки, "ЧЦ=10; ЧГ=0") + "].ПредставлениеРеквизита";
			
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , Поле, "Объект");
			
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

#КонецЕсли
#КонецЕсли

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