План продаж по номенклатуре / Модуль менеджера

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

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

#Область Проведение

// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
//              регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("ПланированиеЗапасов");
	
КонецПроцедуры

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

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

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

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.КомандыСозданияНаОсновании
//  Параметры - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.Параметры
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	БизнесПроцессы.Задание.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
	
КонецПроцедуры

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

		Возврат КомандаСоздатьНаОсновании;
	КонецЕсли;

	Возврат Неопределено;
КонецФункции

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

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

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

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

#Область СезонныйКоэффициент
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"СезонныйКоэффициент");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='Сезонный коэффициент'"));
	ДопПараметр.Вставить("СоздаватьРеквизит",	ИспользоватьСезонныеКоэффициенты 
		И Не ЭтоПланПродажПоКатегориям
		И Не ЗаполнятьНазначениеВТЧ);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьСезонныеКоэффициенты 
		И Не ЭтоПланПродажПоКатегориям
		И Не ЗаполнятьНазначениеВТЧ);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='Сезонный коэффициент'"));
	ДопПараметр.Вставить("ВходитВОперанд",		"ВспомогательныеОперанды");
	
	ДопПараметры.Вставить("СезонныйКоэффициент",ДопПараметр);
	
#КонецОбласти 
	
#Область ПланыПродаж
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПродаж");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План продаж'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланыПродаж);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланыПродаж);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План продаж'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПродаж");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланы");
	
	ДопПараметры.Вставить("ПланыПродаж", ДопПараметр);
#КонецОбласти
	
#Область ПланыПродажСОтбором
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПродажСОтбором");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План продаж*'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланыПродаж И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланыПродаж И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План продаж*'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПродаж");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланыСОтбором");
	
	ДопПараметры.Вставить("ПланыПродажСОтбором", ДопПараметр);
#КонецОбласти
	
