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