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

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

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

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

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

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

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

	УстановитьПривилегированныйРежим(Истина);
	
	МассивВидов = Новый Массив;
	
	ДобавитьПредустановленныйВидНоменклатуры(МассивВидов, Перечисления.ТипыНоменклатуры.Товар, НСтр("ru = 'Товар'"));
	ДобавитьПредустановленныйВидНоменклатуры(МассивВидов, Перечисления.ТипыНоменклатуры.Услуга, НСтр("ru = 'Услуга'"));
	
	Возврат МассивВидов;

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

// Добавляет в массив вид номенклатуры с указанным типом.
// Если вида номенклатуры с таким типов нет в ИБ, то он создается.
//
// Параметры:
//	МассивВидов - Массив                              - массив видов номенклатуры,
//	Тип         - ПеречислениеСсылка.ТипыНоменклатуры - тип номенклатуры,
//	Имя         - Строка                              - имя нового вида номенклатуры.
//
Процедура ДобавитьПредустановленныйВидНоменклатуры(МассивВидов, Тип, Имя) Экспорт

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

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

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

// Возвращает значение единицы измерения срока годности по значению точности указания срока годности серии.
//
// Параметры:
//	ТочностьУказанияСрокаГодности - ПеречислениеСсылка.ТочностиУказанияСрокаГодности - Точность указания срока 
//									годности серии вида номенклатуры.
//
// Возвращаемое значение:
//	ПеречислениеСсылка.ЕдиницыИзмеренияВремени - единица измерения срока годности по значению точности указания 
//												срока годности серии.
//
Функция ЕдиницаИзмеренияСрокаГодности(ТочностьУказанияСрокаГодности) Экспорт
	
	ЕдиницаИзмеренияСрокаГодности = Перечисления.ЕдиницыИзмеренияВремени.ПустаяСсылка();
	
	Если ТочностьУказанияСрокаГодности = Перечисления.ТочностиУказанияСрокаГодности.СТочностьюДоМесяцев Тогда
		ЕдиницаИзмеренияСрокаГодности = Перечисления.ЕдиницыИзмеренияВремени.Месяц;
	ИначеЕсли ТочностьУказанияСрокаГодности = Перечисления.ТочностиУказанияСрокаГодности.СТочностьюДоДней Тогда
		ЕдиницаИзмеренияСрокаГодности = Перечисления.ЕдиницыИзмеренияВремени.Сутки;
	ИначеЕсли ТочностьУказанияСрокаГодности = Перечисления.ТочностиУказанияСрокаГодности.СТочностьюДоЧасов Тогда
		ЕдиницаИзмеренияСрокаГодности = Перечисления.ЕдиницыИзмеренияВремени.Час;
	КонецЕсли;
	
	Возврат ЕдиницаИзмеренияСрокаГодности;
	
КонецФункции


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

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

	РеквизитыДляКлючаЦен = Запрос.Выполнить().Выгрузить();
	
	Возврат РеквизитыДляКлючаЦен
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	НоменклатураВызовСервера.ВидыНоменклатурыОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка);
КонецПроцедуры

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

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

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

#Область ОбновлениеИнформационнойБазы

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

//++ Локализация