#Область ФактыПродаж
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ФактыПродаж");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт продаж*'"), НСтр("ru='Факт продаж'")));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ЧтениеФактаПродаж);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд",	ЧтениеФактаПродаж);
	ДопПараметр.Вставить("ЗаголовокОперанда",	?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт продаж*'"), НСтр("ru='Факт продаж'")));
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыФакты");
	
	ДопПараметры.Вставить("ФактыПродаж", ДопПараметр);
#КонецОбласти

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

// Возвращает макеты операндов для данного плана
//
// Параметры:
//  Макеты  - Соответствие - Общий список макетов, в который добавляются макеты этого документа.
//
// Возвращаемое значение:
//   Соответствие   - Макеты для операндов.
//
Функция МакетыОперандовПлана(Макеты = Неопределено) Экспорт

	Если Макеты = Неопределено Тогда
		Макеты = Новый Соответствие;
	КонецЕсли; 
	
	Макеты.Вставить("ДоляДнейНаличияТовараНаОстатках", ПолучитьМакет("СКД_ДоляДнейНаличияТовараНаОстатках"));
	Макеты.Вставить("СезонныйКоэффициент",             ПолучитьМакет("СКД_СезонныйКоэффициент"));
	Макеты.Вставить("ПланыПродаж",                     ПолучитьМакет("СКД_ПланыПродаж"));
	Макеты.Вставить("ПланыПродажСОтбором",             ПолучитьМакет("СКД_ПланыПродажСОтбором"));
	Макеты.Вставить("ФактыПродаж",                     ПолучитьМакет("СКД_ФактыПродаж"));
	Макеты.Вставить("АссортиментПродаж",               ПолучитьМакет("СКД_АссортиментПродаж"));
	Макеты.Вставить("ТоварыПриобретенныеКлиентом",     ПолучитьМакет("СКД_ТоварыПриобретенныеКлиентом"));
	Если ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25() Тогда
		Макеты.Вставить("ЦеныНоменклатуры",            ПолучитьМакет("СКД_ЦеныНоменклатуры2_5"));
	Иначе
		Макеты.Вставить("ЦеныНоменклатуры",            ПолучитьМакет("СКД_ЦеныНоменклатуры"));
	КонецЕсли; 
	
	Возврат Макеты;

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

// Процедура заполняет табличную часть документа по формулам или по правилу заполнения по источникам данных планирования,
// предназначена для заполнения документа в фоне.
//
// Параметры:
//  Параметры  - Структура - Настройки для заполнения
//  АдресХранилища - Строка - Адрес временного хранилища, в которое будет помещен результат работы задания
//  АдресХранилищаДополнительный - Строка.
//
Процедура ЗаполнитьДокумент(Знач Параметры, Знач АдресХранилища, Знач АдресХранилищаДополнительный = "") Экспорт
	
	Настройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(Параметры.КлючОбщихНастроек, 
		"НастройкиФоновогоЗадания_"+Параметры.УникальныйИдентификатор);
	
	Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
		
		Возврат;
		
	КонецЕсли;
	
	Параметры.Вставить("Периоды", Настройки.Периоды);
	
	Если Параметры.Свойство("ЗаполнятьПоФормуле") Тогда
		
		Параметры.Вставить("ЗаполняемаяТЧ", Настройки.ЗаполняемаяТЧ);
		ЗаполнитьДокументПоФормуле(Параметры, АдресХранилища, АдресХранилищаДополнительный);
		
	ИначеЕсли Параметры.Свойство("ЗаполнятьПоПравилу") Тогда
		
		Параметры.Вставить("ПравилоЗаполнения", Настройки.ПравилоЗаполнения);
		Параметры.Вставить("ПользовательскиеНастройки", Настройки.ПользовательскиеНастройки);
		Параметры.Вставить("ЗаполняемаяТЧ", Настройки.ЗаполняемаяТЧ);
		
		ЗаполнитьПоПравилуЗаполнения(Параметры, АдресХранилища);
		
	ИначеЕсли Параметры.Свойство("ЗаполнитьДляЗамещения") Тогда
		
		Параметры.Вставить("ЗаполняемаяТЧ", Настройки.ЗаполняемаяТЧ);
		ЗаполнитьДокументДляЗамещения(Параметры, АдресХранилища);
		
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	ОбщегоНазначения.ХранилищеОбщихНастроекУдалить(Параметры.КлючОбщихНастроек, 
		"НастройкиФоновогоЗадания_"+Параметры.УникальныйИдентификатор, Пользователи.ТекущийПользователь());
	
КонецПроцедуры

// Процедура заполняет табличную часть документа по формулам
// Параметры:
//  Параметры  - Структура - Настройки для заполнения:
//  	* ЗаполняемаяТЧ - ТаблицаЗначений -
//  АдресХранилища - Строка - Адрес временного хранилища, в которое будет помещен результат работы задания
//  АдресХранилищаДополнительный - Строка.
//
Процедура ЗаполнитьДокументПоФормуле(Знач Параметры, Знач АдресХранилища, Знач АдресХранилищаДополнительный) Экспорт
	
	Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Документ.ПланПродаж.МодульМенеджера.ЗаполнитьДокументПоФормуле");
	
	Если Не Параметры.Свойство("ЗаполнятьПоФормуле") Тогда
		Возврат;
	КонецЕсли; 
	
	ИмяКолонкиПериода = "ДатаОтгрузки";
	
	Периоды = Параметры.Периоды;
	Планирование.ПодготовитьТаблицуПериодовПередЗаполнением(Параметры);
	Планирование.ЗаполнитьТаблицуПериодов(Периоды, Параметры.Периодичность, Параметры.НачалоПериодаСмещения, Параметры.КонецПериодаСмещения,,, Параметры.НачалоАктивныхПериодов);
	
	НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
	ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
	Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда 
		
		ПоместитьВоВременноеХранилище(Новый ТаблицаЗначений, АдресХранилища);
		ПоместитьВоВременноеХранилище(Неопределено, АдресХранилищаДополнительный);
		
		Возврат;
		
	КонецЕсли;
	
	Параметры.Вставить("Периоды", Периоды); 
	
	ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
	
	КолонкаПериода = ЗаполняемаяТЧ.Колонки[ИмяКолонкиПериода]; // КолонкаТаблицыЗначений - 
	КолонкаПериода.Имя = "ПериодСостава";
	
	Результат = Планирование.ЗаполнитьПоФормуле(Параметры);
	
	Если Результат.Колонки.Найти("ПериодСостава") = Неопределено Тогда
		Результат.Колонки.Добавить("ПериодСостава", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата))
	КонецЕсли; 
	
	Результат.Колонки["ПериодСостава"].Имя = ИмяКолонкиПериода;
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
	Если Параметры.НачалоАктивныхПериодов > Параметры.НачалоПериодаСмещения Тогда
		ПоместитьВоВременноеХранилище(Периоды, АдресХранилищаДополнительный);
	Иначе
		ПоместитьВоВременноеХранилище(Неопределено, АдресХранилищаДополнительный);
	КонецЕсли;
	
	КоличествоОбработанных = Периоды.Количество();
	ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанных);
	
