Коммерческое предложение клиенту / Модуль менеджера

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

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

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

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

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

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

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

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

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

#Область ИнтеграцияШаблоныСообщений

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

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

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

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

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

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

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

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

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

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

// ЭлектронноеВзаимодействие.ОбменСКонтрагентами

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

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

// Конец ЭлектронноеВзаимодействие.ОбменСКонтрагентами

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

// ЭлектронноеВзаимодействие.ОбменСКонтрагентами

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

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

// Конец ЭлектронноеВзаимодействие.ОбменСКонтрагентами

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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

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

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

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

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

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

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

#Область Товары

	ЕстьСкидки = Ложь;
	ДанныеОбъекта.Вставить("СуммаВсего", 0);
	ДанныеОбъекта.Вставить("СуммаВсегоНДС", 0);
	ДанныеОбъекта.Вставить("КоличествоТоваров", 0);
	ДанныеОбъекта.Вставить("Товары", Новый Массив);
	
	Для Каждого СтрокаТовары Из ТаблицаТовары Цикл
		
		Если СтрокаТовары.СуммаСкидки <> 0 Тогда
			ЕстьСкидки = Истина;
		КонецЕсли;
		
		ДанныеОбъекта.СуммаВсего        = ДанныеОбъекта.СуммаВсего + СтрокаТовары.Сумма;
		ДанныеОбъекта.СуммаВсегоНДС     = ДанныеОбъекта.СуммаВсегоНДС + СтрокаТовары.СуммаНДС;
		ДанныеОбъекта.КоличествоТоваров = ДанныеОбъекта.КоличествоТоваров + 1;
		
		СтрокаТаблицыТовары = Новый Структура;
		
		НаименованиеТовара = КоммерческиеПредложенияДокументыКлиентСервер.ПредставлениеНоменклатурыДляПечати(СтрокаТовары.Номенклатура, СтрокаТовары.Характеристика);
		
		СтрокаТаблицыТовары.Вставить("НомерСтроки",      СтрокаТовары.НомерСтроки);
		СтрокаТаблицыТовары.Вставить("Номенклатура",     НаименованиеТовара);
		СтрокаТаблицыТовары.Вставить("Количество",       СтрокаТовары.Количество);
		СтрокаТаблицыТовары.Вставить("ЕдиницаИзмерения", СтрокаТовары.ЕдиницаИзмерения);
		СтрокаТаблицыТовары.Вставить("Цена",             Формат(СтрокаТовары.Цена,"ЧДЦ=2; ЧРД=."));
		СтрокаТаблицыТовары.Вставить("СуммаСНДС",        Формат(СтрокаТовары.СуммаСНДС,"ЧДЦ=2; ЧРД=."));
		СтрокаТаблицыТовары.Вставить("СуммаСкидки",      Формат(СтрокаТовары.СуммаСкидки,"ЧДЦ=2; ЧРД=."));
		СтрокаТаблицыТовары.Вставить("СрокПоставки",     КоммерческиеПредложенияДокументыКлиентСервер.СрокПоставкиСтрокой(ДанныеШапки.ВариантУказанияСрокаПоставки, 
		                                                                                                                  СтрокаТовары.СрокПоставки));
		
		КоммерческиеПредложенияДокументыПереопределяемый.ДополнитьДанныеОбъектаДляПечати(СтрокаТаблицыТовары, СтрокаТовары, ДанныеОбъекта);
		
		ДанныеОбъекта.Товары.Добавить(СтрокаТаблицыТовары);
		
	КонецЦикла;

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

#Область ЗаполнениеДанныхОбъекта 

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

Функция ПредставлениеКлиента(Клиент, Контрагент)
	
	Возврат КоммерческиеПредложенияДокументы.ПредставлениеПартнераКонтрагента(Клиент, Контрагент);
	
КонецФункции

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

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

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

// ЭлектронноеВзаимодействие.ОбменСКонтрагентами

#Область ЗаполнениеЭД

Процедура УстановитьДанныеДополнительнаяИнформация(ДанныеДокумента, СсылкаНаОбъект, ДополнительнаяИнформацияHTML)
	
	ЭлектронноеВзаимодействие.ЗаполнитьЗначениеРеквизитаВДереве(ДанныеДокумента, "ДополнительнаяИнформация.ФорматированныйТекст.ТекстHTML", ДополнительнаяИнформацияHTML); 
	
	ТаблицаПрисоединенныхФайлов = КоммерческиеПредложенияДокументы.ТаблицаПрисоединенныхФайловДляЭД(СсылкаНаОбъект, Истина);
	ТаблицаПрисоединенныхФайлов.Колонки.Добавить("ДвоичныеДанные");
	ТаблицаПрисоединенныхФайлов.Колонки.Добавить("ContentID");
	
	Для Каждого Файл Из ТаблицаПрисоединенныхФайлов Цикл
		
		Файл.ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(Файл.Ссылка);
		Файл.ContentID      = СтрЗаменить(Прав(Файл.ИмяФайла, СтрДлина(Файл.ИмяФайла) - 1), "_", "-");
		
	КонецЦикла;
	
	Если ТаблицаПрисоединенныхФайлов.Количество() > 0 Тогда 
		ЭлектронноеВзаимодействие.ЗагрузитьТаблицуВДерево(ДанныеДокумента, ТаблицаПрисоединенныхФайлов,
			"ДополнительнаяИнформация.ФорматированныйТекст.ПрисоединенныеФайлы");
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

Функция ЗначенияПолейНоменклатуры(РезультатЗапроса)
	
	МассивСтрок = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Номенклатура");
	ПоляЗаполнения = Новый Структура("НоменклатураСсылка, НоменклатураНаименование");
	ЗначенияПолейНоменклатуры = КоммерческиеПредложенияДокументы.КонструкторЗначенияПолей(МассивСтрок, ПоляЗаполнения);
	КоммерческиеПредложенияДокументыПереопределяемый.ЗаполнитьДанныеНоменклатуры(МассивСтрок, ЗначенияПолейНоменклатуры);

	Возврат ЗначенияПолейНоменклатуры;
	
КонецФункции

Функция ЗначенияПолейХарактеристик(РезультатЗапроса)
	
	МассивСтрок = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Характеристика");
	ПоляЗаполнения = Новый Структура("ХарактеристикаСсылка, ХарактеристикаНаименование");
	ЗначенияПолейХарактеристик = КоммерческиеПредложенияДокументы.КонструкторЗначенияПолей(МассивСтрок, ПоляЗаполнения);
	КоммерческиеПредложенияДокументыПереопределяемый.ЗаполнитьДанныеХарактеристикНоменклатуры(МассивСтрок, ЗначенияПолейХарактеристик);
	
	Возврат ЗначенияПолейХарактеристик;
	
КонецФункции

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

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

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

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

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

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

// Конец ЭлектронноеВзаимодействие.ОбменСКонтрагентами

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

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

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

#КонецЕсли

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