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