КонецПроцедуры

// Процедура заполняет табличную часть документа по правилу заполнения из различных источников.
//
// Параметры:
//  Параметры  - Структура - Настройки для заполнения:
//  	* ЗаполняемаяТЧ - ТаблицаЗначений -
//  	* Периоды см. Планирование.ТаблицаПериоды
//  АдресХранилища - Строка - Адрес временного хранилища, в которое будет помещен результат работы задания
//  Настройки  - Структура - Дополнительные настройки для заполнения, Правило заполнения, пользовательские настройки, ТЧ
//                           заполнения.
//
Процедура ЗаполнитьПоПравилуЗаполнения(Знач Параметры, Знач АдресХранилища) Экспорт
	
	Если Не Параметры.Свойство("ЗаполнятьПоПравилу") Тогда
		Возврат;
	КонецЕсли; 
	
	ИмяКолонкиПериода = "ДатаОтгрузки";
	
	Периоды = Параметры.Периоды;
	
	НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
	ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
	Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда 
		
		Возврат;
		
	КонецЕсли;
	
	Коэффициенты = Новый Массив;
	Для Индекс = 1 По ВсегоПериодов Цикл
		Коэффициенты.Добавить(1);
	КонецЦикла;
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ПараметрыДанных", Планирование.ПолучитьПараметрыПлана(Параметры));
	Если Параметры.Свойство("Отбор") Тогда
		ДополнительныеПараметры.Вставить("Отбор", Параметры.Отбор);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Параметры.ИзменитьРезультатНа) Тогда
		
		ДополнительныеПараметры.ПараметрыДанных.Вставить("Коэффициент", (100 + Параметры.ИзменитьРезультатНа) / 100);
		
	КонецЕсли;
	
	Если Параметры.Свойство("ТочностьОкругления") Тогда
		ДополнительныеПараметры.ПараметрыДанных.Вставить("ТочностьОкругления", Параметры.ТочностьОкругления);
	КонецЕсли;
	
	ПравилоЗаполнения = Параметры.ПравилоЗаполнения;
	ПользовательскиеНастройки = Параметры.ПользовательскиеНастройки;
	
	Результат = Планирование.ВыбратьДанныеПоПравилам(
		Перечисления.ТипыПланов.ПланПродаж, 
		ПравилоЗаполнения, 
		ПользовательскиеНастройки, 
		ДополнительныеПараметры);
	
	ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
	
	Если Результат <> Неопределено Тогда
		
		РазрядностьОкругления = Параметры.ТочностьОкругления + 3;
		
		ВыходныеДниКалендарей = Новый Соответствие;
		ОсновнойКалендарьПредприятия = Константы.ОсновнойКалендарьПредприятия.Получить();
		КалендарьСкладаПлана = Справочники.Календари.ПустаяСсылка();
		
		Если ЗначениеЗаполнено(Параметры.Склад) Тогда
			КалендарьСкладаПлана = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Склад, "Календарь");
		КонецЕсли; 
		
		
		Для каждого СтрокаРезультата Из Результат Цикл
			
			Если Параметры.ТочностьОкругления <> 0 Тогда
				ИмяФункции = НСтр("ru = 'Окр(%1; %2)'");
				СтрокаРезультата.Расшифровка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяФункции, СтрокаРезультата.Расшифровка, Pow(10, -РазрядностьОкругления));
				СтрокаРезультата.ЧисловоеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяФункции, СтрокаРезультата.ЧисловоеПредставление, Pow(10, -РазрядностьОкругления));
			КонецЕсли;
			
			Если СтрокаРезультата.Количество = null Тогда
				Продолжить;
			КонецЕсли;
			
			Если Цел(СтрокаРезультата.Количество * Pow(10, РазрядностьОкругления)) = 0 Тогда
				
				Продолжить;
				
			КонецЕсли;
			
			Количество = Окр(СтрокаРезультата.Количество, РазрядностьОкругления);
			
			Если Параметры.РаспределитьПоРабочимДням И Не Параметры.КроссТаблица Тогда
				
				Если ЗначениеЗаполнено(Параметры.Склад) Тогда
					КалендарьСклада = КалендарьСкладаПлана;
				Иначе
					КалендарьСклада = СтрокаРезультата.СкладКалендарь;
				КонецЕсли; 
				
				Если Не ЗначениеЗаполнено(КалендарьСклада) Тогда
					
					КалендарьСклада = ОсновнойКалендарьПредприятия;
					
				КонецЕсли;
				
				ДлительностьПериода = ДлительностьПериода(Параметры.НачалоПериода, Параметры.ОкончаниеПериода, КалендарьСклада, ВыходныеДниКалендарей);
				РезультатРаспределения = Новый Массив;
				
				Пока Количество > 0 Цикл
					
					Пока ДлительностьПериода > 0 Цикл
						
						КоличествоКРаспределению = Окр(Цел(Количество * Pow(10, РазрядностьОкругления) / ДлительностьПериода) / Pow(10, РазрядностьОкругления), РазрядностьОкругления);
						
						Если КоличествоКРаспределению > 0 Тогда
							
							Прервать;
							
						Иначе
							
							ДлительностьПериода = ДлительностьПериода - 1;
							
						КонецЕсли;
						
					КонецЦикла;
					
					Если ДлительностьПериода = 0 Тогда
						
						Прервать;
						
					КонецЕсли;
					
					ИндексПериода = 0;
					
					Пока ИндексПериода < ДлительностьПериода Цикл
						
						Если ИндексПериода <= РезультатРаспределения.ВГраница() Тогда
							
							РезультатРаспределения[ИндексПериода] = РезультатРаспределения[ИндексПериода] + КоличествоКРаспределению;
							
						Иначе
							
							РезультатРаспределения.Вставить(ИндексПериода, КоличествоКРаспределению);
							
						КонецЕсли;
						
						Количество = Количество - КоличествоКРаспределению;
						ИндексПериода = ИндексПериода + 1;
						
					КонецЦикла;
					
				КонецЦикла;
				
				Если РезультатРаспределения.Количество() > 0 Тогда
					
					ДатаКалендаря = Параметры.НачалоПериода;
					
					Для каждого РаспределенноеКоличество Из РезультатРаспределения Цикл
						
						Пока Классификация.ЭтоВыходнойДень(ДатаКалендаря, КалендарьСклада, ВыходныеДниКалендарей) Цикл
							
							ДатаКалендаря = ДатаКалендаря + 86400;
							
						КонецЦикла;
						
						НоваяСтрока = ЗаполняемаяТЧ.Добавить();
						ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
						
						НоваяСтрока.Количество = РаспределенноеКоличество;
						НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
						
						НоваяСтрока[ИмяКолонкиПериода] = ДатаКалендаря;
						
						ДатаКалендаря = ДатаКалендаря + 86400;
						
					КонецЦикла;
					
				КонецЕсли;
				
			ИначеЕсли Параметры.КроссТаблица Тогда
				
				Если ЗначениеЗаполнено(СтрокаРезультата.Период) 
					И СтрокаРезультата.Период >= Параметры.НачалоПериода 
					И СтрокаРезультата.Период <= Параметры.ОкончаниеПериода Тогда
					
					// Распределять по периодам не требуется
					СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
				
					Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
						СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
					КонецЕсли;
					
					НоваяСтрока = ЗаполняемаяТЧ.Добавить();
					ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
					
					НоваяСтрока.Количество = Количество;
					НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
					НоваяСтрока[ИмяКолонкиПериода] = СтрокаРезультата.Период;
					
					Продолжить;
					
				ИначеЕсли ЗначениеЗаполнено(СтрокаРезультата.Период) Тогда
					// Исключаем строку т.к. не попадает в заданный период плана
					Продолжить;
					
				КонецЕсли; 
				
				Если СтрокаРезультата.Количество < 0 Тогда
					ЗнакКоличества = -1;
				Иначе
					ЗнакКоличества = 1;
				КонецЕсли;
				
				РаспределениеКоличества = Планирование.РаспределитьСуммуПропорциональноКоэффициентам(ЗнакКоличества * СтрокаРезультата.Количество, Коэффициенты, РазрядностьОкругления);
				Если РаспределениеКоличества = Неопределено Тогда
					СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
					
					Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
						СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
					КонецЕсли;
					
					Продолжить;
				КонецЕсли; 
				
				// При равномерном распределении остаток округления вычитается из первого элемента, поэтому обнуляем если ушел в минус.
				Если РаспределениеКоличества[0] < 0 Тогда
					РаспределениеКоличества[0] = 0;
				КонецЕсли;
				
				СтрокаРезультата.Расшифровка = "(" + СтрокаРезультата.Расшифровка + ") * " + НСтр("ru = 'Коэфф распределения'");
				СтрокаРезультата.ЧисловоеПредставление = "(" + СтрокаРезультата.ЧисловоеПредставление + ") * ";
				// Распределение производим начиная с последнего элемента, т.к. первый может быть меньше остальных.
				Индекс = РаспределениеКоличества.ВГраница();
				Пока Индекс >= 0 Цикл
				
					Количество = РаспределениеКоличества[Индекс];
					ДатаПериода = НайденныеСтрокиПериодов[НайденныеСтрокиПериодов.ВГраница() - Индекс].ДатаНачала;
					Индекс = Индекс - 1;
					
					Если Количество = 0 Тогда
						Продолжить;
					КонецЕсли;
					
					НоваяСтрока = ЗаполняемаяТЧ.Добавить();
					ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
					
					НоваяСтрока.Количество = ЗнакКоличества * Количество;
					НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
					НоваяСтрока[ИмяКолонкиПериода] = ДатаПериода;
					
					НоваяСтрока.Расшифровка = СтрокаРезультата.Расшифровка + " = "
						+ СтрокаРезультата.ЧисловоеПредставление
						+ Строка(Окр(НоваяСтрока.Количество/СтрокаРезультата.Количество, 3, 1))
						+ " = " + Строка(НоваяСтрока.Количество);
				КонецЦикла; 
				
			Иначе
				
				СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
				
				Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
					СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
				КонецЕсли;
				
				НоваяСтрока = ЗаполняемаяТЧ.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
				НоваяСтрока.Количество = Количество;
				НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
				НоваяСтрока[ИмяКолонкиПериода] = СтрокаРезультата.Период;
				
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(ЗаполняемаяТЧ, АдресХранилища);
	
