Виды цен (Колонки прайс-листа) / Модуль объекта

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

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

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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	Если Не ЭтоГруппа Тогда
		Идентификатор = "";
	КонецЕсли;
	
КонецПроцедуры

Функция ИспользуютсяРасширенныеНастройкиОкругления()
	
	ИспользоватьРасширеннуюНастройкуОкругления = Ложь;
	
	Если ПравилаОкругленияЦены.Количество() = 1
		И ПравилаОкругленияЦены[0].НижняяГраницаДиапазонаЦен = 0
		И ПравилаОкругленияЦены[0].ПсихологическоеОкругление = 0 Тогда
		ИспользоватьРасширеннуюНастройкуОкругления = Ложь;
	ИначеЕсли ПравилаОкругленияЦены.Количество() >= 1 Тогда
		ИспользоватьРасширеннуюНастройкуОкругления = Истина;
	Иначе
		ИспользоватьРасширеннуюНастройкуОкругления = Ложь;
	КонецЕсли;
	
	Возврат ИспользоватьРасширеннуюНастройкуОкругления;
	
КонецФункции

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

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

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

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

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

#Область ИнициализацияИЗаполнение

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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