// см. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления
//
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт

	Обработчик = Обработчики.Добавить();
	Обработчик.Процедура = "Справочники.ВидыНоменклатуры.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Обработчик.Версия = "11.5.23.25";
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.Идентификатор = Новый УникальныйИдентификатор("0bd0e232-2e00-4bef-be9f-49c3b155bffe");
	Обработчик.Многопоточный = Истина;
	Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ВидыНоменклатуры.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
	Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	
	СписокОписаний = Новый Массив;
	СписокОписаний.Добавить(НСтр("ru = 'Обновление справочника ""Виды номенклатуры"":'"));
	СписокОписаний.Добавить(НСтр("ru = '- удаление реквизита ""УдалитьКодОКВЭД2"" из табличной части ""Реквизиты для контроля номенклатуры""';"));
	
	Обработчик.Комментарий = СтрСоединить(СписокОписаний, Символы.ПС);
	Обработчик.Порядок = Перечисления.ПорядокОбработчиковОбновления.Обычный;
	
	Читаемые = Новый Массив;
	Читаемые.Добавить(Метаданные.Справочники.ВидыНоменклатуры.ПолноеИмя());
	Обработчик.ЧитаемыеОбъекты = СтрСоединить(Читаемые, ",");
	
	Изменяемые = Новый Массив;
	Изменяемые.Добавить(Метаданные.Справочники.ВидыНоменклатуры.ПолноеИмя());
	Обработчик.ИзменяемыеОбъекты = СтрСоединить(Изменяемые, ",");
	
	Блокируемые = Новый Массив;
	Блокируемые.Добавить(Метаданные.Справочники.ВидыНоменклатуры.ПолноеИмя());
	Обработчик.БлокируемыеОбъекты = СтрСоединить(Блокируемые, ",");

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

// Параметры:
// 	Параметры - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке
//
Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	ПараметрыВыборки = Параметры.ПараметрыВыборки;
	ПараметрыВыборки.ПолныеИменаОбъектов = ПустаяСсылка().Метаданные().ПолноеИмя();
	ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиСсылки();

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

