Запрос коммерческих предложений у поставщиков / Модуль менеджера

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// См. ЭлектронноеВзаимодействие.ПриЗаполненииСписковСОграничениемДоступа
Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт
	
	Списки.Вставить(Метаданные.Документы.ЗапросКоммерческихПредложенийПоставщиков, Истина);
	Списки.Вставить(Метаданные.Справочники.ЗапросКоммерческихПредложенийПоставщиковПрисоединенныеФайлы, Истина);
	
КонецПроцедуры

// См. ЭлектронноеВзаимодействие.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных
Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт
	
	КоммерческиеПредложенияДокументыПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(
		"Документ.ЗапросКоммерческихПредложенийПоставщиков", Описание);
	КоммерческиеПредложенияДокументыПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(
		"Справочник.ЗапросКоммерческихПредложенийПоставщиковПрисоединенныеФайлы", Описание);
	
КонецПроцедуры

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	
	КоммерческиеПредложенияДокументыПереопределяемый.ПриЗаполненииОграниченияДоступа(
		"Документ.ЗапросКоммерческихПредложенийПоставщиков", Ограничение);
	
КонецПроцедуры

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

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

#Область КомандыСозданияНаОсновании

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

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

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

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

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

// Возвращает статус запроса коммерческого приложения по умолчанию
Функция СтатусПоУмолчанию() Экспорт
	
	Возврат Перечисления.СостоянияЗапросаКоммерческихПредложений.Подготовка;
	
КонецФункции

// Вызывается для определения событий которые поддерживает текущая версия документа
// 
// Параметры:
//  ОбработчикиСобытийПереопределяемые - Структура - доступные события документа.
//
Процедура ОбработчикиСобытийКоммерческихПредложений(ОбработчикиСобытийПереопределяемые) Экспорт
	
	ОбработчикиСобытийПереопределяемые["ПослеВыполненияСинхронизации"] = Истина;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

		ДанныеФайла.Свойство("Наименование", НовыйФайл.ИмяФайла);
		ДанныеФайла.Свойство("Расширение", НовыйФайл.РасширениеФайла);
		ДанныеФайла.Свойство("Размер", НовыйФайл.Размер);
		
	КонецЦикла;
	
	Если Файлы.Количество() > 0 Тогда 
		ЭлектронноеВзаимодействие.ЗагрузитьТаблицуВДерево(ДанныеДокумента, Файлы, "ПрисоединенныеФайлы");
	КонецЕсли;
	
КонецПроцедуры

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

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

// Вычитает сумму скидки из переданного значения.
//
// Параметры:
//  ПроцентСкидки - Число - размер скидки в процентах.
//  Сумма - Число - сумма, из которой необходимо вычесть скидку.
//
// Возвращаемое значение:
//   Сумма за вычетом скидки.
//
Функция СуммаЗаВычетомСкидки(ПроцентСкидки, Сумма) Экспорт
	
	Возврат Окр(Сумма * (100 - ПроцентСкидки) / 100, 2);
	
КонецФункции

// Вычитает НДС из переданного значения.
//
// Параметры:
//  СтавкаНДС - ЛюбаяСсылка - ссылка на значение ставки НДС.
//  Сумма - Число - сумма, из которой необходимо вычесть НДС.
//
// Возвращаемое значение:
//   Сумма за вычетом НДС.
//
Функция ИсключитьНДСИзСуммы(Сумма, СтавкаНДС) Экспорт
	
	ЗначениеСтавки = ОбменСКонтрагентамиИнтеграция.ЗначениеСтавкиНДСИзПеречисления(СтавкаНДС);
	
	НДС = Сумма / (1 + ЗначениеСтавки) * ЗначениеСтавки;
	
	СуммаБезНДС = Сумма - НДС;
	
	Возврат  Окр(СуммаБезНДС, 2);
	