КонецПроцедуры

// Процедура заполняет табличную часть документа из регистра
// Параметры:
//  Параметры  - Структура - Настройки для заполнения:
//  	* ЗаполняемаяТЧ - ТаблицаЗначений -
//  АдресХранилища - Строка - Адрес временного хранилища, в которое будет помещен результат работы задания.
//
Процедура ЗаполнитьДокументДляЗамещения(Знач Параметры, Знач АдресХранилища) Экспорт
	
	Если Не Параметры.Свойство("ЗаполнитьДляЗамещения") Тогда
		Возврат;
	КонецЕсли; 
	
	ИмяКолонкиПериода = "ДатаОтгрузки";
	
	Периоды = Параметры.Периоды;
	
	НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
	ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
	Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда 
		
		ПоместитьВоВременноеХранилище(Новый ТаблицаЗначений, АдресХранилища);
		Возврат;
		
	КонецЕсли;
	
	Параметры.Вставить("Периоды", Периоды); 
	
	ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
	
	КолонкаПериода = ЗаполняемаяТЧ.Колонки[ИмяКолонкиПериода]; // КолонкаТаблицыЗначений - 
	КолонкаПериода.Имя = "ПериодСостава";
	
	Результат = Планирование.ЗаполнитьДляЗамещения(Параметры);
	
	Если Результат.Колонки.Найти("ПериодСостава") = Неопределено Тогда
		Результат.Колонки.Добавить("ПериодСостава", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата))
	КонецЕсли; 
	
	Результат.Колонки["ПериодСостава"].Имя = ИмяКолонкиПериода;
	
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
	
