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