// Обработчик обновления
// 
// Параметры:
// 	Параметры - См. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляМногопоточнойОбработки 
//
Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	Параметры.ОбработкаЗавершена = Ложь;
	
	ПолноеИмяОбъекта = ПустаяСсылка().Метаданные().ПолноеИмя();
	
	ОбновляемыеДанные = ОбновлениеИнформационнойБазы.ДанныеДляОбновленияВМногопоточномОбработчике(Параметры);
	
	Если ОбновляемыеДанные.Количество() = 0 Тогда
		
		Параметры.ОбработкаЗавершена =
			ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, ПолноеИмяОбъекта);
		Возврат;
		
	КонецЕсли;
	
	ОбъектовОбработано = 0;
	ПроблемныхОбъектов = 0;
	ИсключенияПриОбновлении = Новый Массив;
	
	СписокОписаний = Новый Массив;
	СписокОписаний.Добавить(НСтр("ru = 'Не удалось обработать справочник ""Виды номенклатуры"" по обработчику:'"));
	СписокОписаний.Добавить(НСтр("ru = '- удаление реквизита ""УдалитьКодОКВЭД2"" из табличной части ""Реквизиты для контроля номенклатуры""';"));
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДанныеДляОбновления.Ссылка КАК Ссылка
	|ПОМЕСТИТЬ ТаблицаЭлементов
	|ИЗ
	|	&ДанныеДляОбновления КАК ДанныеДляОбновления
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТаблицаЭлементов.Ссылка КАК Ссылка,
	|	ДанныеСправочника.ВерсияДанных КАК ВерсияДанных,
	|	ЕСТЬNULL(ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыУдалитьКодОКВЭД2.ОтображатьПриСоздании, Ложь) КАК ОтображатьПриСозданииУдалитьКодОКВЭД2,
	|	ЕСТЬNULL(ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыУдалитьКодОКВЭД2.ЗаполнятьОбязательно, Ложь) КАК ЗаполнятьОбязательноУдалитьКодОКВЭД2,
	|	ЕСТЬNULL(ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыУдалитьКодОКВЭД2.Уникален, Ложь) КАК УникаленУдалитьКодОКВЭД2,
	|	ЕСТЬNULL(ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыКодОКВЭД2.ОтображатьПриСоздании, Ложь) КАК ОтображатьПриСозданииКодОКВЭД2,
	|	ЕСТЬNULL(ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыКодОКВЭД2.ЗаполнятьОбязательно, Ложь) КАК ЗаполнятьОбязательноКодОКВЭД2,
	|	ЕСТЬNULL(ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыКодОКВЭД2.Уникален, Ложь) КАК УникаленКодОКВЭД2
	|ИЗ
	|	ТаблицаЭлементов КАК ТаблицаЭлементов
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыНоменклатуры КАК ДанныеСправочника
	|		ПО (ТаблицаЭлементов.Ссылка = ДанныеСправочника.Ссылка)
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыНоменклатуры.РеквизитыДляКонтроляНоменклатуры КАК ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыУдалитьКодОКВЭД2
	|		ПО (ТаблицаЭлементов.Ссылка = ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыУдалитьКодОКВЭД2.Ссылка)
	|			И (ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыУдалитьКодОКВЭД2.ИмяРеквизита = ""УдалитьКодОКВЭД2"")
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыНоменклатуры.РеквизитыДляКонтроляНоменклатуры КАК ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыКодОКВЭД2
	|		ПО (ТаблицаЭлементов.Ссылка = ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыКодОКВЭД2.Ссылка)
	|			И (ВидыНоменклатурыРеквизитыДляКонтроляНоменклатурыКодОКВЭД2.ИмяРеквизита = ""КодОКВЭД2"")
	|";
	
	Запрос.УстановитьПараметр("ДанныеДляОбновления", ОбновляемыеДанные);
	
	Справочник = Запрос.Выполнить().Выбрать();
	
	Пока Справочник.Следующий() Цикл
		
		ПричинаИсключения = 0;
		Рекомендация = "";
		
		НачатьТранзакцию();
		
		Попытка
			
			ПричинаИсключения = 1; // Блокировка
			
			Блокировка = Новый БлокировкаДанных;
			
			ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяОбъекта);
			ЭлементБлокировки.УстановитьЗначение("Ссылка", Справочник.Ссылка);
			ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
			
			Блокировка.Заблокировать();
			
			СправочникОбъект = ОбновлениеИнформационнойБазыУТ.ПроверитьПолучитьОбъект(
				Справочник.Ссылка, Справочник.ВерсияДанных, Параметры.Очередь); // СправочникОбъект
			
			ПричинаИсключения = 2; // ПлохиеДанные
			Рекомендация = НСтр("ru = 'Проверьте данные справочника вручную.'");
			
			ОбъектИзменен = Ложь;
			
			Если СправочникОбъект <> Неопределено Тогда
				
				Если (Не Справочник.ОтображатьПриСозданииКодОКВЭД2
					И Не Справочник.ЗаполнятьОбязательноКодОКВЭД2
					И Не Справочник.УникаленКодОКВЭД2)
					И (Не Справочник.ОтображатьПриСозданииУдалитьКодОКВЭД2
					Или Не Справочник.ЗаполнятьОбязательноУдалитьКодОКВЭД2
					Или Не Справочник.УникаленУдалитьКодОКВЭД2) Тогда
					
					НайденныеСтроки = СправочникОбъект.РеквизитыДляКонтроляНоменклатуры.НайтиСтроки(Новый Структура("ИмяРеквизита", "КодОКВЭД2"));
					Если НайденныеСтроки.Количество() > 0 Тогда
						
						НайденныеСтроки[0].ОтображатьПриСоздании = Справочник.ОтображатьПриСозданииУдалитьКодОКВЭД2;
						НайденныеСтроки[0].ЗаполнятьОбязательно = Справочник.ЗаполнятьОбязательноУдалитьКодОКВЭД2;
						НайденныеСтроки[0].Уникален = Справочник.УникаленУдалитьКодОКВЭД2;
						
					КонецЕсли;
					
				КонецЕсли;
				
				НайденныеСтроки = СправочникОбъект.РеквизитыДляКонтроляНоменклатуры.НайтиСтроки(Новый Структура("ИмяРеквизита", "УдалитьКодОКВЭД2"));
				Если НайденныеСтроки.Количество() > 0 Тогда
					
					СправочникОбъект.РеквизитыДляКонтроляНоменклатуры.Удалить(НайденныеСтроки[0]);
					
				КонецЕсли;
					
				ОбъектИзменен = Истина;
				
			КонецЕсли;
			
			ПричинаИсключения = 3; // Запись
			
			Если ОбъектИзменен Тогда
				ОбновлениеИнформационнойБазы.ЗаписатьДанные(СправочникОбъект);
			Иначе
				ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Справочник.Ссылка);
			КонецЕсли;
			
			ОбъектовОбработано = ОбъектовОбработано + 1;
			ЗафиксироватьТранзакцию();
			
		Исключение
			
			ОтменитьТранзакцию();
			
			ПроблемныхОбъектов = ПроблемныхОбъектов + 1;
			ОбновлениеИнформационнойБазыУТ.СообщитьОНеудачнойОбработке(ИнформацияОбОшибке(), Справочник.Ссылка);
			
			Если ПричинаИсключения = 2 Тогда
				
				ОписаниеПроблемы = ОбновлениеИнформационнойБазыУТ.ПроблемаСДанными(
					Справочник.Ссылка, Рекомендация, ИнформацияОбОшибке());
				ИсключенияПриОбновлении.Добавить(ОписаниеПроблемы);
				
			ИначеЕсли ПричинаИсключения = 3 Тогда
				
				ОбновлениеИнформационнойБазыУТ.ЗаписатьПлохиеДанные(
					ИсключенияПриОбновлении, ОбъектовОбработано, Параметры);
				ВызватьИсключение СтрСоединить(СписокОписаний, Символы.ПС);
				
			КонецЕсли;
			
		КонецПопытки;
		
	КонецЦикла;
	
	Параметры.ОбработкаЗавершена =
		ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, ПолноеИмяОбъекта);
	
