Отклонения от условий закупок / Модуль менеджера

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

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

// Инициализирует дерево отклонений для формирования отчета
//
// Возвращаемое значение:
// 		ДеревоЗначений - ДеревоОтклонений - Инициализированное дерево значений:
// 		* НомерСтроки - Число - Номер строки
// 		* Параметр - Строка - Имя параметра
// 		* ОтклонениеПараметра - Строка - Текст с ошибкой
//
Функция ИнициализироватьДеревоОтклонений() Экспорт
	
	ДеревоОтклонений = Новый ДеревоЗначений();
	ДеревоОтклонений.Колонки.Добавить("НомерСтроки");
	ДеревоОтклонений.Колонки.Добавить("Параметр");
	ДеревоОтклонений.Колонки.Добавить("ОтклонениеПараметра");
	
	Возврат ДеревоОтклонений
	
КонецФункции

// Добавляет отклонения по шапке документа в массив отклонений от условий закупок
//
// Параметры:
// 		ИмяПараметраШапки        - Строка - Имя отклоняемого параметра
// 		ОтклонениеПараметраШапки - Строка - Текст с ошибкой
// 		МассивОтклонений         - Массив - Массив с отклонениями.
//
Процедура ДобавитьОтклонениеШапкиВМассивОтклонений(ИмяПараметраШапки, ОтклонениеПараметраШапки, МассивОтклонений) Экспорт
	
	СтруктураОтклонений = Новый Структура();
	СтруктураОтклонений.Вставить("ИмяПараметраШапки", ИмяПараметраШапки);
	СтруктураОтклонений.Вставить("ОтклонениеПараметраШапки", ОтклонениеПараметраШапки);
	
	МассивОтклонений.Добавить(СтруктураОтклонений);
КонецПроцедуры

// Добавляет отклонения по табличной части документа в дерево отклонений от условий закупок.
//
// Параметры:
// 		НомерСтроки          - Число - Номер строки с ошибкой
// 		Параметр             - Строка - Имя отклоняемого параметра
// 		ОтклонениеПараметра  - Строка - Текст с ошибкой
// 		ДеревоОтклонений     - см. ИнициализироватьДеревоОтклонений
//
Процедура ДобавитьОтклонениеСтрокиВДеревоОтклонений(НомерСтроки, Параметр, ОтклонениеПараметра, ДеревоОтклонений) Экспорт
	НайденнаяСтрока  = ДеревоОтклонений.Строки.Найти(НомерСтроки,"НомерСтроки");
	Если НайденнаяСтрока = Неопределено Тогда
		СтрокаОтклонений             = ДеревоОтклонений.Строки.Добавить();
		СтрокаОтклонений.НомерСтроки = НомерСтроки;
		ВложеннаяСтрокаОтклонений    = СтрокаОтклонений.Строки.Добавить();
	Иначе
		ВложеннаяСтрокаОтклонений = НайденнаяСтрока.Строки.Добавить();
	КонецЕсли;
	ВложеннаяСтрокаОтклонений.НомерСтроки         = НомерСтроки;
	ВложеннаяСтрокаОтклонений.Параметр            = Параметр;
	ВложеннаяСтрокаОтклонений.ОтклонениеПараметра = ОтклонениеПараметра;
КонецПроцедуры

// Настройки размещения в панели отчетов.
//
// Параметры:
//   Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки.
//       Может использоваться для получения настроек варианта этого отчета при помощи функции ВариантыОтчетов.ОписаниеВарианта().
//   ОписаниеОтчета - СтрокаДереваЗначений - Настройки этого отчета, уже сформированные и готовые к изменению.
//       См. ВариантыОтчетов.ОписаниеОтчета.
//
// Описание:
//   См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.
//
// Вспомогательные методы:
//	НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>");
//	ВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Истина/Ложь);
//
// Примеры:
//
//  1. Установка описания варианта.
//	НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>");
//	НастройкиВарианта.Описание = НСтр("ru = '<Описание>'");
//
//  2. Отключение варианта отчета.
//	НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>");
//	НастройкиВарианта.Включен = Ложь;
//
Процедура НастроитьВариантыОтчета(Настройки, ОписаниеОтчета) Экспорт
	
	// Отключение контекстных вариантов
	ВариантыОтчетовУТПереопределяемый.ОтключитьОтчет(ОписаниеОтчета);
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.ВариантыОтчетов

#Область ВыводДанных

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

// Выводит отклонения в область шапки
//
// Параметры:
//  МассивОтклонений - Массив - массив с отклонениями
//  ТаблицаОтчета	 - ТабличныйДокумент - табличный документ отчета.
//
Процедура ВывестиОтклоненияВОбластьШапки(МассивОтклонений, ТаблицаОтчета) Экспорт
	Макет = ПолучитьМакет("Макет");
	Область = Макет.ПолучитьОбласть("ЗаголовокОтклонений");
	Область.Параметры.Заголовок = НСтр("ru='Соответствие условиям закупок'");
	ТаблицаОтчета.Вывести(Область);
	
	Область = Макет.ПолучитьОбласть("ОтклонениеШапки");
	ТаблицаОтчета.НачатьГруппуСтрок();
	Для каждого Отклонение Из МассивОтклонений Цикл
		Область.Параметры.Заполнить(Отклонение);
		ТаблицаОтчета.Вывести(Область);
	КонецЦикла; 
	ТаблицаОтчета.ЗакончитьГруппуСтрок();