КонецФункции

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

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

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

	Товары = ПараметрыПроцедуры.Товары.Скопировать();
	Товары.Индексы.Добавить(СтрСоединить(КолонкиИндексаТоваров, ","));

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

		Если ЕстьИдентификаторПредложенияСервиса Тогда
			ИдентификаторПредложенияВСервисе = СтрокаКонтрагента.ИдентификаторПредложенияСервиса;
			КоммерческоеПредложениеСсылка = КоммерческиеПредложенияПоставщиков.Получить(СтрокаКонтрагента.ИдентификаторПредложенияСервиса);
		Иначе
			ИдентификаторПредложенияВСервисе = "";
			КоммерческоеПредложениеСсылка = КоммерческиеПредложенияПоставщиков.Получить(СтрокаКонтрагента.Контрагент);
		КонецЕсли;

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

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

	Если ЗначениеЗаполнено(Менеджер) Тогда
		ОтборКИ = УправлениеКонтактнойИнформацией.ОтборКонтактнойИнформации();
		ОтборКИ.ТипыКонтактнойИнформации.Добавить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
		ОтборКИ.ТипыКонтактнойИнформации.Добавить(Перечисления.ТипыКонтактнойИнформации.Телефон);
		КонтактнаяИнформация = УправлениеКонтактнойИнформацией.КонтактнаяИнформация(Менеджер, ОтборКИ);

		СтрокаКИ = КонтактнаяИнформация.Найти(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, "Тип");
		Если СтрокаКИ <> Неопределено Тогда
			Email = СтрокаКИ.Представление;
		Иначе
			Email = "";
		КонецЕсли;
		СтрокаКИ = КонтактнаяИнформация.Найти(Перечисления.ТипыКонтактнойИнформации.Телефон, "Тип");
		Если СтрокаКИ <> Неопределено Тогда
			НомерТелефона = СтрокаКИ.Представление;
		Иначе
			НомерТелефона = "";
		КонецЕсли;
	Иначе
		Email = "";
		НомерТелефона = "";
	КонецЕсли;

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

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

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

Процедура ПересчитатьСуммыТаблицыВВалюту(Таблица, Знач СтараяВалюта, Знач НоваяВалюта, Знач ДатаКурса)

	СуммаКРаспределению = РаботаСКурсамиВалют.ПересчитатьВВалюту(Таблица.Итог("СуммаВВалютеЗапроса"),
		СтараяВалюта, НоваяВалюта, ДатаКурса);

	МассивСумм = Новый Массив;
	Для НомерСтроки = 0 По Таблица.Количество()-1 Цикл
		
		СтрокаТаблицы = Таблица[НомерСтроки];
		СтрокаТаблицы.ЦенаВВалютеЗапроса = РаботаСКурсамиВалют.ПересчитатьВВалюту(
			СтрокаТаблицы.ЦенаВВалютеЗапроса, СтараяВалюта, НоваяВалюта, ДатаКурса);
		
		МассивСумм.Добавить(РаботаСКурсамиВалют.ПересчитатьВВалюту(СтрокаТаблицы.СуммаВВалютеЗапроса,
			СтараяВалюта, НоваяВалюта, ДатаКурса));
			
	КонецЦикла;
	
	МассивСумм = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(СуммаКРаспределению, МассивСумм);
	
	Если МассивСумм <> Неопределено Тогда
		
		Для НомерСтроки = 0 По Таблица.Количество()-1 Цикл
			СтрокаТаблицы = Таблица[НомерСтроки];
			
			СтрокаТаблицы.СуммаВВалютеЗапроса = МассивСумм[НомерСтроки];
			
		КонецЦикла;
		
	КонецЕсли;

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

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

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