КонецПроцедуры


#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

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

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

#КонецЕсли

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

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

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

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

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

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

#Область Проведение

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

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

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

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

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


Функция АдаптированныйТекстЗапросаДвиженийПоРегистру(ИмяРегистра) Экспорт

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

	Возврат Результат;

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

// Формирует запрос для расчета замещенных и замещающих планов
// 
// Параметры:
//  Параметры - Структура - Значения дополнительных реквизитов.
// 
// Возвращаемое значение:
//  Запрос
Функция ЗапросЗамещенныеИЗамещающиеПланы(Параметры) Экспорт

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

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

	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПланыПродажОбороты.Период КАК ПериодСостава,
	|	ПланыПродажОбороты.Сценарий КАК Сценарий,
	|	ПланыПродажОбороты.Статус КАК Статус,
	|	ПланыПродажОбороты.Номенклатура КАК Номенклатура,
	|	ПланыПродажОбороты.Характеристика КАК Характеристика,
	|	ПланыПродажОбороты.Назначение КАК Назначение,
	|	ПланыПродажОбороты.Подразделение КАК Подразделение,
	|	ПланыПродажОбороты.Склад КАК Склад,
	|	ПланыПродажОбороты.Партнер КАК Партнер,
	|	ПланыПродажОбороты.Соглашение КАК Соглашение,
	|	ПланыПродажОбороты.ФорматМагазина КАК ФорматМагазина,
	|	ПланыПродажОбороты.Менеджер КАК Менеджер,
	|	ПланыПродажОбороты.КоличествоОборот КАК КоличествоУпаковок,
	|	ПланыПродажОбороты.СуммаОборот КАК Сумма
	|ИЗ
	|	РегистрНакопления.ПланыПродаж.Обороты(
	|			&НачалоПериода,
	|			&КонецПериода,
	|			Запись,
	|			Сценарий = &Сценарий
	|				И ВидПлана = &ВидПлана
	|				И (&ЗаполнятьНазначениеВТЧ
	|					ИЛИ Назначение = &Назначение)
	|				И Статус В (&Статусы)
	|				И &ТекстЗапросаОтборСоглашение
	|				И &ТекстЗапросаОтборМенеджер
	|				И &ТекстЗапросаОтборПартнер
	|				И &ТекстЗапросаОтборПодразделение
	|				И &ТекстЗапросаОтборСклад
	|				И &ТекстЗапросаОтборФорматМагазина) КАК ПланыПродажОбороты";
		
	Запрос.УстановитьПараметр("КонецПериода",   Параметры.КонецПериодаСмещения);
	Запрос.УстановитьПараметр("НачалоПериода",  Параметры.НачалоПериодаСмещения);
	Запрос.УстановитьПараметр("Статусы",        Параметры.Статусы);
	Запрос.УстановитьПараметр("Сценарий",       Параметры.Сценарий);
	Запрос.УстановитьПараметр("ВидПлана",       Параметры.ВидПлана);
	
	Запрос.УстановитьПараметр("Менеджер",       Параметры.Менеджер);
	Запрос.УстановитьПараметр("Партнер",        Параметры.Партнер);
	Запрос.УстановитьПараметр("Подразделение",  Параметры.Подразделение);
	Запрос.УстановитьПараметр("Склад",          Параметры.Склад);
	Запрос.УстановитьПараметр("Соглашение",     Параметры.Соглашение);
	Запрос.УстановитьПараметр("ФорматМагазина", Параметры.ФорматМагазина);
	Запрос.УстановитьПараметр("ЗаполнятьНазначениеВТЧ", Параметры.ЗаполнятьНазначениеВТЧ);
	Запрос.УстановитьПараметр("Назначение",             Параметры.Назначение);
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"&ТекстЗапросаОтборМенеджер",
		?(ЗначениеЗаполнено(Параметры.Менеджер),"Менеджер = &Менеджер","Истина"));
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"&ТекстЗапросаОтборПартнер",
		?(ЗначениеЗаполнено(Параметры.Партнер),"Партнер = &Партнер","Истина"));
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"&ТекстЗапросаОтборПодразделение",
		?(ЗначениеЗаполнено(Параметры.Подразделение),"Подразделение = &Подразделение","Истина"));
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"&ТекстЗапросаОтборСклад",
		?(ЗначениеЗаполнено(Параметры.Склад),"Склад = &Склад","Истина"));
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"&ТекстЗапросаОтборСоглашение",
		?(ЗначениеЗаполнено(Параметры.Соглашение),"Соглашение = &Соглашение","Истина"));
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"&ТекстЗапросаОтборФорматМагазина",
		?(ЗначениеЗаполнено(Параметры.ФорматМагазина),"ФорматМагазина = &ФорматМагазина","Истина"));
	
	Возврат Запрос;
	