КонецПроцедуры

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

// Выводит отклонения по этапам оплаты документа
//
// Параметры:
//  ДокументЗакупки			 - ДокументОбъект - проверяемый документ
//  ДеревоОтклонений		 - см. ИнициализироватьДеревоОтклонений
//  ТаблицаОтчета			 - ТабличныйДокумент - табличный документ отчета.
//
Процедура ВывестиОтклоненияЭтапыОплатыДокументаЗакупки(Знач ДокументЗакупки, ДеревоОтклонений, ТаблицаОтчета) Экспорт
	
	Макет = ПолучитьМакет("Макет");
	
	ТребуетсяЗалогЗаТару = ДокументЗакупки.ТребуетсяЗалогЗаТару;
	
	Если ТребуетсяЗалогЗаТару Тогда
		ОбластьШапки = Макет.ПолучитьОбласть("ШапкаЭтаповОплатыСТарой");
		ОбластьИмя = "СтрокаЭтаповОплатыСТарой";
		ОбластьСтрокиИмя = "ЭтапыОплатыСтрокаСТарой";
	Иначе
		ОбластьШапки = Макет.ПолучитьОбласть("ШапкаЭтаповОплаты");
		ОбластьИмя = "СтрокаЭтаповОплаты";
		ОбластьСтрокиИмя = "ЭтапыОплатыСтрока";
	КонецЕсли;
	
	Область = Макет.ПолучитьОбласть("ЗаголовокОтклонений");
	Область.Параметры.Заголовок = НСтр("ru='Соответствие этапов оплаты условиям закупок'");
	ТаблицаОтчета.Вывести(Область);
	
	ТаблицаОтчета.НачатьГруппуСтрок();
	ТаблицаОтчета.Вывести(ОбластьШапки);
	
	ОбластьОтклонение       = Макет.ПолучитьОбласть("СтрокаТаблицыОтклонение");
	ОбластьСтрокиОтклонение = ОбластьОтклонение.Области.ТаблицаСтрокаОтклонение; // ОбластьЯчеекТабличногоДокумента
	
	ЧетнаяСтрока = Ложь;
	
	Для каждого Отклонение Из ДеревоОтклонений.Строки Цикл
		Область = Макет.ПолучитьОбласть(ОбластьИмя);
		ОбластьСтроки = Область.Области[ОбластьСтрокиИмя]; // ОбластьЯчеекТабличногоДокумента
		
		Если ЧетнаяСтрока Тогда
			ЦветФона = ЦветаСтиля.АльтернативныйЦветФонаПоля;
		Иначе
			ЦветФона = ЦветаСтиля.ЦветФонаПоля;
		КонецЕсли;
		
		СтрокаТовары = ДокументЗакупки.ЭтапыГрафикаОплаты.Получить(Отклонение.НомерСтроки-1);
		Область.Параметры.Заполнить(СтрокаТовары);
		
		ОбластьСтроки.ЦветФона = ЦветФона;
		
		Для каждого СтрокаСОтклонением Из Отклонение.Строки Цикл
			Попытка
				ИмяПараметра = ОбластьСтрокиИмя + СтрокаСОтклонением.Параметр;
				ОбластьПараметра = Область.Области[ИмяПараметра]; // ОбластьЯчеекТабличногоДокумента
				ОбластьПараметра.ЦветТекста = ЦветаСтиля.ЦветОтрицательногоЧисла;
			Исключение
				Продолжить;
			КонецПопытки;
		КонецЦикла;
		ТаблицаОтчета.Вывести(Область);
		
		ТаблицаОтчета.НачатьГруппуСтрок();
		Для каждого СтрокаСОтклонением Из Отклонение.Строки Цикл
			ОбластьСтрокиОтклонение.ЦветФона = ЦветФона;
			ОбластьОтклонение.Параметры.Заполнить(СтрокаСОтклонением);
			ТаблицаОтчета.Вывести(ОбластьОтклонение);
		КонецЦикла;
		ТаблицаОтчета.ЗакончитьГруппуСтрок();
		
		ЧетнаяСтрока = НЕ ЧетнаяСтрока;
	КонецЦикла;
	
	Область = Макет.ПолучитьОбласть("СтрокаТаблицыПоследняя");
	ТаблицаОтчета.Вывести(Область);
	
	ТаблицаОтчета.ЗакончитьГруппуСтрок();
КонецПроцедуры

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

#Область КомандыПодменюОтчеты

// Добавляет команду отчета в список команд.
// 
// Параметры:
//   КомандыОтчетов - см. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
// Возвращаемое значение:
//   СтрокаТаблицыЗначений - новая команда отчета.
Функция ДобавитьКомандуОтчета(КомандыОтчетов) Экспорт

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

	Возврат Неопределено;

КонецФункции

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

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

#КонецЕсли

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