Функция ПредставлениеУсловийПоставки(ДанныеОбъекта)

	ПредставлениеУсловийПоставки = "";
	
	Если Не ПустаяСтрока(ДанныеОбъекта.УсловияОплатыТекст) Тогда
		УсловияОплаты = СтрШаблон(НСтр("ru = 'Оплата: %1'"), ДанныеОбъекта.УсловияОплатыТекст);
		ПредставлениеУсловийПоставки = УсловияОплаты;
	КонецЕсли;
	
	Если Не ПустаяСтрока(ДанныеОбъекта.УсловиеПоставкиТекст) Тогда
		
		УсловияДоставки = СтрШаблон(НСтр("ru = 'Поставка: %1'"), ДанныеОбъекта.УсловиеПоставкиТекст);
		ПредставлениеУсловийПоставки = ПредставлениеУсловийПоставки 
		                              + ?(ПустаяСтрока(ПредставлениеУсловийПоставки), "", Символы.ПС)
		                              + УсловияДоставки;
		
	КонецЕсли;
	
	Если Не ПустаяСтрока(ДанныеОбъекта.ПрочаяДополнительнаяИнформацияТекст) Тогда
		
		Если ПустаяСтрока(ПредставлениеУсловийПоставки) Тогда
			ПрочиеУсловия = ДанныеОбъекта.ПрочаяДополнительнаяИнформацияТекст;
		Иначе
			ПрочиеУсловия = СтрШаблон(НСтр("ru = 'Прочее: %1'"), ДанныеОбъекта.ПрочаяДополнительнаяИнформацияТекст);
		КонецЕсли;
		
		ПредставлениеУсловийПоставки = ПредставлениеУсловийПоставки 
		                              + ?(ПустаяСтрока(ПредставлениеУсловийПоставки), "", Символы.ПС)
		                              + ПрочиеУсловия;
		
	КонецЕсли;
	
	Возврат ПредставлениеУсловийПоставки;

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

Функция КонтактнаяИнформацияЗаявки(ДанныеОбъекта)
	
	КонтактнаяИнформацияОрганизации   = "";
	
	Если ЗначениеЗаполнено(ДанныеОбъекта.Организация) Тогда
		
		Если ДанныеОбъекта.Свойство("ЮридическийАдрес") И Не ПустаяСтрока(ДанныеОбъекта.ЮридическийАдрес) Тогда
			ПредставлениеАдресаОрганизации  = СтрШаблон(ШаблонПредставленияАдреса(), ДанныеОбъекта.ЮридическийАдрес);
			КонтактнаяИнформацияОрганизации = КонтактнаяИнформацияОрганизации + Символы.ПС +  ПредставлениеАдресаОрганизации;
		КонецЕсли;
		
		Если ДанныеОбъекта.Свойство("Телефоны") И Не ПустаяСтрока(ДанныеОбъекта.Телефоны) Тогда
			ПредставлениеТелефонаОрганизации = СтрШаблон(ШаблонПредставлениеТелефона(), ДанныеОбъекта.Телефоны);
			КонтактнаяИнформацияОрганизации = КонтактнаяИнформацияОрганизации + Символы.ПС + ПредставлениеТелефонаОрганизации;
		КонецЕсли;
		
		Если ДанныеОбъекта.Свойство("ЭлектроннаяПочта") И Не ПустаяСтрока(ДанныеОбъекта.ЭлектроннаяПочта) Тогда
			ПредставлениеАдресЭПОрганизации = СтрШаблон(ШаблонПредставлениеEmail(), ДанныеОбъекта.ЭлектроннаяПочта);
			КонтактнаяИнформацияОрганизации = КонтактнаяИнформацияОрганизации + Символы.ПС + ПредставлениеАдресЭПОрганизации;
		КонецЕсли;
		
		Если Не ПустаяСтрока(КонтактнаяИнформацияОрганизации) Тогда
			КонтактнаяИнформацияОрганизации = НСтр("ru = 'Контактная информация организации:'") + КонтактнаяИнформацияОрганизации;
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат КонтактнаяИнформацияОрганизации;
	
КонецФункции

Функция ШаблонПредставленияАдреса()
	
	Возврат Символы.Таб + НСтр("ru = 'Адрес: %1.'");
	
КонецФункции

Функция ШаблонПредставлениеТелефона()
	
	Возврат Символы.Таб + НСтр("ru = 'Тел.: %1.'");
	
КонецФункции

Функция ШаблонПредставлениеEmail()
	
	Возврат Символы.Таб + НСтр("ru = 'Эл. почта: %1.'");
	
КонецФункции

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

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

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

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

#КонецЕсли

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