#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ПолучениеДанныхИнформационнойБазы
Функция МинимальныйИМаксимальныйЗапасы(Товар) Экспорт
МетодПоСтатистике = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике");
МетодПоНорме = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоНорме");
Если Товар.МетодОбеспечения = МетодПоСтатистике Или Товар.МетодОбеспечения = МетодПоНорме Тогда
СрокПоставки = Товар.СрокПоставки;
ОбеспечиваемыйПериод = Товар.ОбеспечиваемыйПериод;
МинимальныйЗапас = Товар.СреднедневноеПотребление * СрокПоставки;
МаксимальныйЗапас = Товар.СреднедневноеПотребление * ОбеспечиваемыйПериод;
Если Товар.ТипЕдиницыИзмерения = Перечисления.ТипыИзмеряемыхВеличин.КоличествоШтук Тогда
Если Цел(МинимальныйЗапас) <> МинимальныйЗапас Тогда
МинимальныйЗапас = 1 + Цел(МинимальныйЗапас);
КонецЕсли;
Если Цел(МаксимальныйЗапас) <> МаксимальныйЗапас Тогда
МаксимальныйЗапас = 1 + Цел(МаксимальныйЗапас);
КонецЕсли;
КонецЕсли;
МинимальныйЗапас = МинимальныйЗапас + Товар.СтраховойЗапас;
МаксимальныйЗапас = МаксимальныйЗапас + Товар.СтраховойЗапас;
Иначе
МинимальныйЗапас = Товар.МинимальныйЗапас;
МаксимальныйЗапас = Товар.МаксимальныйЗапас;
КонецЕсли;
Возврат Новый Структура("МинимальныйЗапас,МаксимальныйЗапас", МинимальныйЗапас, МаксимальныйЗапас);
КонецФункции
Функция УровеньЗапасаИКартинкаСменитьМетод(Товар) Экспорт
МетодПоСтатистике =
Товар.МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике");
УровеньЗапаса =
?(Товар.Остаток - Товар.МинимальныйЗапас < 0, 1,
?(Товар.Остаток - 2 * Товар.МинимальныйЗапас < 0, 2,
?(Товар.Остаток < Товар.МаксимальныйЗапас / 2, 4,
7)));
УровеньЗапасаМаксимум =
?(Товар.Остаток > Товар.МаксимальныйЗапас, 6,
?(Товар.Остаток >= Товар.МаксимальныйЗапас / 2, 5,
7));
ТочкаЗаказаКартинка = Товар.Остаток - Товар.МинимальныйЗапас < 0;
КОтменеЗаказаКартинка = Товар.ЗаказыКпоступлению + Товар.Остаток - Товар.МинимальныйЗапас > Товар.МаксимальныйЗапас
И Товар.ЗаказыКпоступлению > 0;
КартинкаСменитьМетод =
?(Товар.ПотреблениеСтабильно И Не МетодПоСтатистике, 0,
?(Не Товар.ПотреблениеСтабильно И МетодПоСтатистике, 1,
?(Товар.ПотреблениеСтабильно И МетодПоСтатистике, -1,
?(Не Товар.ПотреблениеСтабильно И Не МетодПоСтатистике, -1,
-2))));
Результат = Новый Структура();
Результат.Вставить("УровеньЗапаса", УровеньЗапаса);
Результат.Вставить("УровеньЗапасаМаксимум", УровеньЗапасаМаксимум);
Результат.Вставить("КартинкаСменитьМетод", КартинкаСменитьМетод);
Результат.Вставить("ТочкаЗаказаКартинка", ТочкаЗаказаКартинка);
Результат.Вставить("КОтменеЗаказаКартинка", КОтменеЗаказаКартинка);
Возврат Результат;
КонецФункции
Функция КоличествоКЗаказуДляПоддержанияЗапаса(Товар) Экспорт
ДоТочкиЗаказа = Товар.Остаток - Товар.МинимальныйЗапас;
ВосполнениеСтраховогоЗапаса = Мин(Товар.СтраховойЗапас, Макс(0, -ДоТочкиЗаказа));
КЗаказу = Макс(0, Товар.МаксимальныйЗапас - Товар.СтраховойЗапас - Товар.ЗаказыКпоступлению - Макс(0, ДоТочкиЗаказа) + ВосполнениеСтраховогоЗапаса)
+ Макс(0, Мин(Товар.РезервыНаСкладе, -Товар.Остаток));
ДатаЗаказаНаступила = Товар.КЗаказуТовары = 1;
ТочкаЗаказаНаступила = ДоТочкиЗаказа <= 0;
Отметка = Товар.КЗаказуТовары <> 2 И (ДатаЗаказаНаступила Или ТочкаЗаказаНаступила) И КЗаказу > 0;
Результат = Новый Структура();
Результат.Вставить("КЗаказу", КЗаказу);
Результат.Вставить("Отметка", Отметка);
Результат.Вставить("ДатаЗаказаНаступила", ДатаЗаказаНаступила);
Результат.Вставить("ТочкаЗаказаНаступила", ТочкаЗаказаНаступила);
Результат.Вставить("ДоТочкиЗаказа", ДоТочкиЗаказа);
Возврат Результат;
КонецФункции
Функция КоличествоКЗаказуДляОбеспеченияЗаказов(Товар) Экспорт
КЗаказу = Товар.Требуется - Товар.КРезервированию;
Отметка = Товар.КЗаказуТовары <> 2
И КЗаказу > 0
И (Товар.ДатаПоставкиРасчетная = Товар.ДатаПоставкиПоСпособуОбеспечения
Или Товар.ДатаПоставкиРасчетная = '00010101'
Или Товар.ДатаПоставкиПоСпособуОбеспечения = '00010101');
Результат = Новый Структура();
Результат.Вставить("КЗаказу", КЗаказу);
Результат.Вставить("Отметка", Отметка);
Возврат Результат;
КонецФункции
#КонецОбласти
Функция СтатистикаПотребления(Параметры, АдресРезультата) Экспорт
Запрос = Новый Запрос();
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| &Номенклатура КАК Номенклатура,
| &Характеристика КАК Характеристика,
| &Склад КАК Склад
|ПОМЕСТИТЬ ВтТовары";
Для Каждого Свойство Из Параметры.КлючПотребности Цикл
Запрос.УстановитьПараметр(Свойство.Ключ, Свойство.Значение);
КонецЦикла;
Запрос.Выполнить();
УстановитьПривилегированныйРежим(Истина);
Запрос.УстановитьПараметр("НачалоТекущегоДня", НачалоДня(ТекущаяДатаСеанса()));
ОбеспечениеСервер.УстановитьПараметрыЗапросаРасчетаСтатистики(Запрос);
ОбеспечениеСервер.ДобавитьВременнуюТаблицуСтатистикиПотребления(Запрос, "ВтТовары");
УстановитьПривилегированныйРежим(Ложь);
Запрос.Текст =
"ВЫБРАТЬ
| Статистика.СреднедневноеПотребление КАК СреднедневноеПотребление,
| Статистика.ДисперсияПотребления КАК ДисперсияПотребления,
| Статистика.ПотреблениеСтабильно КАК ПотреблениеСтабильно,
|
| Статистика.Потребление КАК Потребление,
| Статистика.ДатаНачалаПериода КАК ДатаНачалаПериода,
| Статистика.ДатаОкончанияПериода КАК ДатаОкончанияПериода
|ИЗ
| ВтСтатистикаПотребления КАК Статистика";
Выборка = Запрос.Выполнить().Выбрать();
Результат = Новый Структура("СреднедневноеПотребление, СреднееОтклонение, ПотреблениеСтабильно, ДанныеЗаПериод");
Если Выборка.Следующий() Тогда
Результат.СреднедневноеПотребление = Выборка.СреднедневноеПотребление;
Если ЗначениеЗаполнено(Выборка.ДисперсияПотребления) И Выборка.ДисперсияПотребления > 0 Тогда
Результат.СреднееОтклонение = Pow(Выборка.ДисперсияПотребления, 0.5);
КонецЕсли;
Результат.ПотреблениеСтабильно = Выборка.ПотреблениеСтабильно;
Результат.ДанныеЗаПериод = Новый СтандартныйПериод(Выборка.ДатаНачалаПериода, Выборка.ДатаОкончанияПериода);
КонецЕсли;
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
КонецФункции
#Область СтруктурыДанных
Функция ПоляТаблицыЗаказы(Секции) Экспорт
Поля = Новый Структура();
Если СтрНайти(Секции, "СвойстваПотребности") Тогда
Поля.Вставить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Поля.Вставить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
Поля.Вставить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады"));
Поля.Вставить("ПодразделениеПолучатель", Новый ОписаниеТипов("СправочникСсылка.СтруктураПредприятия"));
Поля.Вставить("Назначение", Новый ОписаниеТипов("СправочникСсылка.Назначения"));
КонецЕсли;
Если СтрНайти(Секции, "РеквизитыЗаказаКОбеспечению") Тогда
Поля.Вставить("Заказ", Метаданные.ОпределяемыеТипы.ОжидаемаяОтгрузка.Тип);
Поля.Вставить("ДатаОтгрузки", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата));
КонецЕсли;
Если СтрНайти(Секции, "РеквизитыОбеспечивающегоЗаказа") Тогда
Поля.Вставить("ТипОбеспечения", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыОбеспечения"));
Поля.Вставить("ИсточникОбеспечения", Новый ОписаниеТипов("СправочникСсылка.Склады, СправочникСсылка.Партнеры, СправочникСсылка.СтруктураПредприятия"));
Поля.Вставить("Соглашение", Новый ОписаниеТипов("СправочникСсылка.СоглашенияСПоставщиками"));
Поля.Вставить("СпособОбеспечения", Новый ОписаниеТипов("СправочникСсылка.СпособыОбеспеченияПотребностей"));
Поля.Вставить("ВидЦены", Новый ОписаниеТипов("СправочникСсылка.ВидыЦенПоставщиков"));
Поля.Вставить("ДатаПоставки", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата));
Поля.Вставить("КЗаказу", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(15, 3));
КонецЕсли;
Возврат Поля;
КонецФункции
Функция ПоляТаблицыЗапасы(Секции) Экспорт
Поля = Новый Структура();
Если СтрНайти(Секции, "СвойстваПотребности") Тогда
Поля.Вставить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Поля.Вставить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
Поля.Вставить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады"));
КонецЕсли;
Если СтрНайти(Секции, "РеквизитыОбеспечивающегоЗаказа") Тогда
Поля.Вставить("ТипОбеспечения", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыОбеспечения"));
Поля.Вставить("ИсточникОбеспечения", Новый ОписаниеТипов("СправочникСсылка.Склады, СправочникСсылка.Партнеры, СправочникСсылка.СтруктураПредприятия"));
Поля.Вставить("Соглашение", Новый ОписаниеТипов("СправочникСсылка.СоглашенияСПоставщиками"));
Поля.Вставить("СпособОбеспечения", Новый ОписаниеТипов("СправочникСсылка.СпособыОбеспеченияПотребностей"));
Поля.Вставить("ВидЦены", Новый ОписаниеТипов("СправочникСсылка.ВидыЦенПоставщиков"));
Поля.Вставить("ДатаПоставки", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата));
Поля.Вставить("КЗаказу", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(15, 3));
КонецЕсли;
Возврат Поля;
КонецФункции
Функция ЗаполнитьИПровестиДокумент(МенеджерДокументов, ДанныеЗаполнения, Статус, СообщенияОбОшибках) Экспорт
ДокументОбъект = МенеджерДокументов.СоздатьДокумент();
ДанныеЗаполнения.Вставить("Дата", ТекущаяДатаСеанса());
ДанныеЗаполнения.Вставить("Статус", Статус);
ДокументОбъект.Заполнить(ДанныеЗаполнения);
ЗаписатьДокумент(ДокументОбъект, СообщенияОбОшибках);
Возврат ДокументОбъект;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область СлужебныйПрограммныйИнтерфейс
Процедура ТаблицаСпособовОбеспечения(Параметры, АдресРезультата) Экспорт
Если Параметры.СпособОбеспечения = Неопределено Тогда
СхемаКомпоновкиДанных = Обработки.ОбеспечениеПотребностей.ПолучитьМакет("МакетКомпоновкиДляСерверныхОтборов");
СхемаКомпоновкиДанных.НаборыДанных.Набор.Запрос = ВременнаяТаблицаСпособовОбеспечения(Параметры.ТоварыПоддерживаемогоЗапаса);
АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных);
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
КомпоновщикНастроек.ЗагрузитьНастройки(Параметры.Настройки);
КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);
Запрос = ПолучитьЗапросСОтборамиКомпоновкиДанных(АдресСхемыКомпоновкиДанных, КомпоновщикНастроек, "Набор");
УдалитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных);
НачалоДня = НачалоДня(ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("НачалоТекущегоДня", НачалоДня);
Запрос.УстановитьПараметр("ДоступныеТипыОбеспечения", ДоступныеТипыОбеспечения());
Запрос.УстановитьПараметр("ФОЗаказыНаПеремещенияВключена",
ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыНаПеремещение"));
Запрос.УстановитьПараметр("ФОПроизводство2_2Включена",
ПолучитьФункциональнуюОпцию("ИспользоватьУправлениеПроизводством2_2"));
Запрос.УстановитьПараметр("ОптимизироватьЗапасыРаспределительногоЦентра",
Константы.ОптимизироватьЗапасыРаспределительногоЦентра.Получить());
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
ПозицияУдаления = СтрНайти(Запрос.Текст, "УНИЧТОЖИТЬ ВтФорматыСкладов");
Позиция = СтрНайти(Запрос.Текст, ";", НаправлениеПоиска.СНачала, ПозицияУдаления) + 1;
ТекстЗапросаПривилегированно = Сред(Запрос.Текст, Позиция);
Запрос.Текст = Лев(Запрос.Текст, ПозицияУдаления - 1);
Запрос.Выполнить();
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика
|ПОМЕСТИТЬ РазличнаяНоменклатура
|ИЗ
| ВтПотребности КАК Таблица
|ГДЕ
| &ОптимизироватьЗапасыРаспределительногоЦентра
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,Характеристика";
Запрос.Выполнить();
РегистрыСведений.СхемыОбеспечения.ВременнаяТаблицаТопологияСкладов(Запрос, "РазличнаяНоменклатура");
УстановитьПривилегированныйРежим(Истина);
Запрос.Текст = ТекстЗапросаПривилегированно;
Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);
Иначе
НачалоДня = НачалоДня(ТекущаяДатаСеанса());
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("СпособОбеспечения", Параметры.СпособОбеспечения);
Запрос.УстановитьПараметр("НачалоТекущегоДня", НачалоДня);
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
Запрос.Текст =
"ВЫБРАТЬ
| &СпособОбеспечения КАК СпособОбеспечения
|ПОМЕСТИТЬ СпособыОбеспечения";
Запрос.Выполнить();
КонецЕсли;
ОбеспечениеВДокументахСервер.ВременнаяТаблицаБлижайшийЦиклПоСпособамОбеспечения(
Запрос.МенеджерВременныхТаблиц,
"Справочник.СпособыОбеспеченияПотребностей",
"ТаблицаВременный");
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Ссылка КАК СпособОбеспечения,
| Таблица.КЗаказуТовары КАК КЗаказуТовары,
| Таблица.ДатаПоставки КАК ДатаПоставки,
| Таблица.ГраницаПериодаОбеспечения КАК ГраницаПериодаОбеспечения,
| Таблица.ФормироватьЗаказыПоРасписанию КАК ФормироватьЗаказыПоРасписанию,
| Таблица.ДатаПоставкиПоГрафику КАК ДатаПоставкиПоГрафику,
| Таблица.ГраницаПериодаОбеспеченияПоГрафику КАК ГраницаПериодаОбеспеченияПоГрафику,
| Таблица.ДнейДоПлановогоЗаказа КАК ДнейДоПлановогоЗаказа,
| Таблица.ПлановаяДатаЗаказа КАК ПлановаяДатаЗаказа,
| Таблица.ФормироватьЗаказыПоТочкеЗаказа КАК ФормироватьЗаказыПоТочкеЗаказа,
| Таблица.ДатаПоставкиПоТочкеЗаказа КАК ДатаПоставкиПоТочкеЗаказа,
| Таблица.ГраницаПериодаОбеспеченияПоТочкеЗаказа КАК ГраницаПериодаОбеспеченияПоТочкеЗаказа,
| Таблица.ГрафикПоставок КАК ГрафикПоставок,
| Таблица.ВариантОбеспечиваемогоПериода КАК ВариантОбеспечиваемогоПериода,
| ИСТИНА КАК Отметка,
| ВЫРАЗИТЬ(Таблица.Ссылка КАК Справочник.СпособыОбеспеченияПотребностей).Наименование КАК Наименование,
| ПРЕДСТАВЛЕНИЕССЫЛКИ(Таблица.Ссылка) КАК СпособОбеспеченияПредставление,
| ВЫБОР
| КОГДА Таблица.Ссылка = ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка)
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК Порядок
|ИЗ
| ТаблицаВременный КАК Таблица
|УПОРЯДОЧИТЬ ПО
| Порядок, Наименование";
Результат = Запрос.Выполнить().Выгрузить();
Результат.Колонки.Добавить("ДнейДоЗаказаПоГрафикуПредставление");
Для Каждого СтрокаТаблицы Из Результат Цикл
Если Не СтрокаТаблицы.ФормироватьЗаказыПоРасписанию Тогда
СтрокаТаблицы.ДнейДоЗаказаПоГрафикуПредставление = НСтр("ru = '<только для заказа по графику>'");
ИначеЕсли Не ЗначениеЗаполнено(СтрокаТаблицы.ПлановаяДатаЗаказа) Тогда
Если ЗначениеЗаполнено(СтрокаТаблицы.ГрафикПоставок) Тогда
СтрокаТаблицы.ДнейДоЗаказаПоГрафикуПредставление = НСтр("ru = '<не заполнен график поставок>'");
Иначе
СтрокаТаблицы.ДнейДоЗаказаПоГрафикуПредставление = НСтр("ru = '<не заполнен график работы предприятия>'");
КонецЕсли;
ИначеЕсли СтрокаТаблицы.ДнейДоПлановогоЗаказа >= 0 Тогда
СтрокаТаблицы.ДнейДоЗаказаПоГрафикуПредставление =
СтрШаблон(НСтр("ru = '%1 дн'"), СтрокаТаблицы.ДнейДоПлановогоЗаказа);
Иначе
СтрокаТаблицы.ДнейДоЗаказаПоГрафикуПредставление =
СтрШаблон(НСтр("ru = 'просрочен на %1 дн'"), - СтрокаТаблицы.ДнейДоПлановогоЗаказа);
КонецЕсли;
КонецЦикла;
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
КонецПроцедуры
Процедура ТаблицаЗапасы(Параметры, АдресРезультата) Экспорт
Запрос = Новый Запрос();
ИспользоватьАссортимент = Ложь;
Если Параметры.ТипОтбора = "ОтборПоЗначениям" Тогда
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
Запрос.УстановитьПараметр("Номенклатура", Параметры.Отбор.Номенклатура);
Запрос.УстановитьПараметр("Характеристика", Параметры.Отбор.Характеристика);
Запрос.УстановитьПараметр("Склад", Параметры.Отбор.Склад);
Запрос.УстановитьПараметр("СпособОбеспечения", Параметры.Отбор.СпособОбеспечения);
Запрос.Текст =
"ВЫБРАТЬ
| &Номенклатура КАК Номенклатура,
| &Характеристика КАК Характеристика,
| &Склад КАК Склад,
| ВЫРАЗИТЬ(&СпособОбеспечения КАК Справочник.СпособыОбеспеченияПотребностей) КАК СпособОбеспечения
|ПОМЕСТИТЬ ВтТовары
|;
|
|
|ВЫБРАТЬ
| Способы.СпособОбеспечения КАК СпособОбеспечения
|ПОМЕСТИТЬ СпособыОбеспечения
|ИЗ
| ВтТовары КАК Способы";
Запрос.Выполнить();
ОбеспечениеВДокументахСервер.ВременнаяТаблицаБлижайшийЦиклПоСпособамОбеспечения(Запрос.МенеджерВременныхТаблиц);
Иначе
СхемаКомпоновкиДанных = Обработки.ОбеспечениеПотребностей.ПолучитьМакет("МакетКомпоновкиДляСерверныхОтборов");
АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных);
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Параметры.Отбор);
СхемаКомпоновкиДанных.НаборыДанных.Набор.Запрос = ВременнаяТаблицаТоваровДляПоддержанияЗапаса();
Запрос = ПолучитьЗапросСОтборамиКомпоновкиДанных(АдресСхемыКомпоновкиДанных, КомпоновщикНастроек, "Набор");
УдалитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных);
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
Запрос.Выполнить();
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.СпособОбеспечения КАК Ссылка,
| Таблица.ДатаПоставки КАК ДатаПоставки,
| Таблица.ГраницаПериодаОбеспечения КАК ГраницаПериодаОбеспечения,
| Таблица.ФормироватьЗаказыПоРасписанию КАК ФормироватьЗаказыПоРасписанию,
| Таблица.ДатаПоставкиПоГрафику КАК ДатаПоставкиПоГрафику,
| Таблица.ГраницаПериодаОбеспеченияПоГрафику КАК ГраницаПериодаОбеспеченияПоГрафику,
| Таблица.ПлановаяДатаЗаказа КАК ПлановаяДатаЗаказа,
| Таблица.ДнейДоПлановогоЗаказа КАК ДнейДоПлановогоЗаказа,
| Таблица.ФормироватьЗаказыПоТочкеЗаказа КАК ФормироватьЗаказыПоТочкеЗаказа,
| Таблица.ДатаПоставкиПоТочкеЗаказа КАК ДатаПоставкиПоТочкеЗаказа,
| Таблица.ГраницаПериодаОбеспеченияПоТочкеЗаказа КАК ГраницаПериодаОбеспеченияПоТочкеЗаказа,
| Таблица.ГрафикПоставок КАК ГрафикПоставок,
| Таблица.ВариантОбеспечиваемогоПериода КАК ВариантОбеспечиваемогоПериода,
| Таблица.КЗаказуТовары КАК КЗаказуТовары
|ПОМЕСТИТЬ БлижайшийЦиклПоСпособамОбеспечения
|ИЗ
| &ТаблицаСпособовОбеспечения КАК Таблица";
Запрос.УстановитьПараметр("ТаблицаСпособовОбеспечения", Параметры.ТаблицаСпособовОбеспечения);
Запрос.Выполнить();
ИспользоватьАссортимент = ПолучитьФункциональнуюОпцию("ИспользоватьАссортимент");
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Запрос.УстановитьПараметр("НачалоТекущегоДня", НачалоДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("ОсновнойКалендарьПредприятия", Константы.ОсновнойКалендарьПредприятия.Получить());
ОбеспечениеСервер.УстановитьПараметрыЗапросаРасчетаСтатистики(Запрос);
ОбеспечениеСервер.ДобавитьВременнуюТаблицуСтатистикиПотребления(Запрос, "ВтТовары");
ТекстыЗапросов = Новый Массив();
ТекстыЗапросов.Добавить(Справочники.ФорматыМагазинов.ТекстЗапросаВтФорматыСкладов(Ложь));
ТекстыЗапросов.Добавить(ВременнаяТаблицаРазличнаяНоменклатура("ВтТовары"));
Запрос.Текст = СтрСоединить(ТекстыЗапросов);
Запрос.Выполнить();
РегистрыСведений.СхемыОбеспечения.ВременнаяТаблицаТопологияСкладов(Запрос, "РазличнаяНоменклатура");
ТекстыЗапросов = Новый Массив();
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Календарь КАК Календарь,
| Набор.ДатаНачалаИнтервала КАК ДатаНачалаИнтервала,
| Набор.ДатаОкончанияИнтервала КАК ДатаОкончанияИнтервала,
| Набор.ГодНачалаИнтервала КАК ГодНачалаИнтервала,
| Набор.ГодОкончанияИнтервала КАК ГодОкончанияИнтервала
|ПОМЕСТИТЬ ДляПоискаКоличестваДнейВИнтервале
|ИЗ(
| ВЫБРАТЬ
| ВЫБОР
| КОГДА ЕСТЬNULL(ВЫРАЗИТЬ(Товары.Склад КАК Справочник.Склады).Календарь,
| ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)
| ТОГДА ОсновнойКалендарьПредприятия.Значение
| ИНАЧЕ ВЫРАЗИТЬ(Товары.Склад КАК Справочник.Склады).Календарь
| КОНЕЦ КАК Календарь,
| &НачалоТекущегоДня ДатаНачалаИнтервала,
| Способ.ДатаПоставки ДатаОкончанияИнтервала,
| ГОД(&НачалоТекущегоДня) КАК ГодНачалаИнтервала,
| ГОД(Способ.ДатаПоставки) КАК ГодОкончанияИнтервала
|ИЗ
| ВтТовары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ БлижайшийЦиклПоСпособамОбеспечения КАК Способ
| ПО Способ.Ссылка = Товары.СпособОбеспечения
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ОсновнойКалендарьПредприятия КАК ОсновнойКалендарьПредприятия
| ПО ИСТИНА
|ГДЕ
| Способ.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ВЫБОР
| КОГДА ЕСТЬNULL(ВЫРАЗИТЬ(Товары.Склад КАК Справочник.Склады).Календарь,
| ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)
| ТОГДА ОсновнойКалендарьПредприятия.Значение
| ИНАЧЕ ВЫРАЗИТЬ(Товары.Склад КАК Справочник.Склады).Календарь
| КОНЕЦ КАК Календарь,
| Способ.ДатаПоставки ДатаНачалаИнтервала,
| Способ.ГраницаПериодаОбеспечения ДатаОкончанияИнтервала,
| ГОД(Способ.ДатаПоставки) КАК ГодНачалаИнтервала,
| ГОД(Способ.ГраницаПериодаОбеспечения) КАК ГодОкончанияИнтервала
|ИЗ
| ВтТовары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ БлижайшийЦиклПоСпособамОбеспечения КАК Способ
| ПО Способ.Ссылка = Товары.СпособОбеспечения
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ОсновнойКалендарьПредприятия КАК ОсновнойКалендарьПредприятия
| ПО ИСТИНА
|ГДЕ
| Способ.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
| И Способ.ГраницаПериодаОбеспечения > ДАТАВРЕМЯ(1, 1, 1)) КАК Набор
|ИНДЕКСИРОВАТЬ ПО
| Календарь, ГодНачалаИнтервала, ГодОкончанияИнтервала";
ТекстыЗапросов.Добавить(Текст);
ТекстыЗапросов.Добавить(ОбеспечениеВДокументахСервер.ВременнаяТаблицаРезультатыРасчетаКоличестваДнейВИнтервале());
ТекстыЗапросов.Добавить(РегистрыСведений.СхемыОбеспечения.ВременнаяТаблицаРазличныеТоварыИСклады("ВтТовары", Ложь));
ТекстыЗапросов.Добавить(ВременнаяТаблицаДанныеЗаполненияЗаказаПоставщику());
ТекстыЗапросов.Добавить(ВременнаяТаблицаКОбеспечениюВсехСкладов(Ложь));
ТекстыЗапросов.Добавить(ВременнаяТаблицаСвободныеОстатки(Ложь));
ТекстыЗапросов.Добавить(ВременнаяТаблицаЗаказыКПоступлениюИОтгрузке(Ложь));
ТекстыЗапросов.Добавить(ВременнаяТаблицаЗаказыНаПеремещениеВнутриСети(Ложь));
ТекстыЗапросов.Добавить(ВременнаяТаблицаПотребностиРаспределительнойСети());
ТекстыЗапросов.Добавить(ВременнаяТаблицаЗапретЗакупкиПоАссортименту(ИспользоватьАссортимент));
Текст =
"ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| Т.Номенклатура.Наименование КАК НоменклатураНаименование,
| Т.Характеристика.Наименование КАК ХарактеристикаНаименование,
| Т.Склад.Наименование КАК СкладНаименование,
|
| ВЫБОР
| КОГДА ЗНАЧЕНИЕ(Перечисление.ОбеспечениеЗаказовПриПоддержанииЗапаса.ЗаСчетЗапасов) = ТоварныеОграничения.ОбеспечениеЗаказовПриПоддержанииЗапаса
| ТОГДА ЕСТЬNULL(Остатки.ВНаличии, 0)
| КОГДА ЦентрыРаспределительныхСетей.Номенклатура ЕСТЬ NULL
| ТОГДА ЕСТЬNULL(Остатки.ВНаличииМинусРезерв, 0)
| ИНАЧЕ
| ВЫБОР
| КОГДА ЕСТЬNULL(Остатки.ВНаличии, 0) - ЕСТЬNULL(ПотребностиРаспределительнойСети.Потребность, 0) > 0
| ТОГДА ЕСТЬNULL(Остатки.ВНаличии, 0) - ЕСТЬNULL(ПотребностиРаспределительнойСети.Потребность, 0)
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ КАК Остаток,
|
| ВЫБОР
| КОГДА ЗНАЧЕНИЕ(Перечисление.ОбеспечениеЗаказовПриПоддержанииЗапаса.ЗаСчетЗапасов) = ТоварныеОграничения.ОбеспечениеЗаказовПриПоддержанииЗапаса
| ТОГДА 0
| КОГДА ЦентрыРаспределительныхСетей.Номенклатура ЕСТЬ NULL
| ТОГДА ЕСТЬNULL(Остатки.ВНаличии, 0) - ЕСТЬNULL(Остатки.ВНаличииМинусРезерв, 0)
| ИНАЧЕ
| ВЫБОР
| КОГДА ЕСТЬNULL(Остатки.ВНаличии, 0) > ЕСТЬNULL(ПотребностиРаспределительнойСети.Потребность, 0)
| ТОГДА ЕСТЬNULL(ПотребностиРаспределительнойСети.Потребность, 0)
| ИНАЧЕ ЕСТЬNULL(Остатки.ВНаличии, 0)
| КОНЕЦ
| КОНЕЦ КАК РезервыНаСкладе,
|
| ВЫБОР
| КОГДА ЦентрыРаспределительныхСетей.Номенклатура ЕСТЬ NULL
| ТОГДА
| ВЫБОР
| КОГДА ЗНАЧЕНИЕ(Перечисление.ОбеспечениеЗаказовПриПоддержанииЗапаса.ЗаСчетЗапасов) = ТоварныеОграничения.ОбеспечениеЗаказовПриПоддержанииЗапаса
| ТОГДА ЕСТЬNULL(Заказы.Поступит, 0)
| ИНАЧЕ ЕСТЬNULL(Заказы.ПоступитМинусРезерв, 0)
| КОНЕЦ
| ИНАЧЕ
| ВЫБОР
| КОГДА ЗНАЧЕНИЕ(Перечисление.ОбеспечениеЗаказовПриПоддержанииЗапаса.ЗаСчетЗапасов) = ТоварныеОграничения.ОбеспечениеЗаказовПриПоддержанииЗапаса
| ИЛИ ЕСТЬNULL(Остатки.ВНаличии, 0) > ЕСТЬNULL(ПотребностиРаспределительнойСети.Потребность, 0)
| ТОГДА ЕСТЬNULL(Заказы.Поступит, 0) + ЕСТЬNULL(ЗаказыНаПеремещениеВнутриСети.ОтгрузкаМинусЗапас, 0)
| КОГДА ЕСТЬNULL(Остатки.ВНаличии, 0)
| + ЕСТЬNULL(Заказы.Поступит, 0)
| + ЕСТЬNULL(ЗаказыНаПеремещениеВнутриСети.ОтгрузкаМинусЗапас, 0)
| - ЕСТЬNULL(ПотребностиРаспределительнойСети.Потребность, 0) > 0
| ТОГДА
| ЕСТЬNULL(Остатки.ВНаличии, 0)
| + ЕСТЬNULL(Заказы.Поступит, 0)
| + ЕСТЬNULL(ЗаказыНаПеремещениеВнутриСети.ОтгрузкаМинусЗапас, 0)
| - ЕСТЬNULL(ПотребностиРаспределительнойСети.Потребность, 0)
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ КАК ЗаказыКПоступлению,
|
| &ТекстЗапросаВесНоменклатуры КАК Вес,
| Т.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Т.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины КАК ТипЕдиницыИзмерения,
| Т.Номенклатура.Код КАК Код,
| Т.Номенклатура.Артикул КАК Артикул,
| Т.Номенклатура.ИспользоватьУпаковки КАК ИспользоватьУпаковки,
|
| ЕСТЬNULL(ТоварныеОграничения.МетодОбеспеченияПотребностей,
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ЗаказПодЗаказ)) КАК МетодОбеспечения,
| ТоварныеОграничения.МинимальноеКоличествоЗапаса КАК МинимальныйЗапас,
| ТоварныеОграничения.МаксимальноеКоличествоЗапаса КАК МаксимальныйЗапас,
| ТоварныеОграничения.СтраховоеКоличествоЗапаса КАК СтраховойЗапас,
|
| СпрУпаковки.Ссылка КАК УпаковкаЗаказа,
| ЕСТЬNULL(СпрУпаковки.Числитель, 1) КАК ЧислительУпаковки,
| ЕСТЬNULL(СпрУпаковки.Знаменатель, 1) КАК ЗнаменательУпаковки,
|
| Т.СпособОбеспечения КАК СпособОбеспечения,
| ЕСТЬNULL(Т.СпособОбеспечения.ТипОбеспечения,
| ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ТаблицаСпособовОбеспечения.КЗаказуТовары КАК КЗаказуТовары,
| ТаблицаСпособовОбеспечения.ДатаПоставки КАК ДатаПоставки,
| ТаблицаСпособовОбеспечения.ГраницаПериодаОбеспечения КАК ГраницаПериодаОбеспечения,
| ЕСТЬNULL(&ФОЗаказыНаПеремещенияВключена И НЕ Т.Склад.ЦеховаяКладовая
| ИЛИ &ФОПроизводство2_2Включена И Т.Склад.ЦеховаяКладовая, ЛОЖЬ) КАК ПеремещениеРазрешено,
|
| ВЫБОР
| КОГДА ИнтервалДоДатыПоставки.КоличествоДней ЕСТЬ NULL И ТаблицаСпособовОбеспечения.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА РАЗНОСТЬДАТ(&НачалоТекущегоДня, ТаблицаСпособовОбеспечения.ДатаПоставки, ДЕНЬ)
| ИНАЧЕ ЕСТЬNULL(ИнтервалДоДатыПоставки.КоличествоДней, 0)
| КОНЕЦ КАК СрокПоставки,
|
| ТоварныеОграничения.МетодОбеспеченияПотребностей В(
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоНорме),
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике))
| И ТаблицаСпособовОбеспечения.ДатаПоставки = ДАТАВРЕМЯ(1, 1, 1) КАК ОшибкаУстановкиИнтервалаДоДатыПоставки,
|
| ТоварныеОграничения.МетодОбеспеченияПотребностей В(
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоНорме),
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике))
| И ТаблицаСпособовОбеспечения.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
| И ИнтервалДоДатыПоставки.КоличествоДней ЕСТЬ NULL КАК ОшибкаРасчетаИнтервалаДоДатыПоставки,
|
| ВЫБОР
| КОГДА ИнтервалМеждуПоставками.КоличествоДней ЕСТЬ NULL
| И ТаблицаСпособовОбеспечения.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
| И ТаблицаСпособовОбеспечения.ГраницаПериодаОбеспечения > ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА РАЗНОСТЬДАТ(ТаблицаСпособовОбеспечения.ДатаПоставки, ТаблицаСпособовОбеспечения.ГраницаПериодаОбеспечения, ДЕНЬ)
| ИНАЧЕ ЕСТЬNULL(ИнтервалМеждуПоставками.КоличествоДней, 0)
| КОНЕЦ КАК ОбеспечиваемыйПериод,
|
| ТоварныеОграничения.МетодОбеспеченияПотребностей В(
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоНорме),
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике))
| И ИнтервалМеждуПоставками.КоличествоДней ЕСТЬ NULL
| И ТаблицаСпособовОбеспечения.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
| И ТаблицаСпособовОбеспечения.ГраницаПериодаОбеспечения > ДАТАВРЕМЯ(1, 1, 1) КАК ОшибкаРасчетаИнтервалаМеждуПоставками,
|
| ТоварныеОграничения.МетодОбеспеченияПотребностей В(
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоНорме),
| ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике))
| И (ТаблицаСпособовОбеспечения.ДатаПоставки = ДАТАВРЕМЯ(1, 1, 1)
| ИЛИ ТаблицаСпособовОбеспечения.ГраницаПериодаОбеспечения = ДАТАВРЕМЯ(1, 1, 1)) КАК ОшибкаУстановкиИнтервалаМеждуПоставками,
| ВЫБОР
| КОГДА ТоварныеОграничения.МетодОбеспеченияПотребностей
| = ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике)
| ТОГДА ЕСТЬNULL(ТаблицаСтатистики.СреднедневноеПотребление, 0)
| ИНАЧЕ ТоварныеОграничения.НормаПотребления
| КОНЕЦ КАК СреднедневноеПотребление,
|
| ЕСТЬNULL(ТаблицаСтатистики.ПотреблениеСтабильно, ЛОЖЬ) КАК ПотреблениеСтабильно,
|
| ЕСТЬNULL(ДанныеЗаполнения.ВидЦеныПоставщика,
| ВЫБОР
| КОГДА ЕСТЬNULL(Т.СпособОбеспечения.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| <> ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
| ТОГДА Т.СпособОбеспечения.ВидЦеныПоставщика
| ИНАЧЕ ЕСТЬNULL(Т.СпособОбеспечения.Соглашение.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| КОНЕЦ) КАК ВидЦены,
| ЕСТЬNULL(ДанныеЗаполнения.Валюта, Т.СпособОбеспечения.Соглашение.Валюта) КАК ВалютаСоглашения,
|
| ВЫБОР КОГДА НЕ ЕСТЬNULL(ДанныеЗаполнения.Соглашение.ЦенаВключаетНДС, Т.СпособОбеспечения.Соглашение.ЦенаВключаетНДС) ТОГДА
| (ВЫБОР
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка
| ИНАЧЕ 0
| КОНЕЦ + 100) / 100
| ИНАЧЕ
| 1
| КОНЕЦ
| * ЦеныПоставщиков.Цена
| * ВЫБОР
| КОГДА КурсВалютаСоглашения.Коэффициент = 0
| ТОГДА 0
| ИНАЧЕ КурсыВалют.Коэффициент / КурсВалютаСоглашения.Коэффициент
| КОНЕЦ
| / ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки, 1) КАК ЦенаВВалютеСоглашения,
|
| ВЫБОР КОГДА НЕ ЕСТЬNULL(ДанныеЗаполнения.Соглашение.ЦенаВключаетНДС, Т.СпособОбеспечения.Соглашение.ЦенаВключаетНДС) ТОГДА
|
| (ВЫБОР
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка
| ИНАЧЕ 0
| КОНЕЦ + 100) / 100
| ИНАЧЕ
| 1
| КОНЕЦ
| * ЦеныПоставщиков.Цена * КурсыВалют.Коэффициент / &КоэффициентВалютыУпрУчета
| / ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки, 1) КАК ЦенаВВалютеУправленческогоУчета,
|
| ВЫБОР КОГДА Т.СпособОбеспечения.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.СборкаРазборка) ТОГДА
| ИСТИНА
| ИНАЧЕ
| ВЫБОР ЕСТЬNULL(Т.СпособОбеспечения.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)
| КОГДА НЕОПРЕДЕЛЕНО ТОГДА
| ЛОЖЬ
| КОГДА ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА
| ЛОЖЬ
| КОГДА ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка) ТОГДА
| ЛОЖЬ
| КОГДА ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| ЛОЖЬ
| ИНАЧЕ
| ИСТИНА
| КОНЕЦ
| КОНЕЦ КАК ИсточникОбеспеченияТолькоПросмотр,
|
| ЕСТЬNULL(ДанныеЗаполнения.Партнер,
| Т.СпособОбеспечения.ИсточникОбеспеченияПотребностей) КАК ИсточникОбеспечения,
| ВЫБОР КОГДА Т.СпособОбеспечения.Соглашение <> ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка) ТОГДА
| Т.СпособОбеспечения.Соглашение
| ИНАЧЕ
| ДанныеЗаполнения.Соглашение
| КОНЕЦ КАК Соглашение,
| ЦеныПоставщиков.УпаковкаЗаказаПоставщика КАК УпаковкаЗаказаПоставщика,
| ЦеныПоставщиков.МинимальнаяПартияПоставки КАК МинимальнаяПартияПоставки,
| ВЫБОР КОГДА Т.СпособОбеспечения.Соглашение <> ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка) ТОГДА
| ЕСТЬNULL(Т.СпособОбеспечения.Соглашение.МинимальнаяСуммаЗаказа,0)
| ИНАЧЕ
| ЕСТЬNULL(ДанныеЗаполнения.Соглашение.МинимальнаяСуммаЗаказа,0)
| КОНЕЦ КАК МинимальнаяСуммаЗаказа
|ИЗ
| ВтТовары КАК Т
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
| ПО &ПодстановкаТоварногоОграничения
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БлижайшийЦиклПоСпособамОбеспечения КАК ТаблицаСпособовОбеспечения
| ПО Т.СпособОбеспечения = ТаблицаСпособовОбеспечения.Ссылка
|
| ЛЕВОЕ СОЕДИНЕНИЕ РезультатыРасчетаКоличестваДнейВИнтервале КАК ИнтервалДоДатыПоставки
| ПО ИнтервалДоДатыПоставки.Календарь =
| ВЫБОР
| КОГДА ЕСТЬNULL(ВЫРАЗИТЬ(Т.Склад КАК Справочник.Склады).Календарь,
| ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)
| ТОГДА &ОсновнойКалендарьПредприятия
| ИНАЧЕ ВЫРАЗИТЬ(Т.Склад КАК Справочник.Склады).Календарь
| КОНЕЦ
| И ИнтервалДоДатыПоставки.ДатаНачалаИнтервала = &НачалоТекущегоДня
| И ИнтервалДоДатыПоставки.ДатаОкончанияИнтервала = ТаблицаСпособовОбеспечения.ДатаПоставки
|
| ЛЕВОЕ СОЕДИНЕНИЕ РезультатыРасчетаКоличестваДнейВИнтервале КАК ИнтервалМеждуПоставками
| ПО ИнтервалМеждуПоставками.Календарь =
| ВЫБОР
| КОГДА ЕСТЬNULL(ВЫРАЗИТЬ(Т.Склад КАК Справочник.Склады).Календарь,
| ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)
| ТОГДА &ОсновнойКалендарьПредприятия
| ИНАЧЕ ВЫРАЗИТЬ(Т.Склад КАК Справочник.Склады).Календарь
| КОНЕЦ
| И ИнтервалМеждуПоставками.ДатаНачалаИнтервала = ТаблицаСпособовОбеспечения.ДатаПоставки
| И ИнтервалМеждуПоставками.ДатаОкончанияИнтервала = ТаблицаСпособовОбеспечения.ГраницаПериодаОбеспечения
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтСвободныеОстатки КАК Остатки
| ПО Т.Номенклатура = Остатки.Номенклатура
| И Т.Характеристика = Остатки.Характеристика
| И Т.Склад = Остатки.Склад
| И Остатки.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтЗаказы КАК Заказы
| ПО Т.Номенклатура = Заказы.Номенклатура
| И Т.Характеристика = Заказы.Характеристика
| И Т.Склад = Заказы.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК ЦентрыРаспределительныхСетей
| ПО ЦентрыРаспределительныхСетей.Номенклатура = Т.Номенклатура
| И ЦентрыРаспределительныхСетей.Характеристика = Т.Характеристика
| И ЦентрыРаспределительныхСетей.Центр = Т.Склад
| И ЦентрыРаспределительныхСетей.Склад = Т.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ЗаказыНаПеремещениеВнутриСети КАК ЗаказыНаПеремещениеВнутриСети
| ПО Т.Номенклатура = ЗаказыНаПеремещениеВнутриСети.Номенклатура
| И Т.Характеристика = ЗаказыНаПеремещениеВнутриСети.Характеристика
| И Т.Склад = ЗаказыНаПеремещениеВнутриСети.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ПотребностиРаспределительнойСети КАК ПотребностиРаспределительнойСети
| ПО Т.Номенклатура = ПотребностиРаспределительнойСети.Номенклатура
| И Т.Характеристика = ПотребностиРаспределительнойСети.Характеристика
| И Т.Склад = ПотребностиРаспределительнойСети.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтСтатистикаПотребления КАК ТаблицаСтатистики
| ПО Т.Номенклатура = ТаблицаСтатистики.Номенклатура
| И Т.Характеристика = ТаблицаСтатистики.Характеристика
| И Т.Склад = ТаблицаСтатистики.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтДанныеЗаполненияЗаказаПоставщику КАК ДанныеЗаполнения
| ПО Т.Номенклатура = ДанныеЗаполнения.Номенклатура
| И Т.Характеристика = ДанныеЗаполнения.Характеристика
| И Т.Склад = ДанныеЗаполнения.Склад
| И ЕСТЬNULL(Т.СпособОбеспечения.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка), ИСТИНА)
| И Т.СпособОбеспечения.ИсточникОбеспеченияПотребностей.Ссылка ЕСТЬ NULL
|
| ЛЕВОЕ СОЕДИНЕНИЕ ЦеныПоставщиков КАК ЦеныПоставщиков
| ПО Т.Номенклатура = ЦеныПоставщиков.Номенклатура
| И Т.Характеристика = ЦеныПоставщиков.Характеристика
| И ЕСТЬNULL(ДанныеЗаполнения.ВидЦеныПоставщика,
| ВЫБОР
| КОГДА ЕСТЬNULL(Т.СпособОбеспечения.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| <> ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
| ТОГДА Т.СпособОбеспечения.ВидЦеныПоставщика
| ИНАЧЕ ЕСТЬNULL(Т.СпособОбеспечения.Соглашение.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| КОНЕЦ) = ЦеныПоставщиков.ВидЦеныПоставщика
|
| ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
| ПО ЦеныПоставщиков.Валюта = КурсыВалют.Валюта
|
| ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсВалютаСоглашения
| ПО ЕСТЬNULL(ДанныеЗаполнения.Валюта, Т.СпособОбеспечения.Соглашение.Валюта) = КурсВалютаСоглашения.Валюта
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК УпаковкиЗаказа
| ПО &ПодстановкаУпаковкиЗаказа
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК СпрУпаковки
| ПО УпаковкиЗаказа.УпаковкаЗаказа = СпрУпаковки.Ссылка
|
| ЛЕВОЕ СОЕДИНЕНИЕ ЗапретЗакупкиПоАссортименту КАК ЗапретЗакупкиПоАссортименту
| ПО ЗапретЗакупкиПоАссортименту.Склад = Т.Склад
| И ЗапретЗакупкиПоАссортименту.Номенклатура = Т.Номенклатура
| И ЗапретЗакупкиПоАссортименту.ДатаВозможнойПоставки = ЕСТЬNULL(ТаблицаСпособовОбеспечения.ДатаПоставки, &НачалоТекущегоДня)
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиНДСНоменклатуры.СрезПоследних(&НачалоТекущегоДня) КАК СтавкиНДСНоменклатурыСтраныРегистрации
| ПО Т.Номенклатура = СтавкиНДСНоменклатурыСтраныРегистрации.Номенклатура
| И Т.СпособОбеспечения.Организация.СтранаРегистрации = СтавкиНДСНоменклатурыСтраныРегистрации.Страна
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСтавкиНДС.СрезПоследних(&НачалоТекущегоДня) КАК ОсновныеСтавкиНДССтраныРегистрации
| ПО Т.СпособОбеспечения.Организация.СтранаРегистрации = ОсновныеСтавкиНДССтраныРегистрации.Страна
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиНДСНоменклатуры.СрезПоследних(&НачалоТекущегоДня, Страна = &ОсновнаяСтрана ИЛИ Страна = ЗНАЧЕНИЕ(Справочник.СтраныМира.ПустаяСсылка)) КАК СтавкиНДСНоменклатуры
| ПО Т.Номенклатура = СтавкиНДСНоменклатуры.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСтавкиНДС.СрезПоследних(&НачалоТекущегоДня, Страна = &ОсновнаяСтрана) КАК ОсновныеСтавкиНДС
| ПО (ИСТИНА)
|ГДЕ
| ЗапретЗакупкиПоАссортименту.Склад ЕСТЬ NULL
|
|УПОРЯДОЧИТЬ ПО
| НоменклатураНаименование, ХарактеристикаНаименование";
Текст = РегистрыСведений.ТоварныеОграничения.ПодставитьСоединение(Текст,
"ПодстановкаТоварногоОграничения");
Текст = РегистрыСведений.ТоварныеОграничения.ПодставитьСоединениеДляУпаковкиЗаказа(Текст,
"ПодстановкаУпаковкиЗаказа");
Текст = СтрЗаменить(Текст, "&ТекстЗапросаВесНоменклатуры",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки(
"Т.Номенклатура.ЕдиницаИзмерения",
"Т.Номенклатура"));
Текст = СтрЗаменить(Текст, "&ТекстЗапросаКоэффициентУпаковки",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
"ЦеныПоставщиков.Упаковка",
"ЦеныПоставщиков.Номенклатура"));
ТекстыЗапросов.Добавить(Текст);
Запрос.Текст = СтрСоединить(ТекстыЗапросов, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.УстановитьПараметр("ИспользоватьХарактеристикиНоменклатуры",
ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры"));
Запрос.УстановитьПараметр("ФОЗаказыНаПеремещенияВключена",
ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыНаПеремещение"));
Запрос.УстановитьПараметр("ФОПроизводство2_2Включена",
ПолучитьФункциональнуюОпцию("ИспользоватьУправлениеПроизводством2_2"));
Запрос.УстановитьПараметр("НачалоТекущегоДня", НачалоДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("ОсновнаяСтрана", ЗначениеНастроекКлиентСерверПовтИсп.ОсновнаяСтрана());
КурсВалютыУпрУчета = РаботаСКурсамиВалютУТ.ПолучитьКурсВалюты(Константы.ВалютаУправленческогоУчета.Получить(), НачалоДня(ТекущаяДатаСеанса()));
КоэффициентВалютыУпрУчета = КурсВалютыУпрУчета.КурсЧислитель / КурсВалютыУпрУчета.КурсЗнаменатель;
Запрос.УстановитьПараметр("КоэффициентВалютыУпрУчета", КоэффициентВалютыУпрУчета);
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДатаСеанса()));
УстановитьПривилегированныйРежим(Истина);
Таблица = Запрос.Выполнить().Выгрузить();
ПоместитьВоВременноеХранилище(Таблица, АдресРезультата);
КонецПроцедуры
Процедура ТаблицаПотребностейПоЗаказамИОстатков(Параметры, АдресРезультата) Экспорт
ОптимизироватьЗапасыРаспределительногоЦентра = Константы.ОптимизироватьЗапасыРаспределительногоЦентра.Получить();
Если Параметры.ТипОтбора = "ОтборПоЗначениям" Тогда
Запрос = Новый Запрос();
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
Запрос.Текст =
"ВЫБРАТЬ
| &Номенклатура КАК Номенклатура,
| &Характеристика КАК Характеристика,
| &Склад КАК Склад,
| &ДатаОтгрузкиЗаказа КАК ДатаОтгрузкиЗаказа,
| &СкладОтгрузкиЗаказа КАК СкладОтгрузкиЗаказа,
| &ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| ВЫРАЗИТЬ(&СпособОбеспечения КАК Справочник.СпособыОбеспеченияПотребностей) КАК СпособОбеспечения,
|
| &Назначение КАК Назначение,
| &Заказ КАК Заказ,
| &ДатаОтгрузки КАК ДатаОтгрузки,
| 0 КАК НеОбеспечено,
| 0 КАК РаспределеноНаСкладе,
| 0 КАК РаспределеноИзЗаказов
|ПОМЕСТИТЬ ВтТовары
|;
|
|
|ВЫБРАТЬ
| Способы.СпособОбеспечения КАК СпособОбеспечения
|ПОМЕСТИТЬ СпособыОбеспечения
|ИЗ
| ВтТовары КАК Способы
|;
|
|
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
| ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) КАК Склад,
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) КАК Центр
|ПОМЕСТИТЬ ТопологияСкладов
|ГДЕ
| ЛОЖЬ
|;
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
| ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) КАК Склад,
| ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка) КАК Назначение
|ПОМЕСТИТЬ ТоварыИСкладыПопавшиеВОбработку
|ГДЕ
| ЛОЖЬ";
Для Каждого Свойство Из Параметры.Отбор Цикл
Запрос.УстановитьПараметр(Свойство.Ключ, Свойство.Значение);
КонецЦикла;
Запрос.Выполнить();
ОбеспечениеВДокументахСервер.ВременнаяТаблицаБлижайшийЦиклПоСпособамОбеспечения(Запрос.МенеджерВременныхТаблиц);
Иначе
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
СхемаКомпоновкиДанных = Обработки.ОбеспечениеПотребностей.ПолучитьМакет("МакетКомпоновкиДляСерверныхОтборов");
АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных);
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Параметры.Отбор);
Тексты = Новый Массив();
Тексты.Добавить(ВременнаяТаблицаОтборПоСегментам());
Тексты.Добавить(ВременнаяТаблицаОтборПоЗаказам());
Тексты.Добавить(ВременнаяТаблицаПотребностиВсехСкладовПоЗаказам());
Тексты.Добавить(
"ВЫБРАТЬ
| Таблица.СпособОбеспечения КАК СпособОбеспечения
|ПОМЕСТИТЬ СпособыОбеспеченияДляОтборов
|ИЗ
| &ТаблицаСпособовОбеспечения КАК Таблица");
Тексты.Добавить(ВременнаяТаблицаПотребностиВыбранныхСкладов());
Тексты.Добавить(ВыборкаПервойЗаписиПотребностейПоЗаказамДляКомпоновкиЗапроса());
Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
СхемаКомпоновкиДанных.НаборыДанных.Набор.Запрос = Текст;
Запрос = ПолучитьЗапросСОтборамиКомпоновкиДанных(АдресСхемыКомпоновкиДанных, КомпоновщикНастроек, "Набор");
УдалитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных);
ПозицияУдаления = СтрНайти(Запрос.Текст, "УНИЧТОЖИТЬ ВтФорматыСкладов");
Позиция = СтрНайти(Запрос.Текст, ";", НаправлениеПоиска.СНачала, ПозицияУдаления) + 1;
ТекстЗапросаПривилегированно = Сред(Запрос.Текст, Позиция);
Запрос.Текст = Лев(Запрос.Текст, ПозицияУдаления - 1);
Запрос.УстановитьПараметр("ОптимизироватьЗапасыРаспределительногоЦентра", ОптимизироватьЗапасыРаспределительногоЦентра);
Запрос.УстановитьПараметр("ФОЗаказыНаПеремещенияВключена",
ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыНаПеремещение"));
Запрос.УстановитьПараметр("ФОПроизводство2_2Включена",
ПолучитьФункциональнуюОпцию("ИспользоватьУправлениеПроизводством2_2"));
Запрос.УстановитьПараметр("ТаблицаСпособовОбеспечения", Параметры.ТаблицаСпособовОбеспечения);
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.Выполнить();
Запрос.Текст = ВременнаяТаблицаРазличнаяНоменклатура("ПотребностиВсехСкладовПоЗаказам");
Запрос.Выполнить();
РегистрыСведений.СхемыОбеспечения.ВременнаяТаблицаТопологияСкладов(Запрос, "РазличнаяНоменклатура");
УстановитьПривилегированныйРежим(Истина);
Запрос.Текст = ТекстЗапросаПривилегированно;
Запрос.Выполнить();
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.СпособОбеспечения КАК Ссылка,
| Таблица.ДатаПоставки КАК ДатаПоставки,
| Таблица.ГраницаПериодаОбеспечения КАК ГраницаПериодаОбеспечения,
| Таблица.ФормироватьЗаказыПоРасписанию КАК ФормироватьЗаказыПоРасписанию,
| Таблица.ДатаПоставкиПоГрафику КАК ДатаПоставкиПоГрафику,
| Таблица.ГраницаПериодаОбеспеченияПоГрафику КАК ГраницаПериодаОбеспеченияПоГрафику,
| Таблица.ПлановаяДатаЗаказа КАК ПлановаяДатаЗаказа,
| Таблица.ДнейДоПлановогоЗаказа КАК ДнейДоПлановогоЗаказа,
| Таблица.ФормироватьЗаказыПоТочкеЗаказа КАК ФормироватьЗаказыПоТочкеЗаказа,
| Таблица.ДатаПоставкиПоТочкеЗаказа КАК ДатаПоставкиПоТочкеЗаказа,
| Таблица.ГраницаПериодаОбеспеченияПоТочкеЗаказа КАК ГраницаПериодаОбеспеченияПоТочкеЗаказа,
| Таблица.ГрафикПоставок КАК ГрафикПоставок,
| Таблица.ВариантОбеспечиваемогоПериода КАК ВариантОбеспечиваемогоПериода,
| Таблица.КЗаказуТовары КАК КЗаказуТовары
|ПОМЕСТИТЬ БлижайшийЦиклПоСпособамОбеспечения
|ИЗ
| &ТаблицаСпособовОбеспечения КАК Таблица
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение,
| Товары.ПодразделениеПолучатель КАК Подразделение
|ПОМЕСТИТЬ ТоварыИСкладыПопавшиеВОбработку
|ИЗ
| ВтТовары КАК Товары
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
Запрос.Выполнить();
КонецЕсли;
НачалоДня = НачалоДня(ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("НачалоТекущегоДня", НачалоДня);
Тексты = Новый Массив();
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Товары.СпособОбеспечения,
| Товары.ДатаОтгрузки КАК ДатаОтгрузки
|ПОМЕСТИТЬ СпособыИДатыОтгрузки
|ИЗ
| ВтТовары КАК Товары
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БлижайшийЦиклПоСпособамОбеспечения КАК ТаблицаСпособовОбеспечения
| ПО ТаблицаСпособовОбеспечения.Ссылка = Товары.СпособОбеспечения
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаОтгрузки)
|ГДЕ
| Товары.ДатаОтгрузки > ТаблицаСпособовОбеспечения.ДатаПоставки
| ИЛИ ТаблицаСпособовОбеспечения.ДатаПоставки = ДАТАВРЕМЯ(1, 1, 1)";
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Таблица.СпособОбеспечения КАК СпособОбеспечения,
| Таблица.ДатаОтгрузки КАК ДатаОтгрузки,
| РасчетДатыПоставкиПоДатеОтгрузкиПереопределяемый.ПлановаяДатаПоставки КАК ДатаПоставки
|ПОМЕСТИТЬ ДатыПоставок
|ИЗ
| СпособыИДатыОтгрузки КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ РасчетДатыПоставкиПоДатеОтгрузкиПереопределяемый ПО ИСТИНА
|ИНДЕКСИРОВАТЬ ПО
| СпособОбеспечения";
Подстановки = ОбеспечениеВДокументахСервер.ПодстановкиДатыПоставкиБлижайшейКДате(
"Таблица.СпособОбеспечения",
"Таблица.ДатаОтгрузки");
Текст = СтрЗаменить(Текст, "РасчетДатыПоставкиПоДатеОтгрузкиПереопределяемый.ПлановаяДатаПоставки", Подстановки.Поле);
Текст = СтрЗаменить(Текст, "ЛЕВОЕ СОЕДИНЕНИЕ РасчетДатыПоставкиПоДатеОтгрузкиПереопределяемый ПО ИСТИНА", Подстановки.Соединения);
Тексты.Добавить(Текст);
Текст = ОбеспечениеВДокументахСервер.ВременнаяТаблицаГодыГрафикаПредприятия();
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Таблица.СпособОбеспечения КАК СпособОбеспечения,
| Таблица.ДатаОтгрузки КАК ДатаОтгрузки,
| ВЫБОР
| КОГДА НЕ ВЫРАЗИТЬ(Таблица.СпособОбеспечения КАК Справочник.СпособыОбеспеченияПотребностей).ФормироватьЗаказыПоРасписанию
| И КалендарьПредприятияВременный.Значение <> ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)
| И РасчетДобавленияДатыПереопределяемый.НайденнаяДата >= &НачалоТекущегоДня
| ТОГДА РасчетДобавленияДатыПереопределяемый.НайденнаяДата
| ИНАЧЕ Таблица.ДатаПоставки
| КОНЕЦ КАК ДатаПоставки,
| НЕ ВЫРАЗИТЬ(Таблица.СпособОбеспечения КАК Справочник.СпособыОбеспеченияПотребностей).ФормироватьЗаказыПоРасписанию
| И КалендарьПредприятияВременный.Значение <> ЗНАЧЕНИЕ(Справочник.Календари.ПустаяСсылка)
| И РасчетДобавленияДатыПереопределяемый.НайденнаяДата < &НачалоТекущегоДня
| И РасчетДобавленияДатыПереопределяемый.НайденнаяДата > ДАТАВРЕМЯ(1, 1, 1) КАК ПрибавитьОдинРабочийДень
|ПОМЕСТИТЬ ДатыПоставокСУчетомРабочихДнейПервая
|ИЗ
| ДатыПоставок КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ОсновнойКалендарьПредприятия КАК КалендарьПредприятияВременный
| ПО ИСТИНА
|
| ЛЕВОЕ СОЕДИНЕНИЕ РасчетДобавленияДатыПереопределяемый ПО ИСТИНА
|ИНДЕКСИРОВАТЬ ПО
| СпособОбеспечения";
Подстановки = ОбеспечениеВДокументахСервер.ДобавитьКДатеПоКалендарюПредприятия(
"Таблица.ДатаПоставки", "0", Истина);
Текст = СтрЗаменить(Текст, "РасчетДобавленияДатыПереопределяемый.НайденнаяДата", Подстановки.Поле);
Текст = СтрЗаменить(Текст, "ЛЕВОЕ СОЕДИНЕНИЕ РасчетДобавленияДатыПереопределяемый ПО ИСТИНА", Подстановки.Соединения);
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Таблица.СпособОбеспечения КАК СпособОбеспечения,
| Таблица.ДатаОтгрузки КАК ДатаОтгрузки,
| ВЫБОР
| КОГДА Таблица.ПрибавитьОдинРабочийДень
| И РасчетДобавленияДатыПереопределяемый.НайденнаяДата > ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА РасчетДобавленияДатыПереопределяемый.НайденнаяДата
| ИНАЧЕ Таблица.ДатаПоставки
| КОНЕЦ КАК ДатаПоставки
|ПОМЕСТИТЬ ДатыПоставокСУчетомРабочихДней
|ИЗ
| ДатыПоставокСУчетомРабочихДнейПервая КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ РасчетДобавленияДатыПереопределяемый ПО ИСТИНА
|ИНДЕКСИРОВАТЬ ПО
| СпособОбеспечения";
Подстановки = ОбеспечениеВДокументахСервер.ДобавитьКДатеПоКалендарюПредприятия(
"Таблица.ДатаПоставки", "1", Истина);
Текст = СтрЗаменить(Текст, "РасчетДобавленияДатыПереопределяемый.НайденнаяДата", Подстановки.Поле);
Текст = СтрЗаменить(Текст, "ЛЕВОЕ СОЕДИНЕНИЕ РасчетДобавленияДатыПереопределяемый ПО ИСТИНА", Подстановки.Соединения);
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Таблица.СпособОбеспечения КАК СпособОбеспечения,
| Таблица.ДатаОтгрузки КАК ДатаОтгрузки,
| Таблица.ДатаПоставки КАК ДатаПоставки,
| РасчетДобавленияДатыПереопределяемый.НайденнаяДата КАК ДатаЗаказа
|ПОМЕСТИТЬ ДатыПоставокИДатыЗаказов
|ИЗ
| ДатыПоставокСУчетомРабочихДней КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ РасчетДобавленияДатыПереопределяемый ПО ИСТИНА
|ИНДЕКСИРОВАТЬ ПО
| СпособОбеспечения, ДатаОтгрузки";
Подстановки = ОбеспечениеВДокументахСервер.ДобавитьКДатеПоКалендарюПредприятия(
"Таблица.ДатаПоставки", "-Таблица.СпособОбеспечения.СрокИсполненияЗаказа");
Текст = СтрЗаменить(Текст, "РасчетДобавленияДатыПереопределяемый.НайденнаяДата", Подстановки.Поле);
Текст = СтрЗаменить(Текст, "ЛЕВОЕ СОЕДИНЕНИЕ РасчетДобавленияДатыПереопределяемый ПО ИСТИНА", Подстановки.Соединения);
Тексты.Добавить(Текст);
Запрос.Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.Выполнить();
ТекстыЗапросов = Новый Массив();
ТекстыЗапросов.Добавить(ВременнаяТаблицаДанныеЗаполненияЗаказаПоставщику());
ТекстыЗапросов.Добавить(ВременнаяТаблицаЗапретЗакупкиПоАссортименту(
ПолучитьФункциональнуюОпцию("ИспользоватьАссортимент")));
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад
|ПОМЕСТИТЬ СкладыВходящиеВРаспределительныеСети
|ИЗ
| ТопологияСкладов КАК Таблица
|ГДЕ
| Таблица.Склад <> Таблица.Центр
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,Характеристика,Склад";
ТекстыЗапросов.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| НЕ СкладыВходящиеВРаспределительныеСети.Склад ЕСТЬ NULL КАК ОбеспечиваетсяИзРаспределительногоЦентра,
| Т.СкладОтгрузкиЗаказа КАК СкладОтгрузкиЗаказа,
| Т.ДатаОтгрузкиЗаказа КАК ДатаОтгрузкиЗаказа,
| Т.Номенклатура.Наименование КАК НоменклатураНаименование,
| Т.Характеристика.Наименование КАК ХарактеристикаНаименование,
| Т.Склад.Наименование КАК СкладНаименование,
| Т.Назначение.Наименование КАК НазначениеНаименование,
|
| Т.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| Т.Назначение КАК Назначение,
| Т.Заказ КАК Заказ,
| ЗаказыРеестра.Приоритет КАК Приоритет,
| ЕСТЬNULL(ЗаказыРеестра.Приоритет.РеквизитДопУпорядочивания,
| 0) КАК ПриоритетРеквизитДопУпорядочивания,
| Т.ДатаОтгрузки КАК ДатаОтгрузки,
| Т.НеОбеспечено + Т.РаспределеноНаСкладе + Т.РаспределеноИзЗаказов КАК Требуется,
| ВЫБОР
| КОГДА ТопологияСкладовЭтоЦентр.Склад ЕСТЬ NULL
| ТОГДА Т.РаспределеноНаСкладе + Т.РаспределеноИзЗаказов
| ИНАЧЕ Т.РаспределеноНаСкладе
| КОНЕЦ КАК КРезервированию,
|
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| КОГДА Т.ДатаОтгрузки > &КонецТекущегоДня
| ТОГДА Т.ДатаОтгрузки
| КОГДА ИСТИНА
| ТОГДА ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ ПорядокСортировки,
| ВЫБОР
| КОГДА &ПроверкаЭтапаСУчетомПравПереопределяемый
| ТОГДА &ДатаЗаказаНаПроизводствоСУчетомПравПереопределяемый
| КОГДА ИСТИНА
| ТОГДА ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ДатаДокументаИБ,
| ВЫБОР
| КОГДА Т.ДатаОтгрузки > &КонецТекущегоДня
| ТОГДА Т.ДатаОтгрузки
| КОГДА ИСТИНА
| ТОГДА ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузкиПослеДатыДокумента,
| ВЫБОР КОГДА Т.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И ТоварныеОграничения.МетодОбеспеченияПотребностей <> ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ЗаказПодЗаказ)
| И ТоварныеОграничения.ОбеспечениеЗаказовПриПоддержанииЗапаса = ЗНАЧЕНИЕ(Перечисление.ОбеспечениеЗаказовПриПоддержанииЗапаса.НезависимоОтЗапасов) ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК ОбеспечиватьНезависимоОтЗапасов,
|
| &ТекстЗапросаВесНоменклатуры КАК Вес,
| Т.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Т.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины КАК ТипЕдиницыИзмерения,
| Т.Номенклатура.Код КАК Код,
| Т.Номенклатура.Артикул КАК Артикул,
| Т.Номенклатура.ИспользоватьУпаковки КАК ИспользоватьУпаковки,
|
| ВЫБОР КОГДА Т.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа) ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК ЭтоРабота,
|
| ЕСТЬNULL(Т.СпособОбеспечения, ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка)) КАК СпособОбеспечения,
| ЕСТЬNULL(Т.СпособОбеспечения.ТипОбеспечения,
| ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ТаблицаСпособовОбеспечения.КЗаказуТовары КАК КЗаказуТовары,
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА ТаблицаСпособовОбеспечения.ДатаПоставки
| КОГДА Т.ДатаОтгрузки <= ТаблицаСпособовОбеспечения.ДатаПоставки
| И ТаблицаСпособовОбеспечения.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ТаблицаСпособовОбеспечения.ДатаПоставки
| КОГДА НЕ ТаблицаСпособовОбеспечения.ФормироватьЗаказыПоРасписанию
| И ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки = ДАТАВРЕМЯ(1, 1, 1)
| И Т.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА &НачалоТекущегоДня
| КОГДА ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки < &НачалоТекущегоДня
| ТОГДА ДАТАВРЕМЯ(1, 1, 1)
| КОГДА ТаблицаСпособовОбеспечения.ФормироватьЗаказыПоРасписанию
| И ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки < ТаблицаСпособовОбеспечения.ДатаПоставки
| ТОГДА ТаблицаСпособовОбеспечения.ДатаПоставки
| ИНАЧЕ ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки
| КОНЕЦ КАК ДатаПоставки,
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА ТаблицаСпособовОбеспечения.ДатаПоставки
| КОГДА Т.ДатаОтгрузки <= ТаблицаСпособовОбеспечения.ДатаПоставки
| И ТаблицаСпособовОбеспечения.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ТаблицаСпособовОбеспечения.ДатаПоставки
| КОГДА НЕ ТаблицаСпособовОбеспечения.ФормироватьЗаказыПоРасписанию
| И ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки = ДАТАВРЕМЯ(1, 1, 1)
| И Т.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА &НачалоТекущегоДня
| КОГДА ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки < &НачалоТекущегоДня
| ТОГДА ДАТАВРЕМЯ(1, 1, 1)
| КОГДА ТаблицаСпособовОбеспечения.ФормироватьЗаказыПоРасписанию
| И ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки < ТаблицаСпособовОбеспечения.ДатаПоставки
| ТОГДА ТаблицаСпособовОбеспечения.ДатаПоставки
| ИНАЧЕ ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки
| КОНЕЦ КАК ДатаПоставкиРасчетная,
| ТаблицаСпособовОбеспечения.ДатаПоставки КАК ДатаПоставкиПоСпособуОбеспечения,
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ИЛИ Т.ДатаОтгрузки <= ТаблицаСпособовОбеспечения.ДатаПоставки
| И ТаблицаСпособовОбеспечения.ДатаПоставки > ДАТАВРЕМЯ(1, 1, 1)
| ИЛИ ТаблицаДатПоставкиИДатыЗаказа.ДатаПоставки < &НачалоТекущегоДня
| ИЛИ ТаблицаДатПоставкиИДатыЗаказа.ДатаЗаказа < &НачалоТекущегоДня
| ТОГДА &НачалоТекущегоДня
| ИНАЧЕ ТаблицаДатПоставкиИДатыЗаказа.ДатаЗаказа
| КОНЕЦ КАК ДатаЗаказаНеПозднее,
|
| ЕСТЬNULL(&ФОЗаказыНаПеремещенияВключена И НЕ Т.Склад.ЦеховаяКладовая
| ИЛИ &ФОПроизводство2_2Включена И Т.Склад.ЦеховаяКладовая, ЛОЖЬ) КАК ПеремещениеРазрешено,
|
| ЕСТЬNULL(ДанныеЗаполнения.ВидЦеныПоставщика,
| ВЫБОР
| КОГДА ЕСТЬNULL(Т.СпособОбеспечения.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| <> ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
| ТОГДА Т.СпособОбеспечения.ВидЦеныПоставщика
| ИНАЧЕ ЕСТЬNULL(Т.СпособОбеспечения.Соглашение.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| КОНЕЦ) КАК ВидЦены,
| ЕСТЬNULL(ДанныеЗаполнения.Валюта, Т.СпособОбеспечения.Соглашение.Валюта) КАК ВалютаСоглашения,
|
| ВЫБОР КОГДА НЕ ЕСТЬNULL(ДанныеЗаполнения.Соглашение.ЦенаВключаетНДС, Т.СпособОбеспечения.Соглашение.ЦенаВключаетНДС) ТОГДА
| (ВЫБОР
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка
| ИНАЧЕ 0
| КОНЕЦ + 100) / 100
| ИНАЧЕ
| 1
| КОНЕЦ
| * ЦеныПоставщиков.Цена
| * ВЫБОР
| КОГДА КурсВалютаСоглашения.Коэффициент =0
| ТОГДА 0
| ИНАЧЕ КурсыВалют.Коэффициент / КурсВалютаСоглашения.Коэффициент
| КОНЕЦ
| / ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки, 1) КАК ЦенаВВалютеСоглашения,
|
| ВЫБОР КОГДА НЕ ЕСТЬNULL(ДанныеЗаполнения.Соглашение.ЦенаВключаетНДС, Т.СпособОбеспечения.Соглашение.ЦенаВключаетНДС) ТОГДА
| (ВЫБОР
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))).Ставка
| ИНАЧЕ 0
| КОНЕЦ + 100) / 100
| ИНАЧЕ
| 1
| КОНЕЦ
| * ЦеныПоставщиков.Цена * КурсыВалют.Коэффициент / &КоэффициентВалютыУпрУчета
| / ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки, 1) КАК ЦенаВВалютеУправленческогоУчета,
|
| ВЫБОР КОГДА Т.СпособОбеспечения.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.СборкаРазборка) ТОГДА
| ИСТИНА
| ИНАЧЕ
| ВЫБОР ЕСТЬNULL(Т.СпособОбеспечения.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)
| КОГДА НЕОПРЕДЕЛЕНО ТОГДА
| ЛОЖЬ
| КОГДА ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА
| ЛОЖЬ
| КОГДА ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка) ТОГДА
| ЛОЖЬ
| КОГДА ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| ЛОЖЬ
| ИНАЧЕ
| ИСТИНА
| КОНЕЦ
| КОНЕЦ КАК ИсточникОбеспеченияТолькоПросмотр,
| ЕСТЬNULL(ДанныеЗаполнения.Партнер,
| Т.СпособОбеспечения.ИсточникОбеспеченияПотребностей) КАК ИсточникОбеспечения,
| ВЫБОР КОГДА Т.СпособОбеспечения.Соглашение <> ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка) ТОГДА
| Т.СпособОбеспечения.Соглашение
| ИНАЧЕ
| ДанныеЗаполнения.Соглашение
| КОНЕЦ КАК Соглашение,
| СпрУпаковки.Ссылка КАК УпаковкаЗаказа,
| ЕСТЬNULL(СпрУпаковки.Числитель, 1) КАК ЧислительУпаковки,
| ЕСТЬNULL(СпрУпаковки.Знаменатель, 1) КАК ЗнаменательУпаковки,
| ЦеныПоставщиков.УпаковкаЗаказаПоставщика КАК УпаковкаЗаказаПоставщика,
| ЦеныПоставщиков.МинимальнаяПартияПоставки КАК МинимальнаяПартияПоставки,
| ВЫБОР КОГДА Т.СпособОбеспечения.Соглашение <> ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка) ТОГДА
| ЕСТЬNULL(Т.СпособОбеспечения.Соглашение.МинимальнаяСуммаЗаказа,0)
| ИНАЧЕ
| ЕСТЬNULL(ДанныеЗаполнения.Соглашение.МинимальнаяСуммаЗаказа,0)
| КОНЕЦ КАК МинимальнаяСуммаЗаказа
|ИЗ
| ВтТовары КАК Т
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БлижайшийЦиклПоСпособамОбеспечения КАК ТаблицаСпособовОбеспечения
| ПО Т.СпособОбеспечения = ТаблицаСпособовОбеспечения.Ссылка
|
| ЛЕВОЕ СОЕДИНЕНИЕ ДатыПоставокИДатыЗаказов КАК ТаблицаДатПоставкиИДатыЗаказа
| ПО ТаблицаДатПоставкиИДатыЗаказа.СпособОбеспечения = Т.СпособОбеспечения
| И ТаблицаДатПоставкиИДатыЗаказа.ДатаОтгрузки = Т.ДатаОтгрузки
|
| ЛЕВОЕ СОЕДИНЕНИЕ СкладыВходящиеВРаспределительныеСети КАК СкладыВходящиеВРаспределительныеСети
| ПО СкладыВходящиеВРаспределительныеСети.Номенклатура = Т.Номенклатура
| И СкладыВходящиеВРаспределительныеСети.Характеристика = Т.Характеристика
| И СкладыВходящиеВРаспределительныеСети.Склад = Т.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК ТопологияСкладовЭтоЦентр
| ПО ТопологияСкладовЭтоЦентр.Номенклатура = Т.Номенклатура
| И ТопологияСкладовЭтоЦентр.Характеристика = Т.Характеристика
| И ТопологияСкладовЭтоЦентр.Склад = Т.Склад
| И ТопологияСкладовЭтоЦентр.Центр = Т.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтДанныеЗаполненияЗаказаПоставщику КАК ДанныеЗаполнения
| ПО Т.Номенклатура = ДанныеЗаполнения.Номенклатура
| И Т.Характеристика = ДанныеЗаполнения.Характеристика
| И Т.Склад = ДанныеЗаполнения.Склад
| И ЕСТЬNULL(Т.СпособОбеспечения.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка), ИСТИНА)
| И Т.СпособОбеспечения.ИсточникОбеспеченияПотребностей.Ссылка ЕСТЬ NULL
|
| ЛЕВОЕ СОЕДИНЕНИЕ ЦеныПоставщиков КАК ЦеныПоставщиков
| ПО Т.Номенклатура = ЦеныПоставщиков.Номенклатура
| И Т.Характеристика = ЦеныПоставщиков.Характеристика
| И ЕСТЬNULL(ДанныеЗаполнения.ВидЦеныПоставщика,
| ВЫБОР
| КОГДА ЕСТЬNULL(Т.СпособОбеспечения.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| <> ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
| ТОГДА Т.СпособОбеспечения.ВидЦеныПоставщика
| ИНАЧЕ ЕСТЬNULL(Т.СпособОбеспечения.Соглашение.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| КОНЕЦ) = ЦеныПоставщиков.ВидЦеныПоставщика
|
| ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
| ПО ЦеныПоставщиков.Валюта = КурсыВалют.Валюта
|
| ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсВалютаСоглашения
| ПО ЕСТЬNULL(ДанныеЗаполнения.Валюта, Т.СпособОбеспечения.Соглашение.Валюта) = КурсВалютаСоглашения.Валюта
|
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
| ПО &ПодстановкаТоварногоОграничения
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК УпаковкиЗаказа
| ПО &ПодстановкаУпаковкиЗаказа
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК СпрУпаковки
| ПО УпаковкиЗаказа.УпаковкаЗаказа = СпрУпаковки.Ссылка
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Т.Заказ
| И НЕ ЗаказыРеестра.ДополнительнаяЗапись
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|
| ЛЕВОЕ СОЕДИНЕНИЕ ЗапретЗакупкиПоАссортименту КАК ЗапретЗакупкиПоАссортименту
| ПО ЗапретЗакупкиПоАссортименту.Склад = Т.Склад
| И ЗапретЗакупкиПоАссортименту.Номенклатура = Т.Номенклатура
| И ЗапретЗакупкиПоАссортименту.ДатаВозможнойПоставки = ЕСТЬNULL(ТаблицаСпособовОбеспечения.ДатаПоставки, &НачалоТекущегоДня)
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиНДСНоменклатуры.СрезПоследних(&НачалоТекущегоДня) КАК СтавкиНДСНоменклатурыСтраныРегистрации
| ПО Т.Номенклатура = СтавкиНДСНоменклатурыСтраныРегистрации.Номенклатура
| И Т.СпособОбеспечения.Организация.СтранаРегистрации = СтавкиНДСНоменклатурыСтраныРегистрации.Страна
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСтавкиНДС.СрезПоследних(&НачалоТекущегоДня) КАК ОсновныеСтавкиНДССтраныРегистрации
| ПО Т.СпособОбеспечения.Организация.СтранаРегистрации = ОсновныеСтавкиНДССтраныРегистрации.Страна
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиНДСНоменклатуры.СрезПоследних(&НачалоТекущегоДня, Страна = &ОсновнаяСтрана ИЛИ Страна = ЗНАЧЕНИЕ(Справочник.СтраныМира.ПустаяСсылка)) КАК СтавкиНДСНоменклатуры
| ПО Т.Номенклатура = СтавкиНДСНоменклатуры.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСтавкиНДС.СрезПоследних(&НачалоТекущегоДня, Страна = &ОсновнаяСтрана) КАК ОсновныеСтавкиНДС
| ПО (ИСТИНА)
|
|ГДЕ
| ВЫБОР
| КОГДА Т.СпособОбеспечения.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Перемещение)
| ТОГДА
| ЕСТЬNULL(&ФОЗаказыНаПеремещенияВключена И НЕ Т.Склад.ЦеховаяКладовая
| ИЛИ &ФОПроизводство2_2Включена И Т.Склад.ЦеховаяКладовая, ЛОЖЬ)
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| И ЗапретЗакупкиПоАссортименту.Склад ЕСТЬ NULL
|
|УПОРЯДОЧИТЬ ПО
| НоменклатураНаименование,
| ХарактеристикаНаименование,
| СкладНаименование,
| НазначениеНаименование,
| Номенклатура,
| Характеристика,
| Склад,
| Назначение,
| ПриоритетРеквизитДопУпорядочивания,
| ПорядокСортировки,
| ДатаДокументаИБ,
| ПорядокПоДатеОтгрузкиПослеДатыДокумента,
| Заказ";
Текст = РегистрыСведений.ТоварныеОграничения.ПодставитьСоединение(Текст,
"ПодстановкаТоварногоОграничения");
Текст = РегистрыСведений.ТоварныеОграничения.ПодставитьСоединениеДляУпаковкиЗаказа(Текст,
"ПодстановкаУпаковкиЗаказа");
Текст = СтрЗаменить(Текст, "&ТекстЗапросаВесНоменклатуры",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки(
"Т.Номенклатура.ЕдиницаИзмерения",
"Т.Номенклатура"));
Текст = СтрЗаменить(Текст, "&ТекстЗапросаКоэффициентУпаковки",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
"ЦеныПоставщиков.Упаковка",
"ЦеныПоставщиков.Номенклатура"));
ПроверкаЭтапаТекст = "ЛОЖЬ";
ДатаЗаказаНаПроизводствоТекст = "ДАТАВРЕМЯ(1, 1, 1)";
Текст = СтрЗаменить(Текст, "&ПроверкаЭтапаСУчетомПравПереопределяемый", ПроверкаЭтапаТекст);
Текст = СтрЗаменить(Текст, "&ДатаЗаказаНаПроизводствоСУчетомПравПереопределяемый", ДатаЗаказаНаПроизводствоТекст);
ТекстыЗапросов.Добавить(Текст);
Запрос.Текст = СтрСоединить(ТекстыЗапросов, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня);
Запрос.УстановитьПараметр("ОсновнаяСтрана", ЗначениеНастроекКлиентСерверПовтИсп.ОсновнаяСтрана());
Запрос.УстановитьПараметр("КонецТекущегоДня", КонецДня(ТекущаяДатаСеанса()));
КурсВалютыУпрУчета = РаботаСКурсамиВалютУТ.ПолучитьКурсВалюты(Константы.ВалютаУправленческогоУчета.Получить(), НачалоДня);
КоэффициентВалютыУпрУчета = КурсВалютыУпрУчета.КурсЧислитель / КурсВалютыУпрУчета.КурсЗнаменатель;
Запрос.УстановитьПараметр("КоэффициентВалютыУпрУчета", КоэффициентВалютыУпрУчета);
Запрос.УстановитьПараметр("ФОЗаказыНаПеремещенияВключена",
ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыНаПеремещение"));
Запрос.УстановитьПараметр("ФОПроизводство2_2Включена",
ПолучитьФункциональнуюОпцию("ИспользоватьУправлениеПроизводством2_2"));
РезультатЗапроса = Запрос.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();
Если Параметры.ТипОтбора = "ОтборПоЗначениям" Тогда
Таблица.Колонки.Удалить("ОбеспечиваетсяИзРаспределительногоЦентра");
КонецЕсли;
Если Параметры.ТипОтбора <> "ОтборПоЗначениям" Тогда
Поля = "Номенклатура,Характеристика,Склад,КЗаказу";
ТаблицаЗапасы = Параметры.ТаблицаЗапасы.Скопировать(Новый Структура("Отметка", Истина), Поля);
Запрос.УстановитьПараметр("ТаблицаЗапасы", ТаблицаЗапасы);
ТекстыЗапросов = Новый Массив();
Текст =
"ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.КЗаказу КАК КЗаказу
|ПОМЕСТИТЬ ВтЗапасы
|ИЗ
| &ТаблицаЗапасы КАК Запасы
|ГДЕ
| Запасы.КЗаказу > 0";
ТекстыЗапросов.Добавить(Текст);
ТекстыЗапросов.Добавить(РегистрыСведений.СхемыОбеспечения.ВременнаяТаблицаРазличныеТоварыИСклады("ТоварыИСкладыПопавшиеВОбработку", Истина));
ТекстыЗапросов.Добавить(ВременнаяТаблицаКОбеспечениюВсехСкладов(Истина));
ТекстыЗапросов.Добавить(ВременнаяТаблицаСвободныеОстатки(Истина));
ТекстыЗапросов.Добавить(ВременнаяТаблицаЗаказыКПоступлениюИОтгрузке(Истина));
ТекстыЗапросов.Добавить(ВременнаяТаблицаЗаказыНаПеремещениеВнутриСети(Истина));
ТекстЗапроса =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| ВЫБОР
| КОГДА Остатки.ВНаличииОстаток
| + Остатки.ЗаказаноОстаток
| - Остатки.РезервироватьНаСкладеОстаток
| - Остатки.РезервироватьПоМереПоступленияОстаток > 0
| ТОГДА
| Остатки.ВНаличииОстаток
| + Остатки.ЗаказаноОстаток
| - Остатки.РезервироватьНаСкладеОстаток
| - Остатки.РезервироватьПоМереПоступленияОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Свободно
|ПОМЕСТИТЬ ТаблицаОстатковРабот
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Работы.Номенклатура КАК Номенклатура,
| Работы.Характеристика КАК Характеристика,
| Работы.Склад КАК Склад,
| Работы.Назначение КАК Назначение
| ИЗ
| ВтТовары КАК Работы
| ГДЕ
| Работы.Склад ССЫЛКА Справочник.СтруктураПредприятия)) КАК Остатки
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
ТекстыЗапросов.Добавить(ТекстЗапроса);
Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) КАК ПодразделениеПолучатель,
| Товары.Назначение КАК Назначение,
|
| ВЫБОР
| КОГДА Товары.Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| ИЛИ НастройкаПоддержанияЗапаса.ОбеспечениеЗаказовПриПоддержанииЗапаса ЕСТЬ NULL
| ИЛИ НастройкаПоддержанияЗапаса.ОбеспечениеЗаказовПриПоддержанииЗапаса
| = ЗНАЧЕНИЕ(Перечисление.ОбеспечениеЗаказовПриПоддержанииЗапаса.ЗаСчетЗапасов)
| ТОГДА ЕСТЬNULL(Запасы.КЗаказу, 0)
| ИНАЧЕ 0
| КОНЕЦ
| + ЕСТЬNULL(Остатки.ВНаличии, 0)
| + ЕСТЬNULL(Заказы.Поступит, 0)
| - ЕСТЬNULL(Остатки.ВРезерве, 0)
| + ЕСТЬNULL(ЗаказыНаПеремещениеВнутриСети.РезервМинусЗапас, 0) КАК КРезервированию
|ИЗ
| ТоварыИСкладыПопавшиеВОбработку КАК Товары
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтСвободныеОстатки КАК Остатки
| ПО Остатки.Номенклатура = Товары.Номенклатура
| И Остатки.Характеристика = Товары.Характеристика
| И Остатки.Склад = Товары.Склад
| И Остатки.Назначение = Товары.Назначение
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтЗаказы КАК Заказы
| ПО Заказы.Номенклатура = Товары.Номенклатура
| И Заказы.Характеристика = Товары.Характеристика
| И Заказы.Склад = Товары.Склад
| И Заказы.Назначение = Товары.Назначение
|
| ЛЕВОЕ СОЕДИНЕНИЕ ЗаказыНаПеремещениеВнутриСети КАК ЗаказыНаПеремещениеВнутриСети
| ПО ЗаказыНаПеремещениеВнутриСети.Номенклатура = Товары.Номенклатура
| И ЗаказыНаПеремещениеВнутриСети.Характеристика = Товары.Характеристика
| И ЗаказыНаПеремещениеВнутриСети.Склад = Товары.Склад
| И ЗаказыНаПеремещениеВнутриСети.Назначение = Товары.Назначение
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтЗапасы КАК Запасы
| ПО Запасы.Номенклатура = Товары.Номенклатура
| И Запасы.Характеристика = Товары.Характеристика
| И Запасы.Склад = Товары.Склад
| И Товары.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
|
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК НастройкаПоддержанияЗапаса
| ПО &ПодстановкаТоварногоОграничения
|ГДЕ
| Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Работы.Номенклатура КАК Номенклатура,
| Работы.Характеристика КАК Характеристика,
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) КАК Склад,
| Работы.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| Работы.Назначение КАК Назначение,
| ЕСТЬNULL(Остатки.Свободно, 0) КАК КРезервированию
|ИЗ
| ВтТовары КАК Работы
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаОстатковРабот КАК Остатки
| ПО Остатки.Номенклатура = Работы.Номенклатура
| И Остатки.Характеристика = Работы.Характеристика
| И Остатки.Склад = Работы.ПодразделениеПолучатель
| И Остатки.Назначение = Работы.Назначение
|ГДЕ
| Работы.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ТекстыЗапросов.Добавить(Текст);
Запрос.Текст = СтрСоединить(ТекстыЗапросов, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.Текст = РегистрыСведений.ТоварныеОграничения.ПодставитьСоединение(Запрос.Текст, "ПодстановкаТоварногоОграничения",
"Товары.Номенклатура,Товары.Характеристика,Товары.Склад", "НастройкаПоддержанияЗапаса");
РезультатЗапроса = Запрос.Выполнить();
ТаблицаОстатки = РезультатЗапроса.Выгрузить();
ТаблицаОстатки.Индексы.Добавить("Номенклатура, Характеристика, Склад, ПодразделениеПолучатель, Назначение");
ТаблицаОстатковНаВсехСкладах = Новый ТаблицаЗначений();
ТаблицаОстатковНаВсехСкладах.Колонки.Добавить("Номенклатура");
ТаблицаОстатковНаВсехСкладах.Колонки.Добавить("Характеристика");
ТаблицаОстатковНаВсехСкладах.Колонки.Добавить("Назначение");
ТаблицаОстатковНаВсехСкладах.Колонки.Добавить("КРезервированию");
Если ПолучитьФункциональнуюОпцию("ИспользоватьУправлениеПеремещениемОбособленныхТоваров")
И Параметры.РасчетОбособленныхПотребностейСУчетомОстатковНаВсехСкладах Тогда
УстановитьПривилегированныйРежим(Истина);
Тексты = Новый Массив();
ТекстЗапроса =
"ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Назначение КАК Назначение,
| Запасы.ВНаличииОстаток + Запасы.ЗаказаноОстаток КАК Запас
|ПОМЕСТИТЬ ЗапасыИПотребности
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И (Номенклатура, Характеристика, Назначение) В(
| ВЫБРАТЬ
| Фильтр.Номенклатура КАК Номенклатура,
| Фильтр.Характеристика КАК Характеристика,
| Фильтр.Назначение КАК Назначение
| ИЗ
| РазличныеТоварыИСклады КАК Фильтр)) КАК Запасы";
Тексты.Добавить(ТекстЗапроса);
ТекстЗапроса =
"ВЫБРАТЬ
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Назначение КАК Назначение,
| СУММА(Набор.Запас) КАК КРезервированию
|ИЗ(
| ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Назначение КАК Назначение,
| Запасы.Запас КАК Запас
| ИЗ
| ЗапасыИПотребности КАК Запасы
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Назначение КАК Назначение,
| Таблица.РезервМинусЗапас КАК Запас
| ИЗ
| ЗаказыНаПеремещениеВнутриСети КАК Таблица
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Потребности.Номенклатура КАК Номенклатура,
| Потребности.Характеристика КАК Характеристика,
| Потребности.Назначение КАК Назначение,
| -Потребности.Зарезервировано - Потребности.Обеспечено - Потребности.НеОбеспечено КАК Запас
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Потребности
| ГДЕ
| Потребности.Состояние В(
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.Обеспечить),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ЗарезервированПриПоступлении),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ВРезерве),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаетсяПоНеподтвержденномуЗаказу),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченКДате))
| И Потребности.Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| РазличныеТоварыИСклады КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Потребности.Номенклатура
| И Фильтр.Характеристика = Потребности.Характеристика
| И Фильтр.Склад = Потребности.Склад
| И Фильтр.Назначение = Потребности.Назначение)
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| РазличныеТоварыИСклады КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Потребности.Номенклатура
| И Фильтр.Характеристика = Потребности.Характеристика
| И Фильтр.Назначение = Потребности.Назначение)
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ТопологияСкладов КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Потребности.Номенклатура
| И Фильтр.Характеристика = Потребности.Характеристика
| И Фильтр.Склад = Потребности.Склад
| И Фильтр.Склад <> Фильтр.Центр)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Потребности.Номенклатура КАК Номенклатура,
| Потребности.Характеристика КАК Характеристика,
| Потребности.Назначение КАК Назначение,
| -Потребности.Зарезервировано КАК Запас
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Потребности
| ГДЕ
| Потребности.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ВРезерве)
| И Потребности.Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| РазличныеТоварыИСклады КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Потребности.Номенклатура
| И Фильтр.Характеристика = Потребности.Характеристика
| И Фильтр.Склад = Потребности.Склад
| И Фильтр.Назначение = Потребности.Назначение)
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ЗаказыНаПеремещениеВнутриСетиГруппировкаПоЗаказам КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Потребности.Номенклатура
| И Фильтр.Характеристика = Потребности.Характеристика
| И Фильтр.СкладОтправитель = Потребности.Склад
| И Фильтр.Назначение = Потребности.Назначение
| И Фильтр.Заказ = Потребности.ЗаказНаОтгрузку)
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ТопологияСкладов КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Потребности.Номенклатура
| И Фильтр.Характеристика = Потребности.Характеристика
| И Фильтр.Склад = Потребности.Склад
| И Фильтр.Склад <> Фильтр.Центр)) КАК Набор
|СГРУППИРОВАТЬ ПО
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Назначение
|ИМЕЮЩИЕ
| СУММА(Набор.Запас) > 0";
Тексты.Добавить(ТекстЗапроса);
Запрос.Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
ТаблицаОстатковНаВсехСкладах = Запрос.Выполнить().Выгрузить();
ТаблицаОстатковНаВсехСкладах.Индексы.Добавить("Номенклатура, Характеристика, Назначение");
КонецЕсли;
Отбор = Новый Структура("Номенклатура, Характеристика, Склад, Назначение, ПодразделениеПолучатель");
ОтборОстатковВсехСкладов = Новый Структура("Номенклатура, Характеристика, Назначение");
Для Каждого СтрокаЗаказы Из Таблица Цикл
ЗаполнитьЗначенияСвойств(Отбор, СтрокаЗаказы);
ЗаполнитьЗначенияСвойств(ОтборОстатковВсехСкладов, СтрокаЗаказы);
СтрокиОстатков = ТаблицаОстатки.НайтиСтроки(Отбор);
Если СтрокиОстатков.Количество() > 0 Тогда
НайденнаяСтрока = СтрокиОстатков[0];
НайденнаяСтрока.КРезервированию = Макс(0, НайденнаяСтрока.КРезервированию - СтрокаЗаказы.КРезервированию);
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаЗаказы.Назначение)
И Не СтрокаЗаказы.ЭтоРабота
И Не СтрокаЗаказы.ОбеспечиваетсяИзРаспределительногоЦентра Тогда
НайденныеСтроки = ТаблицаОстатковНаВсехСкладах.НайтиСтроки(ОтборОстатковВсехСкладов);
Если НайденныеСтроки.Количество() > 0 Тогда
НайденныеСтроки[0].КРезервированию = Макс(0, НайденныеСтроки[0].КРезервированию - СтрокаЗаказы.КРезервированию);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаЗаказы Из Таблица Цикл
ЗаполнитьЗначенияСвойств(Отбор, СтрокаЗаказы);
ЗаполнитьЗначенияСвойств(ОтборОстатковВсехСкладов, СтрокаЗаказы);
СтрокиОстатков = ТаблицаОстатки.НайтиСтроки(Отбор);
КРезервированию = 0;
Если СтрокиОстатков.Количество() > 0 Тогда
НайденнаяСтрока = СтрокиОстатков[0];
КРезервированию = Макс(0, Мин(НайденнаяСтрока.КРезервированию, СтрокаЗаказы.Требуется - СтрокаЗаказы.КРезервированию));
СтрокаЗаказы.КРезервированию = СтрокаЗаказы.КРезервированию + КРезервированию;
НайденнаяСтрока.КРезервированию = НайденнаяСтрока.КРезервированию - КРезервированию;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаЗаказы.Назначение)
И Не СтрокаЗаказы.ЭтоРабота
И Не СтрокаЗаказы.ОбеспечиваетсяИзРаспределительногоЦентра Тогда
НайденныеСтроки = ТаблицаОстатковНаВсехСкладах.НайтиСтроки(ОтборОстатковВсехСкладов);
Если НайденныеСтроки.Количество() > 0 Тогда
КРезервированиюПоТовару = Мин(НайденныеСтроки[0].КРезервированию, КРезервированию);
НайденныеСтроки[0].КРезервированию = НайденныеСтроки[0].КРезервированию - КРезервированиюПоТовару;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаЗаказы Из Таблица Цикл
Если ЗначениеЗаполнено(СтрокаЗаказы.Назначение)
И Не СтрокаЗаказы.ЭтоРабота
И Не СтрокаЗаказы.ОбеспечиваетсяИзРаспределительногоЦентра Тогда
ЗаполнитьЗначенияСвойств(ОтборОстатковВсехСкладов, СтрокаЗаказы);
НайденныеСтроки = ТаблицаОстатковНаВсехСкладах.НайтиСтроки(ОтборОстатковВсехСкладов);
Если НайденныеСтроки.Количество() > 0 Тогда
КРезервированию = Макс(0, Мин(НайденныеСтроки[0].КРезервированию, СтрокаЗаказы.Требуется - СтрокаЗаказы.КРезервированию));
НайденныеСтроки[0].КРезервированию = НайденныеСтроки[0].КРезервированию - КРезервированию;
СтрокаЗаказы.КРезервированию = СтрокаЗаказы.КРезервированию + КРезервированию;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПоместитьВоВременноеХранилище(Таблица, АдресРезультата);
КонецПроцедуры
Процедура СформироватьДеревоЗаказов(Параметры, АдресРезультата) Экспорт
ДеревоЗаказов = Параметры.ДеревоЗаказов;
КвалификаторыЧисла = Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Неотрицательный);
ОписаниеБулева = Новый ОписаниеТипов("Булево");
Параметры.Запасы.Колонки.Добавить("ЭтоРабота", ОписаниеБулева);
ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Параметры.ЗаказыКОбеспечению, Параметры.Запасы);
Параметры.Запасы.Индексы.Добавить("СпособОбеспечения, ИсточникОбеспечения, Соглашение, Склад");
Параметры.Запасы.Свернуть("СпособОбеспечения, ИсточникОбеспечения, Соглашение, Склад, Номенклатура, ТипОбеспечения,
|Характеристика, УпаковкаЗаказа, ЦенаВВалютеСоглашения, Отметка, ЕдиницаИзмерения, ВалютаСоглашения, Вес, ЭтоРабота,
|МинимальнаяСуммаЗаказа, ВидЦены, ТипЕдиницыИзмерения, ИсточникОбеспеченияТолькоПросмотр, ПеремещениеРазрешено",
"КЗаказу, СуммаВалютаСоглашения, Округлено, КЗаказуРекомендуется");
Параметры.Запасы.Колонки.Добавить("Обработана", Новый ОписаниеТипов("Булево"));
Сч = 0;
Пока Сч < Параметры.Запасы.Количество() Цикл
СтрокаЗапас = Параметры.Запасы[Сч];
Если НЕ СтрокаЗапас.Отметка ИЛИ СтрокаЗапас.Обработана Тогда
Сч = Сч + 1;
Продолжить;
КонецЕсли;
СтруктураПоиска = Новый Структура("ИсточникОбеспечения, Соглашение, Склад");
ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаЗапас);
НайденныеСтрокиЗапасы = Параметры.Запасы.НайтиСтроки(СтруктураПоиска);
СтрокаЗаказ = ДеревоЗаказов.Строки.Добавить();
СтрокаЗаказ.УровеньВДереве = 0;
ЗаполнитьЗначенияСвойств(СтрокаЗаказ, СтрокаЗапас,,"СпособОбеспечения, Номенклатура, Характеристика, ЕдиницаИзмерения, УпаковкаЗаказа, ЦенаВВалютеСоглашения");
КЗаказуИтог = 0;
ПотребностьИтог = 0;
СуммаВалютаСоглашенияИтог = 0;
ВесИтог = 0;
ТипыВеличинСовпадают = Истина;
ТипИзмеряемойВеличины = Неопределено;
Для Каждого ЭлементЗапас Из НайденныеСтрокиЗапасы Цикл
Если ЭлементЗапас.Отметка Тогда
Если ТипИзмеряемойВеличины <> ЭлементЗапас.ТипЕдиницыИзмерения И ТипИзмеряемойВеличины <> Неопределено Тогда
ТипыВеличинСовпадают = Ложь;
КонецЕсли;
ТипИзмеряемойВеличины = ЭлементЗапас.ТипЕдиницыИзмерения;
СтрокаНоменклатура = СтрокаЗаказ.Строки.Добавить();
СтрокаНоменклатура.УровеньВДереве = 1;
ЗаполнитьЗначенияСвойств(СтрокаНоменклатура, ЭлементЗапас);
СтрокаНоменклатура.КЗаказу = Макс(ЭлементЗапас.Округлено, ЭлементЗапас.КЗаказу);
СтрокаНоменклатура.Потребность = ЭлементЗапас.КЗаказуРекомендуется;
СтрокаНоменклатура.Вес = ЭлементЗапас.Вес * СтрокаНоменклатура.КЗаказу;
СтрокаНоменклатура.СуммаВалютаСоглашения = СтрокаНоменклатура.ЦенаВВалютеСоглашения * СтрокаНоменклатура.КЗаказу;
КЗаказуИтог = КЗаказуИтог + СтрокаНоменклатура.КЗаказу;
ПотребностьИтог = ПотребностьИтог + СтрокаНоменклатура.Потребность;
СуммаВалютаСоглашенияИтог = СуммаВалютаСоглашенияИтог + СтрокаНоменклатура.СуммаВалютаСоглашения;
ВесИтог = ВесИтог + СтрокаНоменклатура.Вес;
ЭлементЗапас.Обработана = Истина;
КонецЕсли;
КонецЦикла;
СтрокаЗаказ.КЗаказу = ?(ТипыВеличинСовпадают, КЗаказуИтог, 0);
СтрокаЗаказ.Потребность = ?(ТипыВеличинСовпадают, ПотребностьИтог, 0);
СтрокаЗаказ.СуммаВалютаСоглашения = СуммаВалютаСоглашенияИтог;
СтрокаЗаказ.Вес = ВесИтог;
Если СуммаВалютаСоглашенияИтог < СтрокаЗаказ.МинимальнаяСуммаЗаказа И СуммаВалютаСоглашенияИтог <> 0 Тогда
СтрокаЗаказ.Предупреждение = Истина;
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
ПоместитьВоВременноеХранилище(ДеревоЗаказов, АдресРезультата);
КонецПроцедуры
#КонецОбласти
#Область ФормированиеЗаказов
Процедура СформироватьЗаказы(Параметры, АдресРезультата) Экспорт
ДокументыОбъекты = Новый Массив();
ТекстКомментарий = НСтр("ru = 'Сформирован автоматически обработкой ""Формирование заказов по потребностям"".'");
Таблица = Параметры.ТаблицаПотребностей;
Таблица.Колонки.Добавить("ЭтоОкругление", Новый ОписаниеТипов("Булево"));
Таблица.Колонки.Добавить("НазначениеОкругленнойСтроки", Новый ОписаниеТипов("СправочникСсылка.Назначения"));
Если Параметры.ИспользоватьУпаковки Тогда
ОкруглитьПередСозданиемЗаказов(Таблица);
КонецЕсли;
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ТаблицаЗначений", Таблица);
Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("ОсновнаяСтрана", ЗначениеНастроекКлиентСерверПовтИсп.ОсновнаяСтрана());
ТекстыЗапроса = Новый СписокЗначений();
ТекстыЗапроса.Добавить(ВременнаяТаблицаИзТаблицыКЗаказу(), "");
ТекстыЗапроса.Добавить(ВременнаяТаблицаДанныеЗаполнения(), "");
ТекстыЗапроса.Добавить(ТаблицаЗаказыПоставщикуКОформлению(), "ТаблицаЗаказыПоставщику");
ТекстыЗапроса.Добавить(ТаблицаЗаказыНаПеремещениеКоформлению(), "ТаблицаЗаказыНаПеремещение");
ТекстыЗапроса.Добавить(ТаблицаЗаказыНаСборкуКОформлению(), "ТаблицаЗаказыНаСборку");
Запрос.УстановитьПараметр("УправлениеПроизводством2_2", ПолучитьФункциональнуюОпцию("ИспользоватьУправлениеПроизводством2_2"));
УстановитьПривилегированныйРежим(Истина);
Таблицы = ОбщегоНазначенияУТ.ВыгрузитьРезультатыЗапроса(Запрос, ТекстыЗапроса);
УстановитьПривилегированныйРежим(Ложь);
ПоляКлючаЗаказа = "НаправлениеДеятельности, Соглашение, Партнер, Организация, Подразделение";
МассивТаблиц = ОбеспечениеСервер.РазбитьТаблицуПоЗначениюКлюча(Таблицы.ТаблицаЗаказыПоставщику, ПоляКлючаЗаказа);
Для Каждого Элемент Из МассивТаблиц Цикл
ПоляКлючаЗаказа = "Склад";
ДанныеЗаполнения = Элемент.Ключ;
ТаблицыПоСкладам = ОбеспечениеСервер.РазбитьТаблицуПоЗначениюКлюча(Элемент.Таблица, ПоляКлючаЗаказа, "");
Если ТаблицыПоСкладам.Количество() = 2
И Не ЗначениеЗаполнено(ТаблицыПоСкладам[0].Таблица[0].Склад) Тогда
ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ТаблицыПоСкладам[0].Таблица, ТаблицыПоСкладам[1].Таблица);
ТаблицыПоСкладам.Удалить(0);
КонецЕсли;
Для Каждого Элемент1 Из ТаблицыПоСкладам Цикл
ДанныеЗаполнения.Вставить("Склад", Элемент1.Ключ.Склад);
Элемент1.Таблица.Колонки.ПодразделениеПолучатель.Имя = "Подразделение";
ДанныеЗаполнения.Вставить("Комментарий", ТекстКомментарий);
ДанныеЗаполнения.Вставить("Товары", Элемент1.Таблица);
Документ = ПолучитьДокумент(Документы.ЗаказПоставщику, ДанныеЗаполнения, Перечисления.СтатусыЗаказовПоставщикам.Подтвержден);
ДокументыОбъекты.Добавить(Документ);
КонецЦикла;
КонецЦикла;
ПоляКлючаЗаказа = "СкладОтправитель, СкладПолучатель, Организация, Подразделение, НаправлениеДеятельности";
МассивТаблиц = ОбеспечениеСервер.РазбитьТаблицуПоЗначениюКлюча(Таблицы.ТаблицаЗаказыНаПеремещение, ПоляКлючаЗаказа);
Для Каждого Элемент Из МассивТаблиц Цикл
ДанныеЗаполнения = Элемент.Ключ;
ДанныеЗаполнения.Вставить("Товары", Элемент.Таблица);
ДанныеЗаполнения.Вставить("Комментарий", ТекстКомментарий);
Документ = ПолучитьДокумент(Документы.ЗаказНаПеремещение, ДанныеЗаполнения, Перечисления.СтатусыВнутреннихЗаказов.КВыполнению);
ДокументыОбъекты.Добавить(Документ);
КонецЦикла;
ПоляКлючаЗаказа = "Организация, Подразделение, Склад, Номенклатура, Характеристика, Назначение, НаправлениеДеятельности,
|НачалоСборкиРазборки, ОкончаниеСборкиРазборки, ДлительностьСборкиРазборки, Количество, КоличествоУпаковок";
МассивТаблиц = ОбеспечениеСервер.РазбитьТаблицуПоЗначениюКлюча(Таблицы.ТаблицаЗаказыНаСборку, ПоляКлючаЗаказа);
Для Каждого Элемент Из МассивТаблиц Цикл
ДанныеЗаполнения = Элемент.Ключ;
ДанныеЗаполнения.Вставить("ХозяйственнаяОперация", Перечисления.ХозяйственныеОперации.СборкаТоваров);
ДанныеЗаполнения.Вставить("Комментарий", ТекстКомментарий);
Документ = ПолучитьДокумент(Документы.ЗаказНаСборку, ДанныеЗаполнения, Перечисления.СтатусыВнутреннихЗаказов.КВыполнению);
ДокументыОбъекты.Добавить(Документ);
КонецЦикла;
ИспользованиеСтатусов = Новый Соответствие();
ИспользоватьСтатусы = ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовПоставщикам");
ИспользованиеСтатусов.Вставить(Тип("ДокументСсылка.ЗаказПоставщику"), ИспользоватьСтатусы);
ИспользоватьСтатусы = ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовНаСборку");
ИспользованиеСтатусов.Вставить(Тип("ДокументСсылка.ЗаказНаСборку"), ИспользоватьСтатусы);
ИспользоватьСтатусы = ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовНаПеремещение");
ИспользованиеСтатусов.Вставить(Тип("ДокументСсылка.ЗаказНаПеремещение"), ИспользоватьСтатусы);
Результат = Новый Структура("ТаблицаДокументов,СписокСообщений", Параметры.ТаблицаДокументов, Новый Массив);
Для Каждого Документ Из ДокументыОбъекты Цикл
Ошибка = Не Документ.ПроверитьЗаполнение();
Если Не Ошибка Тогда
НачатьТранзакцию();
Попытка
Документ.Записать(РежимЗаписиДокумента.Проведение);
ДобавитьДокументВРезультат(Документ, Результат, ИспользованиеСтатусов);
ПоместитьВоВременноеХранилище(Результат, Параметры.АдресРезультатаФормированияЗаказов);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ИмяСобытияЖурнала = НСтр("ru = 'Формирование заказов: создание документов'", ОбщегоНазначения.КодОсновногоЯзыка());
ЗаписьЖурналаРегистрации(ИмяСобытияЖурнала, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Ошибка = Истина;
КонецПопытки;
КонецЕсли;
Если Ошибка Тогда
НачатьТранзакцию();
Попытка
Документ.Записать(РежимЗаписиДокумента.Запись);
ДобавитьДокументВРезультат(Документ, Результат, ИспользованиеСтатусов);
ПоместитьВоВременноеХранилище(Результат, Параметры.АдресРезультатаФормированияЗаказов);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ИмяСобытияЖурнала = НСтр("ru = 'Формирование заказов: создание документов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
ЗаписьЖурналаРегистрации(ИмяСобытияЖурнала, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
КонецЦикла;
ОбеспечениеВДокументахСервер.ПроверитьЗапуститьФоновоеЗаданиеРаспределенияЗапасов();
КонецПроцедуры
Процедура УдалитьЗаказы(Параметры, АдресРезультата) Экспорт
НачатьТранзакцию();
Попытка
СписокОшибок = ОбщегоНазначенияУТ.УстановитьПометкуУдаленияДокументов(Параметры.СсылкиНаУдаление);
ПоместитьВоВременноеХранилище(СписокОшибок, АдресРезультата);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ИмяСобытияЖурнала = НСтр("ru = 'Формирование заказов: установка пометки удаления документов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
ЗаписьЖурналаРегистрации(ИмяСобытияЖурнала, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Функция ВременнаяТаблицаИзТаблицыКЗаказу()
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| Таблица.Назначение КАК Назначение,
|
| Таблица.Заказ КАК Заказ,
|
| Таблица.ТипОбеспечения КАК ТипОбеспечения,
| Таблица.ИсточникОбеспечения КАК ИсточникОбеспечения,
| Таблица.Соглашение КАК Соглашение,
| Таблица.СпособОбеспечения КАК СпособОбеспечения,
| Таблица.ВидЦены КАК ВидЦены,
| Таблица.ДатаПоставки КАК ДатаПоставки,
| Таблица.КЗаказу КАК КЗаказу,
| Таблица.ЭтоОкругление КАК ЭтоОкругление,
| Таблица.НазначениеОкругленнойСтроки КАК НазначениеОкругленнойСтроки,
| Таблица.УпаковкаЗаказа КАК Упаковка
|
|ПОМЕСТИТЬ ВтТаблицаЗначений
|ИЗ
| &ТаблицаЗначений КАК Таблица
|
|ГДЕ
| Таблица.КЗаказу > 0
|
|ИНДЕКСИРОВАТЬ ПО
| СпособОбеспечения
|;
|
|
|";
Возврат ТекстЗапроса;
КонецФункции
Функция ВременнаяТаблицаДанныеЗаполнения()
ТекстЗапроса =
"ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| ВЫБОР
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))) ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатурыСтраныРегистрации.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДССтраныРегистрации.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка))))
| КОГДА НЕ (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)))) ЕСТЬ NULL
| ТОГДА (ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС, ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка))))
| ИНАЧЕ 0
| КОНЕЦ КАК СтавкаНДС,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| Т.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| Т.Назначение КАК Назначение,
|
| ВЫБОР КОГДА ЛОЖЬ ТОГДА
| НЕОПРЕДЕЛЕНО
| ИНАЧЕ
| НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК Заказ,
|
| ВЫБОР КОГДА Т.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка) ТОГДА
| НЕОПРЕДЕЛЕНО
| ИНАЧЕ
| НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК Давалец,
|
| ВЫБОР КОГДА Т.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка) ТОГДА
| НЕОПРЕДЕЛЕНО
| ИНАЧЕ
| НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК Договор,
|
| ВЫБОР
| КОГДА ЛОЖЬ
| ТОГДА НЕОПРЕДЕЛЕНО
| ИНАЧЕ
| НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК ТипПроизводственногоПроцесса,
|
| Т.ТипОбеспечения КАК ТипОбеспечения,
| Т.ИсточникОбеспечения КАК ИсточникОбеспечения,
| Т.Соглашение КАК Соглашение,
| ЕСТЬNULL(
| ВЫРАЗИТЬ(
| ВЫБОР
| КОГДА Т.ЭтоОкругление
| ТОГДА Т.НазначениеОкругленнойСтроки
| ИНАЧЕ Т.Назначение
| КОНЕЦ КАК Справочник.Назначения).НаправлениеДеятельности,
| ЗНАЧЕНИЕ(Справочник.НаправленияДеятельности.ПустаяСсылка)) КАК НаправлениеДеятельности,
|
| ВЫБОР
| КОГДА ЕСТЬNULL(Т.СпособОбеспечения.Организация, ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка))
| <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
| ТОГДА Т.СпособОбеспечения.Организация
| ИНАЧЕ ЕСТЬNULL(Т.СпособОбеспечения.Соглашение.Организация, ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка))
| КОНЕЦ КАК Организация,
|
| ЕСТЬNULL(Т.СпособОбеспечения.Подразделение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка)) КАК Подразделение,
|
| ЕСТЬNULL(Т.СпособОбеспечения.ДлительностьВДнях, 0) КАК ДлительностьВДнях,
|
| Т.ВидЦены КАК ВидЦены,
| Т.ДатаПоставки КАК ДатаПоставки,
| Т.КЗаказу КАК Количество,
| Т.Упаковка КАК Упаковка
|
|ПОМЕСТИТЬ ВтДанныеЗаполнения
|ИЗ
| ВтТаблицаЗначений КАК Т
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиНДСНоменклатуры.СрезПоследних(&НачалоДня) КАК СтавкиНДСНоменклатурыСтраныРегистрации
| ПО Т.Номенклатура = СтавкиНДСНоменклатурыСтраныРегистрации.Номенклатура
| И Т.СпособОбеспечения.Организация.СтранаРегистрации = СтавкиНДСНоменклатурыСтраныРегистрации.Страна
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСтавкиНДС.СрезПоследних(&НачалоДня) КАК ОсновныеСтавкиНДССтраныРегистрации
| ПО Т.СпособОбеспечения.Организация.СтранаРегистрации = ОсновныеСтавкиНДССтраныРегистрации.Страна
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиНДСНоменклатуры.СрезПоследних(&НачалоДня, Страна = &ОсновнаяСтрана ИЛИ Страна = ЗНАЧЕНИЕ(Справочник.СтраныМира.ПустаяСсылка)) КАК СтавкиНДСНоменклатуры
| ПО Т.Номенклатура = СтавкиНДСНоменклатуры.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСтавкиНДС.СрезПоследних(&НачалоДня, Страна = &ОсновнаяСтрана) КАК ОсновныеСтавкиНДС
| ПО (ИСТИНА)
|
|;
|
|
|";
Возврат ТекстЗапроса;
КонецФункции
Функция ТаблицаЗаказыПоставщикуКОформлению()
ТекстЗапроса =
"ВЫБРАТЬ
| ВЫБОР КОГДА Т.ИсточникОбеспечения = НЕОПРЕДЕЛЕНО ТОГДА
| ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
| ИНАЧЕ
| Т.ИсточникОбеспечения
| КОНЕЦ КАК Партнер,
| Т.НаправлениеДеятельности КАК НаправлениеДеятельности,
| Т.Соглашение КАК Соглашение,
| Т.Организация КАК Организация,
| Т.Подразделение КАК Подразделение,
| Т.Склад КАК Склад,
| Т.Номенклатура КАК Номенклатура,
| МАКСИМУМ(Т.СтавкаНДС) КАК СтавкаНДС,
| Т.Характеристика КАК Характеристика,
| Т.Назначение КАК Назначение,
| Т.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| Т.ВидЦены КАК ВидЦеныПоставщика,
| Т.ДатаПоставки КАК ДатаПоступления,
| СУММА(ВЫБОР
| КОГДА Т.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА Т.Количество
| ИНАЧЕ Т.Количество / (Т.Упаковка.Числитель / Т.Упаковка.Знаменатель)
| КОНЕЦ) КАК КоличествоУпаковок,
| СУММА(Т.Количество) КАК Количество,
| Т.Упаковка КАК Упаковка
|ИЗ
| ВтДанныеЗаполнения КАК Т
|ГДЕ
| Т.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)
|
|СГРУППИРОВАТЬ ПО
| Т.НаправлениеДеятельности,
| Т.Соглашение,
| Т.ИсточникОбеспечения,
| Т.Организация,
| Т.Подразделение,
| Т.Склад,
| Т.Номенклатура,
| Т.Характеристика,
| Т.Назначение,
| Т.ДатаПоставки,
| Т.ВидЦены,
| Т.ПодразделениеПолучатель,
| Т.ИсточникОбеспечения,
| Т.Упаковка
|
|УПОРЯДОЧИТЬ ПО
| НаправлениеДеятельности,
| Соглашение,
| Партнер,
| Организация,
| Подразделение,
| Склад,
| Назначение,
| ДатаПоступления,
| Номенклатура,
| Характеристика,
| ПодразделениеПолучатель
|;
|
|
|";
Возврат ТекстЗапроса;
КонецФункции
Функция ТаблицаЗаказыНаПеремещениеКОформлению()
ТекстЗапроса =
"ВЫБРАТЬ
| ВЫБОР КОГДА Т.ИсточникОбеспечения = НЕОПРЕДЕЛЕНО ТОГДА
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| ИНАЧЕ
| Т.ИсточникОбеспечения
| КОНЕЦ КАК СкладОтправитель,
| Т.Организация КАК Организация,
| Т.Подразделение КАК Подразделение,
| Т.Склад КАК СкладПолучатель,
| Т.НаправлениеДеятельности КАК НаправлениеДеятельности,
|
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Назначение КАК Назначение,
|
| МАКСИМУМ(ДОБАВИТЬКДАТЕ(Т.ДатаПоставки, ДЕНЬ, - Т.ДлительностьВДнях)) КАК НачалоОтгрузки,
| Т.ДатаПоставки КАК ОкончаниеПоступления,
|
| СУММА(Т.Количество) КАК КоличествоУпаковок,
| СУММА(Т.Количество) КАК Количество
|ИЗ
| ВтДанныеЗаполнения КАК Т
|ГДЕ
| Т.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Перемещение)
|СГРУППИРОВАТЬ ПО
| Т.ИсточникОбеспечения, Т.Организация, Т.Подразделение, Т.Склад, Т.НаправлениеДеятельности,
| Т.Номенклатура, Т.Характеристика, Т.Назначение, Т.ДатаПоставки, Т.ДлительностьВДнях
|УПОРЯДОЧИТЬ ПО
| СкладОтправитель, СкладПолучатель, Организация, Подразделение, НаправлениеДеятельности,
| Назначение, НачалоОтгрузки, Номенклатура, Характеристика, ОкончаниеПоступления
|;
|
|
|";
Возврат ТекстЗапроса;
КонецФункции
Функция ТаблицаЗаказыНаСборкуКОформлению()
ТекстЗапроса =
"ВЫБРАТЬ
| Т.Организация КАК Организация,
| Т.Подразделение КАК Подразделение,
| Т.Склад КАК Склад,
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Назначение КАК Назначение,
| Т.НаправлениеДеятельности КАК НаправлениеДеятельности,
|
| МАКСИМУМ(ДОБАВИТЬКДАТЕ(Т.ДатаПоставки, ДЕНЬ, - Т.ДлительностьВДнях)) КАК НачалоСборкиРазборки,
|
| Т.ДатаПоставки КАК ОкончаниеСборкиРазборки,
| Т.ДатаПоставки КАК ЖелаемаяДатаПоступления,
| Т.ДлительностьВДнях КАК ДлительностьСборкиРазборки,
|
| СУММА(Т.Количество) КАК КоличествоУпаковок,
| СУММА(Т.Количество) КАК Количество
|ИЗ
| ВтДанныеЗаполнения КАК Т
|ГДЕ
| Т.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.СборкаРазборка)
|СГРУППИРОВАТЬ ПО
| Т.Организация, Т.Подразделение, Т.Склад, Т.Номенклатура, Т.Характеристика,
| Т.Назначение, Т.НаправлениеДеятельности, Т.ДлительностьВДнях, Т.ДатаПоставки
|УПОРЯДОЧИТЬ ПО
| Организация, Подразделение, Склад, Номенклатура, Характеристика, Назначение, НаправлениеДеятельности, НачалоСборкиРазборки
|;
|
|
|";
Возврат ТекстЗапроса;
КонецФункции
Процедура ОкруглитьПередСозданиемЗаказов(Таблица)
Таблица.Сортировать("Номенклатура, Характеристика, Склад, ДатаПоставки, Назначение УБЫВ", Новый СравнениеЗначений());
ПоляКлюча = "Номенклатура, Характеристика, Склад";
Ключ = Новый Структура(ПоляКлюча);
Остаток = 0;
ОкругленнаяСтрока = Неопределено;
Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл
Строка = Таблица[ИндексСтроки];
Если Не Строка.Отметка
Или Строка.КЗаказу = 0
Или Строка.НеОкруглятьПередСозданиемЗаказа Тогда
Продолжить;
КонецЕсли;
ИзменилсяКлюч = ОбеспечениеСервер.ИзменилсяКлюч(Ключ, Строка);
ЗаполнитьЗначенияСвойств(Ключ, Строка);
Если ИзменилсяКлюч Тогда
Если Остаток > 0 Тогда
НоваяСтрока = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ОкругленнаяСтрока);
НоваяСтрока.КЗаказу = Остаток;
НоваяСтрока.Назначение = Справочники.Назначения.ПустаяСсылка();
НоваяСтрока.ЭтоОкругление = Истина;
НоваяСтрока.НазначениеОкругленнойСтроки = ОкругленнаяСтрока.Назначение;
КонецЕсли;
Округлено = Округлить(Строка.КЗаказу, ?(Строка.ЧислительУпаковки = 0 Или Строка.ЗнаменательУпаковки = 0, 1, Строка.ЧислительУпаковки / Строка.ЗнаменательУпаковки),
Строка.ТипЕдиницыИзмерения);
Кратность = ?(Строка.ЧислительУпаковки = 0 Или Строка.ЗнаменательУпаковки = 0, 1, Строка.ЧислительУпаковки / Строка.ЗнаменательУпаковки);
МинимальнаяПартияПоставки = Строка.МинимальнаяПартияПоставки * Кратность;
Округлено = Макс(МинимальнаяПартияПоставки, Округлено);
Остаток = Округлено - Строка.КЗаказу;
ОкругленнаяСтрока = Строка;
Иначе
Если Остаток >= Строка.КЗаказу Тогда
Строка.ДатаПоставки = ОкругленнаяСтрока.ДатаПоставки;
Остаток = Остаток - Строка.КЗаказу;
Иначе
Если Остаток > 0 Тогда
КЗаказуДляНовойОкругленнойСтроки = Строка.КЗаказу - Остаток;
НоваяСтрока = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
НоваяСтрока.КЗаказу = Остаток;
НоваяСтрока.ДатаПоставки = ОкругленнаяСтрока.ДатаПоставки;
Строка.КЗаказу = КЗаказуДляНовойОкругленнойСтроки;
КонецЕсли;
Округлено = Округлить(Строка.КЗаказу, ?(Строка.ЧислительУпаковки = 0 Или Строка.ЗнаменательУпаковки = 0, 1, Строка.ЧислительУпаковки / Строка.ЗнаменательУпаковки),
Строка.ТипЕдиницыИзмерения);
Остаток = Округлено - Строка.КЗаказу;
ОкругленнаяСтрока = Строка;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Остаток > 0 Тогда
НоваяСтрока = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ОкругленнаяСтрока);
НоваяСтрока.КЗаказу = Остаток;
НоваяСтрока.Назначение = Справочники.Назначения.ПустаяСсылка();
НоваяСтрока.ЭтоОкругление = Истина;
НоваяСтрока.НазначениеОкругленнойСтроки = ОкругленнаяСтрока.Назначение;
КонецЕсли;
КонецПроцедуры
Функция Округлить(Количество, Кратность, ТипЕдиницыИзмерения)
Если Кратность <> 1
Или ТипЕдиницыИзмерения = ПредопределенноеЗначение("Перечисление.ТипыИзмеряемыхВеличин.КоличествоШтук") Тогда
Если Количество % Кратность <> 0 Тогда
Остаток = Цел(Количество / Кратность) + 1;
Возврат Остаток * Кратность;
Иначе
Возврат Количество;
КонецЕсли;
Иначе
Возврат Количество;
КонецЕсли;
КонецФункции
Функция ПолучитьЗначенияРеквизитовДокумента(ДокументОбъект)
ЗначенияРеквизитов = Новый Структура();
ЗначенияРеквизитов.Вставить("Документ", ДокументОбъект.Ссылка);
ЗначенияРеквизитов.Вставить("СтандартнаяКартинка", ?(ДокументОбъект.Проведен, 0, ?(ДокументОбъект.ПометкаУдаления, 1, 2)));
ЗаказНеПодтвержден = ?(ТипЗнч(ДокументОбъект) <> Тип("ДокументОбъект.ЗаказПоставщику")
Или ДокументОбъект.Статус = Перечисления.СтатусыЗаказовПоставщикам.Подтвержден
Или ДокументОбъект.Статус = Перечисления.СтатусыЗаказовПоставщикам.Закрыт, ?(ДокументОбъект.Проведен, 0, 1), 1);
ЗаказНаПроизводствоНеКПроизводству = 0;
ЗначенияРеквизитов.Вставить("НеПоставленВГрафик", ЗаказНеПодтвержден);
ЗначенияРеквизитов.Вставить("НеПоставленВГрафикПроизводства", ЗаказНаПроизводствоНеКПроизводству);
ЗначенияРеквизитов.Вставить("Статус", ДокументОбъект.Статус);
ЗначенияРеквизитов.Вставить("Организация", ДокументОбъект.Организация);
ДатаПоставки = '00010101';
ИмяТабЧасти = "";
Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЗаказНаСборку") Тогда
ЗначенияРеквизитов.Вставить("ИсточникОбеспечения", ДокументОбъект.Склад);
ДатаПоставки = ДокументОбъект.ОкончаниеСборкиРазборки;
ИначеЕсли ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЗаказНаПеремещение") Тогда
ЗначенияРеквизитов.Вставить("ИсточникОбеспечения", ДокументОбъект.СкладОтправитель);
ИмяТабЧасти = "Товары";
ИмяРеквизитаДатыПоставки = "ОкончаниеПоступления";
ИначеЕсли ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЗаказПоставщику") Тогда
ЗначенияРеквизитов.Вставить("ИсточникОбеспечения", ДокументОбъект.Партнер);
ЗначенияРеквизитов.Вставить("Сумма", ДокументОбъект.СуммаДокумента);
ЗначенияРеквизитов.Вставить("Валюта", ДокументОбъект.Валюта);
ИмяТабЧасти = "Товары";
ИмяРеквизитаДатыПоставки = "ДатаПоступления";
КонецЕсли;
Если ИмяТабЧасти <> "" Тогда
Для каждого Строка Из ДокументОбъект[ИмяТабЧасти] Цикл
Если ДатаПоставки <> Строка[ИмяРеквизитаДатыПоставки] Тогда
Если ДатаПоставки <> '00010101' Тогда
ДатаПоставки = '00010101';
Прервать;
КонецЕсли;
ДатаПоставки = Строка[ИмяРеквизитаДатыПоставки];
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЗначенияРеквизитов.Вставить("ДатаПоставки", ДатаПоставки);
Возврат ЗначенияРеквизитов;
КонецФункции
Функция ПолучитьДокумент(МенеджерДокументов, ДанныеЗаполнения, Статус)
ДокументОбъект = МенеджерДокументов.СоздатьДокумент();
ДанныеЗаполнения.Вставить("Дата", ТекущаяДатаСеанса());
ДокументОбъект.Заполнить(ДанныеЗаполнения);
Если Не ЗначениеЗаполнено(ДокументОбъект.Статус) Тогда
ДокументОбъект.Статус = Статус;
КонецЕсли;
Возврат ДокументОбъект;
КонецФункции
Процедура ДобавитьДокументВРезультат(Документ, Результат, ИспользованиеСтатусов)
НоваяСтрока = Результат.ТаблицаДокументов.Добавить();
НовыеЗначенияРеквизитов = ПолучитьЗначенияРеквизитовДокумента(Документ);
ЗаполнитьЗначенияСвойств(НоваяСтрока, НовыеЗначенияРеквизитов);
НоваяСтрока.ИспользованиеСтатусов = ИспользованиеСтатусов[ТипЗнч(НоваяСтрока.Документ)];
Ошибки = ПолучитьСообщенияПользователю(Истина);
Для Каждого Ошибка Из Ошибки Цикл
Ошибка.КлючДанных = Документ.Ссылка;
Результат.СписокСообщений.Добавить(Ошибка);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область Прочее
Функция ПолучитьЗапросСОтборамиКомпоновкиДанных(АдресСхемыКомпоновкиДанных, КомпоновщикНастроек, ИмяНабораДанных)
СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных);
СегментыСервер.ВключитьОтборПоСегментуНоменклатурыВСКД(КомпоновщикНастроек);
ОтборКомпоновки = КомпоновщикНастроек.ПолучитьНастройки().Отбор;
ИспользуетсяОтборПоЗаказам = НайтиОтборРекурсивно(ОтборКомпоновки.Элементы, Новый ПолеКомпоновкиДанных("Заказ"))
Или НайтиОтборРекурсивно(ОтборКомпоновки.Элементы, Новый ПолеКомпоновкиДанных("НаправлениеДеятельности"));
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(КомпоновщикНастроек, "ИспользуетсяОтборПоЗаказам", Истина, ИспользуетсяОтборПоЗаказам);
КомпоновщикМакетаКомпоновкиДанных = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакетаКомпоновкиДанных.Выполнить(СхемаКомпоновкиДанных,
КомпоновщикНастроек.ПолучитьНастройки(),,,, Ложь);
Запрос = Новый Запрос(МакетКомпоновкиДанных.НаборыДанных[ИмяНабораДанных].Запрос);
Для каждого ПараметрКомпоновки Из МакетКомпоновкиДанных.ЗначенияПараметров Цикл
Запрос.УстановитьПараметр(ПараметрКомпоновки.Имя, ПараметрКомпоновки.Значение);
КонецЦикла;
ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
Запрос.УстановитьПараметр("ИспользоватьХарактеристикиНоменклатуры", ИспользоватьХарактеристикиНоменклатуры);
Возврат Запрос;
КонецФункции
Функция ВременнаяТаблицаТоваровДляПоддержанияЗапаса()
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| НоменклатураСегмента.Номенклатура КАК Номенклатура,
| НоменклатураСегмента.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ОтборПоСегментам
|ИЗ
| РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
| {ГДЕ
| НоменклатураСегмента.Номенклатура.* КАК Номенклатура,
| НоменклатураСегмента.Характеристика.* КАК Характеристика,
| НоменклатураСегмента.Сегмент.* КАК СегментНоменклатуры}
|ГДЕ
| &ИспользуетсяОтборПоСегментуНоменклатуры
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Характеристика
|;
|
|
|" + Справочники.ФорматыМагазинов.ТекстЗапросаВтФорматыСкладов(Ложь)
+ РегистрыСведений.ТоварныеОграничения.ВременнаяТаблицаТоварыПоддерживаемогоЗапаса()
+ "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| ЕСТЬNULL(СпрСпособ.Ссылка, ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка)) КАК СпособОбеспечения
|
|ПОМЕСТИТЬ ВтТовары
|ИЗ
| ВтТоварыПоддерживаемогоЗапаса КАК Т
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособ
| ПО &ПодстановкаОсновногоСпособаОбеспечения
|
|{ГДЕ
| ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка) КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) КАК ПодразделениеПолучатель,
| ЗНАЧЕНИЕ(Справочник.НаправленияДеятельности.ПустаяСсылка) КАК НаправлениеДеятельности,
| ВЫРАЗИТЬ(NULL КАК Справочник.Назначения).Заказ.* КАК Заказ}
|
|{ГДЕ
| (ЕСТЬNULL(СпрСпособ.Ссылка,
| ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))).* КАК СпособОбеспечения,
| ЕСТЬNULL(СпрСпособ.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ВЫРАЗИТЬ(
| ВЫБОР
| КОГДА СпрСпособ.Подразделение <> ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| СпрСпособ.Подразделение
| ИНАЧЕ
| ЕСТЬNULL(Т.Склад.Подразделение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка))
| КОНЕЦ КАК Справочник.СтруктураПредприятия).* КАК Подразделение,
| (ЕСТЬNULL(СпрСпособ.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)).* КАК ИсточникОбеспечения}
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад,
| СпособОбеспечения
|;
|
|
|УНИЧТОЖИТЬ ВтФорматыСкладов;
|
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| Т.СпособОбеспечения КАК СпособОбеспечения
|{ВЫБРАТЬ
| Номенклатура.* КАК Номенклатура,
| Характеристика.* КАК Характеристика,
| Склад.* КАК Склад,
| СпособОбеспечения.* КАК СпособОбеспечения}
|ИЗ
| ВтТовары КАК Т";
ТекстЗапроса = РегистрыСведений.СхемыОбеспечения.ПодставитьСоединениеДляПолученияСпособаОбеспечения(
ТекстЗапроса, "ПодстановкаОсновногоСпособаОбеспечения");
Возврат ТекстЗапроса;
КонецФункции
Функция ВременнаяТаблицаСпособовОбеспечения(ТоварыПоддерживаемогоЗапаса)
ТекстЗапроса =
ВременнаяТаблицаОтборПоЗаказам()
+ ОбщегоНазначения.РазделительПакетаЗапросов()
+ Справочники.ФорматыМагазинов.ТекстЗапросаВтФорматыСкладов(Ложь)
+ "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| НоменклатураСегмента.Номенклатура КАК Номенклатура,
| НоменклатураСегмента.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ОтборПоСегментам
|ИЗ
| РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
| {ГДЕ
| НоменклатураСегмента.Номенклатура.* КАК Номенклатура,
| НоменклатураСегмента.Характеристика.* КАК Характеристика,
| НоменклатураСегмента.Сегмент.* КАК СегментНоменклатуры}
|ГДЕ
| &ИспользуетсяОтборПоСегментуНоменклатуры
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика
|;
|
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| Т.Подразделение КАК Подразделение,
| Т.Назначение КАК Назначение,
| Т.СпособОбеспечения КАК СпособОбеспечения,
| СУММА(Т.Количество) КАК Количество
|
|ПОМЕСТИТЬ ВтПотребности
|ИЗ (
| ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| ВЫБОР КОГДА Т.Склад ССЫЛКА Справочник.Склады ТОГДА
| Т.Склад
| ИНАЧЕ
| ЗНАЧЕНИЕ(Справочник.Склады.Пустаяссылка)
| КОНЕЦ КАК Склад,
| ВЫБОР КОГДА Т.Склад ССЫЛКА Справочник.СтруктураПредприятия ТОГДА
| Т.Склад
| ИНАЧЕ
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.Пустаяссылка)
| КОНЕЦ КАК Подразделение,
| Т.Назначение КАК Назначение,
| СпрСпособ.Ссылка КАК СпособОбеспечения,
| Т.НеОбеспечено + Т.Зарезервировано + Т.Обеспечено КАК Количество
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Т
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособ
| ПО &ПодстановкаОсновногоСпособаОбеспечения
|
| ГДЕ
| Т.Состояние В(
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.Обеспечить),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ЗарезервированПриПоступлении),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаетсяПоНеподтвержденномуЗаказу),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченКДате))
|
| {ГДЕ
| Т.Номенклатура.* КАК Номенклатура,
| Т.Характеристика.* КАК Характеристика,
| Т.Назначение.* КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) КАК ПодразделениеПолучатель}
|
| {ГДЕ Т.ЗаказНаОтгрузку В(
| ВЫБРАТЬ
| ТаблицаОтбора.Заказ КАК Заказ
| ИЗ
| ОтборПоЗаказам КАК ТаблицаОтбора
| ГДЕ
| &ИспользуетсяОтборПоЗаказам)}
|
| {ГДЕ (Т.Номенклатура, Т.Характеристика) В(
| ВЫБРАТЬ
| ТаблицаОтбора.Номенклатура КАК Номенклатура,
| ТаблицаОтбора.Характеристика КАК Характеристика
| ИЗ
| ОтборПоСегментам КАК ТаблицаОтбора
| ГДЕ
| &ИспользуетсяОтборПоСегментуНоменклатуры)}
|
|) КАК Т
|
|СГРУППИРОВАТЬ ПО
| Т.Номенклатура,
| Т.Характеристика,
| Т.Склад,
| Т.Подразделение,
| Т.Назначение,
| Т.СпособОбеспечения
|
|ИМЕЮЩИЕ
| СУММА(Т.Количество) > 0
|
|;
|
|
|"
+ ?(Не ТоварыПоддерживаемогоЗапаса, "", РегистрыСведений.ТоварныеОграничения.ВременнаяТаблицаТоварыПоддерживаемогоЗапаса());
Тексты = Новый Массив();
Тексты.Добавить(ТекстЗапроса);
Тексты.Добавить("УНИЧТОЖИТЬ ВтФорматыСкладов");
Тексты.Добавить(ОбщегоНазначения.РазделительПакетаЗапросов());
Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Потребности.Номенклатура КАК Номенклатура,
| Потребности.Характеристика КАК Характеристика,
| Потребности.Склад КАК Склад,
| Топология.Центр КАК Центр,
| Потребности.Подразделение КАК Подразделение,
| Потребности.Назначение КАК Назначение,
| Потребности.СпособОбеспечения,
| СУММА(Перемещения.НеОбеспечено + Перемещения.Зарезервировано + Перемещения.Обеспечено) КАК Количество
|ПОМЕСТИТЬ ЗаказыВнутриСети
|ИЗ
| ВтПотребности КАК Потребности
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК Перемещения
| ПО Перемещения.Номенклатура = Потребности.Номенклатура
| И Перемещения.Характеристика = Потребности.Характеристика
| И Перемещения.Склад = Потребности.Склад
| И Перемещения.Назначение = Потребности.Назначение
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказНаПеремещение КАК ЗаказыНаПеремещение
| ПО ЗаказыНаПеремещение.Ссылка = Перемещения.ЗаказНаОтгрузку
|
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК Топология
| ПО Топология.Номенклатура = Перемещения.Номенклатура
| И Топология.Характеристика = Перемещения.Характеристика
| И Топология.Склад = Перемещения.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК СкладыСети
| ПО СкладыСети.Номенклатура = Топология.Номенклатура
| И СкладыСети.Характеристика = Топология.Характеристика
| И СкладыСети.Центр = Топология.Центр
| И СкладыСети.Склад =
| ЗаказыНаПеремещение.СкладПолучатель
|
|ГДЕ
| НЕ СкладыСети.Номенклатура ЕСТЬ NULL
| И Перемещения.Состояние В(
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.Обеспечить),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ЗарезервированПриПоступлении),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаетсяПоНеподтвержденномуЗаказу),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченКДате))
|СГРУППИРОВАТЬ ПО
| Потребности.Номенклатура,
| Потребности.Характеристика,
| Потребности.Склад,
| Топология.Центр,
| Потребности.Подразделение,
| Потребности.Назначение,
| Потребности.СпособОбеспечения
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,Характеристика,Склад,Центр,Назначение";
Тексты.Добавить(Текст);
Тексты.Добавить(ОбщегоНазначения.РазделительПакетаЗапросов());
ТекстЗапроса = СтрСоединить(Тексты);
ТекстЗапроса = ТекстЗапроса +
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| Т.СпособОбеспечения КАК СпособОбеспечения,
| Т.Количество КАК Количество
|ПОМЕСТИТЬ ВтУдаленныеСкладыСпособыОбеспечения
|ИЗ
| ВтПотребности КАК Т
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК Топология
| ПО Топология.Номенклатура = Т.Номенклатура
| И Топология.Характеристика = Т.Характеристика
| И Топология.Склад = Т.Склад
| И Топология.Центр = Т.Склад
|ГДЕ
| Топология.Номенклатура ЕСТЬ NULL
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Потребности.Номенклатура КАК Номенклатура,
| Потребности.Характеристика КАК Характеристика,
| ВЫРАЗИТЬ(Топология.Центр КАК Справочник.Склады) КАК Склад
|ПОМЕСТИТЬ ВтРаспредЦентрыСпособыОбеспечения
|ИЗ
| ВтПотребности КАК Потребности
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК Топология
| ПО Топология.Номенклатура = Потребности.Номенклатура
| И Топология.Характеристика = Потребности.Характеристика
| И Топология.Склад = Потребности.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ЗаказыВнутриСети КАК ЗаказыВнутриСети
| ПО ЗаказыВнутриСети.Номенклатура = Потребности.Номенклатура
| И ЗаказыВнутриСети.Характеристика = Потребности.Характеристика
| И ЗаказыВнутриСети.Склад = Потребности.Склад
| И ЗаказыВнутриСети.Назначение = Потребности.Назначение
| И ЗаказыВнутриСети.Центр = Топология.Центр
|ГДЕ
| НЕ Топология.Номенклатура ЕСТЬ NULL
| И Потребности.Количество - ЕСТЬNULL(ЗаказыВнутриСети.Количество, 0) > 0
|;
|
|
|";
ИспользоватьАссортимент = ПолучитьФункциональнуюОпцию("ИспользоватьАссортимент");
ТекстСпособыОбеспечения = "";
Если Не ИспользоватьАссортимент Тогда
ТекстСпособыОбеспечения =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Т.СпособОбеспечения КАК СпособОбеспечения
|ПОМЕСТИТЬ СпособыОбеспечения
|ИЗ
| &НаборТекстовЗапросов КАК Т
|ГДЕ
| &УсловиеДоступаПоТипуОбеспечения
|ИНДЕКСИРОВАТЬ ПО
| СпособОбеспечения
|;
|
|
|";
Иначе
Тексты = Новый Массив();
Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Склад КАК Склад,
| Т.СпособОбеспечения КАК СпособОбеспечения
|ПОМЕСТИТЬ ВтТовары
|ИЗ
| &НаборТекстовЗапросов КАК Т
|ГДЕ
| &УсловиеДоступаПоТипуОбеспечения
|ИНДЕКСИРОВАТЬ ПО
| СпособОбеспечения
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.СпособОбеспечения КАК Ссылка
|ПОМЕСТИТЬ СпособыОбеспеченияВременный
|ИЗ
| ВтТовары КАК Т
|ИНДЕКСИРОВАТЬ ПО
| Ссылка";
Тексты.Добавить(Текст);
Текст = ОбеспечениеВДокументахСервер.ВременнаяТаблицаГодыГрафикаПредприятия();
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Таблица.Ссылка КАК Ссылка,
| РасчетДатыПоставкиПереопределяемый.ПлановаяДатаПоставки КАК ДатаПоставки
|ПОМЕСТИТЬ БлижайшийЦиклПоСпособамОбеспечения
|ИЗ
| СпособыОбеспеченияВременный КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ РасчетДатыПоставкиПереопределяемый ПО ИСТИНА
|ИНДЕКСИРОВАТЬ ПО
| Ссылка";
Подстановки = ОбеспечениеВДокументахСервер.ПодстановкиПлановойДатыПоставки(
"Таблица.Ссылка",
"&НачалоТекущегоДня",
Истина);
Текст = СтрЗаменить(Текст, "РасчетДатыПоставкиПереопределяемый.ПлановаяДатаПоставки", Подстановки.Поле);
Текст = СтрЗаменить(Текст, "ЛЕВОЕ СОЕДИНЕНИЕ РасчетДатыПоставкиПереопределяемый ПО ИСТИНА", Подстановки.Соединения);
Тексты.Добавить(Текст);
Текст = ВременнаяТаблицаЗапретЗакупкиПоАссортименту(ИспользоватьАссортимент);
Тексты.Добавить(Текст);
Тексты.Добавить(
"УНИЧТОЖИТЬ ГодыГрафикаПредприятияВременный;
|УНИЧТОЖИТЬ ГодыГрафикаПредприятия");
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.СпособОбеспечения КАК СпособОбеспечения
|ПОМЕСТИТЬ СпособыОбеспечения
|ИЗ
| ВтТовары КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ БлижайшийЦиклПоСпособамОбеспечения КАК ТаблицаСпособовОбеспечения
| ПО Т.СпособОбеспечения = ТаблицаСпособовОбеспечения.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ ЗапретЗакупкиПоАссортименту КАК ЗапретЗакупкиПоАссортименту
| ПО ЗапретЗакупкиПоАссортименту.Склад = Т.Склад
| И ЗапретЗакупкиПоАссортименту.Номенклатура = Т.Номенклатура
| И ЗапретЗакупкиПоАссортименту.ДатаВозможнойПоставки = ЕСТЬNULL(ТаблицаСпособовОбеспечения.ДатаПоставки, &НачалоТекущегоДня)
|ГДЕ
| ЗапретЗакупкиПоАссортименту.Склад ЕСТЬ NULL";
Тексты.Добавить(Текст);
Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
ТекстСпособыОбеспечения = Текст + ОбщегоНазначения.РазделительПакетаЗапросов();
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + ТекстСпособыОбеспечения;
ИсточникДанных = ИсточникДанныхДляСпособовОбеспечения(ТоварыПоддерживаемогоЗапаса);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&НаборТекстовЗапросов", СтрШаблон("(%1)", ИсточникДанных));
ТекстЗапроса = РегистрыСведений.СхемыОбеспечения.ПодставитьСоединениеДляПолученияСпособаОбеспечения(
ТекстЗапроса, "ПодстановкаОсновногоСпособаОбеспечения");
ТекстЗапроса = ТекстЗапроса +
"ВЫБРАТЬ ПЕРВЫЕ 1
| Т.СпособОбеспечения КАК СпособОбеспечения
|{ВЫБРАТЬ
| СпособОбеспечения.* КАК СпособОбеспечения}
|ИЗ
| СпособыОбеспечения КАК Т";
ДоступныеТипыОбеспечения = ДоступныеТипыОбеспечения();
ТекстУсловияДоступаПоТипуОбеспечения = ?(ДоступныеТипыОбеспечения = Неопределено,
"ИСТИНА",
"ЕСТЬNULL(Т.СпособОбеспечения.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) В (&ДоступныеТипыОбеспечения)");
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыПоставщикам")
И (ДоступныеТипыОбеспечения = Неопределено Или ДоступныеТипыОбеспечения.Количество() > 0) Тогда
ТекстУсловияДоступаПоТипуОбеспечения = ?(ДоступныеТипыОбеспечения = Неопределено,
"ИСТИНА",
"(Т.СпособОбеспечения.ТипОбеспечения ЕСТЬ NULL ИЛИ Т.СпособОбеспечения.ТипОбеспечения В(&ДоступныеТипыОбеспечения))");
КонецЕсли;
ТекстУсловияДоступаПоТипуОбеспечения = ТекстУсловияДоступаПоТипуОбеспечения + "
|";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеДоступаПоТипуОбеспечения", ТекстУсловияДоступаПоТипуОбеспечения);
Возврат ТекстЗапроса;
КонецФункции
Функция ИсточникДанныхДляСпособовОбеспечения(ТоварыПоддерживаемогоЗапаса)
НаборТекстовЗапросов = Новый Массив();
Если ТоварыПоддерживаемогоЗапаса Тогда
НаборТекстовЗапросов.Добавить(
"ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Склад КАК Склад,
| СпрСпособ.Ссылка КАК СпособОбеспечения,
| 0 КАК Количество
| ИЗ
| ВтТоварыПоддерживаемогоЗапаса КАК Т
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособ
| ПО &ПодстановкаОсновногоСпособаОбеспечения
| ГДЕ
| Т.МетодОбеспеченияПотребностей <> ЗНАЧЕНИЕ(Перечисление.МетодыОбеспеченияПотребностей.ЗаказПодЗаказ)
| И (&ИспользоватьХарактеристикиНоменклатуры
| ИЛИ Т.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
|
| {ГДЕ
| ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка) КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) КАК ПодразделениеПолучатель,
| ЗНАЧЕНИЕ(Справочник.НаправленияДеятельности.ПустаяСсылка) КАК НаправлениеДеятельности,
| НЕОПРЕДЕЛЕНО КАК Заказ}
|
| {ГДЕ
| Т.Склад.* КАК Склад,
| (ЕСТЬNULL(СпрСпособ.Ссылка,
| ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))).* КАК СпособОбеспечения,
| ЕСТЬNULL(СпрСпособ.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ВЫРАЗИТЬ(
| ВЫБОР
| КОГДА СпрСпособ.Подразделение <> ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| СпрСпособ.Подразделение
| ИНАЧЕ
| ЕСТЬNULL(Т.Склад.Подразделение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка))
| КОНЕЦ КАК Справочник.СтруктураПредприятия).* КАК Подразделение,
| (ЕСТЬNULL(СпрСпособ.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)).* КАК ИсточникОбеспечения}");
КонецЕсли;
НаборТекстовЗапросов.Добавить(
"ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Склад КАК Склад,
| Т.СпособОбеспечения КАК СпособОбеспечения,
| Т.Количество КАК Количество
|ИЗ
| ВтУдаленныеСкладыСпособыОбеспечения КАК Т
|{ГДЕ
| Т.Склад.* КАК Склад,
| (ЕСТЬNULL(Т.СпособОбеспечения,
| ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))).* КАК СпособОбеспечения,
| ЕСТЬNULL(Т.СпособОбеспечения.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ВЫРАЗИТЬ(
| ВЫБОР
| КОГДА Т.СпособОбеспечения.Подразделение <> ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| Т.СпособОбеспечения.Подразделение
| ИНАЧЕ
| ЕСТЬNULL(Т.Склад.Подразделение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка))
| КОНЕЦ КАК Справочник.СтруктураПредприятия).* КАК Подразделение,
| (ЕСТЬNULL(Т.СпособОбеспечения.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)).* КАК ИсточникОбеспечения}
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Склад КАК Склад,
| СпрСпособ.Ссылка КАК СпособОбеспечения,
| 0 КАК Количество
|ИЗ
| ВтРаспредЦентрыСпособыОбеспечения КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособ
| ПО &ПодстановкаОсновногоСпособаОбеспечения
| {ГДЕ
| Т.Склад.* КАК Склад,
| (ЕСТЬNULL(СпрСпособ.Ссылка,
| ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))).* КАК СпособОбеспечения,
| ЕСТЬNULL(СпрСпособ.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ВЫРАЗИТЬ(
| ВЫБОР
| КОГДА СпрСпособ.Подразделение <> ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| СпрСпособ.Подразделение
| ИНАЧЕ
| ЕСТЬNULL(Т.Склад.Подразделение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка))
| КОНЕЦ КАК Справочник.СтруктураПредприятия).* КАК Подразделение,
| (ЕСТЬNULL(СпрСпособ.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)).* КАК ИсточникОбеспечения}");
ТекстНабораЗапросов = СтрСоединить(НаборТекстовЗапросов, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
Возврат ТекстНабораЗапросов;
КонецФункции
Функция ДоступныеТипыОбеспечения() Экспорт
Результат = Новый Массив();
ЕстьОграничения = Ложь;
ЕстьДоступПокупка = ПравоДоступа("Добавление", Метаданные.Документы.ЗаказПоставщику)
И ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыПоставщикам");
Если ЕстьДоступПокупка Тогда
Результат.Добавить(Перечисления.ТипыОбеспечения.Покупка);
Иначе
ЕстьОграничения = Истина;
КонецЕсли;
ЕстьДоступПеремещение = ПравоДоступа("Добавление", Метаданные.Документы.ЗаказНаПеремещение)
И ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыНаПеремещение");
Если ЕстьДоступПеремещение Тогда
Результат.Добавить(Перечисления.ТипыОбеспечения.Перемещение);
Иначе
ЕстьОграничения = Истина;
КонецЕсли;
ЕстьДоступСборка = ПравоДоступа("Добавление", Метаданные.Документы.ЗаказНаСборку)
И ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыНаСборку");
Если ЕстьДоступСборка Тогда
Результат.Добавить(Перечисления.ТипыОбеспечения.СборкаРазборка);
Иначе
ЕстьОграничения = Истина;
КонецЕсли;
ЕстьОграниченияВременный = Истина;
ЕстьОграничения = ЕстьОграничения Или ЕстьОграниченияВременный;
ЕстьОграниченияВременный = Истина;
ЕстьОграничения = ЕстьОграничения Или ЕстьОграниченияВременный;
Если ЕстьОграничения Тогда
Возврат Результат;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция ВременнаяТаблицаДанныеЗаполненияЗаказаПоставщику()
Тексты = Новый Массив();
ЗаполнятьПоСтатистике = ХранилищеОбщихНастроек.Загрузить(
"НастройкиРаботыСДокументами", "ЗаполнятьРеквизитыДокументовПоСтатистике");
Если ЗаполнятьПоСтатистике = Ложь Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
| ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) КАК Склад,
| ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка) КАК Партнер,
| ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка) КАК Соглашение,
| ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка) Валюта,
| ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка) КАК ВидЦеныПоставщика
|
|ПОМЕСТИТЬ ВтДанныеЗаполненияЗаказаПоставщику
|ГДЕ
| ЛОЖЬ
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад";
Иначе
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
|
| МАКСИМУМ(Товары.Ссылка.Дата) КАК ДатаПоследнегоЗаказа
|
|ПОМЕСТИТЬ ВтДатаПоследнегоЗаказа
|ИЗ
| ВтТовары КАК Т
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику.Товары КАК Товары
| ПО Т.Номенклатура = Товары.Номенклатура
| И Т.Характеристика = Товары.Характеристика
| И Т.Склад = Товары.Склад
|ГДЕ
| Т.СпособОбеспечения ЕСТЬ NULL
| ИЛИ (Т.СпособОбеспечения.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)
| И Т.СпособОбеспечения.ИсточникОбеспеченияПотребностей В(НЕОПРЕДЕЛЕНО,
| ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка),
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка),
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка)))
| И Товары.Ссылка.Проведен
|СГРУППИРОВАТЬ ПО
| Т.Номенклатура, Т.Характеристика, Т.Склад
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| МАКСИМУМ(Т.ДатаПоследнегоЗаказа) КАК ДатаПоследнегоЗаказа,
| МАКСИМУМ(ВЫБОР КОГДА Т.ДатаПоследнегоЗаказа = Товары.Ссылка.Дата ТОГДА
| NULL
| ИНАЧЕ Товары.Ссылка.Дата
| КОНЕЦ) КАК ДатаПредпоследнегоЗаказа
|
|ПОМЕСТИТЬ ВтДатаПредпоследнегоЗаказа
|ИЗ
| ВтДатаПоследнегоЗаказа КАК Т
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику.Товары КАК Товары
| ПО Т.Номенклатура = Товары.Номенклатура
| И Т.Характеристика = Товары.Характеристика
| И Т.Склад = Товары.Склад
|ГДЕ
| Товары.Ссылка.Проведен
|СГРУППИРОВАТЬ ПО
| Т.Номенклатура, Т.Характеристика, Т.Склад
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| МАКСИМУМ(Т.ДатаПоследнегоЗаказа) КАК ДатаПоследнегоЗаказа,
| МАКСИМУМ(Т.ДатаПредпоследнегоЗаказа) КАК ДатаПредпоследнегоЗаказа,
| МАКСИМУМ(ВЫБОР КОГДА Товары.Ссылка.Дата В (Т.ДатаПоследнегоЗаказа, Т.ДатаПредпоследнегоЗаказа) ТОГДА
| NULL
| ИНАЧЕ Товары.Ссылка.Дата
| КОНЕЦ) КАК ДатаТретьегоЗаказа
|
|ПОМЕСТИТЬ ВтДатаТретьегоЗаказа
|ИЗ
| ВтДатаПредпоследнегоЗаказа КАК Т
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику.Товары КАК Товары
| ПО Т.Номенклатура = Товары.Номенклатура
| И Т.Характеристика = Товары.Характеристика
| И Т.Склад = Товары.Склад
|ГДЕ
| Товары.Ссылка.Проведен
|СГРУППИРОВАТЬ ПО
| Т.Номенклатура, Т.Характеристика, Т.Склад
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
|
| МАКСИМУМ(ВЫБОР КОГДА Т.ДатаПоследнегоЗаказа = Товары.Ссылка.Дата ТОГДА
| Товары.Ссылка
| ИНАЧЕ NULL
| КОНЕЦ) КАК Заказ1,
| МАКСИМУМ(ВЫБОР КОГДА Т.ДатаПредпоследнегоЗаказа = Товары.Ссылка.Дата ТОГДА
| Товары.Ссылка
| ИНАЧЕ NULL
| КОНЕЦ) КАК Заказ2,
| МАКСИМУМ(ВЫБОР КОГДА Т.ДатаТретьегоЗаказа = Товары.Ссылка.Дата ТОГДА
| Товары.Ссылка
| ИНАЧЕ NULL
| КОНЕЦ) КАК Заказ3
|
|ПОМЕСТИТЬ ВтТриПоследнихЗаказа
|ИЗ
| ВтДатаТретьегоЗаказа КАК Т
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику.Товары КАК Товары
| ПО Т.Номенклатура = Товары.Номенклатура
| И Т.Характеристика = Товары.Характеристика
| И Т.Склад = Товары.Склад
| И Товары.Ссылка.Дата В (Т.ДатаПоследнегоЗаказа, Т.ДатаПредпоследнегоЗаказа, Т.ДатаТретьегоЗаказа)
|ГДЕ
| Товары.Ссылка.Проведен
|СГРУППИРОВАТЬ ПО
| Т.Номенклатура, Т.Характеристика, Т.Склад
|ИНДЕКСИРОВАТЬ ПО
| Заказ1, Заказ2, Заказ3
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
|
| ВЫБОР КОГДА Т.Заказ2.Партнер ЕСТЬ NULL ТОГДА
| Т.Заказ1.Партнер
| КОГДА Т.Заказ3.Партнер ЕСТЬ NULL ТОГДА
| ВЫБОР КОГДА Т.Заказ1.Партнер = Т.Заказ2.Партнер ТОГДА
| Т.Заказ1.Партнер
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
| КОНЕЦ
| ИНАЧЕ
| ВЫБОР КОГДА Т.Заказ1.Партнер = Т.Заказ2.Партнер ИЛИ Т.Заказ1.Партнер = Т.Заказ3.Партнер ТОГДА
| Т.Заказ1.Партнер
| КОГДА Т.Заказ2.Партнер = Т.Заказ3.Партнер ТОГДА
| Т.Заказ2.Партнер
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
| КОНЕЦ
| КОНЕЦ КАК Партнер,
|
| ВЫБОР КОГДА Т.Заказ2.Партнер ЕСТЬ NULL ТОГДА
| Т.Заказ1.Соглашение
| КОГДА Т.Заказ3.Партнер ЕСТЬ NULL ТОГДА
| ВЫБОР КОГДА Т.Заказ1.Соглашение = Т.Заказ2.Соглашение ТОГДА
| Т.Заказ1.Соглашение
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)
| КОНЕЦ
| ИНАЧЕ
| ВЫБОР КОГДА Т.Заказ1.Соглашение = Т.Заказ2.Соглашение ИЛИ Т.Заказ1.Соглашение = Т.Заказ3.Соглашение ТОГДА
| Т.Заказ1.Соглашение
| КОГДА Т.Заказ2.Соглашение = Т.Заказ3.Соглашение ТОГДА
| Т.Заказ2.Соглашение
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)
| КОНЕЦ
| КОНЕЦ КАК Соглашение,
|
| ВЫРАЗИТЬ(ВЫБОР КОГДА Т.Заказ2.Партнер ЕСТЬ NULL ТОГДА
| Т.Заказ1.Соглашение
| КОГДА Т.Заказ3.Партнер ЕСТЬ NULL ТОГДА
| ВЫБОР КОГДА Т.Заказ1.Соглашение = Т.Заказ2.Соглашение ТОГДА
| Т.Заказ1.Соглашение
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)
| КОНЕЦ
| ИНАЧЕ
| ВЫБОР КОГДА Т.Заказ1.Соглашение = Т.Заказ2.Соглашение ИЛИ Т.Заказ1.Соглашение = Т.Заказ3.Соглашение ТОГДА
| Т.Заказ1.Соглашение
| КОГДА Т.Заказ2.Соглашение = Т.Заказ3.Соглашение ТОГДА
| Т.Заказ2.Соглашение
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)
| КОНЕЦ
| КОНЕЦ КАК Справочник.СоглашенияСПоставщиками).Валюта КАК Валюта,
|
| ВЫРАЗИТЬ(ВЫБОР КОГДА Т.Заказ2.Партнер ЕСТЬ NULL ТОГДА
| Т.Заказ1.Соглашение
| КОГДА Т.Заказ3.Партнер ЕСТЬ NULL ТОГДА
| ВЫБОР КОГДА Т.Заказ1.Соглашение = Т.Заказ2.Соглашение ТОГДА
| Т.Заказ1.Соглашение
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)
| КОНЕЦ
| ИНАЧЕ
| ВЫБОР КОГДА Т.Заказ1.Соглашение = Т.Заказ2.Соглашение ИЛИ Т.Заказ1.Соглашение = Т.Заказ3.Соглашение ТОГДА
| Т.Заказ1.Соглашение
| КОГДА Т.Заказ2.Соглашение = Т.Заказ3.Соглашение ТОГДА
| Т.Заказ2.Соглашение
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)
| КОНЕЦ
| КОНЕЦ КАК Справочник.СоглашенияСПоставщиками).ВидЦеныПоставщика КАК ВидЦеныПоставщика
|
|ПОМЕСТИТЬ ВтДанныеЗаполненияЗаказаПоставщику
|ИЗ
| ВтТриПоследнихЗаказа КАК Т
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад";
КонецЕсли;
Тексты.Добавить(ТекстЗапроса);
ТекстЗапроса =
"ВЫБРАТЬ
| УсловияЗакупок.Номенклатура КАК Номенклатура,
| УсловияЗакупок.Характеристика КАК Характеристика,
| УсловияЗакупок.ВидЦеныПоставщика КАК ВидЦеныПоставщика,
| УсловияЗакупок.УпаковкаЗаказа КАК УпаковкаЗаказа,
| УсловияЗакупок.МинимальнаяПартияПоставки КАК МинимальнаяПартияПоставки
|ПОМЕСТИТЬ ВТУсловияЗакупок
|ИЗ
| РегистрСведений.УсловияЗакупок.СрезПоследних(
| КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ),
| (Номенклатура, Характеристика, ВидЦеныПоставщика)
| В (
| ВЫБРАТЬ
| ТаблицаОтбора.Номенклатура КАК Номенклатура,
| ТаблицаОтбора.Характеристика КАК Характеристика,
| ВЫБОР
| КОГДА ЕСТЬNULL(ТаблицаОтбора.СпособОбеспечения.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| <> ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
| ТОГДА ТаблицаОтбора.СпособОбеспечения.ВидЦеныПоставщика
| ИНАЧЕ ЕСТЬNULL(ТаблицаОтбора.СпособОбеспечения.Соглашение.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| КОНЕЦ КАК ВидЦеныПоставщика
| ИЗ
| ВтТовары КАК ТаблицаОтбора)) КАК УсловияЗакупок
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Характеристика,
| ВидЦеныПоставщика
|;
|
|ВЫБРАТЬ
| ЦеныПоставщиков.Номенклатура КАК Номенклатура,
| ЦеныПоставщиков.Характеристика КАК Характеристика,
| ЦеныПоставщиков.Партнер КАК Партнер,
| ЦеныПоставщиков.ВидЦеныПоставщика КАК ВидЦеныПоставщика,
| ЦеныПоставщиков.Цена КАК Цена,
| ЦеныПоставщиков.Упаковка КАК Упаковка,
| ЦеныПоставщиков.Валюта КАК Валюта
|ПОМЕСТИТЬ ВТЦеныПоставщиков
|ИЗ
| РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(
| КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ),
| (Номенклатура, Характеристика, Партнер, ВидЦеныПоставщика)
| В (
| ВЫБРАТЬ
| ТаблицаОтбора.Номенклатура КАК Номенклатура,
| ТаблицаОтбора.Характеристика КАК Характеристика,
| ТаблицаОтбора.СпособОбеспечения.ИсточникОбеспеченияПотребностей КАК Партнер,
| ВЫБОР
| КОГДА ЕСТЬNULL(ТаблицаОтбора.СпособОбеспечения.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| <> ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
| ТОГДА ТаблицаОтбора.СпособОбеспечения.ВидЦеныПоставщика
| ИНАЧЕ ЕСТЬNULL(ТаблицаОтбора.СпособОбеспечения.Соглашение.ВидЦеныПоставщика, ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка))
| КОНЕЦ КАК ВидЦеныПоставщика
| ИЗ
| ВтТовары КАК ТаблицаОтбора
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Партнер КАК Партнер,
| Т.ВидЦеныПоставщика КАК ВидЦеныПоставщика
| ИЗ
| ВтДанныеЗаполненияЗаказаПоставщику КАК Т)
| ) КАК ЦеныПоставщиков
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Характеристика,
| Партнер,
| ВидЦеныПоставщика
|
|;
|
|ВЫБРАТЬ
| ВТЦеныПоставщиков.Номенклатура КАК Номенклатура,
| ВТЦеныПоставщиков.Характеристика КАК Характеристика,
| ВТЦеныПоставщиков.Партнер КАК Партнер,
| ВТЦеныПоставщиков.ВидЦеныПоставщика КАК ВидЦеныПоставщика,
| ВТЦеныПоставщиков.Цена КАК Цена,
| ВТЦеныПоставщиков.Упаковка КАК Упаковка,
| ВТЦеныПоставщиков.Валюта КАК Валюта,
| ВТУсловияЗакупок.УпаковкаЗаказа КАК УпаковкаЗаказаПоставщика,
| ВТУсловияЗакупок.МинимальнаяПартияПоставки КАК МинимальнаяПартияПоставки
|ПОМЕСТИТЬ ЦеныПоставщиков
|ИЗ
| ВТЦеныПоставщиков КАК ВТЦеныПоставщиков
| ЛЕВОЕ СОЕДИНЕНИЕ ВТУсловияЗакупок КАК ВТУсловияЗакупок
| ПО ВТЦеныПоставщиков.Номенклатура = ВТУсловияЗакупок.Номенклатура
| И ВТЦеныПоставщиков.Характеристика = ВТУсловияЗакупок.Характеристика
| И ВТЦеныПоставщиков.ВидЦеныПоставщика = ВТУсловияЗакупок.ВидЦеныПоставщика
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Характеристика,
| Партнер,
| ВидЦеныПоставщика
|;
|
|ВЫБРАТЬ
| КурсыВалют.Валюта КАК Валюта,
| ВЫБОР
| КОГДА КурсыВалют.КурсЗнаменатель = 0
| ТОГДА 0
| ИНАЧЕ КурсыВалют.КурсЧислитель / КурсыВалют.КурсЗнаменатель
| КОНЕЦ КАК Коэффициент
|ПОМЕСТИТЬ КурсыВалют
|ИЗ
| РегистрСведений.ОтносительныеКурсыВалют.СрезПоследних(КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ),
| БазоваяВалюта В (ВЫБРАТЬ
| БазоваяВалютаПоУмолчанию.Значение КАК Значение
| ИЗ
| Константа.БазоваяВалютаПоУмолчанию КАК БазоваяВалютаПоУмолчанию)) КАК КурсыВалют
|
|ИНДЕКСИРОВАТЬ ПО
| Валюта";
Тексты.Добавить(ТекстЗапроса);
ТекстЗапроса = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Возврат ТекстЗапроса;
КонецФункции
Функция ВременнаяТаблицаКОбеспечениюВсехСкладов(ВТаблицеОтбораЕстьНазначения)
Текст =
"ВЫБРАТЬ
| ЗапасыИПотребности.Номенклатура КАК Номенклатура,
| ЗапасыИПотребности.Характеристика КАК Характеристика,
| ЗапасыИПотребности.Склад КАК Склад,
| ЗапасыИПотребности.Назначение КАК Назначение,
| ВЫБОР
| КОГДА
| ЗапасыИПотребности.ВНаличииОстаток
| - ЗапасыИПотребности.РезервироватьНаСкладеОстаток
| - ЗапасыИПотребности.РезервироватьПоМереПоступленияОстаток < 0
| ТОГДА
| 0
| КОГДА
| ЗапасыИПотребности.ВНаличииОстаток
| - ЗапасыИПотребности.РезервироватьНаСкладеОстаток
| - ЗапасыИПотребности.РезервироватьПоМереПоступленияОстаток
| - ЗапасыИПотребности.ОтложитьРезервированиеОстаток
| - ЗапасыИПотребности.КОбеспечениюОстаток > 0
| ТОГДА
| ЗапасыИПотребности.ОтложитьРезервированиеОстаток
| + ЗапасыИПотребности.КОбеспечениюОстаток
| ИНАЧЕ
| ЗапасыИПотребности.ВНаличииОстаток
| - ЗапасыИПотребности.РезервироватьНаСкладеОстаток
| - ЗапасыИПотребности.РезервироватьПоМереПоступленияОстаток
| КОНЕЦ КАК ОбеспеченоСоСклада,
| ЗапасыИПотребности.ОтложитьРезервированиеОстаток
| + ЗапасыИПотребности.КОбеспечениюОстаток КАК КОбеспечению,
| ВЫБОР
| КОГДА
| ЗапасыИПотребности.ВНаличииОстаток
| + ЗапасыИПотребности.ЗаказаноОстаток
| - ЗапасыИПотребности.РезервироватьНаСкладеОстаток
| - ЗапасыИПотребности.РезервироватьПоМереПоступленияОстаток > 0
| ТОГДА
| ЗапасыИПотребности.ВНаличииОстаток
| + ЗапасыИПотребности.ЗаказаноОстаток
| - ЗапасыИПотребности.РезервироватьНаСкладеОстаток
| - ЗапасыИПотребности.РезервироватьПоМереПоступленияОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК СвободноВЗаказах
|ПОМЕСТИТЬ ВтКОбеспечениюВсехСкладовВременная
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| &УсловиеОтбораНазначений
| И (Номенклатура, Характеристика, Склад) В(
| ВЫБРАТЬ
| ТаблицаОтбора.Номенклатура КАК Номенклатура,
| ТаблицаОтбора.Характеристика КАК Характеристика,
| ТаблицаОтбора.Склад КАК Склад
| ИЗ
| РазличныеТоварыИСклады КАК ТаблицаОтбора)) КАК ЗапасыИПотребности
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Назначение, Склад
|;
|
|
|ВЫБРАТЬ
| ЗапасыИПотребности.Номенклатура КАК Номенклатура,
| ЗапасыИПотребности.Характеристика КАК Характеристика,
| ЗапасыИПотребности.Склад КАК Склад,
| ЗапасыИПотребности.Назначение КАК Назначение,
| ЗапасыИПотребности.ОбеспеченоСоСклада КАК ОбеспеченоСоСклада,
| ВЫБОР
| КОГДА ЗапасыИПотребности.ОбеспеченоСоСклада > ЗапасыИПотребности.КОбеспечению
| ТОГДА
| 0
| КОГДА ЗапасыИПотребности.КОбеспечению - ЗапасыИПотребности.ОбеспеченоСоСклада < ЗапасыИПотребности.СвободноВЗаказах
| ТОГДА
| ЗапасыИПотребности.КОбеспечению - ЗапасыИПотребности.ОбеспеченоСоСклада
| ИНАЧЕ ЗапасыИПотребности.СвободноВЗаказах
| КОНЕЦ КАК ОбеспеченоИзЗаказов
|ПОМЕСТИТЬ ВтКОбеспечениюВсехСкладов
|ИЗ
| ВтКОбеспечениюВсехСкладовВременная КАК ЗапасыИПотребности
|ГДЕ
| ЗапасыИПотребности.ОбеспеченоСоСклада > 0
| ИЛИ (ЗапасыИПотребности.ОбеспеченоСоСклада < ЗапасыИПотребности.КОбеспечению
| И ЗапасыИПотребности.СвободноВЗаказах > 0)
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Назначение, Склад
|;
|
|
|УНИЧТОЖИТЬ ВтКОбеспечениюВсехСкладовВременная";
УсловиеОтбораНазначений = ?(ВТаблицеОтбораЕстьНазначения, "ИСТИНА", "Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)");
Текст = СтрЗаменить(Текст, "&УсловиеОтбораНазначений", УсловиеОтбораНазначений);
Возврат Текст;
КонецФункции
Функция ВременнаяТаблицаСвободныеОстатки(ВТаблицеОтбораЕстьНазначения)
Тексты = Новый Массив();
Текст =
"ВЫБРАТЬ
| Запасы.Склад КАК Склад,
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Назначение КАК Назначение,
| Запасы.ВНаличииОстаток КАК Запас,
| ВЫБОР
| КОГДА Запасы.ВНаличииОстаток - Запасы.РезервироватьНаСкладеОстаток < 0
| ТОГДА
| Запасы.ВНаличииОстаток - Запасы.РезервироватьНаСкладеОстаток
| КОГДА Запасы.ВНаличииОстаток - Запасы.РезервироватьНаСкладеОстаток - Запасы.РезервироватьПоМереПоступленияОстаток > 0
| ТОГДА
| Запасы.ВНаличииОстаток - Запасы.РезервироватьНаСкладеОстаток - Запасы.РезервироватьПоМереПоступленияОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Свободно,
| Запасы.РезервироватьНаСкладеОстаток КАК Резерв
|ПОМЕСТИТЬ СвободныеОстаткиПоДаннымРегистра
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| &УсловиеОтбораНазначений
| И (Номенклатура, Характеристика, Склад) В(
| ВЫБРАТЬ
| ТаблицаОтбора.Номенклатура КАК Номенклатура,
| ТаблицаОтбора.Характеристика КАК Характеристика,
| ТаблицаОтбора.Склад КАК Склад
| ИЗ
| РазличныеТоварыИСклады КАК ТаблицаОтбора)) КАК Запасы
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Остатки.Склад КАК Склад,
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Назначение КАК Назначение,
| Остатки.Запас КАК Запас,
| Остатки.Свободно - ЕСТЬNULL(КОбеспечениюВсехСкладов.ОбеспеченоСоСклада, 0) КАК Свободно,
| Остатки.Резерв КАК ВРезерве
|ПОМЕСТИТЬ ВтСвободныеОстаткиВсехСкладов
|ИЗ
| РазличныеТоварыИСклады КАК ТаблицаОтбора
|
| ЛЕВОЕ СОЕДИНЕНИЕ СвободныеОстаткиПоДаннымРегистра КАК Остатки
| ПО Остатки.Номенклатура = ТаблицаОтбора.Номенклатура
| И Остатки.Характеристика = ТаблицаОтбора.Характеристика
| И Остатки.Склад = ТаблицаОтбора.Склад
| И Остатки.Назначение = &ПодстановкаНазначенияСоединения
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтКОбеспечениюВсехСкладов КАК КОбеспечениюВсехСкладов
| ПО КОбеспечениюВсехСкладов.Номенклатура = ТаблицаОтбора.Номенклатура
| И КОбеспечениюВсехСкладов.Характеристика = ТаблицаОтбора.Характеристика
| И КОбеспечениюВсехСкладов.Склад = ТаблицаОтбора.Склад
| И КОбеспечениюВсехСкладов.Назначение = &ПодстановкаНазначенияСоединения
|ГДЕ
| НЕ Остатки.Номенклатура ЕСТЬ NULL
|;
|
|
|ВЫБРАТЬ
| Т.Склад КАК Склад,
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Назначение КАК Назначение,
| СУММА(Запас) КАК ВНаличии,
| СУММА(Свободно) КАК ВНаличииМинусРезерв,
| СУММА(ВРезерве) КАК ВРезерве
|ПОМЕСТИТЬ ВтСвободныеОстатки
|ИЗ
| (ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Назначение КАК Назначение,
| Т.Склад КАК Склад,
| Т.Запас КАК Запас,
| Т.Свободно КАК Свободно,
| Т.ВРезерве КАК ВРезерве
| ИЗ
| ВтСвободныеОстаткиВсехСкладов КАК Т
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Назначение КАК Назначение,
| Топология.Центр КАК Склад,
| Т.Запас КАК Запас,
| Т.Свободно КАК Свободно,
| Т.ВРезерве КАК ВРезерве
| ИЗ
| ВтСвободныеОстаткиВсехСкладов КАК Т
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК Топология
| ПО Т.Номенклатура = Топология.Номенклатура
| И Т.Характеристика = Топология.Характеристика
| И Т.Склад = Топология.Склад
| И Т.Склад <> Топология.Центр
|ГДЕ
| НЕ Топология.Номенклатура ЕСТЬ NULL) КАК Т
|
|СГРУППИРОВАТЬ ПО
| Т.Номенклатура, Т.Характеристика, Т.Склад, Т.Назначение
|
|ИНДЕКСИРОВАТЬ ПО
| Склад, Номенклатура, Характеристика, Назначение
|;
|
|
|УНИЧТОЖИТЬ ВтСвободныеОстаткиВсехСкладов;
|УНИЧТОЖИТЬ СвободныеОстаткиПоДаннымРегистра";
Тексты.Добавить(Текст);
Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Подстановка = "ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)";
ПодстановкаНазначение = "ТаблицаОтбора.Назначение";
ПодстановкаИтоговая = ?(ВТаблицеОтбораЕстьНазначения, ПодстановкаНазначение, Подстановка);
Текст = СтрЗаменить(Текст, "&ПодстановкаНазначенияСоединения", ПодстановкаИтоговая);
УсловиеОтбораНазначений = ?(ВТаблицеОтбораЕстьНазначения, "ИСТИНА", "Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)");
Текст = СтрЗаменить(Текст, "&УсловиеОтбораНазначений", УсловиеОтбораНазначений);
Возврат Текст;
КонецФункции
Функция ВременнаяТаблицаЗаказыКПоступлениюИОтгрузке(ВТаблицеОтбораЕстьНазначения)
Тексты = Новый Массив();
Текст =
"ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Назначение КАК Назначение,
| Запасы.ЗаказаноОстаток КАК Запас,
| ВЫБОР
| КОГДА Запасы.ВНаличииОстаток
| - Запасы.РезервироватьНаСкладеОстаток
| - Запасы.РезервироватьПоМереПоступленияОстаток > 0
| ТОГДА
| Запасы.ЗаказаноОстаток
| КОГДА
| Запасы.ВНаличииОстаток
| + Запасы.ЗаказаноОстаток
| - Запасы.РезервироватьНаСкладеОстаток
| - Запасы.РезервироватьПоМереПоступленияОстаток > 0
| ТОГДА
| Запасы.ВНаличииОстаток
| + Запасы.ЗаказаноОстаток
| - Запасы.РезервироватьНаСкладеОстаток
| - Запасы.РезервироватьПоМереПоступленияОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Свободно
|ПОМЕСТИТЬ ВтОжидаемыеПоступленияВсехСкладов
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| &УсловиеОтбораНазначений
| И (Номенклатура, Характеристика, Склад) В(
| ВЫБРАТЬ
| Фильтр.Номенклатура КАК Номенклатура,
| Фильтр.Характеристика КАК Характеристика,
| Фильтр.Склад КАК Склад
| ИЗ
| РазличныеТоварыИСклады КАК Фильтр)) КАК Запасы
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| РаспределениеЗапасов.Номенклатура КАК Номенклатура,
| РаспределениеЗапасов.Характеристика КАК Характеристика,
| РаспределениеЗапасов.Склад КАК Склад,
| РаспределениеЗапасов.Назначение КАК Назначение,
| ЕСТЬNULL(РаспределениеЗапасов.Запас, 0) КАК Запас,
| ЕСТЬNULL(РаспределениеЗапасов.Свободно, 0)
| - ЕСТЬNULL(КОбеспечениюВсехСкладов.ОбеспеченоИзЗаказов, 0) КАК Свободно
|ПОМЕСТИТЬ ВтЗаказыВсехСкладов
|ИЗ
| РазличныеТоварыИСклады КАК ТаблицаОтбора
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтОжидаемыеПоступленияВсехСкладов КАК РаспределениеЗапасов
| ПО РаспределениеЗапасов.Номенклатура = ТаблицаОтбора.Номенклатура
| И РаспределениеЗапасов.Характеристика = ТаблицаОтбора.Характеристика
| И РаспределениеЗапасов.Склад = ТаблицаОтбора.Склад
| И РаспределениеЗапасов.Назначение = &ПодстановкаНазначенияСоединения
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтКОбеспечениюВсехСкладов КАК КОбеспечениюВсехСкладов
| ПО КОбеспечениюВсехСкладов.Номенклатура = ТаблицаОтбора.Номенклатура
| И КОбеспечениюВсехСкладов.Характеристика = ТаблицаОтбора.Характеристика
| И КОбеспечениюВсехСкладов.Склад = ТаблицаОтбора.Склад
| И КОбеспечениюВсехСкладов.Назначение = &ПодстановкаНазначенияСоединения
|ГДЕ
| НЕ РаспределениеЗапасов.Номенклатура ЕСТЬ NULL
|;
|
|
|ВЫБРАТЬ
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Назначение КАК Назначение,
| Набор.Склад КАК Склад,
| СУММА(Набор.ЗаказыКПоступлению) КАК Поступит,
| СУММА(Набор.ЗаказыКПоступлению)
| - СУММА(Набор.ЗаказыКОтгрузке) КАК ПоступитМинусРезерв
|ПОМЕСТИТЬ ВтЗаказы
|ИЗ(
| ВЫБРАТЬ
| График.Номенклатура КАК Номенклатура,
| График.Характеристика КАК Характеристика,
| График.Назначение КАК Назначение,
| График.Склад КАК Склад,
| График.Запас КАК ЗаказыКПоступлению,
| График.Запас - График.Свободно КАК ЗаказыКОтгрузке
| ИЗ
| ВтЗаказыВсехСкладов КАК График
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| График.Номенклатура КАК Номенклатура,
| График.Характеристика КАК Характеристика,
| График.Назначение КАК Назначение,
| Топология.Центр КАК Склад,
| График.Запас КАК ЗаказыКПоступлению,
| График.Запас - График.Свободно КАК ЗаказыКОтгрузке
| ИЗ
| ВтЗаказыВсехСкладов КАК График
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК Топология
| ПО График.Номенклатура = Топология.Номенклатура
| И График.Характеристика = Топология.Характеристика
| И График.Склад = Топология.Склад
| И График.Склад <> Топология.Центр
|ГДЕ
| НЕ Топология.Номенклатура ЕСТЬ NULL) КАК Набор
|
|СГРУППИРОВАТЬ ПО
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Склад,
| Набор.Назначение
|
|ИНДЕКСИРОВАТЬ ПО
| Склад, Номенклатура, Характеристика, Назначение
|;
|
|
|УНИЧТОЖИТЬ ВтЗаказыВсехСкладов;
|УНИЧТОЖИТЬ ВтОжидаемыеПоступленияВсехСкладов";
Тексты.Добавить(Текст);
Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Подстановка = "ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)";
ПодстановкаНазначение = "ТаблицаОтбора.Назначение";
ПодстановкаИтоговая = ?(ВТаблицеОтбораЕстьНазначения, ПодстановкаНазначение, Подстановка);
Текст = СтрЗаменить(Текст, "&ПодстановкаНазначенияСоединения", ПодстановкаИтоговая);
Подстановка = "ДвижениеТоваров.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)";
ПодстановкаНазначение = "ИСТИНА";
ПодстановкаИтоговая = ?(ВТаблицеОтбораЕстьНазначения, ПодстановкаНазначение, Подстановка);
Текст = СтрЗаменить(Текст, "&ПодстановкаНазначенияОтбора", ПодстановкаИтоговая);
УсловиеОтбораНазначений = ?(ВТаблицеОтбораЕстьНазначения, "ИСТИНА", "Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)");
Текст = СтрЗаменить(Текст, "&УсловиеОтбораНазначений", УсловиеОтбораНазначений);
Возврат Текст;
КонецФункции
Функция ВременнаяТаблицаЗапретЗакупкиПоАссортименту(ИспользоватьАссортимент)
Если Не ИспользоватьАссортимент Тогда
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 0
| НЕОПРЕДЕЛЕНО КАК Склад,
| НЕОПРЕДЕЛЕНО КАК Номенклатура,
| НЕОПРЕДЕЛЕНО КАК ДатаВозможнойПоставки
|ПОМЕСТИТЬ ЗапретЗакупкиПоАссортименту";
Иначе
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Товары.Склад КАК Склад,
| Товары.Номенклатура КАК Номенклатура,
| ВЫБОР
| КОГДА ТаблицаСпособовОбеспечения.ДатаПоставки <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ТаблицаСпособовОбеспечения.ДатаПоставки
| ИНАЧЕ &НачалоТекущегоДня
| КОНЕЦ КАК ДатаВозможнойПоставки
|ПОМЕСТИТЬ СкладыИДатыПоставок
|ИЗ
| ВтТовары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ БлижайшийЦиклПоСпособамОбеспечения КАК ТаблицаСпособовОбеспечения
| ПО Товары.СпособОбеспечения = ТаблицаСпособовОбеспечения.Ссылка
|ГДЕ
| ВЫРАЗИТЬ(Товары.Склад КАК Справочник.Склады).ТипСклада = ЗНАЧЕНИЕ(Перечисление.ТипыСкладов.РозничныйМагазин)
|ИНДЕКСИРОВАТЬ ПО
| Склад, ДатаВозможнойПоставки
|;
|
|
|ВЫБРАТЬ
| Таблица.Склад КАК Склад,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.ДатаВозможнойПоставки КАК ДатаВозможнойПоставки
|ПОМЕСТИТЬ ЗапретЗакупкиПоАссортименту
|ИЗ
| СкладыИДатыПоставок КАК Таблица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияИзмененияФорматовМагазинов КАК ИсторияНастроек
| ПО Таблица.Склад = ИсторияНастроек.Склад
| И ИсторияНастроек.Период В(
| ВЫБРАТЬ
| МАКСИМУМ (История.Период) КАК Период
| ИЗ
| РегистрСведений.ИсторияИзмененияФорматовМагазинов КАК История
| ГДЕ
| История.Склад = ИсторияНастроек.Склад
| И История.Период < Таблица.ДатаВозможнойПоставки)
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ИспользоватьФорматыМагазинов КАК ИспользоватьФорматыМагазинов
| ПО ИСТИНА
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Ассортимент КАК Ассортимент
| ПО ЕСТЬNULL(ИсторияНастроек.КонтролироватьАссортимент, ЛОЖЬ)
| И Ассортимент.Номенклатура = Таблица.Номенклатура
| И Ассортимент.ОбъектПланирования
| = ВЫБОР КОГДА ИспользоватьФорматыМагазинов.Значение ТОГДА
| ЕСТЬNULL(ИсторияНастроек.ФорматМагазина, ЗНАЧЕНИЕ(Справочник.ФорматыМагазинов.ПустаяСсылка))
| ИНАЧЕ
| Таблица.Склад
| КОНЕЦ
| И Ассортимент.РазрешеныЗакупки
| И Ассортимент.Период В(
| ВЫБРАТЬ
| МАКСИМУМ (Ассорти.Период) КАК Период
| ИЗ
| РегистрСведений.Ассортимент КАК Ассорти
| ГДЕ
| Ассорти.Номенклатура = Ассортимент.Номенклатура
| И Ассорти.ОбъектПланирования = Ассортимент.ОбъектПланирования
| И Ассорти.Период <= Таблица.ДатаВозможнойПоставки)
|ГДЕ
| ИсторияНастроек.КонтролироватьАссортимент
| И Ассортимент.Номенклатура ЕСТЬ NULL
|ИНДЕКСИРОВАТЬ ПО
| Склад, Номенклатура, ДатаВозможнойПоставки";
КонецЕсли;
Возврат ТекстЗапроса;
КонецФункции
Процедура ЗаписатьДокумент(ДокументОбъект, СообщенияОбОшибках)
ОшибокНеОбнаружено = ДокументОбъект.ПроверитьЗаполнение();
Если Не ОшибокНеОбнаружено Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Иначе
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
ИмяГруппыСобытий = НСтр("ru = 'Обеспечение потребностей'", ОбщегоНазначения.КодОсновногоЯзыка());
ИмяСобытияВГруппе = НСтр("ru = 'Создание заказов'", ОбщегоНазначения.КодОсновногоЯзыка());
ИмяСобытияЖурнала = ИмяГруппыСобытий + "." + ИмяСобытияВГруппе;
ЗаписьЖурналаРегистрации(ИмяСобытияЖурнала, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Ошибки = ПолучитьСообщенияПользователю(Истина);
Для Каждого Ошибка Из Ошибки Цикл
Ошибка.КлючДанных = ДокументОбъект.Ссылка;
СообщенияОбОшибках.Добавить(Ошибка);
КонецЦикла;
КонецПроцедуры
Функция НайтиОтборРекурсивно(КоллекцияЭлементов, ЗначениеПоиска)
Для Каждого ЭлементОтбора Из КоллекцияЭлементов Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
Если Не ЭлементОтбора.Использование Тогда
Продолжить;
КонецЕсли;
МассивИменПолей = СтрРазделить(Строка(ЭлементОтбора.ЛевоеЗначение), ".");
Если Новый ПолеКомпоновкиДанных(МассивИменПолей[0]) = ЗначениеПоиска Тогда
Возврат Истина;
КонецЕсли;
Иначе
Возврат НайтиОтборРекурсивно(ЭлементОтбора.Элементы, ЗначениеПоиска);
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Функция ВременнаяТаблицаОтборПоСегментам()
Возврат
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| НоменклатураСегмента.Номенклатура КАК Номенклатура,
| НоменклатураСегмента.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ОтборПоСегментам
|ИЗ
| РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
| {ГДЕ
| НоменклатураСегмента.Номенклатура.* КАК Номенклатура,
| НоменклатураСегмента.Характеристика.* КАК Характеристика,
| НоменклатураСегмента.Сегмент.* КАК СегментНоменклатуры}
|ГДЕ
| &ИспользуетсяОтборПоСегментуНоменклатуры
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика";
КонецФункции
Функция ВременнаяТаблицаОтборПоЗаказам()
МассивТекстов = Новый Массив;
МассивТекстов.Добавить(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| РеестрДокументов.Ссылка КАК Заказ
|ПОМЕСТИТЬ ОтборПоЗаказам
|ИЗ РегистрСведений.РеестрДокументов КАК РеестрДокументов
|ГДЕ
| &ИспользуетсяОтборПоЗаказам
|{ГДЕ
| РеестрДокументов.Ссылка.* КАК Заказ,
| РеестрДокументов.НаправлениеДеятельности.* КАК НаправлениеДеятельности}");
Возврат СтрСоединить(МассивТекстов, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
КонецФункции
Функция ВременнаяТаблицаРазличнаяНоменклатура(ИмяТаблицы)
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика
|ПОМЕСТИТЬ РазличнаяНоменклатура
|ИЗ
| ИмяТаблицы КАК Таблица
|ГДЕ
| &ОптимизироватьЗапасыРаспределительногоЦентра";
Возврат СтрЗаменить(Текст, "ИмяТаблицы", ИмяТаблицы);
КонецФункции
Функция ВременнаяТаблицаПотребностиВсехСкладовПоЗаказам()
ТекстЗапроса =
Справочники.ФорматыМагазинов.ТекстЗапросаВтФорматыСкладов(Ложь) +
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
|
| ВЫБОР КОГДА Товары.Склад ССЫЛКА Справочник.Склады ТОГДА
| Товары.Склад
| ИНАЧЕ
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| КОНЕЦ КАК Склад,
|
| ВЫБОР КОГДА Товары.Склад ССЫЛКА Справочник.СтруктураПредприятия ТОГДА
| Товары.Склад
| ИНАЧЕ
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка)
| КОНЕЦ КАК ПодразделениеПолучатель,
|
| Товары.Назначение КАК Назначение,
| Товары.ЗаказНаОтгрузку КАК Заказ,
| Товары.ЖелаемаяДатаОтгрузки КАК ДатаОтгрузки,
| Товары.НеОбеспечено КАК НеОбеспечено,
| Товары.Зарезервировано + Товары.Обеспечено КАК Распределено,
| Товары.Состояние КАК Состояние,
| СпрСпособ.Ссылка КАК СпособОбеспечения
|ПОМЕСТИТЬ ПотребностиВсехСкладовПоЗаказам
|ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Товары
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособ
| ПО &ПодстановкаОсновногоСпособаОбеспечения
|
|ГДЕ
| Товары.Состояние В(
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.Обеспечить),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченКДате),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаетсяПоНеподтвержденномуЗаказу),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ЗарезервированПриПоступлении))
|
|{ГДЕ
| Товары.Номенклатура.* КАК Номенклатура,
| Товары.Характеристика.* КАК Характеристика,
| Товары.Назначение.* КАК Назначение}
|
|{ГДЕ Товары.ЗаказНаОтгрузку В(
| ВЫБРАТЬ
| ТаблицаОтбора.Заказ КАК Заказ
| ИЗ
| ОтборПоЗаказам КАК ТаблицаОтбора
| ГДЕ
| &ИспользуетсяОтборПоЗаказам)}
|
|{ГДЕ (Товары.Номенклатура, Товары.Характеристика) В(
| ВЫБРАТЬ
| ТаблицаОтбора.Номенклатура КАК Номенклатура,
| ТаблицаОтбора.Характеристика КАК Характеристика
| ИЗ
| ОтборПоСегментам КАК ТаблицаОтбора
| ГДЕ
| &ИспользуетсяОтборПоСегментуНоменклатуры)}
|;
|
|
|УНИЧТОЖИТЬ ВтФорматыСкладов";
ТекстЗапроса = РегистрыСведений.СхемыОбеспечения.ПодставитьСоединениеДляПолученияСпособаОбеспечения(
ТекстЗапроса,
"ПодстановкаОсновногоСпособаОбеспечения",
"Товары.Номенклатура,Товары.Характеристика,ВЫРАЗИТЬ(Товары.Склад КАК Справочник.Склады)");
Возврат ТекстЗапроса;
КонецФункции
Функция ВременнаяТаблицаПотребностиВыбранныхСкладов()
Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Склад КАК СкладОтгрузкиЗаказа,
| Товары.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| Товары.Назначение КАК Назначение,
| Товары.Заказ КАК Заказ,
| Товары.ДатаОтгрузки КАК ДатаОтгрузки,
| Товары.ДатаОтгрузки КАК ДатаОтгрузкиЗаказа,
| Товары.НеОбеспечено КАК НеОбеспечено,
| Товары.Распределено КАК Распределено,
| Товары.Состояние КАК Состояние,
| Товары.СпособОбеспечения КАК СпособОбеспечения
|ИЗ
| ПотребностиВсехСкладовПоЗаказам КАК Товары
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК Топология
| ПО Товары.Номенклатура = Топология.Номенклатура
| И Товары.Характеристика = Топология.Характеристика
| И Товары.Склад = Топология.Склад
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СпособыОбеспеченияДляОтборов КАК ТаблицаСпособовОбеспеченияПереопределенный
| ПО ЕСТЬNULL(Товары.СпособОбеспечения, ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))
| = ТаблицаСпособовОбеспеченияПереопределенный.СпособОбеспечения
| И ВЫБОР КОГДА Товары.СпособОбеспечения.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Перемещение) ТОГДА
| ЕСТЬNULL(&ФОЗаказыНаПеремещенияВключена И НЕ Товары.Склад.ЦеховаяКладовая
| ИЛИ &ФОПроизводство2_2Включена И Товары.Склад.ЦеховаяКладовая, ЛОЖЬ)
| ИНАЧЕ ИСТИНА
| КОНЕЦ
|
|ГДЕ
| Топология.Номенклатура ЕСТЬ NULL
|
|{ГДЕ
| Товары.Склад.* КАК Склад,
| (ЕСТЬNULL(Товары.СпособОбеспечения,
| ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))).* КАК СпособОбеспечения,
| ЕСТЬNULL(Товары.СпособОбеспечения.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ВЫРАЗИТЬ(
| ВЫБОР
| КОГДА Товары.СпособОбеспечения.Подразделение <> ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| Товары.СпособОбеспечения.Подразделение
| ИНАЧЕ
| ЕСТЬNULL(Товары.Склад.Подразделение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка))
| КОНЕЦ КАК Справочник.СтруктураПредприятия).* КАК Подразделение,
| (ЕСТЬNULL(Товары.СпособОбеспечения.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)).* КАК ИсточникОбеспечения}
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВсеТовары.Номенклатура КАК Номенклатура,
| ВсеТовары.Характеристика КАК Характеристика,
| ВсеТовары.Склад КАК Склад,
| ВсеТовары.Склад КАК СкладОтгрузкиЗаказа,
| ВсеТовары.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| ВсеТовары.Назначение КАК Назначение,
| ВсеТовары.Заказ КАК Заказ,
| ВсеТовары.ДатаОтгрузки КАК ДатаОтгрузки,
| ВсеТовары.ДатаОтгрузки КАК ДатаОтгрузкиЗаказа,
| ВсеТовары.НеОбеспечено КАК НеОбеспечено,
| ВсеТовары.Распределено КАК Распределено,
| ВсеТовары.Состояние КАК Состояние,
| ВсеТовары.СпособОбеспечения КАК СпособОбеспечения
|ИЗ
| ПотребностиВсехСкладовПоЗаказам КАК ВсеТовары
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СпособыОбеспеченияДляОтборов КАК ТаблицаСпособовОбеспеченияПереопределенный
| ПО ЕСТЬNULL(ВсеТовары.СпособОбеспечения, ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))
| = ТаблицаСпособовОбеспеченияПереопределенный.СпособОбеспечения
| И ВЫБОР КОГДА ВсеТовары.СпособОбеспечения.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Перемещение) ТОГДА
| ЕСТЬNULL(&ФОЗаказыНаПеремещенияВключена И НЕ ВсеТовары.Склад.ЦеховаяКладовая
| ИЛИ &ФОПроизводство2_2Включена И ВсеТовары.Склад.ЦеховаяКладовая, ЛОЖЬ)
| ИНАЧЕ ИСТИНА
| КОНЕЦ
|
|ГДЕ
| ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ТопологияСкладов КАК Топология
| ГДЕ
| Топология.Номенклатура = ВсеТовары.Номенклатура
| И Топология.Характеристика = ВсеТовары.Характеристика
| И Топология.Склад = ВсеТовары.Склад)
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ТопологияСкладов КАК Топология
| ГДЕ
| Топология.Номенклатура = ВсеТовары.Номенклатура
| И Топология.Характеристика = ВсеТовары.Характеристика
| И Топология.Центр = ВсеТовары.Склад)
|
|{ГДЕ
| ВсеТовары.Склад.* КАК Склад,
| (ЕСТЬNULL(ВсеТовары.СпособОбеспечения,
| ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))).* КАК СпособОбеспечения,
| ЕСТЬNULL(ВсеТовары.СпособОбеспечения.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ВЫРАЗИТЬ(
| ВЫБОР
| КОГДА ВсеТовары.СпособОбеспечения.Подразделение <> ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| ВсеТовары.СпособОбеспечения.Подразделение
| ИНАЧЕ
| ЕСТЬNULL(ВсеТовары.Склад.Подразделение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка))
| КОНЕЦ КАК Справочник.СтруктураПредприятия).* КАК Подразделение,
| (ЕСТЬNULL(ВсеТовары.СпособОбеспечения.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)).* КАК ИсточникОбеспечения}
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВсеТовары.Номенклатура КАК Номенклатура,
| ВсеТовары.Характеристика КАК Характеристика,
| Топология.Центр КАК Склад,
| ВсеТовары.Склад КАК СкладОтгрузкиЗаказа,
| ВсеТовары.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| ВсеТовары.Назначение КАК Назначение,
| ВсеТовары.Заказ КАК Заказ,
| ДОБАВИТЬКДАТЕ(ВсеТовары.ДатаОтгрузки, ДЕНЬ,
| - ЕСТЬNULL(СпрСпособСкладСети.ДлительностьВДнях, 0))КАК ДатаОтгрузки,
| ВсеТовары.ДатаОтгрузки КАК ДатаОтгрузкиЗаказа,
| ВсеТовары.НеОбеспечено КАК НеОбеспечено,
| ВсеТовары.Распределено КАК Распределено,
| ВсеТовары.Состояние КАК Состояние,
| СпрСпособЦентр.Ссылка КАК СпособОбеспечения
|ИЗ
| ПотребностиВсехСкладовПоЗаказам КАК ВсеТовары
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказНаПеремещение КАК ЗаказыНаПеремещение
| ПО ЗаказыНаПеремещение.Ссылка = ВсеТовары.Заказ
|
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК Топология
| ПО Топология.Номенклатура = ВсеТовары.Номенклатура
| И Топология.Характеристика = ВсеТовары.Характеристика
| И Топология.Склад = ВсеТовары.Склад
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК СкладыСети
| ПО СкладыСети.Номенклатура = Топология.Номенклатура
| И СкладыСети.Характеристика = Топология.Характеристика
| И СкладыСети.Центр = Топология.Центр
| И СкладыСети.Склад = (
| ВЫБОР
| КОГДА ЗаказыНаПеремещение.СкладПолучатель ЕСТЬ НЕ NULL ТОГДА ЗаказыНаПеремещение.СкладПолучатель
| КОНЕЦ)
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособСкладСети
| ПО &ПодстановкаОсновногоСпособаОбеспеченияСкладаСети
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособЦентр
| ПО &ПодстановкаОсновногоСпособаОбеспеченияЦентраСети
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СпособыОбеспеченияДляОтборов КАК ТаблицаСпособовОбеспеченияПереопределенный
| ПО ЕСТЬNULL(СпрСпособЦентр.Ссылка, ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))
| = ТаблицаСпособовОбеспеченияПереопределенный.СпособОбеспечения
| И ВЫБОР КОГДА СпрСпособЦентр.Ссылка.ТипОбеспечения = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Перемещение) ТОГДА
| ЕСТЬNULL(&ФОЗаказыНаПеремещенияВключена И НЕ ВсеТовары.Склад.ЦеховаяКладовая
| ИЛИ &ФОПроизводство2_2Включена И ВсеТовары.Склад.ЦеховаяКладовая, ЛОЖЬ)
| ИНАЧЕ ИСТИНА
| КОНЕЦ
|ГДЕ
| НЕ Топология.Номенклатура ЕСТЬ NULL
| И СкладыСети.Номенклатура ЕСТЬ NULL
|
|{ГДЕ
| Топология.Центр.* КАК Склад,
| (ЕСТЬNULL(СпрСпособЦентр.Ссылка,
| ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка))).* КАК СпособОбеспечения,
| ЕСТЬNULL(СпрСпособЦентр.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.Покупка)) КАК ТипОбеспечения,
| ВЫРАЗИТЬ(
| ВЫБОР
| КОГДА СпрСпособЦентр.Подразделение <> ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) ТОГДА
| СпрСпособЦентр.Подразделение
| ИНАЧЕ
| ЕСТЬNULL(Топология.Центр.Подразделение,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка))
| КОНЕЦ КАК Справочник.СтруктураПредприятия).* КАК Подразделение,
| (ЕСТЬNULL(СпрСпособЦентр.ИсточникОбеспеченияПотребностей, НЕОПРЕДЕЛЕНО)).* КАК ИсточникОбеспечения}";
Подстановка =
"ВсеТовары.Номенклатура,
|ВсеТовары.Характеристика,
|ВсеТовары.Склад";
Текст = РегистрыСведений.СхемыОбеспечения.ПодставитьСоединениеДляПолученияСпособаОбеспечения(
Текст, "ПодстановкаОсновногоСпособаОбеспеченияСкладаСети", Подстановка, "СкладСети");
Подстановка =
"ВсеТовары.Номенклатура,
|ВсеТовары.Характеристика,
|Топология.Центр";
Текст = РегистрыСведений.СхемыОбеспечения.ПодставитьСоединениеДляПолученияСпособаОбеспечения(
Текст, "ПодстановкаОсновногоСпособаОбеспеченияЦентраСети", Подстановка, "ЦентрСети");
ТекстЗапроса =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.СкладОтгрузкиЗаказа КАК СкладОтгрузкиЗаказа,
| Товары.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| Товары.Назначение КАК Назначение,
| Товары.Заказ КАК Заказ,
| Товары.ДатаОтгрузки КАК ДатаОтгрузки,
| Товары.ДатаОтгрузкиЗаказа КАК ДатаОтгрузкиЗаказа,
| СУММА(Товары.НеОбеспечено) КАК НеОбеспечено,
| СУММА(ВЫБОР КОГДА Товары.Состояние В(
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ЗарезервированПриПоступлении)) ТОГДА
| Товары.Распределено
| ИНАЧЕ
| 0
| КОНЕЦ) КАК РаспределеноНаСкладе,
| СУММА(ВЫБОР КОГДА Товары.Состояние В(
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченКДате),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаетсяПоНеподтвержденномуЗаказу)) ТОГДА
| Товары.Распределено
| ИНАЧЕ
| 0
| КОНЕЦ) КАК РаспределеноИзЗаказов,
| ЕСТЬNULL(Товары.СпособОбеспечения, ЗНАЧЕНИЕ(Справочник.СпособыОбеспеченияПотребностей.ПустаяСсылка)) КАК СпособОбеспечения
|ПОМЕСТИТЬ ВтТовары
|ИЗ
| ТекстВложенногоЗапросаПереопределяемый КАК Товары
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура,
| Товары.Характеристика,
| Товары.Склад,
| Товары.СкладОтгрузкиЗаказа,
| Товары.ПодразделениеПолучатель,
| Товары.Назначение,
| Товары.Заказ,
| Товары.ДатаОтгрузки,
| Товары.ДатаОтгрузкиЗаказа,
| Товары.СпособОбеспечения";
Текст = СтрЗаменить(ТекстЗапроса, "ТекстВложенногоЗапросаПереопределяемый", СтрШаблон("(%1)", Текст));
Возврат Текст;
КонецФункции
Функция ВыборкаПервойЗаписиПотребностейПоЗаказамДляКомпоновкиЗапроса()
Возврат
"ВЫБРАТЬ ПЕРВЫЕ 1
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.СкладОтгрузкиЗаказа КАК СкладОтгрузкиЗаказа,
| Товары.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| Товары.Назначение КАК Назначение,
| Товары.Заказ КАК Заказ,
| Товары.ДатаОтгрузки КАК ДатаОтгрузки,
| Товары.ДатаОтгрузкиЗаказа КАК ДатаОтгрузкиЗаказа,
|
| Товары.НеОбеспечено КАК НеОбеспечено,
| Товары.РаспределеноНаСкладе КАК РаспределеноНаСкладе,
| Товары.РаспределеноИзЗаказов КАК РаспределеноИзЗаказов,
|
| Товары.СпособОбеспечения КАК СпособОбеспечения
|{ВЫБРАТЬ
| Номенклатура.* КАК Номенклатура,
| Характеристика.* КАК Характеристика,
| Склад.* КАК Склад,
| СкладОтгрузкиЗаказа.* КАК СкладОтгрузкиЗаказа,
| ПодразделениеПолучатель.* КАК ПодразделениеПолучатель,
| Назначение.* КАК Назначение,
| Заказ.* КАК Заказ,
| ДатаОтгрузки КАК ДатаОтгрузки,
| ДатаОтгрузкиЗаказа КАК ДатаОтгрузкиЗаказа,
| НеОбеспечено КАК НеОбеспечено,
| РаспределеноНаСкладе КАК РаспределеноНаСкладе,
| РаспределеноИзЗаказов КАК РаспределеноИзЗаказов,
| СпособОбеспечения.* КАК СпособОбеспечения}
|ИЗ
| ВтТовары КАК Товары";
КонецФункции
Функция ВременнаяТаблицаЗаказыНаПеремещениеВнутриСети(ВТаблицеОтбораЕстьНазначения)
Тексты = Новый Массив();
Текст =
"ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Назначение КАК Назначение,
| Запасы.Заказ КАК ЗаказНаПоступление,
| Запасы.ЗаказаноОстаток КАК Запас
|ПОМЕСТИТЬ ОжидаемыеПоступленияПоЗаказам
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| ТИПЗНАЧЕНИЯ(Заказ) В(
| ТИП(Документ.ЗаказНаПеремещение))
| И (Номенклатура, Характеристика, Склад) В(
| ВЫБРАТЬ
| Фильтр.Номенклатура КАК Номенклатура,
| Фильтр.Характеристика КАК Характеристика,
| Фильтр.Склад КАК Склад
| ИЗ
| РазличныеТоварыИСклады КАК Фильтр)) КАК Запасы
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Набор.Склад КАК Склад,
| Набор.СкладОтправитель КАК СкладОтправитель,
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Назначение КАК Назначение,
| Набор.Заказ КАК Заказ,
| СУММА(Набор.ВРезервеНаСкладе) КАК ВРезервеНаСкладе,
| СУММА(Набор.Распределено) КАК Распределено,
| СУММА(Набор.НеОбеспечено) КАК НеОбеспечено,
| СУММА(Набор.Запас) КАК Запас
|ПОМЕСТИТЬ ЗаказыНаПеремещениеВнутриСетиГруппировкаПоЗаказам
|ИЗ(
| ВЫБРАТЬ
| Топология.Центр КАК Склад,
| Сведения.Склад КАК СкладОтправитель,
| Сведения.Номенклатура КАК Номенклатура,
| Сведения.Характеристика КАК Характеристика,
| Сведения.Назначение КАК Назначение,
| Сведения.ЗаказНаОтгрузку КАК Заказ,
| ВЫБОР КОГДА Сведения.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ВРезерве) ТОГДА
| Сведения.Зарезервировано
| ИНАЧЕ
| 0
| КОНЕЦ КАК ВРезервеНаСкладе,
| Сведения.Зарезервировано + Сведения.Обеспечено КАК Распределено,
| Сведения.НеОбеспечено КАК НеОбеспечено,
| 0 КАК Запас
| ИЗ
| ТопологияСкладов КАК Топология
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК Сведения
| ПО Сведения.Номенклатура = Топология.Номенклатура
| И Сведения.Характеристика = Топология.Характеристика
| И Сведения.Склад = Топология.Склад
| И Сведения.Назначение = &ПодстановкаНазначенияОтбора
| И Сведения.Состояние В(
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ВРезерве),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ЗарезервированПриПоступлении),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаетсяПоНеподтвержденномуЗаказу),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченКДате),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.Обеспечить),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.НеОбеспечивать))
| И ТИПЗНАЧЕНИЯ(Сведения.ЗаказНаОтгрузку) В(
| ТИП(Документ.ЗаказНаПеремещение)
| )
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказНаПеремещение КАК ЗаказыНаПеремещение
| ПО ЗаказыНаПеремещение.Ссылка = Сведения.ЗаказНаОтгрузку
|
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК СкладыСети
| ПО СкладыСети.Номенклатура = Топология.Номенклатура
| И СкладыСети.Характеристика = Топология.Характеристика
| И СкладыСети.Центр = Топология.Центр
| И СкладыСети.Склад В(
| ЗаказыНаПеремещение.СкладПолучатель)
|
| ГДЕ
| НЕ СкладыСети.Номенклатура ЕСТЬ NULL
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| РазличныеТоварыИСклады КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Сведения.Номенклатура
| И Фильтр.Характеристика = Сведения.Характеристика
| И Фильтр.Склад = Сведения.Склад)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Топология.Центр КАК Склад,
| СкладыСети.Склад КАК СкладОтправитель,
| Сведения.Номенклатура КАК Номенклатура,
| Сведения.Характеристика КАК Характеристика,
| Сведения.Назначение КАК Назначение,
| Сведения.ЗаказНаПоступление КАК Заказ,
| 0 КАК ВРезервеНаСкладе,
| 0 КАК Распределено,
| 0 КАК НеОбеспечено,
| Сведения.Запас КАК Запас
| ИЗ
| ТопологияСкладов КАК Топология
|
| ЛЕВОЕ СОЕДИНЕНИЕ ОжидаемыеПоступленияПоЗаказам КАК Сведения
| ПО Сведения.Номенклатура = Топология.Номенклатура
| И Сведения.Характеристика = Топология.Характеристика
| И Сведения.Склад = Топология.Склад
| И Сведения.Назначение = &ПодстановкаНазначенияОтбора
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказНаПеремещение КАК ЗаказыНаПеремещение
| ПО ЗаказыНаПеремещение.Ссылка = Сведения.ЗаказНаПоступление
|
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК СкладыСети
| ПО СкладыСети.Номенклатура = Топология.Номенклатура
| И СкладыСети.Характеристика = Топология.Характеристика
| И СкладыСети.Центр = Топология.Центр
| И СкладыСети.Склад В(
| ЗаказыНаПеремещение.СкладОтправитель)
|
| ГДЕ
| НЕ СкладыСети.Номенклатура ЕСТЬ NULL) КАК Набор
|СГРУППИРОВАТЬ ПО
| Набор.Склад,
| Набор.СкладОтправитель,
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Назначение,
| Набор.Заказ
|ИНДЕКСИРОВАТЬ ПО
| СкладОтправитель, Номенклатура, Характеристика, Назначение, Заказ
|;
|
|
|ВЫБРАТЬ
| Таблица.Склад КАК Склад,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Назначение КАК Назначение,
| СУММА(ВЫБОР КОГДА Таблица.Распределено + Таблица.НеОбеспечено < Таблица.Запас ТОГДА
| - Таблица.Распределено - Таблица.НеОбеспечено
| ИНАЧЕ
| - Таблица.Запас
| КОНЕЦ) КАК ОтгрузкаМинусЗапас,
| СУММА(ВЫБОР КОГДА Таблица.Распределено - Таблица.ВРезервеНаСкладе + Таблица.НеОбеспечено < Таблица.Запас ТОГДА
| - Таблица.Распределено + Таблица.ВРезервеНаСкладе - Таблица.НеОбеспечено
| ИНАЧЕ
| - Таблица.Запас
| КОНЕЦ) КАК РезервМинусЗапас
|ПОМЕСТИТЬ ЗаказыНаПеремещениеВнутриСети
|ИЗ
| ЗаказыНаПеремещениеВнутриСетиГруппировкаПоЗаказам КАК Таблица
|СГРУППИРОВАТЬ ПО
| Таблица.Склад,
| Таблица.Номенклатура,
| Таблица.Характеристика,
| Таблица.Назначение
|ИНДЕКСИРОВАТЬ ПО
| Склад, Номенклатура, Характеристика, Назначение";
Подстановка = "ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)";
ПодстановкаНазначение = "Сведения.Назначение";
ПодстановкаИтоговая = ?(ВТаблицеОтбораЕстьНазначения, ПодстановкаНазначение, Подстановка);
Текст = СтрЗаменить(Текст, "&ПодстановкаНазначенияОтбора", ПодстановкаИтоговая);
Тексты.Добавить(Текст);
Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Возврат Текст;
КонецФункции
Функция ВременнаяТаблицаПотребностиРаспределительнойСети()
Текст =
"ВЫБРАТЬ
| Топология.Центр КАК Склад,
| Топология.Номенклатура КАК Номенклатура,
| Топология.Характеристика КАК Характеристика,
| СУММА(Сведения.Зарезервировано + Сведения.Обеспечено + Сведения.НеОбеспечено) КАК Потребность
|ПОМЕСТИТЬ ПотребностиРаспределительнойСети
|ИЗ
| ТопологияСкладов КАК Топология
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК Сведения
| ПО Сведения.Номенклатура = Топология.Номенклатура
| И Сведения.Характеристика = Топология.Характеристика
| И Сведения.Склад = Топология.Склад
| И Сведения.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И Сведения.Состояние В(
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ВРезерве),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ЗарезервированПриПоступлении),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаетсяПоНеподтвержденномуЗаказу),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОбеспеченКДате),
| ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.Обеспечить))
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказНаПеремещение КАК ЗаказыНаПеремещение
| ПО ЗаказыНаПеремещение.Ссылка = Сведения.ЗаказНаОтгрузку
|
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТопологияСкладов КАК СкладыСети
| ПО СкладыСети.Номенклатура = Топология.Номенклатура
| И СкладыСети.Характеристика = Топология.Характеристика
| И СкладыСети.Центр = Топология.Центр
| И СкладыСети.Склад В(
| ЗаказыНаПеремещение.СкладПолучатель
| )
|
|ГДЕ
| СкладыСети.Номенклатура ЕСТЬ NULL
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| РазличныеТоварыИСклады КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Сведения.Номенклатура
| И Фильтр.Характеристика = Сведения.Характеристика
| И Фильтр.Склад = Сведения.Склад)
|
|СГРУППИРОВАТЬ ПО
| Топология.Центр,
| Топология.Номенклатура,
| Топология.Характеристика
|ИНДЕКСИРОВАТЬ ПО
| Склад, Номенклатура, Характеристика";
Возврат Текст;
КонецФункции
#КонецОбласти
#КонецОбласти
#КонецЕсли