КонецПроцедуры

//-- Локализация

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

#Область Прочее

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

	КонтролироватьДублиНоменклатуры = ВидНоменклатуры.РеквизитыДляКонтроляНоменклатуры.НайтиСтроки(Новый Структура("Уникален", Истина)).Количество() > 0;
		
КонецПроцедуры

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

	УстановитьРеквизитыЦенообразованияПоУмолчанию(ВидНоменклатуры);

	НоменклатураЛокализация.ЗаполнитьРеквизитыВидаНоменклатурыПоУмолчанию(ВидНоменклатуры);
	
КонецПроцедуры

Функция ЗначенияРеквизитовСтрогоЗаполняемыеПоОсобенностямУчета() Экспорт
	
	ЗначенияРеквизитовСтрогоЗаполняемыеПоОсобенностямУчета = Новый Соответствие;
	
	НоменклатураЛокализация.ЗначенияРеквизитовСтрогоЗаполняемыеПоОсобенностямУчета(ЗначенияРеквизитовСтрогоЗаполняемыеПоОсобенностямУчета);
	
	Возврат ЗначенияРеквизитовСтрогоЗаполняемыеПоОсобенностямУчета;
	
КонецФункции

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

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

Функция ОписанияИспользованияРеквизитовСерии(НастройкиИспользованияСерий = Неопределено, ПараметрыУказанияСерий = Неопределено, ЗначенияПолейСвязи = Неопределено) Экспорт

	ОписанияИспользованияРеквизитовСерии = Новый Массив;
	
	Если НастройкиИспользованияСерий = Неопределено Тогда
		НастройкиИспользованияСерий = НастройкиИспользованияСерийСоставПолей(Истина);
	Иначе
		ФорматнаяСтрокаСрокаГодности = "";
	КонецЕсли;
	
	ФорматнаяСтрокаСрокаГодности = Перечисления.ТочностиУказанияСрокаГодности.ФорматнаяСтрока(НастройкиИспользованияСерий.ТочностьУказанияСрокаГодностиСерии);
	ПредставлениеФорматнойСтрокиВЗаголовкеСрокаГодности = Перечисления.ТочностиУказанияСрокаГодности.ПредставлениеФорматнойСтроки(НастройкиИспользованияСерий.ТочностьУказанияСрокаГодностиСерии);

	ОписаниеИспользованиеРеквизитаСерии = ОписаниеИспользованиеРеквизитаСерии();
	ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита = "Номер";
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеРеквизита
		= Метаданные.Справочники.СерииНоменклатуры.Реквизиты.Найти(ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита).Представление();
	ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки = "ИспользоватьНомерСерии";
	ОписаниеИспользованиеРеквизитаСерии.ТекстШаблонаНаименования = НСтр("ru = '%Номер%'");
	ОписаниеИспользованиеРеквизитаСерии.Использование = НастройкиИспользованияСерий[ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки];
	ОписанияИспользованияРеквизитовСерии.Добавить(ОписаниеИспользованиеРеквизитаСерии);
	
	ОписаниеИспользованиеРеквизитаСерии = ОписаниеИспользованиеРеквизитаСерии();
	ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита = "ДатаПроизводства";
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеРеквизита
		= Метаданные.Справочники.СерииНоменклатуры.Реквизиты.Найти(ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита).Представление();
	ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки = "ИспользоватьДатуПроизводстваСерии";
	ОписаниеИспользованиеРеквизитаСерии.ТекстШаблонаНаименования = НСтр("ru = 'от %ДатаПроизводства%'");
	ОписаниеИспользованиеРеквизитаСерии.Использование = НастройкиИспользованияСерий[ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки];
	ОписаниеИспользованиеРеквизитаСерии.Формат = ФорматнаяСтрокаСрокаГодности;
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеФорматнойСтрокиВЗаголовке = ПредставлениеФорматнойСтрокиВЗаголовкеСрокаГодности;
	ОписанияИспользованияРеквизитовСерии.Добавить(ОписаниеИспользованиеРеквизитаСерии);
	
	ОписаниеИспользованиеРеквизитаСерии = ОписаниеИспользованиеРеквизитаСерии();
	ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита = "ГоденДо";
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеРеквизита
		= Метаданные.Справочники.СерииНоменклатуры.Реквизиты.Найти(ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита).Представление();
	ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки = "ИспользоватьСрокГодностиСерии";
	ОписаниеИспользованиеРеквизитаСерии.ТекстШаблонаНаименования = НСтр("ru = 'до %ГоденДо%'");
	ОписаниеИспользованиеРеквизитаСерии.Использование = НастройкиИспользованияСерий[ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки];
	ОписаниеИспользованиеРеквизитаСерии.Формат = ФорматнаяСтрокаСрокаГодности;
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеФорматнойСтрокиВЗаголовке = ПредставлениеФорматнойСтрокиВЗаголовкеСрокаГодности;
	ОписанияИспользованияРеквизитовСерии.Добавить(ОписаниеИспользованиеРеквизитаСерии);
	
	ОписаниеИспользованиеРеквизитаСерии = ОписаниеИспользованиеРеквизитаСерии();
	ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита = "RFIDTID";
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеРеквизита
		= Метаданные.Справочники.СерииНоменклатуры.Реквизиты.Найти(ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита).Представление();
	ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки = "ИспользоватьRFIDМеткиСерии";
	ОписаниеИспользованиеРеквизитаСерии.Использование = НастройкиИспользованияСерий[ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки];
	ОписаниеИспользованиеРеквизитаСерии.МожноРедактировать = Ложь;
	ОписанияИспользованияРеквизитовСерии.Добавить(ОписаниеИспользованиеРеквизитаСерии);
	
	ОписаниеИспользованиеРеквизитаСерии = ОписаниеИспользованиеРеквизитаСерии();
	ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита = "RFIDUser";
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеРеквизита
		= Метаданные.Справочники.СерииНоменклатуры.Реквизиты.Найти(ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита).Представление();
	ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки = "ИспользоватьRFIDМеткиСерии";
	ОписаниеИспользованиеРеквизитаСерии.Использование = НастройкиИспользованияСерий[ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки];
	ОписаниеИспользованиеРеквизитаСерии.МожноРедактировать = Ложь; // В ERP не реализована запись банка RFIDUser 
	ОписанияИспользованияРеквизитовСерии.Добавить(ОписаниеИспользованиеРеквизитаСерии);
	
	ОписаниеИспользованиеРеквизитаСерии = ОписаниеИспользованиеРеквизитаСерии();
	ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита = "RFIDEPC";
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеРеквизита
		= Метаданные.Справочники.СерииНоменклатуры.Реквизиты.Найти(ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита).Представление();
	ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки = "ИспользоватьRFIDМеткиСерии";
	ОписаниеИспользованиеРеквизитаСерии.Использование = НастройкиИспользованияСерий[ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки];
	ОписаниеИспользованиеРеквизитаСерии.ПроверятьЗаполнение = Истина;
	ОписаниеИспользованиеРеквизитаСерии.МожноРедактировать = Ложь; // В ERP реализована запись только банка RFIDEPC и только для интеграции с ГИСМ
	ОписанияИспользованияРеквизитовСерии.Добавить(ОписаниеИспользованиеРеквизитаСерии);
	
	ОписаниеИспользованиеРеквизитаСерии = ОписаниеИспользованиеРеквизитаСерии();
	ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита = "EPCGTIN";
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеРеквизита
		= Метаданные.Справочники.СерииНоменклатуры.Реквизиты.Найти(ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита).Представление();
	ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки = "ИспользоватьRFIDМеткиСерии";
	ОписаниеИспользованиеРеквизитаСерии.Использование = НастройкиИспользованияСерий[ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки];
	ОписаниеИспользованиеРеквизитаСерии.МожноРедактировать = Ложь;
	ОписанияИспользованияРеквизитовСерии.Добавить(ОписаниеИспользованиеРеквизитаСерии);
	
	ОписаниеИспользованиеРеквизитаСерии = ОписаниеИспользованиеРеквизитаСерии();
	ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита = "RFIDМеткаНеЧитаемая";
	ОписаниеИспользованиеРеквизитаСерии.ПредставлениеРеквизита
		= Метаданные.Справочники.СерииНоменклатуры.Реквизиты.Найти(ОписаниеИспользованиеРеквизитаСерии.ИмяРеквизита).Представление();
	ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки = "ИспользоватьRFIDМеткиСерии";
	ОписаниеИспользованиеРеквизитаСерии.Использование = НастройкиИспользованияСерий[ОписаниеИспользованиеРеквизитаСерии.ИмяНастройки];
	ОписаниеИспользованиеРеквизитаСерии.МожноРедактировать = Ложь;
	ОписанияИспользованияРеквизитовСерии.Добавить(ОписаниеИспользованиеРеквизитаСерии);
	
	НоменклатураЛокализация.ОписаниеИспользованияРеквизитовСерии(ОписанияИспользованияРеквизитовСерии, НастройкиИспользованияСерий, ПараметрыУказанияСерий, ЗначенияПолейСвязи);
	
	Возврат ОписанияИспользованияРеквизитовСерии;

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