КонецФункции

// Инициализирует параметры, обслуживающие выбор назначений в формах документа.
//
//  Возвращаемое значение:
//  См. Справочники.Назначения.МакетФормыВыбораНазначений
//
Функция МакетФормыВыбораНазначений() Экспорт
	
	МакетФормы = Справочники.Назначения.МакетФормыВыбораНазначений();
	
	ШаблонНазначения = Справочники.Назначения.ДобавитьШаблонНазначений(МакетФормы);
	
	// Потребности в товарах на складе в шапке.
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.Товары.Назначение", "ОбеспечениеЗаказовСкладВШапке");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад И Объект.Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.Товары.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.Товары.Характеристика";
	ОписаниеКолонок.ПутиКДанным.Склад            = "Объект.Склад";
	
	// Потребности в товарах на складе в тч.
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.Товары.Назначение", "ОбеспечениеЗаказовСкладВТЧ");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСкладВТЧ И Объект.Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.Товары.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.Товары.Характеристика";
	ОписаниеКолонок.ПутиКДанным.Склад            = "Объект.Товары.Склад";
	
	// Потребности в товарах на всех складах.
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовВсеСклады", Истина, "Объект.Товары.Назначение", "ОбеспечениеЗаказовВсеСклады");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад = ЛОЖЬ И Объект.ВидПлана.ЗаполнятьСкладВТЧ = ЛОЖЬ И Объект.Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.Товары.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.Товары.Характеристика";
	
	// Потребности в работах в подразделении-получателе.
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовРаботами", Истина, "Объект.Товары.Назначение", "ОбеспечениеЗаказовРаботами");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьПодразделение И Объект.Товары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.Товары.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.Товары.Характеристика";
	ОписаниеКолонок.ПутиКДанным.Подразделение    = "Объект.Подразделение";
	
	// Потребности в товарах на складе в шапке(по периодам).
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.ТоварыПоПериодам.Назначение", "ОбеспечениеЗаказовПоПериодамСкладВШапке");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад И Объект.ТоварыПоПериодам.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.ТоварыПоПериодам.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.ТоварыПоПериодам.Характеристика";
	ОписаниеКолонок.ПутиКДанным.Склад            = "Объект.Склад";
	
	// Потребности в товарах на складе в тч (по периодам).
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.ТоварыПоПериодам.Назначение", "ОбеспечениеЗаказовПоПериодамСкладВТЧ");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСкладВТЧ И Объект.ТоварыПоПериодам.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.ТоварыПоПериодам.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.ТоварыПоПериодам.Характеристика";
	ОписаниеКолонок.ПутиКДанным.Склад            = "Объект.ТоварыПоПериодам.Склад";
	
	// Потребности в товарах на всех складах (по периодам).
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовВсеСклады", Истина, "Объект.ТоварыПоПериодам.Назначение", "ОбеспечениеЗаказовВсеСкладыПоПериодам");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад = ЛОЖЬ И Объект.ВидПлана.ЗаполнятьСкладВТЧ = ЛОЖЬ И Объект.ТоварыПоПериодам.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.ТоварыПоПериодам.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.ТоварыПоПериодам.Характеристика";
	
	// Потребности в работах в подразделении-получателе (по периодам).
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовРаботами", Истина, "Объект.ТоварыПоПериодам.Назначение", "ОбеспечениеЗаказовРаботамиПоПериодам");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьПодразделение И Объект.ТоварыПоПериодам.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.ТоварыПоПериодам.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.ТоварыПоПериодам.Характеристика";
	ОписаниеКолонок.ПутиКДанным.Подразделение    = "Объект.Подразделение";
	
	// Все назначения для поля Назначение в шапке документа.
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ВсеНазначения", Ложь, "Объект.Назначение");
	
	Возврат МакетФормы;
	
