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