Функция ОписаниеИспользованиеРеквизитаСерии() Экспорт
	
	ОписаниеИспользованиеРеквизитаСерии = Новый Структура;
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ИмяРеквизита");
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ПредставлениеРеквизита");
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ИмяНастройки");
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ТекстШаблонаНаименования");
	ОписаниеИспользованиеРеквизитаСерии.Вставить("Использование", Ложь);
	
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ОсобенностиУчета", "");
	ОписаниеИспользованиеРеквизитаСерии.Вставить("Формат", "");
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ПредставлениеФорматнойСтрокиВЗаголовке", "");
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ПроверятьЗаполнение", Истина);
	ОписаниеИспользованиеРеквизитаСерии.Вставить("МожноРедактировать", Истина);
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ТекстУсловногоОформления", "");
	ОписаниеИспользованиеРеквизитаСерии.Вставить("ПроверятьУникальностьЗначения", Ложь);
	
	Возврат ОписаниеИспользованиеРеквизитаСерии;
	
КонецФункции

Функция ПредусмотренаАвтоматическаяГенерацияСерий(НастройкиИспользованияСерий) Экспорт
	
	ПредусмотренаАвтоматическаяГенерацияСерий = Ложь;
	НоменклатураЛокализация.ПредусмотренаАвтоматическаяГенерацияСерий(ПредусмотренаАвтоматическаяГенерацияСерий, НастройкиИспользованияСерий); 
	
	Возврат ПредусмотренаАвтоматическаяГенерацияСерий;
	
