Оформление производства без заказов / Форма списка новых документов / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем ВыполняетсяЗакрытие;

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

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

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

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	УдалитьДокументы();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПриИзменении(Элемент)
	ОбеспечениеВДокументахКлиент.ПроверитьЗапуститьФоновоеЗаданиеРаспределенияЗапасов();
КонецПроцедуры

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

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

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

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

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

// СтандартныеПодсистемы.Свойства
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

&НаКлиенте
Процедура СписокДокументовИзменить(Команда)
	
	ТекущиеДанные = Элементы.Список.ТекущиеДанные;
	Если ТекущиеДанные <> Неопределено Тогда
		ПоказатьЗначение(Неопределено, ТекущиеДанные.Ссылка);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();
	
	СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтаФорма, "Список.Дата", "Дата");

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

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

&НаСервере
Функция ПроведениеДокументов(ВыделенныеСтроки, Проведение = Истина)
	
	// СтандартныеПодсистемы.ЗамерПроизводительности
	ОписаниеЗамера = ОценкаПроизводительности.НачатьЗамерДлительнойОперации(
		"Обработка.ОформлениеПроизводстваБезЗаказов.Форма.ФормаСпискаНовыхДокументов.Команда.СписокДокументовПровести");
	// Конец СтандартныеПодсистемы.ЗамерПроизводительности
	
	СтруктураВозврата = ПровестиДокументы(ВыделенныеСтроки, Проведение);
	
	// СтандартныеПодсистемы.ЗамерПроизводительности
	КоличествоОпераций = СтруктураВозврата.ДокументыДляОбработки.Количество();
	ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоОпераций);
	// Конец СтандартныеПодсистемы.ЗамерПроизводительности
	
	Возврат СтруктураВозврата;
	
КонецФункции

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

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

&НаКлиенте
Процедура ОповеститьПользователяОПроведенииДокументов(ДокументыДляОбработки, ДанныеОНеОбработанныхДокументах, Проведение)
	
	НеОбработанныеДокументы = Новый Массив;
	
	ШаблонСообщения = ?(Проведение, 
		НСтр("ru = 'Документ %1 не проведен: %2'"),
		НСтр("ru = 'Документ %1 не удалось сделать непроведенным: %2'"));
	
	Для Каждого ИнформацияОДокументе Из ДанныеОНеОбработанныхДокументах Цикл
		ОбщегоНазначенияКлиент.СообщитьПользователю(
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения,
				Строка(ИнформацияОДокументе.Ссылка),
				ИнформацияОДокументе.ОписаниеОшибки),
			ИнформацияОДокументе.Ссылка);
		
		НеОбработанныеДокументы.Добавить(ИнформацияОДокументе.Ссылка);
	КонецЦикла;
	
	Если НеОбработанныеДокументы.Количество() > 0 Тогда
		ТекстДиалога = ?(Проведение, 
				НСтр("ru = 'Не удалось провести один или несколько документов.'"),
				НСтр("ru = 'Не удалось сделать непроведенным один или несколько документов.'"));

		ПоказатьПредупреждение(, ТекстДиалога);
	КонецЕсли;

	ОбработанныеДокументы = ОбщегоНазначенияКлиентСервер.РазностьМассивов(ДокументыДляОбработки, НеОбработанныеДокументы);
	
	Если ОбработанныеДокументы.Количество() > 0 Тогда
		
		Если ДокументыДляОбработки.Количество() > 1 Тогда
			Документ = Заголовок;
			ТекстОповещения = НСтр("ru='Изменение (%КоличествоДокументов%)'");
			ТекстОповещения = СтрЗаменить(ТекстОповещения, "%КоличествоДокументов%", ОбработанныеДокументы.Количество());
			ДействиеПриНажатии = "";
		Иначе
			Документ = ДокументыДляОбработки[0];
			ТекстОповещения = НСтр("ru='Изменение'");
			ДействиеПриНажатии = ПолучитьНавигационнуюСсылку(Документ);
		КонецЕсли;
		
		ПоказатьОповещениеПользователя(ТекстОповещения, ДействиеПриНажатии, Строка(Документ),
			БиблиотекаКартинок.Информация32);
		
	КонецЕсли;

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

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

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

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

&НаКлиенте
Процедура ПередЗакрытиемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		
		ВыполняетсяЗакрытие = Истина;
		Закрыть();
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОбновитьДанныеСписка() Экспорт
	
	Элементы.Список.Обновить();
	
КонецПроцедуры

ВыполняетсяЗакрытие = Ложь;

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

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