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

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

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	Если ЭтоГруппа Тогда
		Возврат;
	КонецЕсли;

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

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

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

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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	Если ЗначениеЗаполнено(ОбъектКопирования.СтавкаНДС)
		И Не УчетНДСУП.СтавкаНДСКорректна(
						ОбъектКопирования.СтавкаНДС,
						Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС,
						Неопределено,
						Неопределено) Тогда
		СтавкаНДС = Справочники.СтавкиНДС.ПустаяСсылка();
	КонецЕсли;

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

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

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

Процедура ПриЧтенииПредставленийНаСервере() Экспорт
	МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект);
КонецПроцедуры

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

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

Процедура ПроверитьКратностьМеры(Мера, Отказ)
	РеквизитыМеры = Справочники.Номенклатура.РеквизитыМеры(Мера);
	СообщениеКратностьБолее = НСтр("ru = 'Кратность более 10 000 000 / 1'");
	СообщениеКратностьМенее = НСтр("ru = 'Кратность менее 1 / 99 999 999'");
	Если ЭтотОбъект[РеквизитыМеры.Использовать]
		И ЗначениеЗаполнено(ЭтотОбъект[РеквизитыМеры.Знаменатель]) Тогда
		Если ЭтотОбъект[РеквизитыМеры.Числитель] / ЭтотОбъект[РеквизитыМеры.Знаменатель] < 0.0000001 Тогда
			ОбщегоНазначения.СообщитьПользователю(
				СообщениеКратностьБолее,
				,
				"Объект." + РеквизитыМеры.Знаменатель,
				,
				Отказ);
		ИначеЕсли ЭтотОбъект[РеквизитыМеры.Числитель] / ЭтотОбъект[РеквизитыМеры.Знаменатель] > 99999999 Тогда
			ОбщегоНазначения.СообщитьПользователю(
				СообщениеКратностьМенее,
				,
				"Объект." + РеквизитыМеры.Числитель,
				,
				Отказ);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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