КонецФункции

Функция ЭтоРеквизитСоставногоТипа(Реквизит)
	
	ТипЗначенияРеквизита = ТипЗнч(Реквизит);
	
	Если ТипЗначенияРеквизита = Тип("ФиксированнаяСтруктура") Тогда
		Возврат (Не Реквизит.Тип.Типы().Количество() < 2);
	ИначеЕсли ТипЗначенияРеквизита = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") Тогда
		Возврат (Не Реквизит.ТипЗначения.Типы().Количество() < 2);
	Иначе
		ТекстИсключения = НСтр("ru = 'Неожиданный тип значения параметра Реквизит.'");
		
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	
КонецФункции

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

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

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

		
	СтрокаРеквизитовДляКонтроля.ДоступностьОтображатьПриСоздании   = ДоступноИзменениеНастройкиОтображенияРеквизита(Объект,
																													СтрокаРеквизитовДляКонтроля,
																													ВладелецРеквизита);
КонецПроцедуры

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

Процедура УдалитьРеквизитДляКонтроля(Объект, ИмяРеквизита, ВладелецРеквизита)
	
	Отбор = Новый Структура("ИмяРеквизита", ИмяРеквизита);
	КоллекцияРеквизитовДляКонтроля = КоллекцияРеквизитовДляКонтроля(Объект, ВладелецРеквизита);
	
	НайденныеСтроки = КоллекцияРеквизитовДляКонтроля.НайтиСтроки(Отбор);
	
	Если НайденныеСтроки.Количество() > 0 Тогда
		
		СтрокаТаблицыРеквизитов = НайденныеСтроки[0];
		КоллекцияРеквизитовДляКонтроля.Удалить(СтрокаТаблицыРеквизитов);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура УдалитьРеквизитДляОтбора(Объект, ИмяРеквизита, ВладелецРеквизита)
	
	КоллекцияРеквизитовОтбора = КоллекцияРеквизитовОтбора(Объект, ВладелецРеквизита); 
	
	МассивСтрок = КоллекцияРеквизитовОтбора.НайтиСтроки(Новый Структура("ИмяРеквизита", ИмяРеквизита));
	
	Если МассивСтрок.Количество() > 0 Тогда
		СтрокаТаблицыРеквизитов = МассивСтрок[0];
		КоллекцияРеквизитовОтбора.Удалить(СтрокаТаблицыРеквизитов);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

