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