КонецФункции

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

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

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

Функция ДлительностьПериода(НачалоПериода, ОкончаниеПериода, Календарь, ВыходныеДниКалендарей)
	
	ДлительностьПериода = (ОкончаниеПериода - НачалоПериода) / 86400 + 1;
	ДатаКалендаря = НачалоПериода;
	
	Пока ДатаКалендаря <= ОкончаниеПериода Цикл
		
		Если Классификация.ЭтоВыходнойДень(ДатаКалендаря, Календарь, ВыходныеДниКалендарей) Тогда
			
			ДлительностьПериода = ДлительностьПериода - 1;
			
		КонецЕсли;
		
		ДатаКалендаря = ДатаКалендаря + 86400;
		
	КонецЦикла;
	
	Возврат ДлительностьПериода;
	
КонецФункции

#Область ЗагрузкаДанныхИзФайла

// Производит сопоставление данных, загружаемых в табличную часть ПолноеИмяТабличнойЧасти,
// с данными в ИБ, и заполняет параметры АдресТаблицыСопоставления и СписокНеоднозначностей.
// 
// Параметры:
// 	АдресЗагружаемыхДанных- Строка - адрес временного хранилища с таблицей значений, в которой
//                                   находятся загруженные данные из файла.
// 	АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений,
//                                       являющейся копией табличной части документа, 
//                                       которую необходимо заполнить из таблицы АдресЗагружаемыхДанных.
// 	СписокНеоднозначностей - ТаблицаЗначений - состоит из:
//  * Идентификатор - Число - идентификатор
//  * Колонка - Строка - имя колонки
// 	ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части
// 	ДополнительныеПараметры - Структура - дополнительные параметры, переданные из формы-источнике.
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
	Планирование.СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры);