Функция КоллекцияРеквизитовОтбора(ТекущийОбъект, ТипВладельцаНабораЭлементов) Экспорт
	
	Если ТипВладельцаНабораЭлементов = "Номенклатура" Тогда
		Возврат ТекущийОбъект.РеквизитыБыстрогоОтбораНоменклатуры;
	ИначеЕсли ТипВладельцаНабораЭлементов = "ХарактеристикиНоменклатуры" Тогда
		Возврат ТекущийОбъект.РеквизитыБыстрогоОтбораХарактеристик;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

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

Функция ИспользоватьПроизводство() Экспорт
	
	ИспользоватьПроизводство = Ложь; //Для УТ
	
	
	Возврат ИспользоватьПроизводство;
	
КонецФункции

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

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

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

	// обработать табличные части ценообразования
	ЗаполнитьРеквизитыДляЦенообразования(ВидНоменклатуры, "ХарактеристикиНоменклатуры");
	ЗаполнитьРеквизитыДляЦенообразования(ВидНоменклатуры, "СерииНоменклатуры");
	
КонецПроцедуры

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

Функция ЗапретитьИспользованияСерииДляЦенообразования(Знач ВидНоменклатуры) Экспорт
	
	Запретить = Ложь;
	
	Если НЕ ВидНоменклатуры.ИспользоватьСерии Тогда
		Запретить = Истина;
	КонецЕсли;
	
	Возврат Запретить;
	
КонецФункции

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

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

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

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

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