Виды цен (Колонки прайс-листа) / Регламентное задание обновление цен / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

			Расписание = Задание.Расписание;
			
			Если Задание.Параметры.Количество() Тогда
				ЗаполнитьРеквизитыПоПараметрам(Задание.Параметры);
			КонецЕсли;
		
		ИначеЕсли ТипЗнч(Задание) = Тип("СправочникСсылка.ОчередьЗаданий") Тогда
			
			СтрутураЗадания = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Задание, "Ключ,
																		|Использование,
																		|ИмяПользователя,
																		|ИнтервалПовтораПриАварийномЗавершении,
																		|КоличествоПовторовПриАварийномЗавершении,
																		|Расписание,
																		|Параметры");
			
			ЗаполнитьЗначенияСвойств(
				ЭтотОбъект,
				СтрутураЗадания,
				"Ключ,
				|Использование,
				|ИмяПользователя,
				|ИнтервалПовтораПриАварийномЗавершении,
				|КоличествоПовторовПриАварийномЗавершении");
			
			ИмяМетаданных        = НСтр("ru = '<нет метаданных>'");
			СинонимМетаданных    = НСтр("ru = '<нет метаданных>'");
			ИмяМетодаМетаданных  = НСтр("ru = '<нет метаданных>'");

			Расписание = СтрутураЗадания.Расписание.Получить();
			
			ПараметрыЗадания = СтрутураЗадания.Параметры.Получить();
			Если ПараметрыЗадания.Количество() Тогда
				ЗаполнитьРеквизитыПоПараметрам(ПараметрыЗадания);
			КонецЕсли;
		КонецЕсли;

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

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

&НаКлиенте
Процедура ВариантОбновленияЦенПриИзменении(Элемент)
	
	ВариантОбновленияЦенПриИзмененииНаСервере(ЭтотОбъект);	
	
	ОбновитьАвтонаименование();
	
КонецПроцедуры

&НаКлиенте
Процедура ВидыЦенПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	ОбновитьАвтонаименование();
	
КонецПроцедуры

//&НаКлиенте
//Процедура ВидОбновленияЦенПриИзменении(Элемент)
//	
//	ОбновитьАвтонаименование();
//	
//КонецПроцедуры

&НаКлиенте
Процедура ВидыЦенПослеУдаления(Элемент)
	
	ОбновитьАвтонаименование();
	
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Записать(Команда)
	
	ЗаписатьРегламентноеЗадание();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьИЗакрытьВыполнить()
	
	ЗаписатьИЗакрытьЗавершение();
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьРасписаниеВыполнить()

	Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание);
	Диалог.Показать(Новый ОписаниеОповещения("ОткрытьРасписаниеЗавершение", ЭтотОбъект));
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ЗаписатьИЗакрытьЗавершение(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
	
	ЗаписатьРегламентноеЗадание();
	Модифицированность = Ложь;
	Закрыть();
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьРасписаниеЗавершение(НовоеРасписание, Контекст) Экспорт

	Если НовоеРасписание <> Неопределено Тогда
		Расписание = НовоеРасписание;
		Модифицированность = Истина;
		Если РазделениеВключено 
			И Расписание.ПериодПовтораВТечениеДня > 0
			И Расписание.ПериодПовтораВТечениеДня < 3600 Тогда
			
			Расписание.ПериодПовтораВТечениеДня = 3600;
			
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьРегламентноеЗадание()
	
	Если НЕ ЗначениеЗаполнено(ИмяМетаданных) Тогда
		Возврат;
	КонецЕсли;
	
	ТекущийИдентификатор = ?(Действие = "Изменить", Идентификатор, Неопределено);
	
	ЗаписатьРегламентноеЗаданиеНаСервере();
	ОбновитьЗаголовокФормы();
	
	Оповестить("Запись_РегламентныеЗадания", ТекущийИдентификатор);
	
КонецПроцедуры

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

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

	Если Действие = "Изменить" Тогда
		ИзменитьЗадание(Идентификатор, ПараметрыЗадания);
	Иначе
		УникальныйИдентификаторЗадания = ДобавитьЗадание(ПараметрыЗадания);
		Идентификатор = Строка(УникальныйИдентификаторЗадания);
	КонецЕсли;

	УстановитьПривилегированныйРежим(Ложь);

	Модифицированность = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗаголовокФормы()
	
	Если НЕ ПустаяСтрока(Наименование) Тогда
		Представление = Наименование;
		
	ИначеЕсли НЕ ПустаяСтрока(СинонимМетаданных) Тогда
		Представление = СинонимМетаданных;
	Иначе
		Представление = ИмяМетаданных;
	КонецЕсли;
	
	Если Действие = "Изменить" Тогда
		Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (Регламентное задание)'"), Представление);
	Иначе
		Заголовок = НСтр("ru = 'Регламентное задание (создание)'");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьВидимостьЭлементовФормы()
	
	Элементы.ГруппаНастройкиВидовЦен.Видимость = Истина; 
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ВариантОбновленияЦенПриИзмененииНаСервере(Форма)
	
	Форма.Элементы.ВидыЦенДляАвтоматическогоОбновления.Доступность = (Форма.ВариантОбновленияЦен<>0);

	Если Форма.ВариантОбновленияЦен=0 и Форма.ВидыЦен.Количество() Тогда
		Форма.ВидыЦен.Очистить();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьРеквизитыПоПараметрам(Параметры)
	
	ВидыЦен.Очистить();
	
	Если (Параметры.Количество() > 0) Тогда
		
		Для Каждого Строка Из Параметры[0] Цикл
			ВидыЦен.Добавить(Строка.ВидЦены);
		КонецЦикла;
		
		ВариантОбновленияЦен = Параметры[1].ВариантОбновленияЦен;
		
	КонецЕсли;
	
КонецПроцедуры

#Область РегламентныеЗадания

// Возвращает РегламентноеЗадание из информационной базы.
//
// В модели сервиса работает с регламентными заданиями платформы, а не с заданиями очереди,
// одинаково как в разделенном, так и в неразделенном режимах.
//
// Параметры:
//  Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска
//                  предопределенного регламентного задания.
//                - УникальныйИдентификатор - идентификатор регламентного задания.
//                - Строка - строка уникального идентификатора регламентного задания.
//                - РегламентноеЗадание - регламентное задание из которого нужно получить
//                  уникальный идентификатор для получения свежей копии регламентного задания.
// 
// Возвращаемое значение:
//  РегламентноеЗадание - в локальном режиме работы.
//  СтрокаТаблицыЗначений из см. РегламентныеЗаданияСервер.НайтиЗадания
//  Неопределено - задание не найдено.
//
&НаСервере
Функция ПолучитьРегламентноеЗадание(Идентификатор)

	УстановитьПривилегированныйРежим(Истина);

	ЗаданиеРезультат = РегламентныеЗаданияСервер.Задание(Идентификатор);

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

// Добавляет новое задание в очередь или регламентное.
// 
// Параметры: 
//  ПараметрыЗадания - Структура - параметры добавляемого задания, возможные свойства:
//   * Использование - Булево - Истина, если регламентное задание должно выполняться автоматически согласно расписанию. 
//   * Метаданные    - ОбъектМетаданныхРегламентноеЗадание - обязательно для указания. Объект метаданных, на основе 
//                              которого будет создано регламентное задание.
//   * Параметры     - Массив - параметры регламентного задания. Количество и состав параметров должны соответствовать 
//                              параметрам метода регламентного задания.
//   * Ключ          - Строка - прикладной идентификатор регламентного задания.
//   * ИнтервалПовтораПриАварийномЗавершении - Число - интервал в секундах, через который нужно перезапускать задание 
//                              в случае его аварийного завершения.
//   * Расписание    - РасписаниеРегламентногоЗадания - расписание задания.
//   * КоличествоПовторовПриАварийномЗавершении - Число - количество повторов при аварийном завершении задания.
//
// Возвращаемое значение:
//  УникальныйИдентификатор - идентификатор регламентного задания в локальном режиме работы
//                            или идентификатор ссылки задания очереди в модели сервиса.
&НаСервере
Функция ДобавитьЗадание(ПараметрыЗадания)

	УстановитьПривилегированныйРежим(Истина);

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

// Изменяет задание очереди или регламентное.
//
// В модели сервиса (разделение включено):
// - в случае вызова в транзакции на задание устанавливается объектная блокировка,
// - если задание создано на основе шаблона или предопределенное, может быть указано
// только свойство Использование в параметре Параметры. Расписание в этом случае,
// изменять нельзя, т.к. оно хранится централизованно в неразделенном Шаблоне задания,
// отдельно для каждой области оно не сохраняется.
// 
// Параметры: 
//  Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска
//                                     непредопределенного регламентного задания.
//                - Строка - имя метаданных предопределенного регламентного задания в любом режиме работы
//                           или строка уникального идентификатора регламентного задания в локальном режиме работы
//                           или строка уникального идентификатора ссылки задания очереди в модели сервиса.
//                - УникальныйИдентификатор - идентификатор регламентного задания в локальном режиме работы
//                           или идентификатор ссылки задания очереди в модели сервиса.
//                - РегламентноеЗадание - регламентное задание в локальном режиме работы.
//                - СправочникСсылка.ОчередьЗаданий - идентификатор задания очереди в модели сервиса.
//                - СтрокаТаблицыЗначений: см. РегламентныеЗаданияСервер.НайтиЗадания
//
//  Параметры - Структура - параметры, которые следует установить заданию, возможные свойства:
//   * Использование - Булево - Истина, если регламентное задание должно выполняться автоматически согласно расписанию.
//   * Параметры     - Массив - параметры регламентного задания. Количество и состав параметров должны соответствовать
//                              параметрам метода регламентного задания.
//   * Ключ          - Строка - прикладной идентификатор регламентного задания.
//   * ИнтервалПовтораПриАварийномЗавершении - Число - интервал в секундах, через который нужно перезапускать задание
//                              в случае его аварийного завершения.
//   * Расписание    - РасписаниеРегламентногоЗадания - расписание задания.
//   * КоличествоПовторовПриАварийномЗавершении - Число - количество повторов при аварийном завершении задания.
//   
&НаСервере
Процедура ИзменитьЗадание(Идентификатор, ПараметрыЗадания) Экспорт

	УстановитьПривилегированныйРежим(Истина);

	РегламентныеЗаданияСервер.ИзменитьЗадание(Идентификатор, ПараметрыЗадания);

	УстановитьПривилегированныйРежим(Ложь);
	
КонецПроцедуры

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

#Область Прочее
&НаКлиентеНаСервереБезКонтекста
Функция АвтоНаименование(Форма)
	
	Форма.Элементы.Наименование.СписокВыбора.Очистить();
	
	СтрокаНаименования = "";
	
	СтрокаНаименования = НСтр("ru = 'Обновление цен ('");
	
	Если Форма.ВариантОбновленияЦен = 0 Тогда
		СтрокаНаименования = СтрокаНаименования + НСтр("ru = 'Все)'");
	ИначеЕсли Форма.ВариантОбновленияЦен = 1 Тогда
		СтрокаНаименования = СтрокаНаименования + НСтр("ru = 'Только выбранные)'");
	ИначеЕсли Форма.ВариантОбновленияЦен = 2 Тогда
		СтрокаНаименования = СтрокаНаименования + НСтр("ru = 'Выбранные и зависимые)'");
	ИначеЕсли Форма.ВариантОбновленияЦен = 3 Тогда
		СтрокаНаименования = СтрокаНаименования + НСтр("ru = 'Все кроме выбранных)'");
	КонецЕсли;
	
	ЭтоПервыйЭлементСписка = Истина;
	Для Каждого ВидЦены Из Форма.ВидыЦен Цикл
		СтрокаНаименования = СтрокаНаименования + ?(ЭтоПервыйЭлементСписка," ",", ") + ВидЦены;
		ЭтоПервыйЭлементСписка = Ложь;
	КонецЦикла;
	
	Форма.Элементы.Наименование.СписокВыбора.Добавить(СтрокаНаименования);
	
	Если Форма.ИндексАвтонаименования <= Форма.Элементы.Наименование.СписокВыбора.Количество() - 1 Тогда
		Возврат Форма.Элементы.Наименование.СписокВыбора.Получить(Форма.ИндексАвтонаименования).Значение;
	Иначе
		Возврат СтрокаНаименования;
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Процедура ОбновитьАвтонаименование(Обновить = Истина)
	
	НаименованиеСтр = АвтоНаименование(ЭтотОбъект);
	Если Не ЗначениеЗаполнено(Наименование)
		ИЛИ (Обновить И ИспользуетсяАвтоНаименование И Не НаименованиеИзмененоПользователем) Тогда
		Наименование = НаименованиеСтр;
		ИспользуетсяАвтоНаименование = Истина;
		ОбновитьЗаголовокФормы();
	КонецЕсли;
	
КонецПроцедуры

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

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

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