КонецПроцедуры

Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
	Планирование.ЗаполнитьСписокНеоднозначностей(СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры);
КонецПроцедуры

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

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

// Заполняет список команд печати.
//
// Параметры:
//   КомандыПечати см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

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

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

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

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

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

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

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

Функция СоздатьПрисоединенныйФайлExcel(ДокументСсылка, ИдентификаторФормы) Экспорт
	
	ПараметрыПечати = Новый Структура;
	ПараметрыПечати.Вставить("ВыводитьШапку", Ложь);
	
	МассивДокументов = Новый Массив;
	МассивДокументов.Добавить(ДокументСсылка);
	
	ОбъектыПечати = Новый СписокЗначений;
	ОбъектыПечати.Добавить(ДокументСсылка);
	
	ТабличныйДокумент = СформироватьПечатнуюФормуПлана(МассивДокументов, ОбъектыПечати, ПараметрыПечати);
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS97);
	
	АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), ИдентификаторФормы);
	ТекущаяДата = ТекущаяДатаСеанса();
	
	ПараметрыФайла = Новый Структура();
	ПараметрыФайла.Вставить("Автор", Пользователи.АвторизованныйПользователь());
	ПараметрыФайла.Вставить("ВладелецФайлов", ДокументСсылка);
	ПараметрыФайла.Вставить("ИмяБезРасширения", "Excel" + " " + Формат(ТекущаяДата, НСтр("ru = 'ДФ=''dd.MM.yyyy ЧЧ.мм.сс'''")));
	ПараметрыФайла.Вставить("РасширениеБезТочки", "xls");
	ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяДата);
	
	Файл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище, Неопределено);
	
	УдалитьФайлы(ИмяВременногоФайла);
	
	Если Файл <> Неопределено Тогда
		РаботаСФайламиСлужебный.ЗанятьФайлДляРедактированияСервер(Файл);
		ДанныеФайла = РаботаСФайлами.ДанныеФайла(Файл, ИдентификаторФормы, Истина);
		СтруктураДействийExcel = Новый Структура;
		СтруктураДействийExcel.Вставить("AutoFilter", Новый Структура("СтрокаНачало, КолонкаНачало", 2, 2));
		
		// Скрытие колонок с идентификаторами номенклатуры и характеристик, упаковки, партнера, соглашения, склада.
		МассивКолонок = Новый Массив;
		МассивКолонок.Добавить(3);
		МассивКолонок.Добавить(4);
		МассивКолонок.Добавить(5);
		МассивКолонок.Добавить(6);
		МассивКолонок.Добавить(7);
		МассивКолонок.Добавить(8);
		МассивКолонок.Добавить(9);
		СтруктураДействийExcel.Вставить("HiddenColumns", МассивКолонок);
		
		Возврат Новый Структура("ДанныеФайла, Файл, СтруктураДействийExcel", ДанныеФайла, Файл, СтруктураДействийExcel);
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

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

#Область ТекущиеДела

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

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

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

#КонецЕсли

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