Загрузка данных
////////////////////////////////////////////////////////////////////////////////
// Модуль "Распределение запасов", содержит процедуры и функции
// чтения и записи в регистр сведений "Распределение запасов".
//
////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура АктуализацияПотребностейПоГраницеОбеспеченияРегламентноеЗадание() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
Метаданные.РегламентныеЗадания.АктуализацияПотребностейПоГраницеОбеспечения);
АктуализацияПотребностейПоГраницеОбеспеченияФоновоеЗадание(Неопределено, Неопределено);
КонецПроцедуры
Процедура ЗапуститьФоновоеЗаданиеАктуализацииПотребностейПоГраницеОбеспечения() Экспорт
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыХотяБыОдногоВида") Тогда
Возврат;
КонецЕсли;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне();
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Актуализация потребностей по границе обеспечения'");
ДлительныеОперации.ВыполнитьВФоне("РаспределениеЗапасов.АктуализацияПотребностейПоГраницеОбеспеченияФоновоеЗадание",
Новый Структура, ПараметрыВыполнения);
КонецПроцедуры
Процедура АктуализацияПотребностейПоГраницеОбеспеченияФоновоеЗадание(ПараметрыПроцедуры, АдресРезультата) Экспорт
УстановитьПривилегированныйРежим(Истина);
Тексты = Новый Массив();
Текст =
"ВЫБРАТЬ
| ДанныеИБ.Номенклатура КАК Номенклатура,
| ДанныеИБ.Характеристика КАК Характеристика,
| ДанныеИБ.Склад КАК Склад,
| ДанныеИБ.Назначение КАК Назначение,
| ДанныеИБ.Заказ КАК Заказ,
| ДанныеИБ.ДатаСобытия КАК ДатаСобытия,
| ДанныеИБ.РезервироватьПоМереПоступленияОстаток КАК РезервироватьПоМереПоступления,
| ДанныеИБ.ОтложитьРезервированиеОстаток КАК ОтложитьРезервирование,
| НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ИЛИ НЕ КонтрольРезервироватьПоМере.Значение ЕСТЬ NULL КАК ОтложенноеОбеспечениеЗапрещено
|ПОМЕСТИТЬ ДанныеЗаказов
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(, ДатаСобытия > ДАТАВРЕМЯ(1,1,1)) КАК ДанныеИБ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.КонтролироватьЗапасыТоваровПодлежащихРезервированиюПоМереПоступления КАК КонтрольРезервироватьПоМере
| ПО КонтрольРезервироватьПоМере.Значение
|ГДЕ
| ДанныеИБ.РезервироватьПоМереПоступленияОстаток <> 0
| И УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| И КонтрольРезервироватьПоМере.Значение ЕСТЬ NULL // Допустимо отложенное обеспечение
| ИЛИ ДанныеИБ.ОтложитьРезервированиеОстаток <> 0
|ИНДЕКСИРОВАТЬ ПО
| ОтложенноеОбеспечениеЗапрещено
|;
|
|/////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад
|ПОМЕСТИТЬ РазличныеТовары
|ИЗ
| ДанныеЗаказов КАК Товары
|ГДЕ
| НЕ Товары.ОтложенноеОбеспечениеЗапрещено
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад";
Тексты.Добавить(Текст);
Текст = ОбеспечениеВДокументахСервер.ВременнаяТаблицаГраницыПериодаОбеспечения(
"РазличныеТовары",
"&НачалоТекущегоДня");
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Движения.Регистратор КАК Регистратор
|ИЗ
| ДанныеЗаказов КАК ДанныеЗаказов
| ЛЕВОЕ СОЕДИНЕНИЕ ГраницыПериодаОбеспечения КАК ГраницыПериода
| ПО ГраницыПериода.Номенклатура = ДанныеЗаказов.Номенклатура
| И ГраницыПериода.Характеристика = ДанныеЗаказов.Характеристика
| И ГраницыПериода.Склад = ДанныеЗаказов.Склад
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыИПотребности КАК Движения
| ПО Движения.Заказ = ДанныеЗаказов.Заказ
|ГДЕ
| ДанныеЗаказов.ОтложитьРезервирование <> 0
| И (ГраницыПериода.ГраницаПериода ЕСТЬ NULL ИЛИ ГраницыПериода.ГраницаПериода >= ДанныеЗаказов.ДатаСобытия)
| ИЛИ ДанныеЗаказов.РезервироватьПоМереПоступления <> 0
| И ГраницыПериода.ГраницаПериода < ДанныеЗаказов.ДатаСобытия";
Тексты.Добавить(Текст);
Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос = Новый Запрос(Текст);
Запрос.УстановитьПараметр("НачалоТекущегоДня", НачалоДня(ТекущаяДатаСеанса()));
Выборка = Запрос.Выполнить().Выбрать();
Набор = РегистрыНакопления.ЗапасыИПотребности.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НачатьТранзакцию();
Попытка
МетаданныеДокумента = Выборка.Регистратор.Метаданные(); // ОбъектМетаданныхДокумент -
БлокировкаДанных = Новый БлокировкаДанных();
ЭлементБлокировки = БлокировкаДанных.Добавить(МетаданныеДокумента.ПолноеИмя());
ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Регистратор);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый;
БлокировкаДанных.Заблокировать();
ЗаписатьДвижения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Выборка.Регистратор, "Проведен");
Если ТипЗнч(ЗаписатьДвижения) <> Тип("Булево") Тогда
ЗаписатьДвижения = Ложь;
КонецЕсли;
Если ЗаписатьДвижения Тогда
НаборЗаписей = РегистрыНакопления.ЗапасыИПотребности.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Отбор.Регистратор.Значение = Выборка.Регистратор;
Набор.Прочитать();
ВсегоСтрок = Набор.Количество();
Для Счетчик = 1 По ВсегоСтрок Цикл
СтрокаНабора = Набор[ВсегоСтрок - Счетчик];
Если СтрокаНабора.ТипЗаписи <> Перечисления.ТипыЗаписейЗапасыИПотребности.ПервичнаяЗапись Тогда
Набор.Удалить(СтрокаНабора);
КонецЕсли;
КонецЦикла;
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Набор.ДополнительныеСвойства.Вставить("РассчитыватьИзменения", Истина);
Набор.ДополнительныеСвойства.Вставить("СвойстваДокумента", Новый Структура("ЭтоНовый", Ложь));
Набор.ДополнительныеСвойства.Вставить("МенеджерВременныхТаблиц", МенеджерВременныхТаблиц);
Набор.ДополнительныеСвойства.Вставить("ТаблицыКонтроля", Новый Структура);
Набор.ДополнительныеСвойства.Вставить("АктуализацияОтложенногоОбеспечения");
Набор.Записать();
ЭмуляцияДокумента = ПроведениеДокументов.ЭмуляцияДокумента(Неопределено, Неопределено);
РаспределениеЗапасовДвижения.ОтразитьЗаданияКРаспределениюЗапасов(ЭмуляцияДокумента, МенеджерВременныхТаблиц);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ТекстСообщения = НСтр("ru = 'Регламентное задание ""Актуализация потребностей по границе обеспечения"" завершилось неудачно по причине: %Причина%'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
СобытиеЖурнала = НСтр("ru = 'Распределение запасов'", ОбщегоНазначения.КодОсновногоЯзыка());
ЗаписьЖурналаРегистрации(СобытиеЖурнала,
УровеньЖурналаРегистрации.Ошибка,
Метаданные.РегламентныеЗадания.АктуализацияПотребностейПоГраницеОбеспечения,
,
ТекстСообщения);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Выполняет распределение в фоне
//
// Параметры:
// Задания - ТаблицаЗначений - колонки соответствуют измерениям, ресурсам и реквизитам регистра сведений
// "ЗаданияКРаспределениюЗапасов", есть и служебные колонки:
// * Номенклатура - СправочникСсылка.Номенклатура -
// * Характеристика - СправочникСсылка.ХарактеристикиНоменклатуры -
// * Склад - СправочникСсылка.СтруктураПредприятия, СправочникСсылка.Склады -
// * Назначение - СправочникСсылка.Назначения -
// * РазделительЗаписи - УникальныйИдентификатор -
// * ЗаказНаОтгрузку - ОпределяемыйТип.ОжидаемаяОтгрузка -
// * ИдентификаторЗаписи - УникальныйИдентификатор -
// * КСнятиюРезерва - Число -
// * ДатаЗаписи - Дата -
// * ИдентификаторЗадания - УникальныйИдентификатор - служебная
// * ДатаЗадания - Дата - служебная
// ИдентификаторыНеОбработанныхЗаписей - Соответствие из УникальныйИдентификатор - ключ, это идентификатор
// не выполненных (выдающих ошибку при
// выполнении) записей регистра
// сведений очереди заданий
// (измерение ИдентификаторЗаписи
// регистра сведений очереди заданий),
// значение, это представление ошибки.
// ДополнительныеСвойства - Неопределено, Структура - дополнительные свойства выполнения заданий.
//
Процедура ВыполнитьРаспределениеВФоне(
Задания,
ИдентификаторыНеОбработанныхЗаписей,
ДополнительныеСвойства = Неопределено) Экспорт
УстановитьПривилегированныйРежим(Истина);
Если БлокироватьРаспределениеЗапасов() Тогда
Возврат;
КонецЕсли;
ТекстыЗапроса = Новый Массив;
ТекстЗапроса =
"ВЫБРАТЬ
| Задания.Номенклатура КАК Номенклатура,
| Задания.Характеристика КАК Характеристика,
| Задания.Склад КАК Склад,
| Задания.Назначение КАК Назначение,
| Задания.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| Задания.ОчередьРасчетаСтруктурыЗаказов КАК ОчередьРасчетаСтруктурыЗаказов,
| Задания.ИдентификаторЗаписи КАК ИдентификаторЗаписи,
| Задания.КСнятиюРезерва КАК КСнятиюРезерва,
| Задания.КСнятиюРезерваИзЗаблокированных КАК КСнятиюРезерваИзЗаблокированных
|ПОМЕСТИТЬ ЗаданияКРаспределениюЗапасов
|ИЗ
| &Задания КАК Задания
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, ЗаказНаОтгрузку
|;
|
|////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Задания.Номенклатура КАК Номенклатура,
| Задания.Характеристика КАК Характеристика,
| Задания.Склад КАК Склад,
| Задания.Назначение КАК Назначение
|ПОМЕСТИТЬ ТоварыДляРаспределенияЗапасов
|ИЗ
| ЗаданияКРаспределениюЗапасов КАК Задания
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение
|;
|
|//////////////////////////////////////////////
|ВЫБРАТЬ
| Задания.Номенклатура КАК Номенклатура,
| Задания.Характеристика КАК Характеристика,
| Задания.Склад КАК Склад,
| Задания.Назначение КАК Назначение,
| Задания.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| СУММА(Задания.КСнятиюРезерва + Задания.КСнятиюРезерваИзЗаблокированных) КАК Отгрузка
|ПОМЕСТИТЬ ИзменениеОстаткаПоТоварамДляКонтроляОстатков
|ИЗ
| ЗаданияКРаспределениюЗапасов КАК Задания
|ГДЕ
| Задания.КСнятиюРезерва > 0 ИЛИ Задания.КСнятиюРезерваИзЗаблокированных > 0
|СГРУППИРОВАТЬ ПО
| Задания.Номенклатура,
| Задания.Характеристика,
| Задания.Склад,
| Задания.Назначение,
| Задания.ЗаказНаОтгрузку
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, ЗаказНаОтгрузку";
ТекстыЗапроса.Добавить(ТекстЗапроса);
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = СтрСоединить(ТекстыЗапроса, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.УстановитьПараметр("Задания", Задания);
Запрос.Выполнить();
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура");
Отбор.Вставить("Характеристика");
Отбор.Вставить("Склад");
Отбор.Вставить("Назначение");
НаборЗаписанЦеликом = Ложь;
НачатьТранзакцию();
Попытка
Если Не ОбновлениеИнформационнойБазы.ОбъектОбработан("РегистрСведений.РаспределениеЗапасов").Обработан
Или Не ОбновлениеИнформационнойБазы.ОбъектОбработан("РегистрСведений.ДоступныеОстаткиТоваров").Обработан Тогда
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
|ИЗ
| ТоварыДляРаспределенияЗапасов КАК Таблица
|;
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
|ИЗ
| ТоварыДляРаспределенияЗапасов КАК Таблица
|ГДЕ
| Таблица.Склад <> НЕОПРЕДЕЛЕНО
| И Таблица.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| И ТИПЗНАЧЕНИЯ(Таблица.Склад) = ТИП(Справочник.Склады)";
ТаблицыБлокировки = Запрос.Выполнить();
Блокировка = Новый БлокировкаДанных();
ДобавитьБлокировки(Блокировка, Неопределено, ТаблицыБлокировки[0], ТаблицыБлокировки[1]);
Блокировка.Заблокировать();
КонецЕсли;
Результат = РаспределениеЗапасовПоТоварам(Запрос, "ТоварыДляРаспределенияЗапасов", Истина,
"РаспределениеЗапасов,ДоступныеОстаткиТоваров");
ЗаписатьРезультатРаспределенияЗапасов(Результат);
НаборЗаписанЦеликом = Истина;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ТекстОшибки = "";
СообщитьОНеудачнойОбработкеНоменклатуры(ИнформацияОбОшибке(), ТекстОшибки);
Для каждого СтрокаТаблицыЗадания Из Задания Цикл
ИдентификаторыНеОбработанныхЗаписей.Вставить(СтрокаТаблицыЗадания.ИдентификаторЗаписи, ТекстОшибки);
КонецЦикла;
НаборЗаписанЦеликом = Ложь;
КонецПопытки;
Если НаборЗаписанЦеликом Тогда
ТекстыЗапроса.Очистить();
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВсеЗаказы
|ИЗ(
| ВЫБРАТЬ
| Задания.ЗаказНаОтгрузку КАК Ссылка
| ИЗ
| ЗаданияКРаспределениюЗапасов КАК Задания
| ГДЕ
| Задания.ЗаказНаОтгрузку <> НЕОПРЕДЕЛЕНО
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ЕСТЬNULL(ОжидаемаяОтгрузка.ЗаказНаОтгрузку, НЕОПРЕДЕЛЕНО) КАК Ссылка
| ИЗ
| ЗаданияКРаспределениюЗапасов КАК Заказы
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК ОжидаемаяОтгрузка
| ПО ОжидаемаяОтгрузка.Номенклатура = Заказы.Номенклатура
| И ОжидаемаяОтгрузка.Характеристика = Заказы.Характеристика
| И ОжидаемаяОтгрузка.Склад = Заказы.Склад
| И ОжидаемаяОтгрузка.Назначение = Заказы.Назначение) КАК Набор
|ИНДЕКСИРОВАТЬ ПО
| Ссылка
|;
|
|/////////////////////////////////////////////
|ВЫБРАТЬ
| ВсеЗаказы.Ссылка КАК Ссылка
|ИЗ
| ВсеЗаказы КАК ВсеЗаказы
|ГДЕ
| ВсеЗаказы.Ссылка <> НЕОПРЕДЕЛЕНО
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЗаказЕстьВНеобработанныхЗаданиях
| ИЗ
| РегистрСведений.ЗаданияКРаспределениюЗапасов КАК ВсеЗадания
| ГДЕ
| ВсеЗадания.ЗаказНаОтгрузку = ВсеЗаказы.Ссылка
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЭтаНоменклатураОтработана
| ИЗ
| ЗаданияКРаспределениюЗапасов КАК ОтработанныеЗадания
| ГДЕ
| ОтработанныеЗадания.Номенклатура = ВсеЗадания.Номенклатура
| И ОтработанныеЗадания.Характеристика = ВсеЗадания.Характеристика
| И ОтработанныеЗадания.Склад = ВсеЗадания.Склад
| И ОтработанныеЗадания.Назначение = ВсеЗадания.Назначение))
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК НоменклатураЗаказаЕстьВНеотработанныхЗаданиях
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК ОжидаемаяОтгрузка
| ГДЕ
| ОжидаемаяОтгрузка.ЗаказНаОтгрузку = ВсеЗаказы.Ссылка
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЭтаНоменклатураЕстьВЗаданиях
| ИЗ
| РегистрСведений.ЗаданияКРаспределениюЗапасов КАК ВсеЗадания
| ГДЕ
| ВсеЗадания.Номенклатура = ОжидаемаяОтгрузка.Номенклатура
| И ВсеЗадания.Характеристика = ОжидаемаяОтгрузка.Характеристика
| И ВсеЗадания.Склад = ОжидаемаяОтгрузка.Склад
| И ВсеЗадания.Назначение = ОжидаемаяОтгрузка.Назначение)
|
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЭтаНоменклатураОтработана
| ИЗ
| ЗаданияКРаспределениюЗапасов КАК ОтработанныеЗадания
| ГДЕ
| ОтработанныеЗадания.Номенклатура = ОжидаемаяОтгрузка.Номенклатура
| И ОтработанныеЗадания.Характеристика = ОжидаемаяОтгрузка.Характеристика
| И ОтработанныеЗадания.Склад = ОжидаемаяОтгрузка.Склад
| И ОтработанныеЗадания.Назначение = ОжидаемаяОтгрузка.Назначение))";
ТекстыЗапроса.Добавить(ТекстЗапроса);
Запрос.Текст = СтрСоединить(ТекстыЗапроса, ОбщегоНазначения.РазделительПакетаЗапросов());
Результаты = Запрос.ВыполнитьПакет();
Заказы = Результаты[Результаты.ВГраница()].Выгрузить().ВыгрузитьКолонку("Ссылка");
ИсключитьСсылкиТребующиеОтложенногоОбновления(Заказы);
РегистрыКОтражению = СостоянияДокументов.РегистрыКОтражениюСостоянияЗаказов();
РегистрыКОтражению.СостоянияЗаказовКлиентов = Истина;
РегистрыКОтражению.СостоянияВнутреннихЗаказов = Истина;
СостоянияДокументов.ДобавитьЗаданияКОтражениюСостоянияЗаказов(Неопределено, Заказы,, РегистрыКОтражению);
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьРаспределениеЗапасовВТранзакцииПроведения(Запрос) Экспорт
Результат = РаспределениеЗапасовПоТоварам(Запрос, "ТоварыДляРаспределенияЗапасов", Истина,
"РаспределениеЗапасов,ДоступныеОстаткиТоваров");
ЗаписатьРезультатРаспределенияЗапасов(Результат);
КонецПроцедуры
Процедура СостояниеСУчетомОтраженияИзменений(Заказ, ТаблицаДвижений, МенеджерВременныхТаблиц, ТаблицаИмитацияРеестра) Экспорт
Запрос = Новый Запрос();
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
УстановитьПривилегированныйРежим(Истина);
//
Запрос.УстановитьПараметр("ТаблицаИмитацияРеестра", ТаблицаИмитацияРеестра);
Запрос.УстановитьПараметр("Заказ", Заказ);
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказыРеестра.ЗаказНаОтгрузку КАК Ссылка,
| ЗаказыРеестра.Приоритет КАК Приоритет,
| ЗаказыРеестра.ДатаДокумента КАК ДатаДокументаИБ
|ПОМЕСТИТЬ ТаблицаИмитацияРеестра
|ИЗ
| &ТаблицаИмитацияРеестра КАК ЗаказыРеестра
|;
|
|///////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗаказыРеестра.Ссылка КАК Ссылка,
| ЗаказыРеестра.Приоритет КАК Приоритет,
| ЗаказыРеестра.ДатаДокументаИБ КАК ДатаДокументаИБ,
| ЛОЖЬ КАК ДополнительнаяЗапись
|ПОМЕСТИТЬ РеестрДокументовСУчетомИзменений
|ИЗ
| РегистрСведений.РеестрДокументов КАК ЗаказыРеестра
|ГДЕ
| НЕ Ссылка В(
| ВЫБРАТЬ
| ЗаказыРеестра.Ссылка КАК Ссылка
| ИЗ
| ТаблицаИмитацияРеестра КАК ЗаказыРеестра)
| И НЕ ЗаказыРеестра.ДополнительнаяЗапись
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Сведения
| ГДЕ
| Сведения.ЗаказНаОтгрузку = ЗаказыРеестра.Ссылка)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЗаказыРеестра.Ссылка КАК Ссылка,
| ЗаказыРеестра.Приоритет КАК Приоритет,
| ЗаказыРеестра.ДатаДокументаИБ КАК ДатаДокументаИБ,
| ЛОЖЬ КАК ДополнительнаяЗапись
|ИЗ
| ТаблицаИмитацияРеестра КАК ЗаказыРеестра";
Запрос.Выполнить();
Запрос.УстановитьПараметр("НаборЗаписейЗапасыИПотребности", ТаблицаДвижений);
Запрос.УстановитьПараметр("Регистратор", Заказ);
Запрос.УстановитьПараметр("ЭтоНовый", Ложь);
Запрос.УстановитьПараметр("КонтролироватьПревышениеОбособленногоОбеспечения", Ложь);
Тексты = Новый Массив();
Текст =
"ВЫБРАТЬ
| *
|ПОМЕСТИТЬ НаборЗаписейЗапасыИПотребности
|ИЗ
| &НаборЗаписейЗапасыИПотребности КАК НаборЗаписейЗапасыИПотребности";
Тексты.Добавить(Текст);
Текст = РаспределениеЗапасовДвижения.ТекстЗапросаИсходныхДвиженийЗапасыИПотребности();
Тексты.Добавить(Текст);
Текст = РаспределениеЗапасовДвижения.ТекстЗапросаИзмененийДвиженийЗапасыИПотребности(Ложь, "НаборЗаписейЗапасыИПотребности");
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
|ПОМЕСТИТЬ ТоварыДляРаспределенияЗапасов
|ИЗ
| НаборЗаписейЗапасыИПотребности КАК Таблица";
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Склад КАК Склад,
| Набор.Назначение КАК Назначение,
| Набор.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| СУММА(Набор.Отгрузка) КАК Отгрузка
|ПОМЕСТИТЬ ИзменениеОстаткаПоТоварамДляКонтроляОстатков
|ИЗ(
| ВЫБРАТЬ
| ИзмененияДвижений.Номенклатура КАК Номенклатура,
| ИзмененияДвижений.Характеристика КАК Характеристика,
| ИзмененияДвижений.Склад КАК Склад,
| ИзмененияДвижений.Назначение КАК Назначение,
| ИзмененияДвижений.Заказ КАК ЗаказНаОтгрузку,
| ВЫБОР
| КОГДА СУММА(ИзмененияДвижений.ВНаличииРасход + ИзмененияДвижений.РезервироватьНаСкладе) > 0
| ТОГДА СУММА(ИзмененияДвижений.ВНаличииРасход + ИзмененияДвижений.РезервироватьНаСкладе)
| ИНАЧЕ 0
| КОНЕЦ
| + ВЫБОР
| КОГДА СУММА(ИзмененияДвижений.ЗаблокированоВНаличииРасход + ИзмененияДвижений.РезервироватьНаСкладеИзЗаблокированных) > 0
| ТОГДА СУММА(ИзмененияДвижений.ЗаблокированоВНаличииРасход + ИзмененияДвижений.РезервироватьНаСкладеИзЗаблокированных)
| ИНАЧЕ 0
| КОНЕЦ КАК Отгрузка
| ИЗ
| ЗапасыИПотребностиИзменение КАК ИзмененияДвижений
| СГРУППИРОВАТЬ ПО
| ИзмененияДвижений.Номенклатура,
| ИзмененияДвижений.Характеристика,
| ИзмененияДвижений.Склад,
| ИзмененияДвижений.Назначение,
| ИзмененияДвижений.Заказ
| ИМЕЮЩИЕ
| СУММА(ИзмененияДвижений.ВНаличииРасход + ИзмененияДвижений.РезервироватьНаСкладе) > 0
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Задания.Номенклатура КАК Номенклатура,
| Задания.Характеристика КАК Характеристика,
| Задания.Склад КАК Склад,
| Задания.Назначение КАК Назначение,
| Задания.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| Задания.КСнятиюРезерва + Задания.КСнятиюРезерваИзЗаблокированных КАК Отгрузка
| ИЗ
| ТоварыДляРаспределенияЗапасов КАК Товары
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗаданияКРаспределениюЗапасов КАК Задания
| ПО Задания.Номенклатура = Товары.Номенклатура
| И Задания.Характеристика = Товары.Характеристика
| И Задания.Склад = Товары.Склад
| И Задания.Назначение = Товары.Назначение
| ГДЕ
| Задания.КСнятиюРезерва + Задания.КСнятиюРезерваИзЗаблокированных > 0) КАК Набор
|СГРУППИРОВАТЬ ПО
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Склад,
| Набор.Назначение,
| Набор.ЗаказНаОтгрузку
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
Тексты.Добавить(Текст);
Запрос.Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.Выполнить();
Результат = РаспределениеЗапасовПоТоварам(
Запрос,
"ТоварыДляРаспределенияЗапасов",
Ложь,
"РаспределениеЗапасов",
"РеестрДокументовСУчетомИзменений",
"ЗапасыИПотребностиИзменение");
Запрос.УстановитьПараметр("Таблица", Результат.РаспределениеЗапасов);
Запрос.Текст =
"ВЫБРАТЬ
| *
|ПОМЕСТИТЬ ИмитацияОтражения
|ИЗ
| &Таблица КАК Таблица";
Запрос.Выполнить();
КонецПроцедуры
Процедура ОбновитьИнформациюОДоступностиТоваровДляВнешнихПользователей() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОбновлениеДанныхОДоступностиТоваровДляВнешнихПользователей);
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ТекущаяДатаСеанса()));
Тексты = Новый Массив();
ТекстЗапроса =
"ВЫБРАТЬ
| &НачалоДня КАК Период,
| РаспределениеЗапасов.Номенклатура КАК Номенклатура,
| РаспределениеЗапасов.Характеристика КАК Характеристика,
| РаспределениеЗапасов.Склад КАК Склад,
| РаспределениеЗапасов.Количество КАК Доступно
|ИЗ
| РегистрСведений.РаспределениеЗапасов КАК РаспределениеЗапасов
|ГДЕ
| РаспределениеЗапасов.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И РаспределениеЗапасов.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| И РаспределениеЗапасов.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек))
| И РаспределениеЗапасов.Номенклатура.ТипНоменклатуры В(
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар),
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))";
Тексты.Добавить(ТекстЗапроса);
ТекстЗапроса =
"ВЫБРАТЬ
| ВЫБОР КОГДА РаспределениеЗапасов.ДатаДоступности > &НачалоДня ТОГДА
| РаспределениеЗапасов.ДатаДоступности
| ИНАЧЕ
| &НачалоДня
| КОНЕЦ КАК Период,
| РаспределениеЗапасов.Номенклатура КАК Номенклатура,
| РаспределениеЗапасов.Характеристика Характеристика,
| РаспределениеЗапасов.Склад КАК Склад,
| РаспределениеЗапасов.Количество КАК Доступно
|ИЗ
| РегистрСведений.РаспределениеЗапасов КАК РаспределениеЗапасов
|ГДЕ
| РаспределениеЗапасов.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И РаспределениеЗапасов.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой))
| И РаспределениеЗапасов.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек))
| И РаспределениеЗапасов.Номенклатура.ТипНоменклатуры В(
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар),
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
| И РаспределениеЗапасов.Количество <> 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| &НачалоДня КАК Период,
| СтарыеДанные.Номенклатура КАК Номенклатура,
| СтарыеДанные.Характеристика КАК Характеристика,
| СтарыеДанные.Склад КАК Склад,
| 0 КАК Доступно
|ИЗ
| РегистрСведений.ДоступностьТоваровДляВнешнихПользователей КАК СтарыеДанные";
Тексты.Добавить(ТекстЗапроса);
ТекстЗапроса = СтрСоединить(Тексты, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
Текст =
"ВЫБРАТЬ
| ВложенныйЗапрос.Период КАК Период,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика,
| ВложенныйЗапрос.Склад КАК Склад,
| СУММА(ВложенныйЗапрос.Доступно) КАК Доступно
|ИЗ
| ВложенныйЗапросПереопределяемый КАК ВложенныйЗапрос
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Период
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| Характеристика,
| Склад,
| Период";
Запрос.Текст = СтрЗаменить(Текст, "ВложенныйЗапросПереопределяемый", СтрШаблон("(%1)", ТекстЗапроса));
СтрокаОстатка = Запрос.Выполнить().Выбрать();
Ключ = Новый Структура("Номенклатура,Характеристика,Склад");
Итог = 0;
НаборЗаписей = РегистрыСведений.ДоступностьТоваровДляВнешнихПользователей.СоздатьНаборЗаписей();
Пока СтрокаОстатка.Следующий() Цикл
Если СтрокаОстатка.Номенклатура <> Ключ.Номенклатура
Или СтрокаОстатка.Характеристика <> Ключ.Характеристика
Или СтрокаОстатка.Склад <> Ключ.Склад Тогда
Если Ключ.Номенклатура <> Неопределено Тогда
НаборЗаписей.Записать();
НаборЗаписей.Очистить();
КонецЕсли;
ЗаполнитьЗначенияСвойств(Ключ, СтрокаОстатка);
Итог = 0;
НаборЗаписей.Отбор.Номенклатура.Установить(Ключ.Номенклатура, Истина);
НаборЗаписей.Отбор.Характеристика.Установить(Ключ.Характеристика, Истина);
НаборЗаписей.Отбор.Склад.Установить(Ключ.Склад, Истина);
КонецЕсли;
Итог = СтрокаОстатка.Доступно + Итог;
Если Итог > 0 Тогда
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, СтрокаОстатка);
Запись.Доступно = Итог;
КонецЕсли;
КонецЦикла;
Если Ключ.Номенклатура <> Неопределено Тогда
НаборЗаписей.Записать();
КонецЕсли;
КонецПроцедуры
// Устанавливает блокировки при записи в любой из двух регистров РаспределениеЗапасов или ДоступныеОстаткиТоваров
// Параметры:
// Блокировка - БлокировкаДанных - блокировка
// Товар - Структура - Структура или таблица с полями:
// * Номенклатура - СправочникСсылка.Номенклатура
// * Характеристика - СправочникСсылка.ХарактеристикиНоменклатуры
// * Склад - СправочникСсылка.Склады,СправочникСсылка.СтруктураПредприятия
// * Назначение - СправочникСсылка.Назначения
// ТаблицаРаспределениеЗапасов - ТаблицаЗначений,РезультатЗапроса - с полями:
// * Номенклатура - СправочникСсылка.Номенклатура
// * Характеристика - СправочникСсылка.ХарактеристикиНоменклатуры
// * Склад - СправочникСсылка.Склады,СправочникСсылка.СтруктураПредприятия
// * Назначение - СправочникСсылка.Назначения
// ТаблицаДоступныеОстаткиТоваров - ТаблицаЗначений,РезультатЗапроса - с полями:
// * Номенклатура - СправочникСсылка.Номенклатура
// * Характеристика - СправочникСсылка.ХарактеристикиНоменклатуры
// * Склад - СправочникСсылка.Склады
Процедура ДобавитьБлокировки(Блокировка, Товар, ТаблицаРаспределениеЗапасов, ТаблицаДоступныеОстаткиТоваров) Экспорт
Если Товар = Неопределено Тогда
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.РаспределениеЗапасов");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Характеристика", "Характеристика");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Назначение", "Назначение");
ЭлементБлокировки.ИсточникДанных = ТаблицаРаспределениеЗапасов;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДоступныеОстаткиТоваров");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Характеристика", "Характеристика");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
ЭлементБлокировки.ИсточникДанных = ТаблицаДоступныеОстаткиТоваров;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Иначе
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.РаспределениеЗапасов");
ЭлементБлокировки.УстановитьЗначение("Номенклатура", Товар.Номенклатура);
ЭлементБлокировки.УстановитьЗначение("Характеристика", Товар.Характеристика);
ЭлементБлокировки.УстановитьЗначение("Склад", Товар.Склад);
ЭлементБлокировки.УстановитьЗначение("Назначение", Товар.Назначение);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Если ТипЗнч(Товар.Склад) = Тип("СправочникСсылка.Склады") И ЗначениеЗаполнено(Товар.Склад) Тогда
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДоступныеОстаткиТоваров");
ЭлементБлокировки.УстановитьЗначение("Номенклатура", Товар.Номенклатура);
ЭлементБлокировки.УстановитьЗначение("Характеристика", Товар.Характеристика);
ЭлементБлокировки.УстановитьЗначение("Склад", Товар.Склад);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Параметры:
// Товары - ТаблицаЗначений - таблица с полями:
// * Номенклатура - см. РегистрНакопления.ЗапасыИПотребности.Номенклатура
// * Характеристика - см. РегистрНакопления.ЗапасыИПотребности.Характеристика
// * Склад - см. РегистрНакопления.ЗапасыИПотребности.Склад
// * Назначение - см. РегистрНакопления.ЗапасыИПотребности.Назначение
// ИменаРегистров - Строка - имена регистров через запятую. Доступно всего два имени "ДоступныеОстаткиТоваров" и "РаспределениеЗапасов".
// Возвращаемое значение:
// Структура:
// * РаспределениеЗапасов - см. РегистрыСведений.РаспределениеЗапасов
// * ДоступныеОстаткиТоваров - см. РегистрыСведений.ДоступныеОстаткиТоваров
Функция ОбновлениеИБПоТовару(Товары, ИменаРегистров) Экспорт
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("Товары", Товары);
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
|ПОМЕСТИТЬ ТоварыДляРаспределенияЗапасов
|ИЗ
| &Товары КАК Таблица
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение
|;
|
|//////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 0
| Задания.Номенклатура КАК Номенклатура,
| Задания.Характеристика КАК Характеристика,
| Задания.Склад КАК Склад,
| Задания.Назначение КАК Назначение,
| Задания.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| Задания.КСнятиюРезерва КАК Отгрузка
|ПОМЕСТИТЬ ИзменениеОстаткаПоТоварамДляКонтроляОстатков
|ИЗ
| РегистрСведений.ЗаданияКРаспределениюЗапасов КАК Задания";
Запрос.Выполнить();
Результат = РаспределениеЗапасовПоТоварам(Запрос, "ТоварыДляРаспределенияЗапасов", Истина, ИменаРегистров);
Возврат Результат;
КонецФункции
// Параметры:
// Запрос - Запрос - запрос, хранящий параметры используемые в списке запросов
// ТекстыЗапроса - СписокЗначений Из Строка - список текстов запросов и их имен.
// Документ - ДокументОбъект - записываемый документ.
Процедура ДобавитьТекстЗапросаКонтроль(Запрос, ТекстыЗапроса, Документ) Экспорт
ЕстьКонтрольКачества = ПолучитьФункциональнуюОпцию("ИспользоватьКонтрольКачестваТоваров");
ЕстьСводныйКонтрольПартий = ЕстьКонтрольКачества И ТипЗнч(Документ) = Тип("ДокументОбъект.КорректировкаНазначенияТоваров");
#Область ВременнаяТаблица_ИзмененияДляКонтроляОбеспечения
// Вычисление изменений по пустой партии.
// 1) Обычный документ расхода:
// ВНаличииРасход (всего) = 5
// ЗаблокированоВНаличииРасход = 0
// ВНаличии (всего) = -5
// ЗаблокированоВНаличии = 0
// 2) Документ расхода по партии:
// ВНаличииРасход (всего) = 5
// ЗаблокированоВНаличииРасход = 5
// ВНаличии (всего) = -5
// ЗаблокированоВНаличии = -5
// 3) Обычный документ прихода:
// ВНаличииРасход (всего) = 0
// ЗаблокированоВНаличииРасход = 0
// ВНаличии (всего) = 5
// ЗаблокированоВНаличии = 0
// 4) Документ прихода по партии:
// ВНаличииРасход (всего) = 0
// ЗаблокированоВНаличииРасход = 0
// ВНаличии (всего) = 5
// ЗаблокированоВНаличии = 5
// Уместна формула: ВНаличииРасход (по пустой партии) = ВНаличииРасход (всего) - ЗаблокированоВНаличииРасход
// Уместна формула: ВНаличии (по пустой партии) = ВНаличии (всего) - ЗаблокированоВНаличии
// Согласно этим формулам, в примерах (2) и (4) изменений по аналитикам с пустой партией нет совсем.
// В примере (1) есть расход по аналитике с пустой партией и есть уменьшение остатка при проведении документа.
// В примере (4) нет расхода по аналитике с пустой партией и есть увеличение остатка при проведении документа.
// Примеры 5-8, аналогично, отмена проведения (либо уменьшение документа).
// Значения изменений ресурсов не меняются. Знаки изменений ресурсов меняются на противоположные. Формулы также уместны.
// 9) Документ корректировки с партии на партию:
// ВНаличииРасход (всего) = 0
// ЗаблокированоВНаличииРасход = 5
// ВНаличии (всего) = 0
// ЗаблокированоВНаличии = 0
// 10) Документ корректировки с партии на пустую партию (разблокировка партии, например Акт контроля качества с действием Разблокировать):
// ВНаличииРасход (всего) = 0
// ЗаблокированоВНаличииРасход = 5
// ВНаличии (всего) = 0
// ЗаблокированоВНаличии = -5
// 11) Документ корректировки с пустой партии на не пустую партию (блокировка из складского запаса, например заявка на контроль):
// ВНаличииРасход (всего) = 0
// ЗаблокированоВНаличииРасход = 5
// ВНаличии (всего) = 0
// ЗаблокированоВНаличии = -5
// Неуместна формула: ВНаличииРасход (по пустой партии) = ВНаличииРасход (всего) - ЗаблокированоВНаличииРасход
// Неуместна формула: ВНаличии (по пустой партии) = ВНаличии (всего) - ЗаблокированоВНаличии
// Примеры 12-14, аналогично, отмена проведения документа корректировки партии (либо уменьшение документа).
// Значения изменений ресурсов не меняются. Знаки изменений ресурсов меняются на противоположные. Формулы также уместны.
// 15) Документ корректировки с партии на пустую (разблокировка партии) с одновременным расходом из пустой партии по методике не поддерживается.
// Воспринимается системой как расход по непустой партии и не подлежит контролю по пустой партии (воспринимается как пример (2).
// 16) Аналогично отмена проведения (либо уменьшение документа).
// 17) Смешанный документ корректировки с партии на пустую партию (2 шт.) и расхода партии (3 шт.):
// ВНаличииРасход (всего) = 3
// ЗаблокированоВНаличииРасход = 5
// ВНаличии (всего) = -3
// ЗаблокированоВНаличии = -5
// 18) Смешанный документ корректировки с партии на партию (2шт.) и расхода партии (3 шт.):
// ВНаличииРасход (всего) = 3
// ЗаблокированоВНаличииРасход = 5
// ВНаличии (всего) = -3
// ЗаблокированоВНаличии = -3
// 19) Смешанный документ корректировки с пустой партии на партию (10шт.) и расхода партии (3 шт.):
// ВНаличииРасход (всего) = 3
// ЗаблокированоВНаличииРасход = 3
// ВНаличии (всего) = -3
// ЗаблокированоВНаличии = 7
// Неуместна формула: ВНаличииРасход (по пустой партии) = ВНаличииРасход (всего) - ЗаблокированоВНаличииРасход
// Неуместна формула: ВНаличии (по пустой партии) = ВНаличии (всего) - ЗаблокированоВНаличии
// Выработка уместной формулы:
// Если есть ЗаблокированоВНаличииРасход > 0 - это может быть отгрузка товара партии, а может быть разблокировка товара партии или корректировка на другую партию.
// Нужно найти изменение ВНаличииРасход > 0.
// Если ЗаблокированоВНаличииРасход > ВНаличииРасход, то часть отгрузка партии, а остальное - разблокировка или корректировка на другую партию.
// Таким образом, для пустой партии ВНаличииРасход (>0) нужно уменьшить на Мин(ЗаблокированоВНаличииРасход (>0), ВНаличииРасход (>0))
// Аналогично для отмены расхода для пустой партии ВНаличииРасход (<0) нужно уменьшить на Макс(ЗаблокированоВНаличииРасход (<0), ВНаличииРасход (<0))
ТекстНабора =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| Таблица.ВНаличииМинусЗаблокировано КАК ВНаличии,
| Таблица.ПоступитМинусЗаблокировано КАК Поступит,
| Таблица.РезервироватьНаСкладе КАК РезервироватьНаСкладе,
| Таблица.РезервироватьПоМереПоступления КАК РезервироватьПоМереПоступления,
| Таблица.ВНаличииРасходМинусЗаблокировано КАК ВНаличииРасход,
| 0 КАК ВНаличииПоПартиямСводно,
| 0 КАК ВНаличииРасходПоПартиямСводно
|ИЗ
| ЗапасыИПотребностиИзменение КАК Таблица";
Если ЕстьКонтрольКачества Тогда
Тексты = Новый Массив();
Тексты.Добавить(ТекстНабора);
Текст =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК КонтролируемаяПартия,
| Таблица.ЗаблокированоВНаличии КАК ВНаличии,
| Таблица.ЗаблокированоПоступит КАК Поступит,
| Таблица.РезервироватьНаСкладеИзЗаблокированных КАК РезервироватьНаСкладе,
| Таблица.РезервироватьПоМереПоступленияИзЗаблокированных КАК РезервироватьПоМереПоступления,
| Таблица.ЗаблокированоВНаличииРасход КАК ВНаличииРасход,
| 0 КАК ВНаличииПоПартиямСводно,
| 0 КАК ВНаличииРасходПоПартиямСводно
|ИЗ
| ЗапасыИПотребностиИзменение КАК Таблица
|ГДЕ
| Таблица.Заказ <> НЕОПРЕДЕЛЕНО";
Тексты.Добавить(Текст);
Если ЕстьСводныйКонтрольПартий Тогда
Текст =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| 0 КАК ВНаличии,
| 0 КАК Поступит,
| 0 КАК РезервироватьНаСкладе,
| 0 КАК РезервироватьПоМереПоступления,
| 0 КАК ВНаличииРасход,
| Таблица.ЗаблокированоВНаличии КАК ВНаличииПоПартиямСводно,
| Таблица.ЗаблокированоВНаличииРасход КАК ВНаличииРасходПоПартиямСводно
|ИЗ
| ЗапасыИПотребностиИзменение КАК Таблица
|ГДЕ
| Таблица.Заказ <> НЕОПРЕДЕЛЕНО";
Тексты.Добавить(Текст);
КонецЕсли;
ТекстНабора = СтрСоединить(Тексты, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.КонтролируемаяПартия КАК КонтролируемаяПартия,
| СУММА(Таблица.ВНаличииРасход) КАК ВНаличииРасход,
| СУММА(Таблица.РезервироватьНаСкладе) КАК РезервироватьНаСкладе,
| СУММА(Таблица.РезервироватьПоМереПоступления) КАК РезервироватьПоМереПоступления,
| СУММА(Таблица.ВНаличии) КАК ВНаличии,
| СУММА(Таблица.Поступит) КАК Поступит,
| СУММА(Таблица.ВНаличииПоПартиямСводно) КАК ВНаличииПоПартиямСводно,
| СУММА(Таблица.ВНаличииРасходПоПартиямСводно) КАК ВНаличииРасходПоПартиямСводно
|ПОМЕСТИТЬ ЗапасыИПотребностиИзменениеСгруппированные
|ИЗ
| НаборПереопределяемый КАК Таблица
|СГРУППИРОВАТЬ ПО
| Таблица.Номенклатура,
| Таблица.Характеристика,
| Таблица.Склад,
| Таблица.Назначение,
| Таблица.КонтролируемаяПартия
|ИМЕЮЩИЕ
| СУММА(Таблица.ВНаличииРасход) <> 0
| ИЛИ СУММА(Таблица.РезервироватьНаСкладе) <> 0
| ИЛИ СУММА(Таблица.РезервироватьПоМереПоступления) <> 0
| ИЛИ СУММА(Таблица.ВНаличииРасходПоПартиямСводно) <> 0
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "НаборПереопределяемый", СтрШаблон("(%1)", ТекстНабора));
ТекстыЗапроса.Добавить(ТекстЗапроса, "ЗапасыИПотребностиИзменениеСгруппированные");
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.КонтролируемаяПартия КАК КонтролируемаяПартия,
| Таблица.ВНаличииРасход КАК ВНаличииРасход,
| Таблица.РезервироватьНаСкладе КАК РезервироватьНаСкладе,
| Таблица.РезервироватьПоМереПоступления КАК РезервироватьПоМереПоступления,
| Таблица.ВНаличии КАК ВНаличии,
| Таблица.Поступит КАК Поступит,
| Таблица.ВНаличииПоПартиямСводно КАК ВНаличииПоПартиямСводно,
| Таблица.ВНаличииРасходПоПартиямСводно КАК ВНаличииРасходПоПартиямСводно
|ПОМЕСТИТЬ ИзмененияДляКонтроляОбеспечения
|ИЗ
| ЗапасыИПотребностиИзменениеСгруппированные КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаХарактеристика
| ПО НастройкаХарактеристика.Склад = Таблица.Склад
| И НастройкаХарактеристика.Номенклатура = Таблица.Номенклатура
| И НастройкаХарактеристика.Характеристика = Таблица.Характеристика
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаНоменклатура
| ПО НастройкаНоменклатура.Склад = Таблица.Склад
| И НастройкаНоменклатура.Номенклатура = Таблица.Номенклатура
| И НастройкаНоменклатура.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаСклад
| ПО НастройкаСклад.Склад = Таблица.Склад
| И НастройкаСклад.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
| И НастройкаСклад.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|ГДЕ
| ЕСТЬNULL(НастройкаХарактеристика.КонтролироватьСвободныеОстатки,
| ЕСТЬNULL(НастройкаНоменклатура.КонтролироватьСвободныеОстатки,
| НастройкаСклад.КонтролироватьСвободныеОстатки))
| И ВЫРАЗИТЬ(Таблица.Номенклатура КАК Справочник.Номенклатура).ТипНоменклатуры
| <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, КонтролируемаяПартия";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ИзмененияДляКонтроляОбеспечения");
#КонецОбласти
#Область ВременнаяТаблица_РезервыПоЗаказамДляКонтроляОбеспечения
ТекстНабора =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| ВЫБОР
| КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных)
| ТОГДА Таблица.ЗаказНаОтгрузку
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)
| КОНЕЦ КАК КонтролируемаяПартия,
| Таблица.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| Таблица.Количество КАК ПолученныеРезервы
|ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Таблица
|ГДЕ
| (Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления)
| И Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| ИЛИ Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных)
| И Таблица.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)))
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ЗапасыИПотребностиПередЗаписью КАК Заказы
| ГДЕ
| Заказы.Номенклатура = Таблица.Номенклатура
| И Заказы.Характеристика = Таблица.Характеристика
| И Заказы.Склад = Таблица.Склад
| И Заказы.Назначение = Таблица.Назначение
| И Заказы.Заказ = Таблица.ЗаказНаОтгрузку)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| Таблица.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| - Таблица.КСнятиюРезерва КАК ПолученныеРезервы
|ИЗ
| РегистрСведений.ЗаданияКРаспределениюЗапасов КАК Таблица
|ГДЕ
| Таблица.КСнятиюРезерва > 0
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ЗапасыИПотребностиПередЗаписью КАК Заказы
| ГДЕ
| Заказы.Номенклатура = Таблица.Номенклатура
| И Заказы.Характеристика = Таблица.Характеристика
| И Заказы.Склад = Таблица.Склад
| И Заказы.Назначение = Таблица.Назначение
| И Заказы.Заказ = Таблица.ЗаказНаОтгрузку)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.ЗаказНаОтгрузку КАК КонтролируемаяПартия,
| Таблица.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| - Таблица.КСнятиюРезерваИзЗаблокированных КАК ПолученныеРезервы
|ИЗ
| РегистрСведений.ЗаданияКРаспределениюЗапасов КАК Таблица
|ГДЕ
| Таблица.КСнятиюРезерваИзЗаблокированных > 0
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ЗапасыИПотребностиПередЗаписью КАК Заказы
| ГДЕ
| Заказы.Номенклатура = Таблица.Номенклатура
| И Заказы.Характеристика = Таблица.Характеристика
| И Заказы.Склад = Таблица.Склад
| И Заказы.Назначение = Таблица.Назначение
| И Заказы.Заказ = Таблица.ЗаказНаОтгрузку)";
// При отгрузке по заказам измерение Заказ пусто, но можно использовать резервы, которые были у отгружаемых заказов.
// Эти заказы есть в движениях до записи.
ТекстЗапроса =
"ВЫБРАТЬ
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Склад КАК Склад,
| Набор.Назначение КАК Назначение,
| Набор.КонтролируемаяПартия КАК КонтролируемаяПартия,
| СУММА(Набор.ПолученныеРезервы) КАК ПолученныеРезервы
|ПОМЕСТИТЬ РезервыПоЗаказамДляКонтроляОбеспечения
|ИЗ(
| ВЫБРАТЬ
| НаборПоЗаказам.Номенклатура КАК Номенклатура,
| НаборПоЗаказам.Характеристика КАК Характеристика,
| НаборПоЗаказам.Склад КАК Склад,
| НаборПоЗаказам.Назначение КАК Назначение,
| НаборПоЗаказам.КонтролируемаяПартия КАК КонтролируемаяПартия,
| НаборПоЗаказам.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| СУММА(НаборПоЗаказам.ПолученныеРезервы) КАК ПолученныеРезервы
| ИЗ
| &Набор КАК НаборПоЗаказам
| СГРУППИРОВАТЬ ПО
| НаборПоЗаказам.Номенклатура,
| НаборПоЗаказам.Характеристика,
| НаборПоЗаказам.Склад,
| НаборПоЗаказам.Назначение,
| НаборПоЗаказам.ЗаказНаОтгрузку,
| НаборПоЗаказам.КонтролируемаяПартия
|ИМЕЮЩИЕ
| СУММА(НаборПоЗаказам.ПолученныеРезервы) > 0) КАК Набор
|СГРУППИРОВАТЬ ПО
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Склад,
| Набор.Назначение,
| Набор.КонтролируемаяПартия
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, КонтролируемаяПартия";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Набор", СтрШаблон("(%1)", ТекстНабора));
ТекстыЗапроса.Добавить(ТекстЗапроса, "РезервыПоЗаказамДляКонтроляОбеспечения");
#КонецОбласти
#Область ВременнаяТаблица_ИзмененияИРезервыДляКонтроляОбеспечения
ТекстЗапроса =
"ВЫБРАТЬ
| Изменения.Номенклатура КАК Номенклатура,
| Изменения.Характеристика КАК Характеристика,
| Изменения.Склад КАК Склад,
| Изменения.Назначение КАК Назначение,
| Изменения.КонтролируемаяПартия КАК КонтролируемаяПартия,
// Увеличение Отгрузить.
| Изменения.ВНаличииРасход КАК Отгрузить,
// Увеличение Отгрузить или РезервироватьНаСкладе, непокрытое увеличением наличия и собственными резервами, распределенными на заказ.
| ВЫБОР
| КОГДА Изменения.РезервироватьНаСкладе
| + Изменения.ВНаличииРасход
| - ЕСТЬNULL(Резервы.ПолученныеРезервы, 0) < 0
| ИЛИ Изменения.РезервироватьНаСкладе
| - Изменения.ВНаличии
| - ЕСТЬNULL(Резервы.ПолученныеРезервы, 0) < 0
| ТОГДА 0
| КОГДА Изменения.РезервироватьНаСкладе
| + Изменения.ВНаличииРасход
| - ЕСТЬNULL(Резервы.ПолученныеРезервы, 0)
| < Изменения.РезервироватьНаСкладе
| - Изменения.ВНаличии
| - ЕСТЬNULL(Резервы.ПолученныеРезервы, 0)
| ТОГДА
| Изменения.РезервироватьНаСкладе
| + Изменения.ВНаличииРасход
| - ЕСТЬNULL(Резервы.ПолученныеРезервы, 0)
| ИНАЧЕ
| Изменения.РезервироватьНаСкладе
| - Изменения.ВНаличии
| - ЕСТЬNULL(Резервы.ПолученныеРезервы, 0)
| КОНЕЦ КАК ЗапросСвободногоОстаткаНаСкладе,
// Увеличение Отгрузить, РезервироватьНаСкладе или РезервироватьПоМереПоступления, непокрытое увеличением наличия или ожидаемого поступления.
| ВЫБОР
| КОГДА Изменения.РезервироватьНаСкладе
| + Изменения.РезервироватьПоМереПоступления
| + Изменения.ВНаличииРасход
| - Изменения.Поступит < 0
| ИЛИ Изменения.РезервироватьНаСкладе
| + Изменения.РезервироватьПоМереПоступления
| - Изменения.ВНаличии
| - Изменения.Поступит < 0
| ТОГДА 0
| КОГДА Изменения.РезервироватьНаСкладе
| + Изменения.РезервироватьПоМереПоступления
| + Изменения.ВНаличииРасход
| - Изменения.Поступит
| < Изменения.РезервироватьНаСкладе
| + Изменения.РезервироватьПоМереПоступления
| - Изменения.ВНаличии
| - Изменения.Поступит
| ТОГДА
| Изменения.РезервироватьНаСкладе
| + Изменения.РезервироватьПоМереПоступления
| + Изменения.ВНаличииРасход
| - Изменения.Поступит
| ИНАЧЕ
| Изменения.РезервироватьНаСкладе
| + Изменения.РезервироватьПоМереПоступления
| - Изменения.ВНаличии
| - Изменения.Поступит
| КОНЕЦ КАК ЗапросСвободногоОстаткаВсего,
// Увеличение Отгрузить по партиям сводно.
| ВЫБОР
| КОГДА Изменения.ВНаличииРасходПоПартиямСводно < 0 ИЛИ - Изменения.ВНаличииПоПартиямСводно < 0
| ТОГДА 0
| КОГДА Изменения.ВНаличииРасходПоПартиямСводно < - Изменения.ВНаличииПоПартиямСводно
| ТОГДА Изменения.ВНаличииРасходПоПартиямСводно
| ИНАЧЕ - Изменения.ВНаличииПоПартиямСводно
| КОНЕЦ КАК ОтгрузитьПоПартиямСводно
|ПОМЕСТИТЬ ИзмененияИРезервыДляКонтроляОбеспечения
|ИЗ
| ИзмененияДляКонтроляОбеспечения КАК Изменения
| ЛЕВОЕ СОЕДИНЕНИЕ РезервыПоЗаказамДляКонтроляОбеспечения КАК Резервы
| ПО Резервы.Номенклатура = Изменения.Номенклатура
| И Резервы.Характеристика = Изменения.Характеристика
| И Резервы.Склад = Изменения.Склад
| И Резервы.Назначение = Изменения.Назначение
| И Резервы.КонтролируемаяПартия = Изменения.КонтролируемаяПартия
|ГДЕ
| Изменения.ВНаличииРасход > 0
| ИЛИ НЕ &КонтролироватьТолькоФактическийОстаток
| И Изменения.РезервироватьНаСкладе
| + Изменения.ВНаличииРасход
| - ЕСТЬNULL(Резервы.ПолученныеРезервы, 0) > 0
| И Изменения.РезервироватьНаСкладе
| - Изменения.ВНаличии
| - ЕСТЬNULL(Резервы.ПолученныеРезервы, 0) > 0
| ИЛИ НЕ &КонтролироватьТолькоФактическийОстаток
| И &КонтролироватьЗапасыТоваровПодлежащихРезервированиюПоМереПоступления
| И Изменения.РезервироватьНаСкладе
| + Изменения.РезервироватьПоМереПоступления
| + Изменения.ВНаличииРасход
| - Изменения.Поступит > 0
| И Изменения.РезервироватьНаСкладе
| + Изменения.РезервироватьПоМереПоступления
| - Изменения.ВНаличии
| - Изменения.Поступит > 0
| ИЛИ НЕ &КонтролироватьТолькоФактическийОстаток
| И Изменения.ВНаличииРасходПоПартиямСводно > 0
| И - Изменения.ВНаличииПоПартиямСводно > 0
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, КонтролируемаяПартия";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ИзмененияИРезервыДляКонтроляОбеспечения");
#КонецОбласти
#Область ВременнаяТаблица_АналитикиЗапасыИПотребностиДляКонтроляОбеспечения
ИмяТаблицыАналитик = "ИзмененияИРезервыДляКонтроляОбеспечения";
Если ЕстьКонтрольКачества Тогда
ИмяТаблицыАналитик = "АналитикиЗапасыИПотребностиДляКонтроляОбеспечения";
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
|ПОМЕСТИТЬ АналитикиЗапасыИПотребностиДляКонтроляОбеспечения
|ИЗ
| ИзмененияИРезервыДляКонтроляОбеспечения КАК Таблица
|ГДЕ
| Таблица.КонтролируемаяПартия = ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
ТекстыЗапроса.Добавить(ТекстЗапроса, "АналитикиЗапасыИПотребностиДляКонтроляОбеспечения");
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.КонтролируемаяПартия КАК КонтролируемаяПартия
|ПОМЕСТИТЬ АналитикиЗапасыИПотребностиДляКонтроляОбеспеченияКонтролируемыхПартий
|ИЗ
| ИзмененияИРезервыДляКонтроляОбеспечения КАК Таблица
|ГДЕ
| Таблица.КонтролируемаяПартия <> ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, КонтролируемаяПартия";
ТекстыЗапроса.Добавить(ТекстЗапроса, "АналитикиЗапасыИПотребностиДляКонтроляОбеспеченияКонтролируемыхПартий");
КонецЕсли;
#КонецОбласти
#Область ВременнаяТаблица_ОшибкиКонтроляДляКонтроляОбеспечения
ТекстНабора =
"ВЫБРАТЬ
| ИзмененияДляКонтроля.Номенклатура КАК Номенклатура,
| ИзмененияДляКонтроля.Характеристика КАК Характеристика,
| ИзмененияДляКонтроля.Склад КАК Склад,
| ИзмененияДляКонтроля.Назначение КАК Назначение,
| ИзмененияДляКонтроля.КонтролируемаяПартия КАК КонтролируемаяПартия,
| ЛОЖЬ ЕстьРезервироватьПоМереПоступления,
|
| ИзмененияДляКонтроля.Отгрузить КАК Отгрузить,
| ИзмененияДляКонтроля.ЗапросСвободногоОстаткаНаСкладе КАК ЗапросСвободногоОстаткаНаСкладе,
| ИзмененияДляКонтроля.ЗапросСвободногоОстаткаВсего КАК ЗапросСвободногоОстаткаВсего,
| ИзмененияДляКонтроля.ОтгрузитьПоПартиямСводно КАК ОтгрузитьПоПартиямСводно,
|
| 0 КАК КонтрольФактическогоОстаткаНаСкладе,
| 0 КАК КонтрольОтгрузкиИзСобственногоРезерва,
| 0 КАК КонтрольСвободногоОстаткаНаСкладе,
| 0 КАК КонтрольСвободногоОстаткаВсего,
| 0 КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
|ИЗ
| ИзмененияИРезервыДляКонтроляОбеспечения КАК ИзмененияДляКонтроля
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| Остатки.РезервироватьПоМереПоступленияОстаток > 0
| ИЛИ Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток > 0 КАК ЕстьРезервироватьПоМереПоступления,
|
| 0 КАК Отгрузить,
| 0 КАК ЗапросСвободногоОстаткаНаСкладе,
| 0 КАК ЗапросСвободногоОстаткаВсего,
| 0 КАК ОтгрузитьПоПартиямСводно,
|
| Остатки.ВНаличииОстаток
| - Остатки.ЗаблокированоВНаличииОстаток КАК КонтрольФактическогоОстаткаНаСкладе,
|
| Остатки.ВНаличииОстаток
| - Остатки.ЗаблокированоВНаличииОстаток
| - Остатки.РезервироватьНаСкладеОстаток КАК КонтрольОтгрузкиИзСобственногоРезерва,
|
| Остатки.ВНаличииОстаток
| - Остатки.ЗаблокированоВНаличииОстаток
| - Остатки.РезервироватьНаСкладеОстаток
| - Остатки.РезервироватьПоМереПоступленияОстаток КАК КонтрольСвободногоОстаткаНаСкладе,
|
| Остатки.ВНаличииОстаток
| + Остатки.ПоступитОстаток
| - Остатки.РезервироватьНаСкладеОстаток
| - Остатки.РезервироватьПоМереПоступленияОстаток
| - Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
| - Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольСвободногоОстаткаВсего,
|
| Остатки.ВНаличииОстаток
| - Остатки.ЗаблокированоВНаличииОстаток
| - Остатки.РезервироватьНаСкладеОстаток
| - Остатки.РезервироватьПоМереПоступленияОстаток КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
| ИЗ
| &Аналитики КАК Таблица)) КАК Остатки
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| ЛОЖЬ ЕстьРезервироватьПоМереПоступления,
|
| 0 КАК Отгрузить,
| 0 КАК ЗапросСвободногоОстаткаНаСкладе,
| 0 КАК ЗапросСвободногоОстаткаВсего,
| 0 КАК ОтгрузитьПоПартиямСводно,
|
// для ПараметрыСеанса.ПроводитьБезКонтроляРезервовТоваровПоЗаказам нужно отгружать из резервов других заказов, но не своего.
| - Остатки.РезервироватьНаСкладеОстаток КАК КонтрольФактическогоОстаткаНаСкладе,
| 0 КАК КонтрольОтгрузкиИзСобственногоРезерва,
| Остатки.РезервироватьПоМереПоступленияОстаток КАК КонтрольСвободногоОстаткаНаСкладе,
| 0 КАК КонтрольСвободногоОстаткаВсего,
| 0 КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ
| ИЗ
| ЗапасыИПотребностиЗатронутыеЗаказы КАК Таблица)
| И (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
| ИЗ
| &Аналитики КАК Таблица)) КАК Остатки";
ТекстНабора = СтрЗаменить(ТекстНабора, "&Аналитики", ИмяТаблицыАналитик);
Если ЕстьКонтрольКачества Тогда
Тексты = Новый Массив();
Тексты.Добавить(ТекстНабора);
Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| Остатки.Заказ КАК КонтролируемаяПартия,
| Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток > 0 КАК ЕстьРезервироватьПоМереПоступления,
|
| 0 КАК Отгрузить,
| 0 КАК ЗапросСвободногоОстаткаНаСкладе,
| 0 КАК ЗапросСвободногоОстаткаВсего,
| 0 КАК ОтгрузитьПоПартиямСводно,
|
| Остатки.ЗаблокированоВНаличииОстаток КАК КонтрольФактическогоОстаткаНаСкладе,
|
| Остатки.ЗаблокированоВНаличииОстаток
| - Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток КАК КонтрольОтгрузкиИзСобственногоРезерва,
|
| Остатки.ЗаблокированоВНаличииОстаток
| - Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
| - Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольСвободногоОстаткаНаСкладе,
|
| Остатки.ЗаблокированоВНаличииОстаток
| + Остатки.ЗаблокированоПоступитОстаток
| - Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
| - Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольСвободногоОстаткаВсего,
|
| 0 КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.КонтролируемаяПартия КАК Заказ
| ИЗ
| АналитикиЗапасыИПотребностиДляКонтроляОбеспеченияКонтролируемыхПартий КАК Таблица)) КАК Остатки
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| Остатки.Заказ КАК КонтролируемаяПартия,
| ЛОЖЬ ЕстьРезервироватьПоМереПоступления,
|
| 0 КАК Отгрузить,
| 0 КАК ЗапросСвободногоОстаткаНаСкладе,
| 0 КАК ЗапросСвободногоОстаткаВсего,
| 0 КАК ОтгрузитьПоПартиямСводно,
|
// для ПараметрыСеанса.ПроводитьБезКонтроляРезервовТоваровПоЗаказам нужно отгружать из резервов других заказов, но не своего.
| - Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток КАК КонтрольФактическогоОстаткаНаСкладе,
| 0 КАК КонтрольОтгрузкиИзСобственногоРезерва,
| Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольСвободногоОстаткаНаСкладе,
| 0 КАК КонтрольСвободногоОстаткаВсего,
| 0 КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ
| ИЗ
| ЗапасыИПотребностиЗатронутыеЗаказы КАК Таблица)
| И (Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.КонтролируемаяПартия КАК Заказ
| ИЗ
| АналитикиЗапасыИПотребностиДляКонтроляОбеспеченияКонтролируемыхПартий КАК Таблица)) КАК Остатки";
Тексты.Добавить(Текст);
Если ЕстьСводныйКонтрольПартий Тогда
// Излишки партий, подлежащие разблокировке, доступные для резервирования по пустой партии.
Текст =
"ВЫБРАТЬ
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика,
| ВложенныйЗапрос.Склад КАК Склад,
| ВложенныйЗапрос.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| ЛОЖЬ ЕстьРезервироватьПоМереПоступления,
|
| 0 КАК Отгрузить,
| 0 КАК ЗапросСвободногоОстаткаНаСкладе,
| 0 КАК ЗапросСвободногоОстаткаВсего,
| 0 КАК ОтгрузитьПоПартиямСводно,
|
| 0 КАК КонтрольФактическогоОстаткаНаСкладе,
| 0 КАК КонтрольОтгрузкиИзСобственногоРезерва,
| 0 КАК КонтрольСвободногоОстаткаНаСкладе,
| 0 КАК КонтрольСвободногоОстаткаВсего,
| ВЫБОР
| КОГДА СУММА(ВложенныйЗапрос.КонтрольРезервированияНаСкладе) < 0 ИЛИ СУММА(ВложенныйЗапрос.КРазблокировкеОстаток) < 0
| ТОГДА 0
| КОГДА СУММА(ВложенныйЗапрос.КРазблокировкеОстаток) < СУММА(ВложенныйЗапрос.КонтрольРезервированияНаСкладе)
| ТОГДА СУММА(ВложенныйЗапрос.КРазблокировкеОстаток)
| ИНАЧЕ СУММА(ВложенныйЗапрос.КонтрольРезервированияНаСкладе)
| КОНЕЦ КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
|ИЗ(
| ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| Остатки.Заказ КАК КонтролируемаяПартия,
| Остатки.КРазблокировкеОстаток КАК КРазблокировкеОстаток,
| Остатки.ЗаблокированоВНаличииОстаток
| - Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
| - Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольРезервированияНаСкладе
| ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
| ИЗ
| АналитикиЗапасыИПотребностиДляКонтроляОбеспечения КАК Таблица)) КАК Остатки
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| Остатки.Заказ КАК КонтролируемаяПартия,
| 0 КАК КРазблокировкеОстаток,
| Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольРезервированияНаСкладе
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ
| ИЗ
| ЗапасыИПотребностиЗатронутыеЗаказы КАК Таблица)
| И (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение
| ИЗ
| АналитикиЗапасыИПотребностиДляКонтроляОбеспечения КАК Таблица)) КАК Остатки) КАК ВложенныйЗапрос
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.КонтролируемаяПартия,
| ВложенныйЗапрос.Назначение
|ИМЕЮЩИЕ
| СУММА(ВложенныйЗапрос.КонтрольРезервированияНаСкладе) > 0";
Тексты.Добавить(Текст);
КонецЕсли;
ТекстНабора = СтрСоединить(Тексты, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Склад КАК Склад,
| Набор.Назначение КАК Назначение,
| Набор.КонтролируемаяПартия КАК КонтролируемаяПартия,
| &КонтролироватьЗапасыТоваровПодлежащихРезервированиюПоМереПоступления
| И МАКСИМУМ(Набор.ЕстьРезервироватьПоМереПоступления) КАК НуженКонтрольСвободногоОстаткаВсего,
| СУММА(Набор.Отгрузить) КАК Отгрузить,
| СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе) КАК ЗапросСвободногоОстаткаНаСкладе,
| СУММА(Набор.ЗапросСвободногоОстаткаВсего) КАК ЗапросСвободногоОстаткаВсего,
| СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) КАК КонтрольФактическогоОстаткаНаСкладе,
| СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе) КАК КонтрольСвободногоОстаткаНаСкладе,
| СУММА(Набор.КонтрольСвободногоОстаткаВсего) КАК КонтрольСвободногоОстаткаВсего,
| ВЫБОР
| КОГДА СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) > 0
| ТОГДА 0
| КОГДА -СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) > СУММА(Набор.Отгрузить)
| ТОГДА СУММА(Набор.Отгрузить)
| ИНАЧЕ -СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе)
| КОНЕЦ КАК НедостаточноФактическогоОстаткаНаСкладеДляОтгрузить,
| ВЫБОР
| КОГДА СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) > 0
| ТОГДА 0
| КОГДА -СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) > СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе)
| ТОГДА СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе)
| ИНАЧЕ -СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе)
| КОНЕЦ КАК НедостаточноФактическогоОстаткаНаСкладе,
| ВЫБОР
| КОГДА СУММА(Набор.КонтрольОтгрузкиИзСобственногоРезерва) > 0
| ТОГДА 0
| КОГДА -СУММА(Набор.КонтрольОтгрузкиИзСобственногоРезерва) > СУММА(Набор.Отгрузить)
| ТОГДА СУММА(Набор.Отгрузить)
| ИНАЧЕ -СУММА(Набор.КонтрольОтгрузкиИзСобственногоРезерва)
| КОНЕЦ КАК НедостаточноСвободногоОстаткаНаСкладеДляОтгрузить,
| ВЫБОР
| КОГДА СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе) > 0
| ТОГДА 0
| КОГДА -СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе) > СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе)
| ТОГДА СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе)
| ИНАЧЕ -СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе)
| КОНЕЦ КАК НедостаточноСвободногоОстаткаНаСкладе,
| ВЫБОР
| КОГДА СУММА(Набор.КонтрольСвободногоОстаткаВсего) > 0
| ТОГДА 0
| КОГДА -СУММА(Набор.КонтрольСвободногоОстаткаВсего) > СУММА(Набор.ЗапросСвободногоОстаткаВсего)
| ТОГДА СУММА(Набор.ЗапросСвободногоОстаткаВсего)
| ИНАЧЕ -СУММА(Набор.КонтрольСвободногоОстаткаВсего)
| КОНЕЦ КАК НедостаточноСвободногоОстаткаВсего,
| ВЫБОР
| КОГДА СУММА(Набор.КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления) > 0
| ТОГДА 0
| КОГДА -СУММА(Набор.КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления) > СУММА(Набор.ОтгрузитьПоПартиямСводно)
| ТОГДА СУММА(Набор.ОтгрузитьПоПартиямСводно)
| ИНАЧЕ -СУММА(Набор.КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления)
| КОНЕЦ КАК НедостаточноСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
|ПОМЕСТИТЬ ОшибкиКонтроляДляКонтроляОбеспечения
|ИЗ
| НаборПереопределяемый КАК Набор
|СГРУППИРОВАТЬ ПО
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Склад,
| Набор.Назначение,
| Набор.КонтролируемаяПартия
|ИМЕЮЩИЕ
| СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) < 0
| И СУММА(Набор.Отгрузить) > 0
| И &КонтролироватьТолькоФактическийОстаток
| ИЛИ СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) < 0
| И СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе) > 0
| И &КонтролироватьТолькоФактическийОстаток
| ИЛИ СУММА(Набор.КонтрольОтгрузкиИзСобственногоРезерва) < 0
| И СУММА(Набор.Отгрузить) > 0
| И НЕ &КонтролироватьТолькоФактическийОстаток
| ИЛИ СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе) < 0
| И СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе) > 0
| И НЕ &КонтролироватьТолькоФактическийОстаток
| ИЛИ СУММА(Набор.КонтрольСвободногоОстаткаВсего) < 0
| И СУММА(Набор.ЗапросСвободногоОстаткаВсего) > 0
| И МАКСИМУМ(Набор.ЕстьРезервироватьПоМереПоступления)
| И НЕ &КонтролироватьТолькоФактическийОстаток
| И &КонтролироватьЗапасыТоваровПодлежащихРезервированиюПоМереПоступления
| ИЛИ СУММА(Набор.КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления) < 0
| И СУММА(Набор.ОтгрузитьПоПартиямСводно) > 0
| И НЕ &КонтролироватьТолькоФактическийОстаток";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "НаборПереопределяемый", СтрШаблон("(%1)", ТекстНабора));
ТекстыЗапроса.Добавить(ТекстЗапроса, "ОшибкиКонтроляДляКонтроляОбеспечения");
#КонецОбласти
#Область ОбеспечениеРезультатыКонтроля
ТекстЗапроса =
"ВЫБРАТЬ
| ОшибкиКонтроля.Номенклатура КАК Номенклатура,
| ОшибкиКонтроля.Характеристика КАК Характеристика,
| ОшибкиКонтроля.Склад КАК Склад,
| ОшибкиКонтроля.Назначение КАК Назначение,
| ОшибкиКонтроля.КонтролируемаяПартия КАК КонтролируемаяПартия,
| ОшибкиКонтроля.НуженКонтрольСвободногоОстаткаВсего КАК НуженКонтрольСвободногоОстаткаВсего,
| &КонтролироватьТолькоФактическийОстаток КАК КонтролироватьТолькоФактическийОстаток,
| ВЫРАЗИТЬ(ОшибкиКонтроля.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|
// Конкурирующие контроли, сообщение выдается на большую величину.
| ВЫБОР
| КОГДА ОшибкиКонтроля.НедостаточноФактическогоОстаткаНаСкладеДляОтгрузить > ОшибкиКонтроля.НедостаточноФактическогоОстаткаНаСкладе
| ТОГДА ОшибкиКонтроля.НедостаточноФактическогоОстаткаНаСкладеДляОтгрузить
| ИНАЧЕ ОшибкиКонтроля.НедостаточноФактическогоОстаткаНаСкладе
| КОНЕЦ КАК КоличествоФактическийОстаток,
|
// Конкурирующие контроли, сообщение выдается на большую величину.
| ВЫБОР
| КОГДА ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляОтгрузить > ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладе
| И ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляОтгрузить > ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
| ТОГДА ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляОтгрузить
| КОГДА ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладе > ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
| ТОГДА ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладе
| ИНАЧЕ ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
| КОНЕЦ КАК КоличествоСвободныйОстатокНаСкладе,
|
| ОшибкиКонтроля.НедостаточноСвободногоОстаткаВсего КАК КоличествоСвободныйОстатокВсего
|ИЗ
| ОшибкиКонтроляДляКонтроляОбеспечения КАК ОшибкиКонтроля";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ОбеспечениеРезультатыКонтроля");
#КонецОбласти
ТипДокумента = ТипЗнч(Документ.Ссылка);
ЭтоДокументИсключение =
ТипДокумента = Тип("ДокументСсылка.ВозвратТоваровОтКлиента")
Или ТипДокумента = Тип("ДокументСсылка.ЗаявкаНаКонтрольКачестваТоваров")
Или ТипДокумента = Тип("ДокументСсылка.КорректировкаРеализации")
Или ТипДокумента = Тип("ДокументСсылка.ПоступлениеТоваровОтКлиента")
Или ТипДокумента = Тип("ДокументСсылка.ПоступлениеТоваровОтХранителя")
И Не Документ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОтПереработчика2_5;
Если Не Запрос.Параметры.Свойство("МерныеТипыЕдиницИзмерений") Тогда
Запрос.УстановитьПараметр("МерныеТипыЕдиницИзмерений",
Справочники.УпаковкиЕдиницыИзмерения.МерныеТипыЕдиницИзмерений());
КонецЕсли;
#Область ОбеспечениеРезультатыКонтроляПревышенияОбособленногоОбеспечения
КонтролироватьПревышениеОбособленногоОбеспечения = Не ЭтоДокументИсключение;
Если КонтролироватьПревышениеОбособленногоОбеспечения Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| ИзмененияДвижений.Номенклатура КАК Номенклатура,
| ИзмененияДвижений.Характеристика КАК Характеристика,
| ИзмененияДвижений.Склад КАК Склад,
| ИзмененияДвижений.Назначение КАК Назначение,
| МАКСИМУМ(ИзмененияДвижений.ВНаличииПриход > 0) КАК ЭтоУвеличениеПрихода
|ПОМЕСТИТЬ АналитикиДляКонтроляПревышенияОбособленногоОбеспечения
|ИЗ
| ЗапасыИПотребностиИзменение КАК ИзмененияДвижений
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаХарактеристика
| ПО НастройкаХарактеристика.Склад = ИзмененияДвижений.Склад
| И НастройкаХарактеристика.Номенклатура = ИзмененияДвижений.Номенклатура
| И НастройкаХарактеристика.Характеристика = ИзмененияДвижений.Характеристика
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаНоменклатура
| ПО НастройкаНоменклатура.Склад = ИзмененияДвижений.Склад
| И НастройкаНоменклатура.Номенклатура = ИзмененияДвижений.Номенклатура
| И НастройкаНоменклатура.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаСклад
| ПО НастройкаСклад.Склад = ИзмененияДвижений.Склад
| И НастройкаСклад.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
| И НастройкаСклад.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|
|ГДЕ
| ИзмененияДвижений.КонтролироватьПревышениеОбособленногоОбеспечения
| И (ЕСТЬNULL(НастройкаХарактеристика.КонтролироватьСвободныеОстатки,
| ЕСТЬNULL(НастройкаНоменклатура.КонтролироватьСвободныеОстатки,
| НастройкаСклад.КонтролироватьСвободныеОстатки))
| ИЛИ ВЫРАЗИТЬ(ИзмененияДвижений.Номенклатура КАК Справочник.Номенклатура).ТипНоменклатуры
| = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа))
|СГРУППИРОВАТЬ ПО
| ИзмененияДвижений.Номенклатура,
| ИзмененияДвижений.Характеристика,
| ИзмененияДвижений.Склад,
| ИзмененияДвижений.Назначение
|ИМЕЮЩИЕ
| СУММА(ИзмененияДвижений.ВНаличииПриход) > 0
| ИЛИ СУММА(ИзмененияДвижений.Поступит) > 0
| ИЛИ НЕ &КонтролироватьПодтвержденныйГрафикПоступления
| И СУММА(ИзмененияДвижений.Заказано) > 0
| ИЛИ СУММА(ИзмененияДвижений.ВНаличииРасход
| + ИзмененияДвижений.РезервироватьНаСкладе
| + ИзмененияДвижений.РезервироватьПоМереПоступления
| + ИзмененияДвижений.РезервироватьНаСкладеИзЗаблокированных
| + ИзмененияДвижений.РезервироватьПоМереПоступленияИзЗаблокированных
| + ИзмененияДвижений.ОтложитьРезервирование
| + ИзмененияДвижений.КОбеспечению) < 0
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
ТекстыЗапроса.Добавить(ТекстЗапроса, "АналитикиДляКонтроляПревышенияОбособленногоОбеспечения");
ТекстЗапроса =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| Остатки.ВНаличииОстаток КАК ВНаличииОстаток,
| ВЫБОР
| КОГДА &КонтролироватьПодтвержденныйГрафикПоступления
| ТОГДА Остатки.ПоступитОстаток
| ИНАЧЕ Остатки.ЗаказаноОстаток
| КОНЕЦ КАК ЗаказаноОстаток,
| Остатки.РезервироватьНаСкладеОстаток
| + Остатки.РезервироватьПоМереПоступленияОстаток
| + Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
| + Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток
| + Остатки.ОтложитьРезервированиеОстаток
| + Остатки.КОбеспечениюОстаток КАК ВсеПотребностиОстаток
|ПОМЕСТИТЬ ЗапасыИПотребностиДляКонтроляОбособленногоОбеспечения
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Аналитики.Номенклатура КАК Номенклатура,
| Аналитики.Характеристика КАК Характеристика,
| Аналитики.Склад КАК Склад,
| Аналитики.Назначение КАК Назначение
| ИЗ
| АналитикиДляКонтроляПревышенияОбособленногоОбеспечения КАК Аналитики)) КАК Остатки
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ЗапасыИПотребностиДляКонтроляОбособленногоОбеспечения");
ТекстЗапроса =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.Назначение КАК Назначение,
| ВЫРАЗИТЬ(Остатки.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ВЫБОР
| КОГДА Аналитики.ЭтоУвеличениеПрихода
| И Остатки.ВНаличииОстаток - Остатки.ВсеПотребностиОстаток
| > ВЫБОР
| КОГДА НЕ ВЫРАЗИТЬ(Остатки.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения.ТипИзмеряемойВеличины
| В (&МерныеТипыЕдиницИзмерений)
| ТОГДА 0
| ИНАЧЕ Остатки.ВсеПотребностиОстаток * ДопустимоеОтклонение.Значение / 100
| КОНЕЦ
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ОшибкаНаличиеБольшеПотребности,
| Остатки.ВНаличииОстаток - Остатки.ВсеПотребностиОстаток КАК ВеличинаНаличиеБольшеПотребности,
| Остатки.ВНаличииОстаток + Остатки.ЗаказаноОстаток - Остатки.ВсеПотребностиОстаток КАК ВеличинаЗаказатьМеньшеНуля
|ИЗ
| ЗапасыИПотребностиДляКонтроляОбособленногоОбеспечения КАК Остатки
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ АналитикиДляКонтроляПревышенияОбособленногоОбеспечения КАК Аналитики
| ПО Аналитики.Номенклатура = Остатки.Номенклатура
| И Аналитики.Характеристика = Остатки.Характеристика
| И Аналитики.Склад = Остатки.Склад
| И Аналитики.Назначение = Остатки.Назначение
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров КАК ДопустимоеОтклонение
| ПО ИСТИНА
|ГДЕ
| Остатки.ВНаличииОстаток + Остатки.ЗаказаноОстаток - Остатки.ВсеПотребностиОстаток
| > ВЫБОР
| КОГДА НЕ ВЫРАЗИТЬ(Остатки.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения.ТипИзмеряемойВеличины
| В (&МерныеТипыЕдиницИзмерений)
| ТОГДА 0
| ИНАЧЕ
| Остатки.ВсеПотребностиОстаток * ДопустимоеОтклонение.Значение / 100
| КОНЕЦ";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ОбеспечениеРезультатыКонтроляПревышенияОбособленногоОбеспечения");
КонецЕсли;
#КонецОбласти
#Область ОбеспечениеРезультатыКонтроляЗапасаКонтролируемойПартииНаСкладе
Если ЕстьКонтрольКачества Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| ИзмененияДвижений.Номенклатура КАК Номенклатура,
| ИзмененияДвижений.Характеристика КАК Характеристика,
| ИзмененияДвижений.Склад КАК Склад,
| ИзмененияДвижений.Назначение КАК Назначение,
| ИзмененияДвижений.Заказ КАК Заказ,
| СУММА(ИзмененияДвижений.ЗаблокированоВНаличииРасход) КАК УменьшениеВНаличииПоДокументу
|ПОМЕСТИТЬ АналитикиДляКонтроляЗапасаКонтролируемойПартииНаСкладе
|ИЗ
| ЗапасыИПотребностиИзменение КАК ИзмененияДвижений
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаХарактеристика
| ПО НастройкаХарактеристика.Склад = ИзмененияДвижений.Склад
| И НастройкаХарактеристика.Номенклатура = ИзмененияДвижений.Номенклатура
| И НастройкаХарактеристика.Характеристика = ИзмененияДвижений.Характеристика
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаНоменклатура
| ПО НастройкаНоменклатура.Склад = ИзмененияДвижений.Склад
| И НастройкаНоменклатура.Номенклатура = ИзмененияДвижений.Номенклатура
| И НастройкаНоменклатура.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаСклад
| ПО НастройкаСклад.Склад = ИзмененияДвижений.Склад
| И НастройкаСклад.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
| И НастройкаСклад.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|
|ГДЕ
| ЕСТЬNULL(НастройкаХарактеристика.КонтролироватьСвободныеОстатки,
| ЕСТЬNULL(НастройкаНоменклатура.КонтролироватьСвободныеОстатки,
| НастройкаСклад.КонтролироватьСвободныеОстатки))
| И ИзмененияДвижений.ЗаблокированоВНаличииРасход <> 0
|СГРУППИРОВАТЬ ПО
| ИзмененияДвижений.Номенклатура,
| ИзмененияДвижений.Характеристика,
| ИзмененияДвижений.Склад,
| ИзмененияДвижений.Назначение,
| ИзмененияДвижений.Заказ
|ИМЕЮЩИЕ
| СУММА(ИзмененияДвижений.ЗаблокированоВНаличииРасход) < 0
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, Заказ";
ТекстыЗапроса.Добавить(ТекстЗапроса, "АналитикиДляКонтроляЗапасаКонтролируемойПартииНаСкладе");
ТекстЗапроса =
"ВЫБРАТЬ
| Обороты.Номенклатура КАК Номенклатура,
| Обороты.Характеристика КАК Характеристика,
| Обороты.Склад КАК Склад,
| Обороты.Назначение КАК Назначение,
| Обороты.Заказ КАК Заказ,
| - Обороты.ЗаблокированоВНаличииОборот КАК ВНаличииМеньшеНуля,
| Обороты.ЗаблокированоВНаличииПриход КАК ВНаличииПриход
|ПОМЕСТИТЬ ЗапасыИПотребностиДляКонтроляЗапасаКонтролируемойПартииНаСкладе
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Обороты(, , Авто,
| (Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
| ВЫБРАТЬ
| Аналитики.Номенклатура КАК Номенклатура,
| Аналитики.Характеристика КАК Характеристика,
| Аналитики.Склад КАК Склад,
| Аналитики.Назначение КАК Назначение,
| Аналитики.Заказ КАК Заказ
| ИЗ
| АналитикиДляКонтроляЗапасаКонтролируемойПартииНаСкладе КАК Аналитики)) КАК Обороты
|ГДЕ
| Обороты.ЗаблокированоВНаличииОборот < 0
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ЗапасыИПотребностиДляКонтроляЗапасаКонтролируемойПартииНаСкладе");
ТекстЗапроса =
"ВЫБРАТЬ
| Обороты.Номенклатура КАК Номенклатура,
| Обороты.Характеристика КАК Характеристика,
| Обороты.Склад КАК Склад,
| Обороты.Назначение КАК Назначение,
| Обороты.Заказ КАК КонтролируемаяПартия,
| ВЫРАЗИТЬ(Обороты.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ВЫБОР
| КОГДА Обороты.ВНаличииМеньшеНуля > Аналитики.УменьшениеВНаличииПоДокументу
| ТОГДА Аналитики.УменьшениеВНаличииПоДокументу
| ИНАЧЕ Обороты.ВНаличииМеньшеНуля
| КОНЕЦ КАК Количество
|ИЗ
| ЗапасыИПотребностиДляКонтроляЗапасаКонтролируемойПартииНаСкладе КАК Обороты
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ АналитикиДляКонтроляЗапасаКонтролируемойПартииНаСкладе КАК Аналитики
| ПО Аналитики.Номенклатура = Обороты.Номенклатура
| И Аналитики.Характеристика = Обороты.Характеристика
| И Аналитики.Склад = Обороты.Склад
| И Аналитики.Назначение = Обороты.Назначение
| И Аналитики.Заказ = Обороты.Заказ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров КАК ДопустимоеОтклонение
| ПО ИСТИНА
|ГДЕ
| Обороты.ВНаличииМеньшеНуля >
| ВЫБОР
| КОГДА НЕ ВЫРАЗИТЬ(Обороты.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения.ТипИзмеряемойВеличины
| В (&МерныеТипыЕдиницИзмерений)
| ТОГДА 0
| ИНАЧЕ
| Обороты.ВНаличииПриход * ДопустимоеОтклонение.Значение / 100
| КОНЕЦ";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ОбеспечениеРезультатыКонтроляЗапасаКонтролируемойПартииНаСкладе");
КонецЕсли;
#КонецОбласти
КонецПроцедуры
Процедура СообщитьОбОшибкахПроведения(Объект, Отказ, РезультатыКонтроля) Экспорт
ОтключитьКонтроль = ПараметрыСеанса.ПроводитьБезКонтроляРезервовТоваровПоЗаказам;
Для Каждого ОшибкаКонтроля Из РезультатыКонтроля Цикл
ЕдиницаИзмерения = ОшибкаКонтроля.ЕдиницаИзмерения;
Количество = ОшибкаКонтроля.КоличествоФактическийОстаток;
Если Количество > 0 И ОтключитьКонтроль Или ОшибкаКонтроля.КонтролироватьТолькоФактическийОстаток Тогда
ТекстНазначениеХарактеристика = НСтр("ru = 'Для отгрузки / резервирования товара %1, %2 на складе %3 по назначению %4 недостаточно остатка в наличии в количестве %5 %6.'");
ТекстНазначение = НСтр("ru = 'Для отгрузки / резервирования обособленного товара %1 на складе %2 по назначению %3 недостаточно остатка в наличии количестве %4 %5'");
ТекстБезНазначенияХарактеристика = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1, %2 на складе %3 недостаточно остатка в наличии в количестве %4 %5.'");
ТекстБезНазначения = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1 на складе %2 недостаточно остатка в наличии в количестве %3 %4'");
ТекстНазначениеХарактеристикаПартия = НСтр("ru = 'Для отгрузки / резервирования товара %1, %2 контролируемой партии %3 на складе %4 по назначению %5 недостаточно остатка в наличии в количестве %6 %7.'");
ТекстНазначениеПартия = НСтр("ru = 'Для отгрузки / резервирования обособленного товара %1 контролируемой партии %2 на складе %3 по назначению %4 недостаточно остатка в наличии количестве %5 %6'");
ТекстБезНазначенияХарактеристикаПартия = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1, %2 контролируемой партии %3 на складе %4 недостаточно остатка в наличии в количестве %5 %6.'");
ТекстБезНазначенияПартия = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1 контролируемой партии %2 на складе %3 недостаточно остатка в наличии в количестве %4 %5'");
Если ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристикаПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристика,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстНазначениеПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстНазначение,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристикаПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристика,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстБезНазначенияПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстБезНазначения,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Отказ);
КонецЕсли;
Если ОшибкаКонтроля.КонтролироватьТолькоФактическийОстаток Тогда
Продолжить;
КонецЕсли;
Количество = ОшибкаКонтроля.КоличествоСвободныйОстатокНаСкладе;
Если Количество > 0 Тогда
ТекстНазначениеХарактеристика = НСтр("ru = 'Для отгрузки / резервирования товара %1, %2 на складе %3 по назначению %4 недостаточно свободного остатка в количестве %5 %6.'");
ТекстНазначение = НСтр("ru = 'Для отгрузки / резервирования обособленного товара %1 на складе %2 по назначению %3 недостаточно свободного остатка в количестве %4 %5'");
ТекстБезНазначенияХарактеристика = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1, %2 на складе %3 недостаточно свободного остатка в количестве %4 %5.'");
ТекстБезНазначения = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1 на складе %2 недостаточно свободного остатка в количестве %3 %4'");
ТекстНазначениеХарактеристикаПартия = НСтр("ru = 'Для отгрузки / резервирования товара %1, %2 контролируемой партии %3 на складе %4 по назначению %5 недостаточно свободного остатка в количестве %6 %7.'");
ТекстНазначениеПартия = НСтр("ru = 'Для отгрузки / резервирования обособленного товара %1 контролируемой партии %2 на складе %3 по назначению %4 недостаточно свободного остатка количестве %5 %6'");
ТекстБезНазначенияХарактеристикаПартия = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1, %2 контролируемой партии %3 на складе %4 недостаточно свободного остатка в количестве %5 %6.'");
ТекстБезНазначенияПартия = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1 контролируемой партии %2 на складе %3 недостаточно свободного остатка в количестве %4 %5'");
Если ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристикаПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристика,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстНазначениеПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстНазначение,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристикаПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристика,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстБезНазначенияПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстБезНазначения,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ОтключитьКонтроль Тогда
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Неопределено);
Иначе
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Отказ);
КонецЕсли;
КонецЕсли;
Количество = ОшибкаКонтроля.КоличествоСвободныйОстатокВсего;
Если ОшибкаКонтроля.НуженКонтрольСвободногоОстаткаВсего И Количество > 0 Тогда
ТекстНазначениеХарактеристика = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1, %2 в наличии и в ожидаемых поступлениях на склад %3 по назначению %4 в количестве %5 %6.'");
ТекстНазначение = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1 в наличии и в ожидаемых поступлениях на склад %2 по назначению %3 в количестве %4 %5'");
ТекстБезНазначенияХарактеристика = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1, %2 в наличии и в ожидаемых поступлениях на склад %3 в количестве %4 %5.'");
ТекстБезНазначения = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1 в наличии и в ожидаемых поступлениях на склад %2 в количестве %3 %4'");
ТекстНазначениеХарактеристикаПартия = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1, %2 контролируемой партии %3 в наличии и в ожидаемых поступлениях на склад %4 по назначению %5 в количестве %6 %7.'");
ТекстНазначениеПартия = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1 контролируемой партии %2 в наличии и в ожидаемых поступлениях на склад %3 по назначению %4 в количестве %5 %6'");
ТекстБезНазначенияХарактеристикаПартия = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1, %2 контролируемой партии %3 в наличии и в ожидаемых поступлениях на склад %4 в количестве %5 %6.'");
ТекстБезНазначенияПартия = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1 контролируемой партии %3 в наличии и в ожидаемых поступлениях на склад %4 в количестве %5 %6'");
Если ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристикаПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристика,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстНазначениеПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстНазначение,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристикаПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристика,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
Иначе
Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
ТекстСообщения = СтрШаблон(ТекстБезНазначенияПартия,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.КонтролируемаяПартия,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстБезНазначения,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Склад,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ОтключитьКонтроль Тогда
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Неопределено);
Иначе
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Отказ);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СообщитьОбОшибкахПроведенияПревышениеОбособленногоОбеспечения(Объект, Отказ, РезультатыКонтроля) Экспорт
Для Каждого ОшибкаКонтроля Из РезультатыКонтроля Цикл
ТекстНазначениеХарактеристика = "";
ТекстНазначение = "";
Количество = 0;
ЕдиницаИзмерения = ОшибкаКонтроля.ЕдиницаИзмерения;
Если ОшибкаКонтроля.ОшибкаНаличиеБольшеПотребности Тогда
Количество = ОшибкаКонтроля.ВеличинаНаличиеБольшеПотребности;
Если ТипЗнч(ОшибкаКонтроля.Склад) = Тип("СправочникСсылка.Склады") Тогда
ТекстНазначениеХарактеристика = НСтр("ru = 'Номенклатура: %1, Характеристика: %2, Склад: %3, Назначение: %4.
|Приходуется для обеспечения больше чем требуется на %5 %6.'");
ТекстНазначение = НСтр("ru = 'Номенклатура: %1, Склад: %2, Назначение: %3.
|Приходуется для обеспечения больше чем требуется на %4 %5.'");
Иначе
ТекстНазначениеХарактеристика = НСтр("ru = 'Номенклатура: %1, Характеристика: %2, Подразделение: %3, Назначение: %4.
|Приходуется для обеспечения больше чем требуется на %5 %6.'");
ТекстНазначение = НСтр("ru = 'Номенклатура: %1, Подразделение: %2, Назначение: %3.
|Приходуется для обеспечения больше чем требуется на %4 %5.'");
КонецЕсли;
Иначе
Количество = ОшибкаКонтроля.ВеличинаЗаказатьМеньшеНуля;
Если ТипЗнч(ОшибкаКонтроля.Склад) = Тип("СправочникСсылка.Склады") Тогда
ТекстНазначениеХарактеристика = НСтр("ru = 'Номенклатура: %1, Характеристика: %2, Склад: %3, Назначение: %4.
|Заказано для обеспечения больше чем требуется на %5 %6.'");
ТекстНазначение = НСтр("ru = 'Номенклатура: %1, Склад: %2, Назначение: %3.
|Заказано для обеспечения больше чем требуется на %4 %5.'");
Иначе
ТекстНазначениеХарактеристика = НСтр("ru = 'Номенклатура: %1, Характеристика: %2, Подразделение: %3, Назначение: %4.
|Заказано для обеспечения больше чем требуется на %5 %6.'");
ТекстНазначение = НСтр("ru = 'Номенклатура: %1, Подразделение: %2, Назначение: %3.
|Заказано для обеспечения больше чем требуется на %4 %5.'");
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристика,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Характеристика,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
Иначе
ТекстСообщения = СтрШаблон(ТекстНазначение,
ОшибкаКонтроля.Номенклатура,
ОшибкаКонтроля.Склад,
ОшибкаКонтроля.Назначение,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Отказ);
КонецЦикла;
КонецПроцедуры
Процедура СообщитьОбОшибкахПроведенияЗапасКонтролируемойПартииНаСкладе(Объект, Отказ, РезультатыКонтроля) Экспорт
Для Каждого ОшибкаКонтроля Из РезультатыКонтроля Цикл
Номенклатура = ОшибкаКонтроля.Номенклатура;
Характеристика = ОшибкаКонтроля.Характеристика;
КонтролируемаяПартия = ОшибкаКонтроля.КонтролируемаяПартия;
Склад = ОшибкаКонтроля.Склад;
Назначение = ОшибкаКонтроля.Назначение;
Количество = ОшибкаКонтроля.Количество;
ЕдиницаИзмерения = ОшибкаКонтроля.ЕдиницаИзмерения;
Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) И ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
Текст = НСтр("ru = 'Недостаточно товара %1 c характеристикой %2 контролируемой партии %3 на складе %4 по назначению %5 в количестве %6 %7.'");
Текст = СтрШаблон(Текст,
Номенклатура,
Характеристика,
КонтролируемаяПартия,
Склад,
Назначение,
Количество,
ЕдиницаИзмерения);
ИначеЕсли ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
Текст = НСтр("ru = 'Недостаточно товара %1 c характеристикой %2 контролируемой партии %3 на складе %4 в количестве %5 %6.'");
Текст = СтрШаблон(Текст,
Номенклатура,
Характеристика,
КонтролируемаяПартия,
Склад,
Количество,
ЕдиницаИзмерения);
ИначеЕсли ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
Текст = НСтр("ru = 'Недостаточно товара %1 контролируемой партии %2 на складе %3 по назначению %4 в количестве %5 %6.'");
Текст = СтрШаблон(Текст,
Номенклатура,
КонтролируемаяПартия,
Склад,
Назначение,
Количество,
ЕдиницаИзмерения);
Иначе
Текст = НСтр("ru = 'Недостаточно товара %1 контролируемой партии %2 на складе %3 в количестве %4 %5.'");
Текст = СтрШаблон(Текст,
Номенклатура,
КонтролируемаяПартия,
Склад,
Количество,
ЕдиницаИзмерения);
КонецЕсли;
ОбщегоНазначения.СообщитьПользователю(Текст, Объект, Неопределено, Неопределено, Отказ);
КонецЦикла;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////////////////////////////
// Обслуживание регистров состояний заказов.
Процедура ДобавитьВременныеТаблицыАктуализацииСостояний(Запрос, ФильтрПереопределяемый, Постфикс) Экспорт
ИменаРегистров = Новый Массив();
ИменаРегистров.Добавить("РегистрСведений.СостоянияЗаказовКлиентов");
ИменаРегистров.Добавить("РегистрСведений.СостоянияВнутреннихЗаказов");
Тексты = Новый Массив();
Для Каждого ИмяРегистра Из ИменаРегистров Цикл
ИмяРегистра = СтрЗаменить(ИмяРегистра, "РегистрСведений.", "");
Параметры = РегистрыСведений[ИмяРегистра].ПараметрыАктуализацииСостоянийЗаказов();
Текст = Параметры.ПравилоОтбораЗаписей;
Текст = СтрЗаменить(Текст, "ФильтрПереопределяемый", ФильтрПереопределяемый);
Текст = СтрЗаменить(Текст, "ТаблицаПереопределяемый", ИмяРегистра + Постфикс);
Тексты.Добавить(Текст);
КонецЦикла;
Запрос.Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.Выполнить();
КонецПроцедуры
Процедура ТаблицаИзмененийРаспределениеЗапасовДляРасчетаСостояний(Запрос) Экспорт
ИменаРегистров = Новый Массив();
ИменаРегистров.Добавить("РегистрСведений.СостоянияЗаказовКлиентов");
ИменаРегистров.Добавить("РегистрСведений.СостоянияВнутреннихЗаказов");
Тексты = Новый Массив();
Для Каждого ИмяРегистра Из ИменаРегистров Цикл
ИмяРегистра = СтрЗаменить(ИмяРегистра, "РегистрСведений.", "");
Параметры = РегистрыСведений[ИмяРегистра].ПараметрыАктуализацииСостоянийЗаказов();
Текст = Параметры.ФункцияСравненияЗаписейВоВременнуюТаблицу;
Текст = СтрЗаменить(Текст, "ПередЗаписьюПереопределяемый", ИмяРегистра + "ПередЗаписью");
Текст = СтрЗаменить(Текст, "ПриЗаписиПереопределяемый", ИмяРегистра + "ПриЗаписи");
Текст = СтрЗаменить(Текст, "ИзменениеПереопределяемый", ИмяРегистра + "Изменение");
Тексты.Добавить(Текст);
КонецЦикла;
Для Каждого ИмяРегистра Из ИменаРегистров Цикл
ИмяРегистра = СтрЗаменить(ИмяРегистра, "РегистрСведений.", "");
Текст = "УНИЧТОЖИТЬ " + ИмяРегистра + "ПередЗаписью";
Тексты.Добавить(Текст);
Текст = "УНИЧТОЖИТЬ " + ИмяРегистра + "ПриЗаписи";
Тексты.Добавить(Текст);
КонецЦикла;
Запрос.Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.ВыполнитьПакет();
КонецПроцедуры
Процедура ИсключитьСсылкиТребующиеОтложенногоОбновления(Ссылки) Экспорт
Если ОбновлениеИнформационнойБазы.ОтложенноеОбновлениеЗавершено() Тогда
Возврат;
КонецЕсли;
НаборСостоянияЗаказовКлиентов = РегистрыСведений.СостоянияЗаказовКлиентов.СоздатьНаборЗаписей();
НаборСостоянияВнутреннихЗаказов = РегистрыСведений.СостоянияВнутреннихЗаказов.СоздатьНаборЗаписей();
НаборСостоянияЗаказовКлиентов.Отбор.Заказ.Использование = Истина;
НаборСостоянияВнутреннихЗаказов.Отбор.Заказ.Использование = Истина;
ВсегоЭлементов = Ссылки.Количество();
Для Счетчик = 1 По ВсегоЭлементов Цикл
Индекс = ВсегоЭлементов - Счетчик;
Ссылка = Ссылки[Индекс];
Набор = Неопределено;
Если НаборСостоянияЗаказовКлиентов.Отбор.Заказ.ТипЗначения.СодержитТип(ТипЗнч(Ссылка)) Тогда
Набор = НаборСостоянияЗаказовКлиентов;
Набор.Отбор.Заказ.Значение = Ссылка;
ИначеЕсли НаборСостоянияВнутреннихЗаказов.Отбор.Заказ.ТипЗначения.СодержитТип(ТипЗнч(Ссылка)) Тогда
Набор = НаборСостоянияВнутреннихЗаказов;
Набор.Отбор.Заказ.Значение = Ссылка;
КонецЕсли;
Если Набор <> Неопределено Тогда
РезультатПроверки = ОбновлениеИнформационнойБазы.ОбъектОбработан(Набор);
Если Не РезультатПроверки.Обработан Тогда
Ссылки.Удалить(Индекс);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ДосчитыватьРегистрРегламентнымЗаданием() Экспорт
Возврат Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Или БлокироватьРаспределениеЗапасов();
КонецФункции
Функция БлокироватьРаспределениеЗапасов() Экспорт
ПараметрЗапускаПриложения = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска");
Возврат СтрНайти(ПараметрЗапускаПриложения, "БлокироватьРаспределениеЗапасов") > 0;
КонецФункции
Функция ОшибкиПроверкиКорректностиЗаписейРегистраСведенийРаспределениеЗапасов() Экспорт
Запрос = Новый Запрос();
Тексты = Новый Массив();
#Область ОстаткиКонтролируемыхПартий
Текст =
"ВЫБРАТЬ
| &ТекстОстаткиКонтролируемыхПартий КАК Состояние,
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Склад КАК Склад,
| Набор.Назначение КАК Назначение,
| Набор.Заказ КАК КонтролируемаяПартия,
| СУММА(Набор.РезервироватьДвижения) КАК РезервироватьДвижения,
| СУММА(Набор.РезервироватьПоМереДвижения) КАК РезервироватьПоМереДвижения,
| СУММА(Набор.ВНаличииСБлокировкойДвижения) КАК ВНаличииСБлокировкойДвижения,
| СУММА(Набор.ОжидаетсяСБлокировкойДвижения) КАК ОжидаетсяСБлокировкойДвижения,
| СУММА(Набор.ВНаличииБезРазблокировкиДвижения) КАК ВНаличииБезРазблокировкиДвижения,
| СУММА(Набор.ОжидаетсяБезРазблокировкиДвижения) КАК ОжидаетсяБезРазблокировкиДвижения,
| СУММА(Набор.РезервироватьСведения) КАК РезервироватьСведения,
| СУММА(Набор.РезервироватьПоМереСведения) КАК РезервироватьПоМереСведения,
| СУММА(Набор.ВНаличииСБлокировкойСведения) КАК ВНаличииСБлокировкойСведения,
| СУММА(Набор.ОжидаетсяСБлокировкойСведения) КАК ОжидаетсяСБлокировкойСведения,
| СУММА(Набор.ВНаличииБезРазблокировкиСведения) КАК ВНаличииБезРазблокировкиСведения,
| СУММА(Набор.ОжидаетсяБезРазблокировкиСведения) КАК ОжидаетсяБезРазблокировкиСведения
|ИЗ(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ,
| Таблица.Резервировать КАК РезервироватьДвижения,
| Таблица.РезервироватьПоМере КАК РезервироватьПоМереДвижения,
| Таблица.ВНаличииСБлокировкой КАК ВНаличииСБлокировкойДвижения,
| Таблица.ОжидаетсяСБлокировкой КАК ОжидаетсяСБлокировкойДвижения,
| Таблица.ВНаличии - Таблица.ВНаличииСБлокировкой КАК ВНаличииБезРазблокировкиДвижения,
| Таблица.Ожидается - Таблица.ОжидаетсяСБлокировкой КАК ОжидаетсяБезРазблокировкиДвижения,
| 0 КАК РезервироватьСведения,
| 0 КАК РезервироватьПоМереСведения,
| 0 КАК ВНаличииСБлокировкойСведения,
| 0 КАК ОжидаетсяСБлокировкойСведения,
| 0 КАК ВНаличииБезРазблокировкиСведения,
| 0 КАК ОжидаетсяБезРазблокировкиСведения
| ИЗ(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ,
| Таблица.РезервироватьНаСкладеИзЗаблокированныхОстаток КАК Резервировать,
| Таблица.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК РезервироватьПоМере,
| Таблица.ЗаблокированоВНаличииОстаток КАК ВНаличии,
| Таблица.ЗаблокированоПоступитОстаток КАК Ожидается,
|
// ВНаличииСБлокировкой
| ВЫБОР
| КОГДА Таблица.ЗаблокированоВНаличииОстаток < 0
| ТОГДА Таблица.ЗаблокированоВНаличииОстаток
| КОГДА Таблица.ЗаблокированоВНаличииОстаток - Таблица.КРазблокировкеОстаток < 0
| ТОГДА Таблица.ЗаблокированоВНаличииОстаток
| ИНАЧЕ Таблица.КРазблокировкеОстаток
| КОНЕЦ КАК ВНаличииСБлокировкой,
|
// ОжидаетсяСБлокировкой
| ВЫБОР
| КОГДА Таблица.ЗаблокированоВНаличииОстаток < 0
| ТОГДА
| ВЫБОР
| КОГДА Таблица.ЗаблокированоПоступитОстаток - Таблица.КРазблокировкеОстаток < 0
| ТОГДА Таблица.ЗаблокированоПоступитОстаток
| ИНАЧЕ Таблица.КРазблокировкеОстаток
| КОНЕЦ
| КОГДА Таблица.ЗаблокированоВНаличииОстаток - Таблица.КРазблокировкеОстаток < 0
| ТОГДА
| ВЫБОР
| КОГДА Таблица.ЗаблокированоВНаличииОстаток + Таблица.ЗаблокированоПоступитОстаток - Таблица.КРазблокировкеОстаток < 0
| ТОГДА Таблица.ЗаблокированоПоступитОстаток
| ИНАЧЕ Таблица.КРазблокировкеОстаток - Таблица.ЗаблокированоВНаличииОстаток
| КОНЕЦ
| ИНАЧЕ 0
| КОНЕЦ КАК ОжидаетсяСБлокировкой
| ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки КАК Таблица) КАК Таблица
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.ЗаказНаПоступление КАК Заказ,
| 0 КАК РезервироватьДвижения,
| 0 КАК РезервироватьПоМереДвижения,
| 0 КАК ВНаличииСБлокировкойДвижения,
| 0 КАК ОжидаетсяСБлокировкойДвижения,
| 0 КАК ВНаличииБезРазблокировкиДвижения,
| 0 КАК ОжидаетсяБезРазблокировкиДвижения,
| 0 КАК РезервироватьСведения,
| 0 КАК РезервироватьПоМереСведения,
| ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| ТОГДА Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ ВНаличииСБлокировкойСведения,
| ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой)
| ТОГДА Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК ОжидаетсяСБлокировкойСведения,
| ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)
| ТОГДА Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК ВНаличииБезРазблокировкиСведения,
| ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке)
| ТОГДА Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК ОжидаетсяБезРазблокировкиСведения
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Таблица
| ГДЕ
| Таблица.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке))
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.ЗаказНаОтгрузку КАК Заказ,
| 0 КАК РезервироватьДвижения,
| 0 КАК РезервироватьПоМереДвижения,
| 0 КАК ВНаличииСБлокировкойДвижения,
| 0 КАК ОжидаетсяСБлокировкойДвижения,
| 0 КАК ВНаличииБезРазблокировкиДвижения,
| 0 КАК ОжидаетсяБезРазблокировкиДвижения,
| ВЫБОР
| КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных)
| ТОГДА Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК РезервироватьСведения,
| ВЫБОР
| КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных)
| ТОГДА Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК РезервироватьПоМереСведения,
| 0 КАК ВНаличииСБлокировкойСведения,
| 0 КАК ОжидаетсяСБлокировкойСведения,
| 0 КАК ВНаличииБезРазблокировкиСведения,
| 0 КАК ОжидаетсяБезРазблокировкиСведения
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Таблица
| ГДЕ
| Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных))) КАК Набор
|СГРУППИРОВАТЬ ПО
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Склад,
| Набор.Назначение,
| Набор.Заказ
|ИМЕЮЩИЕ
| СУММА(Набор.РезервироватьДвижения) <> СУММА(Набор.РезервироватьСведения)
| ИЛИ СУММА(Набор.РезервироватьПоМереДвижения) <> СУММА(Набор.РезервироватьПоМереСведения)
| ИЛИ СУММА(Набор.ВНаличииСБлокировкойДвижения) <> СУММА(Набор.ВНаличииСБлокировкойСведения)
| ИЛИ СУММА(Набор.ОжидаетсяСБлокировкойДвижения) <> СУММА(Набор.ОжидаетсяСБлокировкойСведения)
| ИЛИ СУММА(Набор.ВНаличииБезРазблокировкиДвижения) <> СУММА(Набор.ВНаличииБезРазблокировкиСведения)
| ИЛИ СУММА(Набор.ОжидаетсяБезРазблокировкиДвижения) <> СУММА(Набор.ОжидаетсяБезРазблокировкиСведения)";
#КонецОбласти
Тексты.Добавить(Текст);
Запрос.УстановитьПараметр("ТекстОстаткиКонтролируемыхПартий", НСтр("ru = 'Остатки контролируемых партий'"));
#Область ОстаткиПроверенныхТоваров
Текст =
"ВЫБРАТЬ
| &ТекстОстаткиПроверенныхТоваров КАК Состояние,
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Склад КАК Склад,
| Набор.Назначение КАК Назначение,
| Набор.Заказ КАК Заказ,
| Набор.ДатаСобытия КАК ДатаСобытия,
| СУММА(Набор.ВНаличииДвижения) КАК ВНаличииДвижения,
| СУММА(Набор.ОжидаетсяДвижения) КАК ОжидаетсяДвижения,
| СУММА(Набор.НаСогласованииПоставкиДвижения) КАК НаСогласованииПоставкиДвижения,
| СУММА(Набор.РезервироватьНаСкладеДвижения) КАК РезервироватьНаСкладеДвижения,
| СУММА(Набор.РезервироватьПоМереПоступленияДвижения) КАК РезервироватьПоМереПоступленияДвижения,
| СУММА(Набор.ОтложитьРезервированиеДвижения) КАК ОтложитьРезервированиеДвижения,
| СУММА(Набор.КОбеспечениюДвижения) КАК КОбеспечениюДвижения,
| СУММА(Набор.НеОбеспечиватьДвижения) КАК НеОбеспечиватьДвижения,
| СУММА(Набор.ВНаличииСведения) КАК ВНаличииСведения,
| СУММА(Набор.ОжидаетсяСведения) КАК ОжидаетсяСведения,
| СУММА(Набор.НаСогласованииПоставкиСведения) КАК НаСогласованииПоставкиСведения,
| СУММА(Набор.РезервироватьНаСкладеСведения) КАК РезервироватьНаСкладеСведения,
| СУММА(Набор.РезервироватьПоМереПоступленияСведения) КАК РезервироватьПоМереПоступленияСведения,
| СУММА(Набор.ОтложитьРезервированиеСведения) КАК ОтложитьРезервированиеСведения,
| СУММА(Набор.КОбеспечениюСведения) КАК КОбеспечениюСведения,
| СУММА(Набор.НеОбеспечиватьСведения) КАК НеОбеспечиватьСведения
|ИЗ(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| НЕОПРЕДЕЛЕНО КАК Заказ,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДатаСобытия,
| Таблица.ВНаличииОстаток - Таблица.ЗаблокированоВНаличииОстаток КАК ВНаличииДвижения,
| 0 КАК ОжидаетсяДвижения,
| 0 КАК НаСогласованииПоставкиДвижения,
| 0 КАК РезервироватьНаСкладеДвижения,
| 0 КАК РезервироватьПоМереПоступленияДвижения,
| 0 КАК ОтложитьРезервированиеДвижения,
| 0 КАК КОбеспечениюДвижения,
| 0 КАК НеОбеспечиватьДвижения,
| 0 КАК ВНаличииСведения,
| 0 КАК ОжидаетсяСведения,
| 0 КАК НаСогласованииПоставкиСведения,
| 0 КАК РезервироватьНаСкладеСведения,
| 0 КАК РезервироватьПоМереПоступленияСведения,
| 0 КАК ОтложитьРезервированиеСведения,
| 0 КАК КОбеспечениюСведения,
| 0 КАК НеОбеспечиватьСведения
| ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки КАК Таблица
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ,
| Таблица.ДатаСобытия КАК ДатаСобытия,
| 0 КАК ВНаличииДвижения,
| Таблица.ПоступитОстаток - Таблица.ЗаблокированоПоступитОстаток КАК ОжидаетсяДвижения,
| Таблица.ЗаказаноОстаток - Таблица.ПоступитОстаток КАК НаСогласованииПоставкиДвижения,
| Таблица.РезервироватьНаСкладеОстаток КАК РезервироватьНаСкладеДвижения,
| Таблица.РезервироватьПоМереПоступленияОстаток КАК РезервироватьПоМереПоступленияДвижения,
| Таблица.ОтложитьРезервированиеОстаток КАК ОтложитьРезервированиеДвижения,
| Таблица.КОбеспечениюОстаток КАК КОбеспечениюДвижения,
| Таблица.НеОбеспечиватьОстаток КАК НеОбеспечиватьДвижения,
| 0 КАК ВНаличииСведения,
| 0 КАК ОжидаетсяСведения,
| 0 КАК НаСогласованииПоставкиСведения,
| 0 КАК РезервироватьНаСкладеСведения,
| 0 КАК РезервироватьПоМереПоступленияСведения,
| 0 КАК ОтложитьРезервированиеСведения,
| 0 КАК КОбеспечениюСведения,
| 0 КАК НеОбеспечиватьСведения
| ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки КАК Таблица
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.ЗаказНаПоступление КАК Заказ,
| Таблица.ДатаПоступления КАК ДатаСобытия,
| 0 КАК ВНаличииДвижения,
| 0 КАК ОжидаетсяДвижения,
| 0 КАК НаСогласованииПоставкиДвижения,
| 0 КАК РезервироватьНаСкладеДвижения,
| 0 КАК РезервироватьПоМереПоступленияДвижения,
| 0 КАК ОтложитьРезервированиеДвижения,
| 0 КАК КОбеспечениюДвижения,
| 0 КАК НеОбеспечиватьДвижения,
| ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| ТОГДА
| Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК ВНаличииСведения,
| ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению)
| ТОГДА
| Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК ОжидаетсяСведения,
| ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки)
| ТОГДА
| Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК НаСогласованииПоставкиСведения,
| 0 КАК РезервироватьНаСкладеСведения,
| 0 КАК РезервироватьПоМереПоступленияСведения,
| 0 КАК ОтложитьРезервированиеСведения,
| 0 КАК КОбеспечениюСведения,
| 0 КАК НеОбеспечиватьСведения
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Таблица
| ГДЕ
| Таблица.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки))
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.ЗаказНаОтгрузку КАК Заказ,
| Таблица.ЖелаемаяДатаОтгрузки КАК ДатаСобытия,
| 0 КАК ВНаличииДвижения,
| 0 КАК ОжидаетсяДвижения,
| 0 КАК НаСогласованииПоставкиДвижения,
| 0 КАК РезервироватьНаСкладеДвижения,
| 0 КАК РезервироватьПоМереПоступленияДвижения,
| 0 КАК ОтложитьРезервированиеДвижения,
| 0 КАК КОбеспечениюДвижения,
| 0 КАК НеОбеспечиватьДвижения,
| 0 КАК ВНаличииСведения,
| 0 КАК ОжидаетсяСведения,
| 0 КАК НаСогласованииПоставкиСведения,
| ВЫБОР
| КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе)
| ТОГДА
| Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК РезервироватьНаСкладеСведения,
| ВЫБОР
| КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления)
| ТОГДА
| Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК РезервироватьПоМереПоступленияСведения,
| ВЫБОР
| КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование)
| ТОГДА
| Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК ОтложитьРезервированиеСведения,
| ВЫБОР
| КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению)
| ТОГДА
| Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК КОбеспечениюСведения,
| ВЫБОР
| КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать)
| ТОГДА
| Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК НеОбеспечиватьСведения
| ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Таблица
| ГДЕ
| Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
|) КАК Набор
| СГРУППИРОВАТЬ ПО
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Склад,
| Набор.Назначение,
| Набор.Заказ,
| Набор.ДатаСобытия
|ИМЕЮЩИЕ
| СУММА(Набор.ВНаличииДвижения) <> СУММА(Набор.ВНаличииСведения)
| ИЛИ СУММА(Набор.ОжидаетсяДвижения) <> СУММА(Набор.ОжидаетсяСведения)
| ИЛИ СУММА(Набор.НаСогласованииПоставкиДвижения) <> СУММА(Набор.НаСогласованииПоставкиСведения)
| ИЛИ СУММА(Набор.РезервироватьНаСкладеДвижения) <> СУММА(Набор.РезервироватьНаСкладеСведения)
| ИЛИ СУММА(Набор.РезервироватьПоМереПоступленияДвижения) <> СУММА(Набор.РезервироватьПоМереПоступленияСведения)
| ИЛИ СУММА(Набор.ОтложитьРезервированиеДвижения) <> СУММА(Набор.ОтложитьРезервированиеСведения)
| ИЛИ СУММА(Набор.КОбеспечениюДвижения) <> СУММА(Набор.КОбеспечениюСведения)
| ИЛИ СУММА(Набор.НеОбеспечиватьДвижения) <> СУММА(Набор.НеОбеспечиватьСведения)";
#КонецОбласти
Тексты.Добавить(Текст);
Запрос.УстановитьПараметр("ТекстОстаткиПроверенныхТоваров", НСтр("ru = 'Остатки проверенных товаров'"));
#Область ВНаличииПоВсемНазначениям
Текст =
"ВЫБРАТЬ
| &ТекстВНаличииПоВсемНазначениям КАК Состояние,
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Склад КАК Склад,
| ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка) КАК Назначение,
| СУММА(Набор.ВНаличииДляПодбораДвижения) КАК ВНаличииДляПодбораДвижения,
| СУММА(Набор.ДоступныйОстатокДляПодбораДвижения) КАК ДоступныйОстатокДляПодбораДвижения,
| СУММА(Набор.ВНаличииДляПодбораДвижения) КАК ВНаличииДляПодбораСведения,
| СУММА(Набор.ДоступныйОстатокДляПодбораСведения) КАК ДоступныйОстатокДляПодбораСведения
|ИЗ(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.ВНаличииОстаток КАК ВНаличииДляПодбораДвижения,
| ВЫБОР
| КОГДА Таблица.Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| ТОГДА 0
| КОГДА Таблица.ВНаличииОстаток
| - Таблица.ЗаблокированоВНаличииОстаток
| - Таблица.РезервироватьНаСкладеОстаток < 0
| ТОГДА
| Таблица.ВНаличииОстаток
| - Таблица.ЗаблокированоВНаличииОстаток
| - Таблица.РезервироватьНаСкладеОстаток
| КОГДА Таблица.ВНаличииОстаток
| - Таблица.ЗаблокированоВНаличииОстаток
| - Таблица.РезервироватьНаСкладеОстаток
| - Таблица.РезервироватьПоМереПоступленияОстаток > 0
| ТОГДА
| Таблица.ВНаличииОстаток
| - Таблица.ЗаблокированоВНаличииОстаток
| - Таблица.РезервироватьНаСкладеОстаток
| - Таблица.РезервироватьПоМереПоступленияОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК ДоступныйОстатокДляПодбораДвижения,
| 0 КАК ВНаличииДляПодбораСведения,
| 0 КАК ДоступныйОстатокДляПодбораСведения
| ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| ТИПЗНАЧЕНИЯ(Склад) = ТИП(Справочник.Склады) И Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)) КАК Таблица
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| 0 КАК ВНаличииДвижения,
| 0 КАК ДоступныйОстатокДляПодбораДвижения,
| Таблица.ВНаличии КАК ВНаличииДляПодбораСведения,
| Таблица.Доступно КАК ДоступныйОстатокДляПодбораСведения
| ИЗ
| РегистрСведений.ДоступныеОстаткиТоваров КАК Таблица
| ГДЕ
| Таблица.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И Таблица.КонтролируемаяПартия = ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)) КАК Набор
|СГРУППИРОВАТЬ ПО
| Набор.Номенклатура,
| Набор.Характеристика,
| Набор.Склад
|ИМЕЮЩИЕ
| СУММА(Набор.ВНаличииДляПодбораДвижения) <> СУММА(Набор.ВНаличииДляПодбораСведения)
| ИЛИ СУММА(Набор.ДоступныйОстатокДляПодбораДвижения) <> СУММА(Набор.ДоступныйОстатокДляПодбораСведения)";
#КонецОбласти
Тексты.Добавить(Текст);
Запрос.УстановитьПараметр("ТекстВНаличииПоВсемНазначениям", НСтр("ru = 'В наличии по всем назначениям'"));
#Область НарушенПорядокРаспределенияЗапасов
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| &ТекстНарушенПорядокРаспределенияЗапасов КАК Состояние,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.СостояниеЗапаса КАК СостояниеЗапасаБлиже,
| Таблица.ЗаказНаПоступление КАК ЗаказНаПоступлениеБлиже,
| Таблица.ДатаДоступности КАК ДатаДоступностиБлиже,
| ПотребностьБолееПриоритетная.СостояниеЗапаса КАК СостояниеЗапасаДальше,
| ПотребностьБолееПриоритетная.ЗаказНаПоступление КАК ЗаказНаПоступлениеДальше,
| ПотребностьБолееПриоритетная.ДатаДоступности КАК ДатаДоступностиДальше
|ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Таблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК ПотребностьБолееПриоритетная
| ПО ПотребностьБолееПриоритетная.Номенклатура = Таблица.Номенклатура
| И ПотребностьБолееПриоритетная.Характеристика = Таблица.Характеристика
| И ПотребностьБолееПриоритетная.Склад = Таблица.Склад
| И ПотребностьБолееПриоритетная.Назначение = Таблица.Назначение
|ГДЕ
| Таблица.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки))
| И (
| Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек)
| И ПотребностьБолееПриоритетная.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению))
| ИЛИ Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению)
| И ПотребностьБолееПриоритетная.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование))
| ИЛИ Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование)
| И ПотребностьБолееПриоритетная.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления))
| И (ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| И Таблица.Количество > 0
| ТОГДА
| ПотребностьБолееПриоритетная.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки))
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| ТОГДА
| ПотребностьБолееПриоритетная.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки))
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению)
| ТОГДА
| ПотребностьБолееПриоритетная.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки))
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой)
| ТОГДА
| ПотребностьБолееПриоритетная.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки)
| КОНЕЦ
| ИЛИ Таблица.СостояниеЗапаса = ПотребностьБолееПриоритетная.СостояниеЗапаса
| И (ПотребностьБолееПриоритетная.ДатаДоступности > Таблица.ДатаДоступности
| ИЛИ ПотребностьБолееПриоритетная.ДатаПоступления = Таблица.ДатаПоступления
| И ПотребностьБолееПриоритетная.ЗаказНаПоступление > Таблица.ЗаказНаПоступление))";
#КонецОбласти
Тексты.Добавить(Текст);
Запрос.УстановитьПараметр("ТекстНарушенПорядокРаспределенияЗапасов", НСтр("ru = 'Нарушен порядок распределения запасов'"));
#Область НарушенФорматЗаписи
Текст =
"ВЫБРАТЬ
| &ТекстНарушенФорматЗаписи КАК Состояние,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| Таблица.ЖелаемаяДатаОтгрузки КАК ЖелаемаяДатаОтгрузки,
| Таблица.ЗаказНаПоступление КАК ЗаказНаПоступление,
| Таблица.ДатаПоступления КАК ДатаПоступления,
| Таблица.ДатаДоступности КАК ДатаДоступности,
| Таблица.Количество
|ИЗ
| РегистрСведений.РаспределениеЗапасов КАК Таблица
|ГДЕ
| Таблица.Количество = 0
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ПустаяСсылка)
| ИЛИ Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ПустаяСсылка)
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| И Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| И Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)
| И Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению)
| И Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой)
| И Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке)
| И Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки)
| И Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НеОбеспечен)
| И Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| И НЕ(
| Таблица.ЗаказНаПоступление = НЕОПРЕДЕЛЕНО
| И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| И НЕ(
| Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
| И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ДатаДоступности <> ДАТАВРЕМЯ(1, 1, 1))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)
| И НЕ(
| Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
| И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению)
| И НЕ(
| Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
| И Таблица.ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ДатаДоступности <> ДАТАВРЕМЯ(1, 1, 1))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой)
| И НЕ(
| Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
| И Таблица.ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ДатаДоступности <> ДАТАВРЕМЯ(1, 1, 1))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке)
| И НЕ(
| Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
| И Таблица.ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки)
| И НЕ(
| Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
| И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
| ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НеОбеспечен)
| И НЕ(
| Таблица.ЗаказНаПоступление = НЕОПРЕДЕЛЕНО
| И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
| ИЛИ Таблица.ХарактеристикаПотребности В(
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать))
| И Таблица.ЗаказНаОтгрузку = НЕОПРЕДЕЛЕНО
|
| ИЛИ Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек)
| И Таблица.ЗаказНаОтгрузку <> НЕОПРЕДЕЛЕНО";
#КонецОбласти
Тексты.Добавить(Текст);
Запрос.УстановитьПараметр("ТекстНарушенФорматЗаписи", НСтр("ru = 'Нарушен формат записи'"));
Запрос.Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Пакет = Запрос.ВыполнитьПакет();
Возврат Пакет;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ТекстРасчетаДоступныеОстаткиТоваров()
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад
|ПОМЕСТИТЬ РазличныеТоварыБезНазначений
|ИЗ
| ТоварыДляРаспределенияЗапасовПереопределяемый КАК Товары
|ГДЕ
| Товары.Номенклатура.ТипНоменклатуры В(
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар),
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
| И Товары.Склад <> НЕОПРЕДЕЛЕНО
| И Товары.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад
|;
|
|////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| Запасы.ВНаличииОстаток КАК ВНаличии
|ПОМЕСТИТЬ ВНаличииПоВсемНазначениям
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад) В(
| ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад
| ИЗ
| РазличныеТоварыБезНазначений КАК Товары)) КАК Запасы
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Заказ КАК КонтролируемаяПартия,
| Запасы.ЗаблокированоВНаличииОстаток КАК ВНаличии
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| Заказ <> НЕОПРЕДЕЛЕНО
| И Заказ <> ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)
| И ТИПЗНАЧЕНИЯ(Заказ) = ТИП(Справочник.КонтролируемыеПартии)
| И (Номенклатура, Характеристика, Склад) В(
| ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад
| ИЗ
| РазличныеТоварыБезНазначений КАК Товары)) КАК Запасы
|;
|
|////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Назначение КАК Назначение,
| Товары.Склад КАК Склад
|ПОМЕСТИТЬ РазличныеТоварыСНазначениями
|ИЗ
| ТоварыДляРаспределенияЗапасовПереопределяемый КАК Товары
|ГДЕ
| ВЫРАЗИТЬ(Товары.Назначение КАК Справочник.Назначения).Заказ = НЕОПРЕДЕЛЕНО
| И ВЫРАЗИТЬ(Товары.Назначение КАК Справочник.Назначения).НаправлениеДеятельности
| <> ЗНАЧЕНИЕ(Справочник.НаправленияДеятельности.ПустаяСсылка)
| И Товары.Номенклатура.ТипНоменклатуры В(
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар),
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
| И Товары.Склад <> НЕОПРЕДЕЛЕНО
| И Товары.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка) КАК Назначение,
| Товары.Склад КАК Склад
|ИЗ
| РазличныеТоварыБезНазначений КАК Товары
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение
|;
|
|////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| Запасы.ВНаличииОстаток
| - Запасы.ЗаблокированоВНаличииОстаток КАК ВНаличии,
| ВЫБОР
| КОГДА
| Запасы.ВНаличииОстаток
| - Запасы.ЗаблокированоВНаличииОстаток
| - Запасы.РезервироватьНаСкладеОстаток < 0
| ТОГДА
| Запасы.ВНаличииОстаток
| - Запасы.ЗаблокированоВНаличииОстаток
| - Запасы.РезервироватьНаСкладеОстаток
| КОГДА Запасы.ВНаличииОстаток
| - Запасы.ЗаблокированоВНаличииОстаток
| - Запасы.РезервироватьНаСкладеОстаток
| - Запасы.РезервироватьПоМереПоступленияОстаток > 0
| ТОГДА
| Запасы.ВНаличииОстаток
| - Запасы.ЗаблокированоВНаличииОстаток
| - Запасы.РезервироватьНаСкладеОстаток
| - Запасы.РезервироватьПоМереПоступленияОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Доступно
|ПОМЕСТИТЬ ДоступноПоНазначениям
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение
| ИЗ
| РазличныеТоварыСНазначениями КАК Товары)) КАК Запасы
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Назначение КАК Назначение,
| Запасы.Заказ КАК КонтролируемаяПартия,
| Запасы.ЗаблокированоВНаличииОстаток КАК ВНаличии,
| ВЫБОР
| КОГДА
| Запасы.ЗаблокированоВНаличииОстаток
| - Запасы.РезервироватьНаСкладеИзЗаблокированныхОстаток < 0
| ТОГДА
| Запасы.ЗаблокированоВНаличииОстаток
| - Запасы.РезервироватьНаСкладеИзЗаблокированныхОстаток
| КОГДА Запасы.ЗаблокированоВНаличииОстаток
| - Запасы.РезервироватьНаСкладеИзЗаблокированныхОстаток
| - Запасы.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток > 0
| ТОГДА
| Запасы.ЗаблокированоВНаличииОстаток
| - Запасы.РезервироватьНаСкладеИзЗаблокированныхОстаток
| - Запасы.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Доступно
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| Заказ <> НЕОПРЕДЕЛЕНО
| И Заказ <> ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)
| И ТИПЗНАЧЕНИЯ(Заказ) = ТИП(Справочник.КонтролируемыеПартии)
| И (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение
| ИЗ
| РазличныеТоварыСНазначениями КАК Товары)) КАК Запасы
|;
|
|///////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение,
| ВНаличииПоВсемНазначениям.КонтролируемаяПартия КАК КонтролируемаяПартия,
| ВНаличииПоВсемНазначениям.ВНаличии КАК ВНаличии,
| ВЫБОР
| КОГДА ВНаличииПоВсемНазначениям.ВНаличии = 0
| ТОГДА 0
| ИНАЧЕ ЕСТЬNULL(ДоступноПоНазначениям.Доступно, 0)
| КОНЕЦ КАК Доступно
|ПОМЕСТИТЬ ДанныеРегистровДляРасчетаДоступныеОстаткиТоваров
|ИЗ
| РазличныеТоварыСНазначениями КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ ВНаличииПоВсемНазначениям КАК ВНаличииПоВсемНазначениям
| ПО ВНаличииПоВсемНазначениям.Номенклатура = Товары.Номенклатура
| И ВНаличииПоВсемНазначениям.Характеристика = Товары.Характеристика
| И ВНаличииПоВсемНазначениям.Склад = Товары.Склад
| ЛЕВОЕ СОЕДИНЕНИЕ ДоступноПоНазначениям КАК ДоступноПоНазначениям
| ПО ДоступноПоНазначениям.Номенклатура = Товары.Номенклатура
| И ДоступноПоНазначениям.Характеристика = Товары.Характеристика
| И ДоступноПоНазначениям.Склад = Товары.Склад
| И ДоступноПоНазначениям.Назначение = Товары.Назначение
| И ДоступноПоНазначениям.КонтролируемаяПартия = ВНаличииПоВсемНазначениям.КонтролируемаяПартия
|ГДЕ
| Товары.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И НЕ ВНаличииПоВсемНазначениям.КонтролируемаяПартия ЕСТЬ NULL
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение,
| ДоступноПоНазначениям.КонтролируемаяПартия КАК КонтролируемаяПартия,
| ДоступноПоНазначениям.ВНаличии КАК ВНаличии,
| ВЫБОР
| КОГДА ДоступноПоНазначениям.ВНаличии = 0
| ТОГДА 0
| ИНАЧЕ ДоступноПоНазначениям.Доступно
| КОНЕЦ КАК Доступно
|ИЗ
| РазличныеТоварыСНазначениями КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ ДоступноПоНазначениям КАК ДоступноПоНазначениям
| ПО ДоступноПоНазначениям.Номенклатура = Товары.Номенклатура
| И ДоступноПоНазначениям.Характеристика = Товары.Характеристика
| И ДоступноПоНазначениям.Склад = Товары.Склад
| И ДоступноПоНазначениям.Назначение = Товары.Назначение
|ГДЕ
| Товары.Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И НЕ ДоступноПоНазначениям.КонтролируемаяПартия ЕСТЬ NULL
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение,
| ДоступныеОстаткиТоваров.КонтролируемаяПартия КАК КонтролируемаяПартия,
| 0 КАК ВНаличии,
| 0 КАК Доступно
|ИЗ
| РазличныеТоварыСНазначениями КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДоступныеОстаткиТоваров КАК ДоступныеОстаткиТоваров
| ПО ДоступныеОстаткиТоваров.Номенклатура = Товары.Номенклатура
| И ДоступныеОстаткиТоваров.Характеристика = Товары.Характеристика
| И ДоступныеОстаткиТоваров.Склад = Товары.Склад
| И ДоступныеОстаткиТоваров.Назначение = Товары.Назначение
|ГДЕ
| Товары.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ВНаличииПоВсемНазначениям КАК Таблица
| ГДЕ
| Таблица.Номенклатура = ДоступныеОстаткиТоваров.Номенклатура
| И Таблица.Характеристика = ДоступныеОстаткиТоваров.Характеристика
| И Таблица.Склад = ДоступныеОстаткиТоваров.Склад
| И Таблица.КонтролируемаяПартия = ДоступныеОстаткиТоваров.КонтролируемаяПартия)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение,
| ДоступныеОстаткиТоваров.КонтролируемаяПартия КАК КонтролируемаяПартия,
| 0 КАК ВНаличии,
| 0 КАК Доступно
|ИЗ
| РазличныеТоварыСНазначениями КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДоступныеОстаткиТоваров КАК ДоступныеОстаткиТоваров
| ПО ДоступныеОстаткиТоваров.Номенклатура = Товары.Номенклатура
| И ДоступныеОстаткиТоваров.Характеристика = Товары.Характеристика
| И ДоступныеОстаткиТоваров.Склад = Товары.Склад
| И ДоступныеОстаткиТоваров.Назначение = Товары.Назначение
|ГДЕ
| Товары.Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ДоступноПоНазначениям КАК Таблица
| ГДЕ
| Таблица.Номенклатура = ДоступныеОстаткиТоваров.Номенклатура
| И Таблица.Характеристика = ДоступныеОстаткиТоваров.Характеристика
| И Таблица.Склад = ДоступныеОстаткиТоваров.Склад
| И Таблица.Назначение = ДоступныеОстаткиТоваров.Назначение
| И Таблица.КонтролируемаяПартия = ДоступныеОстаткиТоваров.КонтролируемаяПартия)
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение
|;
|
|///////////////////////////////////////////////////////////////////
|УНИЧТОЖИТЬ ВНаличииПоВсемНазначениям;
|УНИЧТОЖИТЬ ДоступноПоНазначениям;
|УНИЧТОЖИТЬ РазличныеТоварыБезНазначений;
|УНИЧТОЖИТЬ РазличныеТоварыСНазначениями";
Возврат Текст;
КонецФункции
Процедура ВременныеТаблицыДанныхРегистров(Запрос, ИмяТаблицыТовары, ИменаРегистров, ИмяТаблицыРеестрДокументов, ИмяТаблицыКорректировки)
Тексты = Новый Массив();
Если СтрНайти(ИменаРегистров, "ДоступныеОстаткиТоваров") > 0 Тогда
Текст = ТекстРасчетаДоступныеОстаткиТоваров();
Тексты.Добавить(Текст);
КонецЕсли;
Если СтрНайти(ИменаРегистров, "РаспределениеЗапасов") > 0 Тогда
Текст =
"ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Назначение КАК Назначение,
| Запасы.Заказ КАК Заказ,
| Запасы.ДатаСобытия КАК ДатаСобытия,
| Запасы.ВНаличииОстаток КАК ВНаличии,
| Запасы.ПоступитОстаток КАК Поступит,
| Запасы.ЗаказаноОстаток КАК Заказано,
| Запасы.ЗаблокированоВНаличииОстаток КАК ЗаблокированоВНаличии,
| Запасы.ЗаблокированоПоступитОстаток КАК ЗаблокированоПоступит,
| Запасы.КРазблокировкеОстаток КАК КРазблокировке
|ПОМЕСТИТЬ Запасы
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение
| ИЗ
| ТоварыДляРаспределенияЗапасовПереопределяемый КАК Товары)) КАК Запасы";
ДополнитьТекстомЗапросаКорректировкиЗапаса(Текст, "ПОМЕСТИТЬ Запасы", ИмяТаблицыКорректировки);
ДобавитьИндекс(Текст, "Номенклатура, Характеристика, Склад, Назначение");
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Потребности.Номенклатура КАК Номенклатура,
| Потребности.Характеристика КАК Характеристика,
| Потребности.Склад КАК Склад,
| Потребности.Назначение КАК Назначение,
| Потребности.Заказ КАК Заказ,
| Потребности.ДатаСобытия КАК ДатаСобытия,
| ВЫБОР
| КОГДА Потребности.РезервироватьНаСкладеОстаток > 0
| ТОГДА Потребности.РезервироватьНаСкладеОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК РезервироватьНаСкладе,
| ВЫБОР
| КОГДА Потребности.РезервироватьПоМереПоступленияОстаток > 0
| ТОГДА Потребности.РезервироватьПоМереПоступленияОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК РезервироватьПоМереПоступления,
| ВЫБОР
| КОГДА Потребности.ОтложитьРезервированиеОстаток > 0
| ТОГДА Потребности.ОтложитьРезервированиеОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК ОтложитьРезервирование,
| ВЫБОР
| КОГДА Потребности.КОбеспечениюОстаток > 0
| ТОГДА Потребности.КОбеспечениюОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК КОбеспечению,
| ВЫБОР
| КОГДА Потребности.НеОбеспечиватьОстаток > 0
| ТОГДА Потребности.НеОбеспечиватьОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК НеОбеспечивать,
| ВЫБОР
| КОГДА Потребности.РезервироватьНаСкладеИзЗаблокированныхОстаток > 0
| ТОГДА Потребности.РезервироватьНаСкладеИзЗаблокированныхОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК РезервироватьНаСкладеИзЗаблокированных,
| ВЫБОР
| КОГДА Потребности.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток > 0
| ТОГДА Потребности.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК РезервироватьПоМереПоступленияИзЗаблокированных
|ПОМЕСТИТЬ Потребности
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(,
| (Номенклатура, Характеристика, Склад, Назначение) В(
| ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение
| ИЗ
| ТоварыДляРаспределенияЗапасовПереопределяемый КАК Товары)) КАК Потребности
|ГДЕ
| Потребности.РезервироватьНаСкладеОстаток > 0
| ИЛИ Потребности.РезервироватьПоМереПоступленияОстаток > 0
| ИЛИ Потребности.ОтложитьРезервированиеОстаток > 0
| ИЛИ Потребности.КОбеспечениюОстаток > 0
| ИЛИ Потребности.НеОбеспечиватьОстаток > 0
| ИЛИ Потребности.РезервироватьНаСкладеИзЗаблокированныхОстаток > 0
| ИЛИ Потребности.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток > 0";
ДополнитьТекстомЗапросаКорректировкиПотребности(Текст, "ПОМЕСТИТЬ Потребности", ИмяТаблицыКорректировки);
ДобавитьИндекс(Текст, "Номенклатура, Характеристика, Склад, Назначение, Заказ");
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| СУММА(Таблица.РезервироватьНаСкладе) КАК РезервироватьНаСкладе
|ПОМЕСТИТЬ ПотребностиПоТовару
|ИЗ
| Потребности КАК Таблица
|СГРУППИРОВАТЬ ПО
| Таблица.Номенклатура,
| Таблица.Характеристика,
| Таблица.Склад,
| Таблица.Назначение
|ИМЕЮЩИЕ
| СУММА(Таблица.РезервироватьНаСкладе) > 0
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Потребности.Заказ КАК Заказ,
| ВЫБОР
| КОГДА ИСТИНА
| ТОГДА NULL
| КОНЕЦ КАК ДатаРаспоряжения
|ПОМЕСТИТЬ ПотребностиРазличныеЗаказы
|ИЗ
| Потребности КАК Потребности
|ИНДЕКСИРОВАТЬ ПО
| Заказ
|;
|
|///////////////////////////////////////
|ВЫБРАТЬ
| ЗаказыРеестра.Ссылка КАК Ссылка,
| МИНИМУМ(ЗаказыРеестра.Приоритет) КАК Приоритет,
| МИНИМУМ(ЕСТЬNULL(Таблица.ДатаРаспоряжения, ЗаказыРеестра.ДатаДокументаИБ)) КАК ДатаДокументаИБ
|ПОМЕСТИТЬ ТаблицаЗаказыРеестра
|ИЗ
| ПотребностиРазличныеЗаказы Таблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РеестрДокументовПереопределяемый КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Таблица.Заказ
| И НЕ ЗаказыРеестра.ДополнительнаяЗапись
|ГДЕ
| НЕ ЗаказыРеестра.Ссылка ЕСТЬ NULL
|СГРУППИРОВАТЬ ПО
| ЗаказыРеестра.Ссылка
|ИНДЕКСИРОВАТЬ ПО
| Ссылка
|;
|УНИЧТОЖИТЬ ПотребностиРазличныеЗаказы";
Если ИмяТаблицыРеестрДокументов = Неопределено Тогда
ИмяТаблицыРеестрДокументов = "РегистрСведений.РеестрДокументов";
КонецЕсли;
Текст = СтрЗаменить(Текст, "РеестрДокументовПереопределяемый", ИмяТаблицыРеестрДокументов);
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Склад КАК Склад,
| Товары.Назначение КАК Назначение
|ПОМЕСТИТЬ ТоварыСКонтролемОбеспечения
|ИЗ
| ТоварыДляРаспределенияЗапасовПереопределяемый КАК Товары
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаКонтроляОбеспеченияХарактеристика
| ПО НастройкаКонтроляОбеспеченияХарактеристика.Склад = Товары.Склад
| И НастройкаКонтроляОбеспеченияХарактеристика.Номенклатура = Товары.Номенклатура
| И НастройкаКонтроляОбеспеченияХарактеристика.Характеристика = Товары.Характеристика
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаКонтроляОбеспеченияНоменклатура
| ПО НастройкаКонтроляОбеспеченияНоменклатура.Склад = Товары.Склад
| И НастройкаКонтроляОбеспеченияНоменклатура.Номенклатура = Товары.Номенклатура
| И НастройкаКонтроляОбеспеченияНоменклатура.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаКонтроляОбеспечения
| ПО НастройкаКонтроляОбеспечения.Склад = Товары.Склад
| И НастройкаКонтроляОбеспечения.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
| И НастройкаКонтроляОбеспечения.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
|
|ГДЕ
| ЕСТЬNULL(НастройкаКонтроляОбеспеченияХарактеристика.КонтролироватьСвободныеОстатки,
| ЕСТЬNULL(НастройкаКонтроляОбеспеченияНоменклатура.КонтролироватьСвободныеОстатки,
| ЕСТЬNULL(НастройкаКонтроляОбеспечения.КонтролироватьСвободныеОстатки, ЛОЖЬ)))
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение";
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Сведения.Номенклатура КАК Номенклатура,
| Сведения.Характеристика КАК Характеристика,
| Сведения.Склад КАК Склад,
| Сведения.Назначение КАК Назначение,
| Сведения.ЗаказНаОтгрузку КАК Заказ,
| ВЫБОР
| КОГДА
| СУММА(ВЫБОР
| КОГДА Сведения.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| ТОГДА Сведения.Количество
| ИНАЧЕ 0
| КОНЕЦ) < МАКСИМУМ(ЕСТЬNULL(ОтгрузкаИзСобственногоРезерва.Отгрузка, 0))
| ТОГДА 0
| ИНАЧЕ
| СУММА(ВЫБОР
| КОГДА Сведения.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| ТОГДА Сведения.Количество
| ИНАЧЕ 0
| КОНЕЦ) - МАКСИМУМ(ЕСТЬNULL(ОтгрузкаИзСобственногоРезерва.Отгрузка, 0))
| КОНЕЦ КАК ВНаличии,
| СУММА(ВЫБОР
| КОГДА Сведения.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| ТОГДА Сведения.Количество
| ИНАЧЕ 0
| КОНЕЦ) КАК ВНаличииОжидаетсяРазблокировка
|ПОМЕСТИТЬ ЗапасыРаспределенныеРанее
|ИЗ
| ТоварыСКонтролемОбеспечения КАК Товары
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК Сведения
| ПО Сведения.Номенклатура = Товары.Номенклатура
| И Сведения.Характеристика = Товары.Характеристика
| И Сведения.Склад = Товары.Склад
| И Сведения.Назначение = Товары.Назначение
| И Сведения.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления)
| И Сведения.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка))
|
| ЛЕВОЕ СОЕДИНЕНИЕ ИзменениеОстаткаПоТоварамДляКонтроляОстатков КАК ОтгрузкаИзСобственногоРезерва
| ПО ОтгрузкаИзСобственногоРезерва.Номенклатура = Сведения.Номенклатура
| И ОтгрузкаИзСобственногоРезерва.Характеристика = Сведения.Характеристика
| И ОтгрузкаИзСобственногоРезерва.Склад = Сведения.Склад
| И ОтгрузкаИзСобственногоРезерва.Назначение = Сведения.Назначение
| И ОтгрузкаИзСобственногоРезерва.ЗаказНаОтгрузку = Сведения.ЗаказНаОтгрузку
|СГРУППИРОВАТЬ ПО
| Сведения.Номенклатура,
| Сведения.Характеристика,
| Сведения.Склад,
| Сведения.Назначение,
| Сведения.ЗаказНаОтгрузку
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, Заказ";
Если Не ОбновлениеИнформационнойБазы.ОбъектОбработан("РегистрСведений.РаспределениеЗапасов").Обработан Тогда
Текст =
"ВЫБРАТЬ
| Сведения.Номенклатура КАК Номенклатура,
| Сведения.Характеристика КАК Характеристика,
| Сведения.Склад КАК Склад,
| Сведения.Назначение КАК Назначение,
| Сведения.ЗаказНаОтгрузку КАК Заказ,
| ВЫБОР
| КОГДА
| СУММА(ВЫБОР
| КОГДА Сведения.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| ТОГДА Сведения.Количество
| ИНАЧЕ 0
| КОНЕЦ) < МАКСИМУМ(ЕСТЬNULL(Сведения.Отгрузка, 0))
| ТОГДА 0
| ИНАЧЕ
| СУММА(ВЫБОР
| КОГДА Сведения.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| ТОГДА Сведения.Количество
| ИНАЧЕ 0
| КОНЕЦ) - МАКСИМУМ(ЕСТЬNULL(Сведения.Отгрузка, 0))
| КОНЕЦ КАК ВНаличии,
| СУММА(ВЫБОР
| КОГДА Сведения.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| ТОГДА Сведения.Количество
| ИНАЧЕ 0
| КОНЕЦ) КАК ВНаличииОжидаетсяРазблокировка
|ПОМЕСТИТЬ ЗапасыРаспределенныеРанее
|ИЗ(
| ВЫБРАТЬ
| Сведения.Номенклатура КАК Номенклатура,
| Сведения.Характеристика КАК Характеристика,
| Сведения.Склад КАК Склад,
| Сведения.Назначение КАК Назначение,
| Сведения.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| Сведения.СостояниеЗапаса КАК СостояниеЗапаса,
| Сведения.Количество КАК Количество,
| ОтгрузкаИзСобственногоРезерва.Отгрузка КАК Отгрузка
| ИЗ
| ТоварыСКонтролемОбеспечения КАК Товары
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК Сведения
| ПО Сведения.Номенклатура = Товары.Номенклатура
| И Сведения.Характеристика = Товары.Характеристика
| И Сведения.Склад = Товары.Склад
| И Сведения.Назначение = Товары.Назначение
| И Сведения.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления)
| И Сведения.СостояниеЗапаса В(
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии),
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка))
|
| ЛЕВОЕ СОЕДИНЕНИЕ ИзменениеОстаткаПоТоварамДляКонтроляОстатков КАК ОтгрузкаИзСобственногоРезерва
| ПО ОтгрузкаИзСобственногоРезерва.Номенклатура = Сведения.Номенклатура
| И ОтгрузкаИзСобственногоРезерва.Характеристика = Сведения.Характеристика
| И ОтгрузкаИзСобственногоРезерва.Склад = Сведения.Склад
| И ОтгрузкаИзСобственногоРезерва.Назначение = Сведения.Назначение
| И ОтгрузкаИзСобственногоРезерва.ЗаказНаОтгрузку = Сведения.ЗаказНаОтгрузку
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Сведения.Номенклатура КАК Номенклатура,
| Сведения.Характеристика КАК Характеристика,
| Сведения.Склад КАК Склад,
| Сведения.Назначение КАК Назначение,
| Сведения.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии) КАК СостояниеЗапаса,
| Сведения.УдалитьЗарезервировано КАК Количество,
| ОтгрузкаИзСобственногоРезерва.Отгрузка КАК Отгрузка
| ИЗ
| ТоварыСКонтролемОбеспечения КАК Товары
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК Сведения
| ПО Сведения.Номенклатура = Товары.Номенклатура
| И Сведения.Характеристика = Товары.Характеристика
| И Сведения.Склад = Товары.Склад
| И Сведения.Назначение = Товары.Назначение
| И Сведения.УдалитьСостояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ЗарезервированПриПоступлении)
|
| ЛЕВОЕ СОЕДИНЕНИЕ ИзменениеОстаткаПоТоварамДляКонтроляОстатков КАК ОтгрузкаИзСобственногоРезерва
| ПО ОтгрузкаИзСобственногоРезерва.Номенклатура = Сведения.Номенклатура
| И ОтгрузкаИзСобственногоРезерва.Характеристика = Сведения.Характеристика
| И ОтгрузкаИзСобственногоРезерва.Склад = Сведения.Склад
| И ОтгрузкаИзСобственногоРезерва.Назначение = Сведения.Назначение
| И ОтгрузкаИзСобственногоРезерва.ЗаказНаОтгрузку = Сведения.ЗаказНаОтгрузку) КАК Сведения
|СГРУППИРОВАТЬ ПО
| Сведения.Номенклатура,
| Сведения.Характеристика,
| Сведения.Склад,
| Сведения.Назначение,
| Сведения.ЗаказНаОтгрузку
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, Заказ";
КонецЕсли;
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ,
| Таблица.ДатаСобытия КАК ДатаСобытия,
| Таблица.РезервироватьПоМереПоступления КАК РезервироватьПоМереПоступления,
| ЕСТЬNULL(РаспределенныеРанее.ВНаличии, 0) КАК ВНаличии,
| ЕСТЬNULL(РаспределенныеРанее.ВНаличииОжидаетсяРазблокировка, 0) КАК ВНаличииОжидаетсяРазблокировка
|ПОМЕСТИТЬ ПотребностиРезервироватьПоМереПоступленияИЗапасыРаспределенныеРанее
|ИЗ
| Потребности КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ЗапасыРаспределенныеРанее КАК РаспределенныеРанее
| ПО РаспределенныеРанее.Номенклатура = Таблица.Номенклатура
| И РаспределенныеРанее.Характеристика = Таблица.Характеристика
| И РаспределенныеРанее.Склад = Таблица.Склад
| И РаспределенныеРанее.Назначение = Таблица.Назначение
| И РаспределенныеРанее.Заказ = Таблица.Заказ
|ГДЕ
| Таблица.РезервироватьПоМереПоступления > 0
|ИНДЕКСИРОВАТЬ ПО
| Заказ,Номенклатура,Характеристика,Склад,Назначение
|;
|
|//////////////////////////////////////////////////////
|УНИЧТОЖИТЬ ТоварыСКонтролемОбеспечения";
Тексты.Добавить(Текст);
КонецЕсли;
Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
Запрос.Текст = СтрЗаменить(Текст, "ТоварыДляРаспределенияЗапасовПереопределяемый", ИмяТаблицыТовары);
Запрос.ВыполнитьПакет();
КонецПроцедуры
Процедура ДополнитьТекстомЗапросаКорректировкиЗапаса(Текст, ТекстПомещенияВТаблицу, ИмяТаблицыКорректировки)
Если ИмяТаблицыКорректировки = Неопределено Тогда
Возврат;
КонецЕсли;
Текст = СтрЗаменить(Текст, ТекстПомещенияВТаблицу, "");
Тексты = Новый Массив();
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Назначение КАК Назначение,
| Запасы.Заказ КАК Заказ,
| Запасы.ДатаСобытия КАК ДатаСобытия,
| 0 КАК ВНаличии,
| Запасы.Поступит КАК Поступит,
| Запасы.Заказано КАК Заказано,
| Запасы.ЗаблокированоВНаличии КАК ЗаблокированоВНаличии,
| Запасы.ЗаблокированоПоступит КАК ЗаблокированоПоступит,
| Запасы.КРазблокировке КАК КРазблокировке
|ИЗ
| КорректировкаДвиженийПереопределяемый КАК Запасы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыДляРаспределенияЗапасовПереопределяемый КАК Фильтр
| ПО Фильтр.Номенклатура = Запасы.Номенклатура
| И Фильтр.Характеристика = Запасы.Характеристика
| И Фильтр.Склад = Запасы.Склад
| И Фильтр.Назначение = Запасы.Назначение";
Текст = СтрЗаменить(Текст, "КорректировкаДвиженийПереопределяемый", ИмяТаблицыКорректировки);
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Назначение КАК Назначение,
| НЕОПРЕДЕЛЕНО КАК Заказ,
| Запасы.ДатаСобытия КАК ДатаСобытия,
| Запасы.ВНаличии КАК ВНаличии,
| 0 КАК Поступит,
| 0 КАК Заказано,
| 0 КАК ЗаблокированоВНаличии,
| 0 КАК ЗаблокированоПоступит,
| 0 КАК КРазблокировке
|ИЗ
| КорректировкаДвиженийПереопределяемый КАК Запасы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыДляРаспределенияЗапасовПереопределяемый КАК Фильтр
| ПО Фильтр.Номенклатура = Запасы.Номенклатура
| И Фильтр.Характеристика = Запасы.Характеристика
| И Фильтр.Склад = Запасы.Склад
| И Фильтр.Назначение = Запасы.Назначение";
Текст = СтрЗаменить(Текст, "КорректировкаДвиженийПереопределяемый", ИмяТаблицыКорректировки);
Тексты.Добавить(Текст);
ТекстНабора = СтрСоединить(Тексты, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
Текст =
"ВЫБРАТЬ
| Запасы.Номенклатура КАК Номенклатура,
| Запасы.Характеристика КАК Характеристика,
| Запасы.Склад КАК Склад,
| Запасы.Назначение КАК Назначение,
| Запасы.Заказ КАК Заказ,
| Запасы.ДатаСобытия КАК ДатаСобытия,
| СУММА(Запасы.ВНаличии) КАК ВНаличии,
| СУММА(Запасы.Поступит) КАК Поступит,
| СУММА(Запасы.Заказано) КАК Заказано,
| СУММА(Запасы.ЗаблокированоВНаличии) КАК ЗаблокированоВНаличии,
| СУММА(Запасы.ЗаблокированоПоступит) КАК ЗаблокированоПоступит,
| СУММА(Запасы.КРазблокировке) КАК КРазблокировке
|ПОМЕСТИТЬ ТаблицаПереопределяемый
|ИЗ
| НаборПереопределяемый КАК Запасы
|СГРУППИРОВАТЬ ПО
| Запасы.Номенклатура,
| Запасы.Характеристика,
| Запасы.Склад,
| Запасы.Назначение,
| Запасы.Заказ,
| Запасы.ДатаСобытия
|ИМЕЮЩИЕ
| СУММА(Запасы.ВНаличии) > 0
| ИЛИ СУММА(Запасы.Поступит) > 0
| ИЛИ СУММА(Запасы.Заказано) > 0
| ИЛИ СУММА(Запасы.ЗаблокированоВНаличии) > 0
| ИЛИ СУММА(Запасы.ЗаблокированоПоступит) > 0
| ИЛИ СУММА(Запасы.КРазблокировке) > 0";
Текст = СтрЗаменить(Текст, "НаборПереопределяемый", СтрШаблон("(%1)", ТекстНабора));
Текст = СтрЗаменить(Текст, "ПОМЕСТИТЬ ТаблицаПереопределяемый", ТекстПомещенияВТаблицу);
КонецПроцедуры
Процедура ДополнитьТекстомЗапросаКорректировкиПотребности(Текст, ТекстПомещенияВТаблицу, ИмяТаблицыКорректировки)
Если ИмяТаблицыКорректировки = Неопределено Тогда
Возврат;
КонецЕсли;
Текст = СтрЗаменить(Текст, ТекстПомещенияВТаблицу, "");
Тексты = Новый Массив();
Тексты.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| Потребности.Номенклатура КАК Номенклатура,
| Потребности.Характеристика КАК Характеристика,
| Потребности.Склад КАК Склад,
| Потребности.Назначение КАК Назначение,
| Потребности.Заказ КАК Заказ,
| Потребности.ДатаСобытия КАК ДатаСобытия,
| Потребности.РезервироватьНаСкладе КАК РезервироватьНаСкладе,
| Потребности.РезервироватьПоМереПоступления КАК РезервироватьПоМереПоступления,
| Потребности.ОтложитьРезервирование КАК ОтложитьРезервирование,
| Потребности.КОбеспечению КАК КОбеспечению,
| Потребности.НеОбеспечивать КАК НеОбеспечивать,
| Потребности.РезервироватьНаСкладеИзЗаблокированных КАК РезервироватьНаСкладеИзЗаблокированных,
| Потребности.РезервироватьПоМереПоступленияИзЗаблокированных КАК РезервироватьПоМереПоступленияИзЗаблокированных
|ИЗ
| КорректировкаДвиженийПереопределяемый КАК Потребности
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыДляРаспределенияЗапасовПереопределяемый КАК Фильтр
| ПО Фильтр.Номенклатура = Потребности.Номенклатура
| И Фильтр.Характеристика = Потребности.Характеристика
| И Фильтр.Склад = Потребности.Склад
| И Фильтр.Назначение = Потребности.Назначение";
Текст = СтрЗаменить(Текст, "КорректировкаДвиженийПереопределяемый", ИмяТаблицыКорректировки);
Тексты.Добавить(Текст);
ТекстНабора = СтрСоединить(Тексты, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
Текст =
"ВЫБРАТЬ
| Потребности.Номенклатура КАК Номенклатура,
| Потребности.Характеристика КАК Характеристика,
| Потребности.Склад КАК Склад,
| Потребности.Назначение КАК Назначение,
| Потребности.Заказ КАК Заказ,
| Потребности.ДатаСобытия КАК ДатаСобытия,
| СУММА(Потребности.РезервироватьНаСкладе) КАК РезервироватьНаСкладе,
| СУММА(Потребности.РезервироватьПоМереПоступления) КАК РезервироватьПоМереПоступления,
| СУММА(Потребности.ОтложитьРезервирование) КАК ОтложитьРезервирование,
| СУММА(Потребности.КОбеспечению) КАК КОбеспечению,
| СУММА(Потребности.НеОбеспечивать) КАК НеОбеспечивать,
| СУММА(Потребности.РезервироватьНаСкладеИзЗаблокированных) КАК РезервироватьНаСкладеИзЗаблокированных,
| СУММА(Потребности.РезервироватьПоМереПоступленияИзЗаблокированных) КАК РезервироватьПоМереПоступленияИзЗаблокированных
|ПОМЕСТИТЬ ТаблицаПереопределяемый
|ИЗ
| НаборПереопределяемый КАК Потребности
|СГРУППИРОВАТЬ ПО
| Потребности.Номенклатура,
| Потребности.Характеристика,
| Потребности.Склад,
| Потребности.Назначение,
| Потребности.Заказ,
| Потребности.ДатаСобытия
|ИМЕЮЩИЕ
| СУММА(Потребности.РезервироватьНаСкладе) > 0
| ИЛИ СУММА(Потребности.РезервироватьПоМереПоступления) > 0
| ИЛИ СУММА(Потребности.ОтложитьРезервирование) > 0
| ИЛИ СУММА(Потребности.КОбеспечению) > 0
| ИЛИ СУММА(Потребности.НеОбеспечивать) > 0
| ИЛИ СУММА(Потребности.РезервироватьНаСкладеИзЗаблокированных) > 0
| ИЛИ СУММА(Потребности.РезервироватьПоМереПоступленияИзЗаблокированных) > 0";
Текст = СтрЗаменить(Текст, "НаборПереопределяемый", СтрШаблон("(%1)", ТекстНабора));
Текст = СтрЗаменить(Текст, "ПОМЕСТИТЬ ТаблицаПереопределяемый", ТекстПомещенияВТаблицу);
КонецПроцедуры
Процедура ДобавитьИндекс(Текст, Поля)
ТекстыСИндексированием = Новый Массив();
ТекстыСИндексированием.Добавить(Текст);
Текст =
"ИНДЕКСИРОВАТЬ ПО
| Поля"; //@Query-part
ТекстыСИндексированием.Добавить(СтрЗаменить(Текст, "Поля", Поля));
Текст = СтрСоединить(ТекстыСИндексированием, Символы.ПС);
КонецПроцедуры
Процедура ДобавитьВременнуюТаблицуЗапасыЗаблокированные(Запрос)
Запрос.Текст =
"ВЫБРАТЬ
| 0 КАК ВидДвижения,
| 0 КАК ВидЗаписи,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ,
| Таблица.ДатаСобытия КАК ДатаПоступления,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДатаДоступности,
| Таблица.ДатаСобытия КАК ДатаСобытия,
| Таблица.ЗаблокированоВНаличии КАК Количество,
| Таблица.ЗаблокированоВНаличии КАК КоличествоИсходное,
| 0 КАК КоличествоРаспределено,
| ЛОЖЬ КАК Пустая
|ИЗ
| Запасы КАК Таблица
|ГДЕ
// Устраняем некорректные движения, где дата не пустая (чтобы не группировать данные).
| Таблица.ДатаСобытия = ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.ЗаблокированоВНаличии <> 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 0 КАК ВидДвижения,
| 1 КАК ВидЗаписи,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ,
| Таблица.ДатаСобытия КАК ДатаПоступления,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДатаДоступности,
| Таблица.ДатаСобытия КАК ДатаСобытия,
| Таблица.ЗаблокированоПоступит КАК Количество,
| Таблица.ЗаблокированоПоступит КАК КоличествоИсходное,
| 0 КАК КоличествоРаспределено,
| ЛОЖЬ КАК Пустая
|ИЗ
| Запасы КАК Таблица
|ГДЕ
| Таблица.ЗаблокированоПоступит > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 1 КАК ВидДвижения,
| 0 КАК ВидЗаписи,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДатаПоступления,
| Таблица.ДатаСобытия КАК ДатаДоступности,
| Таблица.ДатаСобытия КАК ДатаСобытия,
| Таблица.КРазблокировке КАК Количество,
| Таблица.КРазблокировке КАК КоличествоИсходное,
| 0 КАК КоличествоРаспределено,
| ИСТИНА КАК Пустая
|ИЗ
| Запасы КАК Таблица
|ГДЕ
| Таблица.КРазблокировке > 0
|УПОРЯДОЧИТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение, Заказ, ВидДвижения, ВидЗаписи, ДатаСобытия";
Таблица = Запрос.Выполнить().Выгрузить();
Таблица.Колонки.Добавить("Индекс1", Новый ОписаниеТипов("Число")); // первая запись по товару
Таблица.Колонки.Добавить("Индекс2", Новый ОписаниеТипов("Число")); // первая запись К разблокировке по товару, -1 если таких записей нет.
Таблица.Колонки.Добавить("Индекс3", Новый ОписаниеТипов("Число")); // последняя запись по товару
ПоляКлюча = "Номенклатура,Характеристика,Склад,Назначение,Заказ";
Ключ = Новый Структура(ПоляКлюча);
ВерхИндекс = Таблица.Количество() - 1;
Для Индекс = 0 По ВерхИндекс Цикл
Запись = Таблица[Индекс];
Если Ключ.Номенклатура <> Запись.Номенклатура
Или Ключ.Характеристика <> Запись.Характеристика
Или Ключ.Склад <> Запись.Склад
Или Ключ.Назначение <> Запись.Назначение
Или Ключ.Заказ <> Запись.Заказ Тогда
ПерваяЗапись = Запись;
ЗаполнитьЗначенияСвойств(Ключ, ПерваяЗапись);
ПерваяЗапись.Индекс1 = Индекс;
ПерваяЗапись.Индекс2 = -1;
КонецЕсли;
ПерваяЗапись.Индекс3 = Индекс;
Если Запись.ВидДвижения = 1 И ПерваяЗапись.Индекс2 = -1 Тогда
ПерваяЗапись.Индекс2 = Индекс;
КонецЕсли;
КонецЦикла;
// Результат работы цикла:
// Индекс1 - первая запись по товару.
// Индекс3 - последняя запись по товару.
// Индекс2 - первая запись К разблокировке по товару, -1 если таких записей нет.
Индекс = 0;
Пока Индекс <= ВерхИндекс Цикл
Запись = Таблица[Индекс];
Если Запись.Индекс2 <> -1 И Запись.Индекс1 < Запись.Индекс2 Тогда
ТекПриход = Запись.Индекс1;
ТекРасход = Запись.Индекс2;
ЗаписьПриход = Таблица[ТекПриход];
ЗаписьРасход = Таблица[ТекРасход];
ПриходКон = Запись.Индекс2 - 1;
РасходКон = Запись.Индекс3;
Пока Истина Цикл
Пока ЗаписьРасход.Количество = 0 И ТекРасход < РасходКон Цикл
ТекРасход = ТекРасход + 1;
ЗаписьРасход = Таблица[ТекРасход];
КонецЦикла;
Если ЗаписьРасход.Количество = 0 Тогда
Прервать;
КонецЕсли;
Пока ЗаписьПриход.Количество <= 0 И ТекПриход < ПриходКон Цикл
ТекПриход = ТекПриход + 1;
ЗаписьПриход = Таблица[ТекПриход];
КонецЦикла;
Если ЗаписьПриход.Количество <= 0 Тогда
Прервать;
КонецЕсли;
Если ЗаписьПриход.Количество = ЗаписьРасход.Количество Тогда
ЗаписьРасход.Количество = 0;
НоваяЗапись = ЗаписьПриход;
ИначеЕсли ЗаписьПриход.Количество < ЗаписьРасход.Количество Тогда
ЗаписьРасход.Количество = ЗаписьРасход.Количество - Макс(ЗаписьПриход.Количество, 0);
НоваяЗапись = ЗаписьПриход;
Иначе // ЗаписьПриход.Количество > ЗаписьРасход.Количество
ЗаписьПриход.Количество = ЗаписьПриход.Количество - ЗаписьРасход.Количество;
НоваяЗапись = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, ЗаписьПриход);
НоваяЗапись.Количество = ЗаписьРасход.Количество;
ЗаписьРасход.Количество = 0;
КонецЕсли;
НоваяЗапись.ДатаДоступности = ЗаписьРасход.ДатаДоступности;
НоваяЗапись.КоличествоРаспределено = НоваяЗапись.Количество;
НоваяЗапись.Количество = 0;
КонецЦикла;
КонецЕсли;
Индекс = Запись.Индекс3 + 1;
КонецЦикла;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА Таблица.ВидЗаписи = 0 И Таблица.Количество < 0
| ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| КОГДА Таблица.ВидЗаписи = 0 И Таблица.Количество > 0
| ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)
| КОГДА Таблица.ВидЗаписи = 0
| ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| КОГДА Таблица.ВидЗаписи = 1 И Таблица.Количество > 0
| ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке)
| ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой)
| КОНЕЦ КАК СостояниеЗапаса,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК Заказ,
| Таблица.ДатаПоступления КАК ДатаПоступления,
| Таблица.ДатаДоступности КАК ДатаДоступности,
| ВЫБОР
| КОГДА Таблица.Количество <> 0
| ТОГДА Таблица.Количество
| ИНАЧЕ Таблица.КоличествоРаспределено
| КОНЕЦ КАК Количество
|ПОМЕСТИТЬ ЗапасыЗаблокированные
|ИЗ
| &ЗапасыЗаблокированные КАК Таблица
|ГДЕ
| НЕ Таблица.Пустая";
Запрос.УстановитьПараметр("ЗапасыЗаблокированные", Таблица);
Запрос.Выполнить();
КонецПроцедуры
Функция РезультатРаспределенияЗапасов(Запрос, ИмяТаблицыТовары, ВсеТовары, ИменаРегистров)
#Область ВыборкаДанных
РезультатРаспределенияЗапасов = Новый Структура("РаспределениеЗапасов,ДоступныеОстаткиТоваров");
ТекстДоступныеОстаткиТоваров =
// Тексты запросов "Доступные остатки товаров".
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.КонтролируемаяПартия КАК КонтролируемаяПартия,
| Таблица.ВНаличии КАК ВНаличии,
| Таблица.Доступно КАК Доступно,
| НЕ Аналитики.Номенклатура ЕСТЬ NULL КАК АналитикаЕстьВЗаданияхКРасчету
|ИЗ
| ДанныеРегистровДляРасчетаДоступныеОстаткиТоваров КАК Таблица
| ЛЕВОЕ СОЕДИНЕНИЕ ИмяТаблицыТовары КАК Аналитики
| ПО Аналитики.Номенклатура = Таблица.Номенклатура
| И Аналитики.Характеристика = Таблица.Характеристика
| И Аналитики.Склад = Таблица.Склад
| И Аналитики.Назначение = Таблица.Назначение
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| 0 КАК ВНаличии,
| 0 КАК Доступно,
| ИСТИНА КАК АналитикаЕстьВЗаданияхКРасчету
|ИЗ
| ИмяТаблицыТовары КАК Таблица
|ГДЕ
| НЕ ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьЗаписи
| ИЗ
| ДанныеРегистровДляРасчетаДоступныеОстаткиТоваров КАК Фильтр
| ГДЕ
| Фильтр.Номенклатура = Таблица.Номенклатура
| И Фильтр.Характеристика = Таблица.Характеристика
| И Фильтр.Склад = Таблица.Склад
| И Фильтр.Назначение = Таблица.Назначение)
|УПОРЯДОЧИТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение
|;
|
|//////////////////////////////////
|УНИЧТОЖИТЬ ДанныеРегистровДляРасчетаДоступныеОстаткиТоваров";
ТекстДоступныеОстаткиТоваров = СтрЗаменить(ТекстДоступныеОстаткиТоваров, "ИмяТаблицыТовары", ИмяТаблицыТовары);
Если СтрНайти(ИменаРегистров, "ДоступныеОстаткиТоваров") > 0 И СтрНайти(ИменаРегистров, "РаспределениеЗапасов") = 0 Тогда
Запрос.Текст = ТекстДоступныеОстаткиТоваров;
РезультатРаспределенияЗапасов.РаспределениеЗапасов = Неопределено;
РезультатРаспределенияЗапасов.ДоступныеОстаткиТоваров = Запрос.ВыполнитьПакет()[0].Выгрузить();
Возврат РезультатРаспределенияЗапасов;
КонецЕсли;
Текст =
// Потребности.
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаОтгрузку,
| Таблица.ДатаСобытия КАК ЖелаемаяДатаОтгрузки,
| 0 КАК ПорядокХарактеристикиПотребности,
| Таблица.РезервироватьНаСкладеИзЗаблокированных КАК Количество,
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных) КАК ХарактеристикаПотребности,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка) КАК СостояниеЗапаса,
| Таблица.Заказ КАК КонтролируемаяПартия,
| ВЫРАЗИТЬ(ЗаказыРеестра.Приоритет КАК Справочник.Приоритеты).РеквизитДопУпорядочивания КАК ПорядокПоПриоритетуДокумента,
|
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузкиЛибоБезПорядка,
|
| ЗаказыРеестра.ДатаДокументаИБ КАК ПорядокПоДатеДокумента,
|
| ВЫБОР
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузки,
|
| 0 КАК КоличествоПриоритет1,
| 0 КАК КоличествоПриоритет2
|ИЗ
| Потребности КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗаказыРеестра КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Таблица.Заказ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|ГДЕ
| Таблица.РезервироватьНаСкладеИзЗаблокированных > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаОтгрузку,
| Таблица.ДатаСобытия КАК ЖелаемаяДатаОтгрузки,
| 1 КАК ПорядокХарактеристикиПотребности,
| Таблица.РезервироватьПоМереПоступленияИзЗаблокированных КАК Количество,
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных) КАК ХарактеристикаПотребности,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НеОбеспечен) КАК СостояниеЗапаса,
| Таблица.Заказ КАК КонтролируемаяПартия,
| ВЫРАЗИТЬ(ЗаказыРеестра.Приоритет КАК Справочник.Приоритеты).РеквизитДопУпорядочивания КАК ПорядокПоПриоритетуДокумента,
|
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузкиЛибоБезПорядка,
|
| ЗаказыРеестра.ДатаДокументаИБ КАК ПорядокПоДатеДокумента,
|
| ВЫБОР
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузки,
|
| 0 КАК КоличествоПриоритет1,
| 0 КАК КоличествоПриоритет2
|ИЗ
| Потребности КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗаказыРеестра КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Таблица.Заказ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|ГДЕ
| Таблица.РезервироватьПоМереПоступленияИзЗаблокированных > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаОтгрузку,
| Таблица.ДатаСобытия КАК ЖелаемаяДатаОтгрузки,
| 2 КАК ПорядокХарактеристикиПотребности,
| Таблица.РезервироватьНаСкладе КАК Количество,
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе) КАК ХарактеристикаПотребности,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии) КАК СостояниеЗапаса,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| ВЫРАЗИТЬ(ЗаказыРеестра.Приоритет КАК Справочник.Приоритеты).РеквизитДопУпорядочивания КАК ПорядокПоПриоритетуДокумента,
|
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузкиЛибоБезПорядка,
|
| ЗаказыРеестра.ДатаДокументаИБ КАК ПорядокПоДатеДокумента,
|
| ВЫБОР
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузки,
|
| 0 КАК КоличествоПриоритет1,
| 0 КАК КоличествоПриоритет2
|ИЗ
| Потребности КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗаказыРеестра КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Таблица.Заказ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|ГДЕ
| Таблица.РезервироватьНаСкладе > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаОтгрузку,
| Таблица.ДатаСобытия КАК ЖелаемаяДатаОтгрузки,
| 3 КАК ПорядокХарактеристикиПотребности,
| Таблица.РезервироватьПоМереПоступления КАК Количество,
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления) КАК ХарактеристикаПотребности,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НеОбеспечен) КАК СостояниеЗапаса,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| ВЫРАЗИТЬ(ЗаказыРеестра.Приоритет КАК Справочник.Приоритеты).РеквизитДопУпорядочивания КАК ПорядокПоПриоритетуДокумента,
|
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузкиЛибоБезПорядка,
|
| ЗаказыРеестра.ДатаДокументаИБ КАК ПорядокПоДатеДокумента,
|
| ВЫБОР
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузки,
|
| Таблица.ВНаличии КАК КоличествоПриоритет1,
| Таблица.ВНаличииОжидаетсяРазблокировка КАК КоличествоПриоритет2
|ИЗ
| ПотребностиРезервироватьПоМереПоступленияИЗапасыРаспределенныеРанее КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗаказыРеестра КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Таблица.Заказ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаОтгрузку,
| Таблица.ДатаСобытия КАК ЖелаемаяДатаОтгрузки,
| 4 КАК ПорядокХарактеристикиПотребности,
| Таблица.ОтложитьРезервирование КАК Количество,
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование) КАК ХарактеристикаПотребности,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НеОбеспечен) КАК СостояниеЗапаса,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| ВЫРАЗИТЬ(ЗаказыРеестра.Приоритет КАК Справочник.Приоритеты).РеквизитДопУпорядочивания КАК ПорядокПоПриоритетуДокумента,
|
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузкиЛибоБезПорядка,
|
| ЗаказыРеестра.ДатаДокументаИБ КАК ПорядокПоДатеДокумента,
|
| ВЫБОР
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузки,
|
| 0 КАК КоличествоПриоритет1,
| 0 КАК КоличествоПриоритет2
|ИЗ
| Потребности КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗаказыРеестра КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Таблица.Заказ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|ГДЕ
| Таблица.ОтложитьРезервирование > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаОтгрузку,
| Таблица.ДатаСобытия КАК ЖелаемаяДатаОтгрузки,
| 5 КАК ПорядокХарактеристикиПотребности,
| Таблица.КОбеспечению КАК Количество,
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению) КАК ХарактеристикаПотребности,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НеОбеспечен) КАК СостояниеЗапаса,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| ВЫРАЗИТЬ(ЗаказыРеестра.Приоритет КАК Справочник.Приоритеты).РеквизитДопУпорядочивания КАК ПорядокПоПриоритетуДокумента,
|
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузкиЛибоБезПорядка,
|
| ЗаказыРеестра.ДатаДокументаИБ КАК ПорядокПоДатеДокумента,
|
| ВЫБОР
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузки,
|
| 0 КАК КоличествоПриоритет1,
| 0 КАК КоличествоПриоритет2
|ИЗ
| Потребности КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗаказыРеестра КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Таблица.Заказ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|ГДЕ
| Таблица.КОбеспечению > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаОтгрузку,
| Таблица.ДатаСобытия КАК ЖелаемаяДатаОтгрузки,
| 6 КАК ПорядокХарактеристикиПотребности,
| Таблица.НеОбеспечивать КАК Количество,
| ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.НеОбеспечивать) КАК ХарактеристикаПотребности,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НеОбеспечен) КАК СостояниеЗапаса,
| ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
| ВЫРАЗИТЬ(ЗаказыРеестра.Приоритет КАК Справочник.Приоритеты).РеквизитДопУпорядочивания КАК ПорядокПоПриоритетуДокумента,
|
| ВЫБОР
| КОГДА НЕ УпорядочиваниеПоДатеДокумента.Значение ЕСТЬ NULL
| ТОГДА НЕОПРЕДЕЛЕНО
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузкиЛибоБезПорядка,
|
| ЗаказыРеестра.ДатаДокументаИБ КАК ПорядокПоДатеДокумента,
|
| ВЫБОР
| КОГДА Таблица.ДатаСобытия > &КонецТекущегоДня
| ТОГДА Таблица.ДатаСобытия
| ИНАЧЕ ЗаказыРеестра.ДатаДокументаИБ
| КОНЕЦ КАК ПорядокПоДатеОтгрузки,
|
| 0 КАК КоличествоПриоритет1,
| 0 КАК КоличествоПриоритет2
|ИЗ
| Потребности КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗаказыРеестра КАК ЗаказыРеестра
| ПО ЗаказыРеестра.Ссылка = Таблица.Заказ
|
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ВариантУпорядочиванияПотребностейПоЗаказамДляОбеспечения КАК УпорядочиваниеПоДатеДокумента
| ПО УпорядочиваниеПоДатеДокумента.Значение = ЗНАЧЕНИЕ(Перечисление.ВариантыУпорядочиванияПотребностейПоЗаказамДляОбеспечения.ПриоритетИДатаДокумента)
|ГДЕ
| Таблица.НеОбеспечивать > 0
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| Характеристика,
| Склад,
| Назначение,
| ПорядокХарактеристикиПотребности,
| КонтролируемаяПартия,
| ПорядокПоПриоритетуДокумента,
| ПорядокПоДатеОтгрузкиЛибоБезПорядка,
| ПорядокПоДатеДокумента,
| ПорядокПоДатеОтгрузки,
| ЗаказНаОтгрузку
|;
|
|/////////////////////////////////////////////////////////////////
// Запасы.
|ВЫБРАТЬ
| 0 КАК ПорядокПоСостояниюЗапаса,
| 0 КАК ПорядокПоСостояниюЗапасаДополнительный,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии) КАК СостояниеЗапаса,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| НЕОПРЕДЕЛЕНО КАК ЗаказНаПоступление,
| НЕОПРЕДЕЛЕНО КАК КонтролируемаяПартия,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДатаПоступления,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДатаДоступности,
| СУММА(Таблица.ВНаличии - Таблица.ЗаблокированоВНаличии) КАК Количество
|ИЗ
| Запасы КАК Таблица
|ГДЕ
| Таблица.ДатаСобытия = ДАТАВРЕМЯ(1, 1, 1)
|СГРУППИРОВАТЬ ПО
| Таблица.Номенклатура,
| Таблица.Характеристика,
| Таблица.Склад,
| Таблица.Назначение
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВЫБОР
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
| ТОГДА 1
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)
| ТОГДА 2
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой)
| ТОГДА 3
| КОГДА Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке)
| ТОГДА 4
| КОНЕЦ КАК ПорядокПоСостояниюЗапаса,
| 1 КАК ПорядокПоСостояниюЗапасаДополнительный,
| Таблица.СостояниеЗапаса КАК СостояниеЗапаса,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаПоступление,
| ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(Таблица.Заказ) = ТИП(Справочник.КонтролируемыеПартии)
| ТОГДА Таблица.Заказ
| ИНАЧЕ НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК КонтролируемаяПартия,
| Таблица.ДатаПоступления КАК ДатаПоступления,
| Таблица.ДатаДоступности КАК ДатаДоступности,
| Таблица.Количество КАК Количество
|ИЗ
| ЗапасыЗаблокированные КАК Таблица
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 3 КАК ПорядокПоСостояниюЗапаса,
| 0 КАК ПорядокПоСостояниюЗапасаДополнительный,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению) КАК СостояниеЗапаса,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаПоступление,
| НЕОПРЕДЕЛЕНО КАК КонтролируемаяПартия,
| Таблица.ДатаСобытия КАК ДатаПоступления,
| Таблица.ДатаСобытия КАК ДатаДоступности,
| Таблица.Поступит - Таблица.ЗаблокированоПоступит КАК Количество
|ИЗ
| Запасы КАК Таблица
|ГДЕ
| Таблица.Поступит - Таблица.ЗаблокированоПоступит > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 5 КАК ПорядокПоСостояниюЗапаса,
| 0 КАК ПорядокПоСостояниюЗапасаДополнительный,
| ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки) КАК СостояниеЗапаса,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаПоступление,
| НЕОПРЕДЕЛЕНО КАК КонтролируемаяПартия,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДатаПоступления,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДатаДоступности,
| Таблица.Заказано - Таблица.Поступит КАК Количество
|ИЗ
| Запасы КАК Таблица
|ГДЕ
| Таблица.ДатаСобытия = ДАТАВРЕМЯ(1, 1, 1)
| И Таблица.Заказано - Таблица.Поступит > 0
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| Характеристика,
| Склад,
| Назначение,
| ПорядокПоСостояниюЗапаса,
| ДатаДоступности,
| ПорядокПоСостояниюЗапасаДополнительный,
| ДатаПоступления,
| ЗаказНаПоступление,
| КонтролируемаяПартия
|;
|
|////////////////////////////////////////////////////////////////////
// Товары.
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| ВЫРАЗИТЬ(-1 КАК ЧИСЛО (10,0)) КАК ПотребностиПервый,
| ВЫРАЗИТЬ(-2 КАК ЧИСЛО (10,0)) КАК ПотребностиПоследний,
| ВЫРАЗИТЬ(-1 КАК ЧИСЛО (10,0)) КАК ЗапасыПервый,
| ВЫРАЗИТЬ(-2 КАК ЧИСЛО (10,0)) КАК ЗапасыПоследний
|ИЗ
| ИмяТаблицыТовары КАК Таблица
|УПОРЯДОЧИТЬ ПО
| Номенклатура, Характеристика, Склад, Назначение
|;
|
|//////////////////////////////////
// ПотребностиРаспределеноНаНесколькоЗаписей.
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Склад КАК Склад,
| Таблица.Назначение КАК Назначение,
| Таблица.Заказ КАК ЗаказНаОтгрузку,
| МАКСИМУМ(Таблица.ВНаличии) КАК КоличествоПриоритет1,
| МАКСИМУМ(Таблица.ВНаличииОжидаетсяРазблокировка) КАК КоличествоПриоритет2
|ИЗ
| ПотребностиРезервироватьПоМереПоступленияИЗапасыРаспределенныеРанее КАК Таблица
|ГДЕ
| (Таблица.ВНаличии > 0 ИЛИ Таблица.ВНаличииОжидаетсяРазблокировка > 0)
| И ИСТИНА В(
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьВтораяЗапись
| ИЗ
| ПотребностиРезервироватьПоМереПоступленияИЗапасыРаспределенныеРанее КАК ЭтаЖеТаблица
| ГДЕ
| ЭтаЖеТаблица.Номенклатура = Таблица.Номенклатура
| И ЭтаЖеТаблица.Характеристика = Таблица.Характеристика
| И ЭтаЖеТаблица.Склад = Таблица.Склад
| И ЭтаЖеТаблица.Назначение = Таблица.Назначение
| И ЭтаЖеТаблица.Заказ = Таблица.Заказ
| И ЭтаЖеТаблица.ДатаСобытия <> Таблица.ДатаСобытия)
|СГРУППИРОВАТЬ ПО
| Таблица.Номенклатура,
| Таблица.Характеристика,
| Таблица.Склад,
| Таблица.Назначение,
| Таблица.Заказ
|;
|
|//////////////////////////////////////////////////////
|УНИЧТОЖИТЬ Запасы;
|УНИЧТОЖИТЬ ЗапасыЗаблокированные;
|УНИЧТОЖИТЬ ТаблицаЗаказыРеестра;
|УНИЧТОЖИТЬ Потребности;
|УНИЧТОЖИТЬ ПотребностиРезервироватьПоМереПоступленияИЗапасыРаспределенныеРанее;
|УНИЧТОЖИТЬ ЗапасыРаспределенныеРанее;
|УНИЧТОЖИТЬ ПотребностиПоТовару";
Текст = СтрЗаменить(Текст, "ИмяТаблицыТовары", ИмяТаблицыТовары);
Если СтрНайти(ИменаРегистров, "ДоступныеОстаткиТоваров") > 0 Тогда
Тексты = Новый Массив();
Тексты.Добавить(Текст);
Тексты.Добавить(ТекстДоступныеОстаткиТоваров);
Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
КонецЕсли;
Запрос.Текст = Текст;
Запрос.УстановитьПараметр("КонецТекущегоДня", КонецДня(ТекущаяДатаСеанса()));
Результат = Запрос.ВыполнитьПакет();
Потребности = Результат[0].Выгрузить();
Запасы = Результат[1].Выгрузить();
Товары = Результат[2].Выгрузить();
ПотребностиРаспределеноНаНесколькоЗаписей = Результат[3].Выгрузить();
ПоляКлюча = "Номенклатура,Характеристика,Склад,Назначение,ЗаказНаОтгрузку";
КлючПоиска = Новый Структура(ПоляКлюча);
ПотребностиРаспределеноНаНесколькоЗаписей.Индексы.Добавить(ПоляКлюча);
ДоступныеОстаткиТоваров = Неопределено;
Если СтрНайти(ИменаРегистров, "ДоступныеОстаткиТоваров") > 0 Тогда
ДоступныеОстаткиТоваров = Результат[Результат.ВГраница() - 1].Выгрузить();
КонецЕсли;
Набор = РегистрыСведений.РаспределениеЗапасов.СоздатьНаборЗаписей();
Если ВсеТовары Тогда
Потребности.Колонки.Добавить("Пустая", Новый ОписаниеТипов("Булево"));
КонецЕсли;
Потребности.Колонки.Добавить("ЗаказНаПоступление", Набор.Метаданные().Измерения.ЗаказНаПоступление.Тип);
Потребности.Колонки.Добавить("ДатаПоступления", Набор.Метаданные().Измерения.ДатаПоступления.Тип);
Потребности.Колонки.Добавить("ДатаДоступности", Набор.Метаданные().Измерения.ДатаДоступности.Тип);
Потребности.Колонки.Добавить("НайденаВТаблицеНесколькоЗаписей", Новый ОписаниеТипов("Булево"));
Потребности.Колонки.Добавить("ВсеРаспределено", Новый ОписаниеТипов("Булево"));
Потребности.Колонки.Добавить("Количество0", Набор.Метаданные().Ресурсы.Количество.тип);
Потребности.Колонки.Добавить("Количество1", Набор.Метаданные().Ресурсы.Количество.тип);
#КонецОбласти
// Таблица Товары должна содержать все аналитики Номенклатура+Характеристика+Склад+Назначение, которые встречаются в
// таблицах Потребности и Запасы. Все три таблицы должны быть упорядочены по этим аналитикам.
ЗаполнитьИндексыВТаблицеТовары(Товары, Потребности, "ПотребностиПервый", "ПотребностиПоследний");
ЗаполнитьИндексыВТаблицеТовары(Товары, Запасы, "ЗапасыПервый", "ЗапасыПоследний");
// Потребности упорядочены по полю ПорядокХарактеристикиПотребности
// 0 - ПеречислениеСсылка.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных
// 1 - ПеречислениеСсылка.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных
// 2 - ПеречислениеСсылка.ХарактеристикиПотребности.РезервироватьНаСкладе
// 3 - ПеречислениеСсылка.ХарактеристикиПотребности.РезервироватьПоМереПоступления
// 4 - ПеречислениеСсылка.ХарактеристикиПотребности.ОтложитьРезервирование
// 5 - ПеречислениеСсылка.ХарактеристикиПотребности.КОбеспечению
// 6 - ПеречислениеСсылка.ХарактеристикиПотребности.НеОбеспечивать
// Запасы упорядочены по полю ПорядокПоСостояниюЗапаса
// 0 - ПеречислениеСсылка.СостоянияЗапаса.ВНаличии
// 1 - ПеречислениеСсылка.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка
// 2 - ПеречислениеСсылка.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке
// 3 - ПеречислениеСсылка.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой, доп. упорядочивание по дате доступности
// 3 - ПеречислениеСсылка.СостоянияЗапаса.ОжидаетсяКПоступлению, доп. упорядочивание по дате доступности
// 4 - ПеречислениеСсылка.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке
// 5 - ПеречислениеСсылка.СостоянияЗапаса.НаСогласованииПоставки
ЗаполняемыеПоляЗапаса = "ЗаказНаПоступление,СостояниеЗапаса,ДатаПоступления,ДатаДоступности";
ОбщиеЗаполняемыеПоля = "Номенклатура,Характеристика,Склад,Назначение";
ДобавленоСтрок = 0;
ЗначениеИзлишек = Перечисления.ХарактеристикиПотребности.Излишек;
ЗначениеВНаличии = Перечисления.СостоянияЗапаса.ВНаличии;
ЗначениеВНаличииОжидаетсяРазблокировка = Перечисления.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка;
Для ИндексТовары = 0 По Товары.Количество() - 1 Цикл
Строка = Товары[ИндексТовары];
ПотребностиПервый = Строка.ПотребностиПервый + ДобавленоСтрок;
ПотребностиПоследний = Строка.ПотребностиПоследний + ДобавленоСтрок;
Запись0 = Неопределено;
Если Строка.ЗапасыПервый <> -1 И Запасы[Строка.ЗапасыПервый].ПорядокПоСостояниюЗапаса = 0 Тогда
Запись0 = Запасы[Строка.ЗапасыПервый];
КонецЕсли;
#Область ОбработкаЗапасов
СоответствиеПартий = Новый Соответствие();
Для ИндексЗапас = Строка.ЗапасыПервый По Строка.ЗапасыПоследний Цикл
Запас = Запасы[ИндексЗапас];
Если ЗначениеЗаполнено(Запас.КонтролируемаяПартия) Тогда
Партия = СоответствиеПартий.Получить(Запас.КонтролируемаяПартия);
Если Партия = Неопределено Тогда
Партия = Новый Структура();
Партия.Вставить("ВсеЗаписи", Новый Массив());
Партия.Вставить("Запись1", Новый Массив());
Партия.Вставить("Запись2", Новый Массив());
Партия.Вставить("РезервВМинус", Неопределено);
Партия.Вставить("Количество1", 0);
Партия.Вставить("Количество2", 0);
СоответствиеПартий.Вставить(Запас.КонтролируемаяПартия, Партия);
КонецЕсли;
Партия.ВсеЗаписи.Добавить(Запас);
Если Запас.ПорядокПоСостояниюЗапаса = 1 Тогда
Партия.Запись1.Добавить(Запас);
Партия.Количество1 = Партия.Количество1 + Макс(0, Запас.Количество);
ИначеЕсли Запас.ПорядокПоСостояниюЗапаса = 2 Тогда
Партия.Запись2.Добавить(Запас);
Партия.Количество2 = Партия.Количество2 + Макс(0, Запас.Количество);
КонецЕсли;
КонецЕсли;
КонецЦикла;
#КонецОбласти
Если Строка.ПотребностиПервый = -1 И Строка.ЗапасыПервый = -1 Тогда // нет запасов, нет потребностей.
Если ВсеТовары Тогда
// Добавление новых строк в конец таблицы, не мешает следующим товарам создавать непрерывные наборы по аналитикам (номенклатура и т.п.),
// так как по текущему товару других строк в таблице потребностей нет.
ТекущаяЗапись = Потребности.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Строка);
ТекущаяЗапись.Пустая = Истина;
КонецЕсли;
Иначе
// Потребности.
Если Строка.ПотребностиПервый <> -1 Тогда
ЕстьРезервироватьПоМере = Ложь;
Для ИндексПотребность = ПотребностиПервый По ПотребностиПоследний Цикл
Потребность = Потребности[ИндексПотребность];
Если Потребность.ПорядокХарактеристикиПотребности = 0 Тогда
#Область РезервироватьНаСкладеИзЗаблокированных
Партия = СоответствиеПартий.Получить(Потребность.КонтролируемаяПартия);
Если Партия = Неопределено Тогда
Партия = Новый Структура();
Партия.Вставить("ВсеЗаписи", Новый Массив());
Партия.Вставить("Запись1", Новый Массив());
Партия.Вставить("Запись2", Новый Массив());
Партия.Вставить("РезервВМинус", Неопределено);
Партия.Вставить("Количество1", 0);
Партия.Вставить("Количество2", 0);
СоответствиеПартий.Вставить(Потребность.КонтролируемаяПартия, Партия);
КонецЕсли;
Распределить1 = Мин(Партия.Количество1, Потребность.Количество);
Распределить2 = Мин(Потребность.Количество - Распределить1, Партия.Количество2);
Распределить3 = Потребность.Количество - Распределить1 - Распределить2;
Партия.Количество1 = Партия.Количество1 - Распределить1;
ИндексЗапасПартии = 0;
Пока Распределить1 > 0 И ИндексЗапасПартии < Партия.Запись1.Количество() Цикл
Запас = Партия.Запись1[ИндексЗапасПартии];
Если Запас.Количество <= 0 Тогда
ИндексЗапасПартии = ИндексЗапасПартии + 1;
Продолжить;
КонецЕсли;
РаспределитьТекущее = Мин(Макс(0, Запас.Количество), Распределить1);
Распределить1 = Распределить1 - РаспределитьТекущее;
Если РаспределитьТекущее >= Потребность.Количество Тогда
ТекущаяЗапись = Потребность;
Иначе
Потребность.Количество = Потребность.Количество - РаспределитьТекущее;
ТекущаяЗапись = Потребности.Вставить(ПотребностиПоследний + 1);
ДобавленоСтрок = ДобавленоСтрок + 1;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Потребность);
ТекущаяЗапись.Количество = РаспределитьТекущее;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Запас, ЗаполняемыеПоляЗапаса);
Запас.Количество = Запас.Количество - РаспределитьТекущее;
КонецЦикла;
ИндексЗапасПартии = 0;
Пока Распределить2 > 0 И ИндексЗапасПартии < Партия.Запись2.Количество() Цикл
Запас = Партия.Запись2[ИндексЗапасПартии];
Если Запас.Количество <= 0 Тогда
ИндексЗапасПартии = ИндексЗапасПартии + 1;
Продолжить;
КонецЕсли;
РаспределитьТекущее = Мин(Макс(0, Запас.Количество), Распределить2);
Распределить2 = Распределить2 - РаспределитьТекущее;
Если РаспределитьТекущее >= Потребность.Количество Тогда
ТекущаяЗапись = Потребность;
Иначе
Потребность.Количество = Потребность.Количество - РаспределитьТекущее;
ТекущаяЗапись = Потребности.Вставить(ПотребностиПоследний + 1);
ДобавленоСтрок = ДобавленоСтрок + 1;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Потребность);
ТекущаяЗапись.Количество = РаспределитьТекущее;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Запас, ЗаполняемыеПоляЗапаса);
Запас.Количество = Запас.Количество - РаспределитьТекущее;
КонецЦикла;
Если Распределить3 > 0 Тогда // отрицательный излишек.
Потребность.ЗаказНаПоступление = Потребность.КонтролируемаяПартия;
Если Партия.РезервВМинус = Неопределено Тогда
Партия.РезервВМинус = Потребности.Вставить(ПотребностиПоследний + 1);
ТекущаяЗапись = Партия.РезервВМинус;
ДобавленоСтрок = ДобавленоСтрок + 1;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Потребность, ОбщиеЗаполняемыеПоля);
ТекущаяЗапись.ЗаказНаПоступление = Потребность.КонтролируемаяПартия;
ТекущаяЗапись.СостояниеЗапаса = ЗначениеВНаличииОжидаетсяРазблокировка;
ТекущаяЗапись.Количество = 0;
ТекущаяЗапись.ХарактеристикаПотребности = ЗначениеИзлишек;
КонецЕсли;
Партия.РезервВМинус.Количество = Партия.РезервВМинус.Количество - Распределить3;
КонецЕсли;
#КонецОбласти
ИначеЕсли Потребность.ПорядокХарактеристикиПотребности = 1 Тогда
#Область РезервироватьПоМереПоступленияИзЗаблокированных
Партия = СоответствиеПартий.Получить(Потребность.КонтролируемаяПартия);
Последний = ?(Партия = Неопределено, -1, Партия.ВсеЗаписи.Количество() - 1);
ИндексЗапасПартии = 0;
ВсеРаспределено = Ложь;
Пока ИндексЗапасПартии <= Последний Цикл
Запас = Партия.ВсеЗаписи[ИндексЗапасПартии];
Если Запас.Количество <= 0 Тогда
ИндексЗапасПартии = ИндексЗапасПартии + 1;
Продолжить;
КонецЕсли;
ВсеРаспределено = Ложь;
Если Запас.Количество >= Потребность.Количество Тогда
ТекущаяЗапись = Потребность;
ВсеРаспределено = Истина;
Иначе
Потребность.Количество = Потребность.Количество - Запас.Количество;
ТекущаяЗапись = Потребности.Вставить(ПотребностиПоследний + 1);
ДобавленоСтрок = ДобавленоСтрок + 1;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Потребность);
ТекущаяЗапись.Количество = Запас.Количество;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Запас, ЗаполняемыеПоляЗапаса);
Запас.Количество = Запас.Количество - ТекущаяЗапись.Количество;
Если Запас.ПорядокПоСостояниюЗапаса = 1 Тогда
Партия.Количество1 = Партия.Количество1 - ТекущаяЗапись.Количество;
КонецЕсли;
Если ВсеРаспределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
#КонецОбласти
ИначеЕсли Потребность.ПорядокХарактеристикиПотребности = 2 Тогда
#Область РезервироватьНаСкладе
Если Запись0 = Неопределено Тогда
Запись0 = Потребности.Вставить(ПотребностиПоследний + 1);
ДобавленоСтрок = ДобавленоСтрок + 1;
ЗаполнитьЗначенияСвойств(Запись0, Потребность, ОбщиеЗаполняемыеПоля);
Запись0.СостояниеЗапаса = ЗначениеВНаличии;
Запись0.Количество = 0;
Запись0.ХарактеристикаПотребности = ЗначениеИзлишек;
КонецЕсли;
Запись0.Количество = Запись0.Количество - Потребность.Количество;
#КонецОбласти
Иначе
ЕстьРезервироватьПоМере = Потребность.ПорядокХарактеристикиПотребности = 3;
ПотребностиПервый = ИндексПотребность;
Прервать;
КонецЕсли;
КонецЦикла;
#Область СкладскиеЗапасыНаРезервироватьПоМереПоступления
Количество0 = Макс(0, ?(Запись0 = Неопределено, 0, Запись0.Количество));
Количество1 = 0;
Для Каждого КлючИЗначение Из СоответствиеПартий Цикл
Количество1 = Количество1 + Макс(0, КлючИЗначение.Значение.Количество1);
КонецЦикла;
Если ЕстьРезервироватьПоМере И (Количество0 > 0 Или Количество1 > 0) Тогда
// Расчет Потребность.Количество0 и Потребность.Количество1;
Для НомерПрохода = 1 По 3 Цикл
Для ИндексПотребность = ПотребностиПервый По ПотребностиПоследний Цикл
Потребность = Потребности[ИндексПотребность];
Если Потребность.ПорядокХарактеристикиПотребности <> 3 Тогда
Прервать;
КонецЕсли;
ЗаполнитьЗначенияСвойств(КлючПоиска, Потребность);
НайденныеСтроки = ПотребностиРаспределеноНаНесколькоЗаписей.НайтиСтроки(КлючПоиска);
Приемник = ?(НомерПрохода < 3 И НайденныеСтроки.Количество() > 0, НайденныеСтроки[0], Потребность);
ТекущаяПотребность = ?(НомерПрохода = 1, Приемник.КоличествоПриоритет1, ?(НомерПрохода = 2, Приемник.КоличествоПриоритет2, Потребность.Количество));
// Заказ мог быть уменьшен а резервы остались.
ТекущаяПотребность = Мин(ТекущаяПотребность, Потребность.Количество - Потребность.Количество0 - Потребность.Количество1);
Распределить0 = Мин(ТекущаяПотребность, Количество0);
Количество0 = Количество0 - Распределить0;
ТекущаяПотребность = ТекущаяПотребность - Распределить0;
Распределить1 = Мин(ТекущаяПотребность, Количество1);
Количество1 = Количество1 - Распределить1;
// Важно, если потребность по заказу задана несколькими строками.
Если НомерПрохода = 1 Тогда
Приемник.КоличествоПриоритет1 = Приемник.КоличествоПриоритет1 - Распределить0 - Распределить1;
ИначеЕсли НомерПрохода = 2 Тогда
Приемник.КоличествоПриоритет2 = Приемник.КоличествоПриоритет2 - Распределить0 - Распределить1;
КонецЕсли;
Потребность.Количество0 = Потребность.Количество0 + Распределить0;
Потребность.Количество1 = Потребность.Количество1 + Распределить1;
Если Количество0 = 0 И Количество1 = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если Количество0 = 0 И Количество1 = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
// Приоритетное распределение складских запасов.
ИндексЗапасы = Строка.ЗапасыПервый;
Для ИндексПотребность = ПотребностиПервый По ПотребностиПоследний Цикл
Потребность = Потребности[ИндексПотребность];
Если Потребность.ПорядокХарактеристикиПотребности <> 3 Тогда
Прервать;
КонецЕсли;
Распределить = Потребность.Количество0;
Запас = Запись0;
Если Распределить > 0 Тогда
Если Распределить >= Потребность.Количество Тогда
ТекущаяЗапись = Потребность;
Потребность.ВсеРаспределено = Истина;
Иначе
Потребность.Количество = Потребность.Количество - Распределить;
ТекущаяЗапись = Потребности.Вставить(ПотребностиПоследний + 1);
ДобавленоСтрок = ДобавленоСтрок + 1;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Потребность);
ТекущаяЗапись.Количество = Распределить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Запас, ЗаполняемыеПоляЗапаса);
Запас.Количество = Запас.Количество - Распределить;
КонецЕсли;
РаспределитьВсего = Потребность.Количество1;
Пока РаспределитьВсего > 0 И ИндексЗапасы <= Строка.ЗапасыПоследний Цикл
Запас = Запасы[ИндексЗапасы];
Если Запас.Количество <= 0 Или Запас.ПорядокПоСостояниюЗапаса = 0 Тогда
ИндексЗапасы = ИндексЗапасы + 1;
Продолжить;
КонецЕсли;
Если Запас.ПорядокПоСостояниюЗапаса <> 1 Тогда
Прервать;
КонецЕсли;
Распределить = Мин(РаспределитьВсего, Запас.Количество);
РаспределитьВсего = РаспределитьВсего - Распределить;
Если Распределить >= Потребность.Количество Тогда
ТекущаяЗапись = Потребность;
Потребность.ВсеРаспределено = Истина;
Иначе
Потребность.Количество = Потребность.Количество - Распределить;
ТекущаяЗапись = Потребности.Вставить(ПотребностиПоследний + 1);
ДобавленоСтрок = ДобавленоСтрок + 1;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Потребность);
ТекущаяЗапись.Количество = Распределить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Запас, ЗаполняемыеПоляЗапаса);
Запас.Количество = Запас.Количество - Распределить;
КонецЦикла;
КонецЦикла;
КонецЕсли;
#КонецОбласти
#Область РаспределениеЗапасовОбщее
ИндексЗапасы = Строка.ЗапасыПервый;
Для ИндексПотребность = ПотребностиПервый По ПотребностиПоследний Цикл
Потребность = Потребности[ИндексПотребность];
Если Потребность.ПорядокХарактеристикиПотребности = 3 И Потребность.ВсеРаспределено Тогда
Продолжить;
КонецЕсли;
Если Потребность.ПорядокХарактеристикиПотребности <> 3
И Потребность.ПорядокХарактеристикиПотребности <> 4
И Потребность.ПорядокХарактеристикиПотребности <> 5 Тогда
Прервать;
КонецЕсли;
Пока ИндексЗапасы <= Строка.ЗапасыПоследний Цикл
Запас = Запасы[ИндексЗапасы];
Если Запас.Количество <= 0
// Запасы не подлежащие разблокировке.
Или Запас.ПорядокПоСостояниюЗапаса = 2
Или Запас.ПорядокПоСостояниюЗапаса = 4 Тогда
ИндексЗапасы = ИндексЗапасы + 1;
Продолжить;
КонецЕсли;
ВсеРаспределено = Ложь;
Распределить = Запас.Количество;
Если Распределить >= Потребность.Количество Тогда
ТекущаяЗапись = Потребность;
ВсеРаспределено = Истина;
Иначе
Потребность.Количество = Потребность.Количество - Распределить;
ТекущаяЗапись = Потребности.Вставить(ПотребностиПоследний + 1);
ДобавленоСтрок = ДобавленоСтрок + 1;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Потребность);
ТекущаяЗапись.Количество = Распределить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Запас, ЗаполняемыеПоляЗапаса);
Запас.Количество = Запас.Количество - ТекущаяЗапись.Количество;
Если ВсеРаспределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
#КонецОбласти
КонецЕсли;
// Излишки.
ИндексЗапасы = Строка.ЗапасыПервый;
Пока ИндексЗапасы <= Строка.ЗапасыПоследний Цикл
Запас = Запасы[ИндексЗапасы];
ИндексЗапасы = ИндексЗапасы + 1;
Если Запас.Количество = 0 Тогда
Продолжить;
КонецЕсли;
Если Строка.ПотребностиПервый = -1 Тогда
// Добавление новых строк в конец таблицы, не мешает следующим товарам создавать непрерывные наборы по аналитикам (номенклатура и т.п.),
// так как по текущему товару других строк в таблице потребностей нет.
ТекущаяЗапись = Потребности.Добавить();
Иначе
ТекущаяЗапись = Потребности.Вставить(ПотребностиПоследний + 1);
ДобавленоСтрок = ДобавленоСтрок + 1;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяЗапись, Запас);
ТекущаяЗапись.ХарактеристикаПотребности = ЗначениеИзлишек;
КонецЦикла;
КонецЕсли;
КонецЦикла; // Товары
РезультатРаспределенияЗапасов.РаспределениеЗапасов = Потребности;
РезультатРаспределенияЗапасов.ДоступныеОстаткиТоваров = ДоступныеОстаткиТоваров;
Возврат РезультатРаспределенияЗапасов;
КонецФункции
Процедура ЗаполнитьИндексыВТаблицеТовары(Товары, Таблица, Первый, Последний)
ИндексТовары = 0;
Для Индекс = 0 По Таблица.Количество() - 1 Цикл
Запись = Таблица[Индекс];
Пока Истина Цикл
Товар = Товары[ИндексТовары];
Если Товар.Номенклатура = Запись.Номенклатура
И Товар.Характеристика = Запись.Характеристика
И Товар.Склад = Запись.Склад
И Товар.Назначение = Запись.Назначение Тогда
Прервать;
КонецЕсли;
ИндексТовары = ИндексТовары + 1;
КонецЦикла;
Если Товар[Первый] = -1 Тогда
Товар[Первый] = Индекс;
КонецЕсли;
Товар[Последний] = Индекс;
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьРезультатРаспределенияЗапасов(Результат)
Набор = РегистрыСведений.РаспределениеЗапасов.СоздатьНаборЗаписей();
Поля = "Номенклатура,Характеристика,Склад,Назначение";
Отбор = Новый Структура(Поля);
Таблица = Результат.РаспределениеЗапасов;
Для Индекс = 0 По Таблица.Количество() - 1 Цикл
Строка = Таблица[Индекс];
Если Отбор.Номенклатура <> Строка.Номенклатура
Или Отбор.Характеристика <> Строка.Характеристика
Или Отбор.Склад <> Строка.Склад
Или Отбор.Назначение <> Строка.Назначение Тогда
Если Отбор.Номенклатура <> Неопределено Тогда
Набор.Записать();
КонецЕсли;
ЗаполнитьЗначенияСвойств(Отбор, Строка);
Набор.Очистить();
Набор.Отбор.Номенклатура.Установить(Отбор.Номенклатура);
Набор.Отбор.Характеристика.Установить(Отбор.Характеристика);
Набор.Отбор.Склад.Установить(Отбор.Склад);
Набор.Отбор.Назначение.Установить(Отбор.Назначение);
КонецЕсли;
Если Не Строка.Пустая Тогда
ЗаполнитьЗначенияСвойств(Набор.Добавить(), Строка);
КонецЕсли;
КонецЦикла;
Если Таблица.Количество() > 0 Тогда
Набор.Записать();
КонецЕсли;
Таблица = Результат.ДоступныеОстаткиТоваров;
Набор = РегистрыСведений.ДоступныеОстаткиТоваров.СоздатьНаборЗаписей();
Для Индекс = 0 По Таблица.Количество() - 1 Цикл
Строка = Таблица[Индекс];
Набор.Очистить();
Набор.Отбор.Номенклатура.Установить(Строка.Номенклатура);
Набор.Отбор.Характеристика.Установить(Строка.Характеристика);
Набор.Отбор.Склад.Установить(Строка.Склад);
Набор.Отбор.Назначение.Установить(Строка.Назначение);
Набор.Отбор.КонтролируемаяПартия.Установить(Строка.КонтролируемаяПартия);
Если Строка.ВНаличии <> 0 Или Строка.Доступно <> 0 Тогда
ЗаполнитьЗначенияСвойств(Набор.Добавить(), Строка);
КонецЕсли;
Набор.Записать();
КонецЦикла;
КонецПроцедуры
Функция РаспределениеЗапасовПоТоварам(Запрос, ИмяТаблицыТовары, ВсеТовары, ИменаРегистров, ИмяТаблицыРеестрДокументов = Неопределено, ИмяТаблицыКорректировки = Неопределено)
ВременныеТаблицыДанныхРегистров(Запрос, ИмяТаблицыТовары, ИменаРегистров, ИмяТаблицыРеестрДокументов, ИмяТаблицыКорректировки);
Если СтрНайти(ИменаРегистров, "РаспределениеЗапасов") > 0 Тогда
ДобавитьВременнуюТаблицуЗапасыЗаблокированные(Запрос);
КонецЕсли;
Результат = РезультатРаспределенияЗапасов(Запрос, ИмяТаблицыТовары, ВсеТовары, ИменаРегистров); // Структура
Возврат Результат;
КонецФункции
Процедура СообщитьОНеудачнойОбработкеНоменклатуры(ИнформацияОбОшибке, ТекстСообщения)
ТекстСообщения = НСтр("ru = 'Задание распределения запасов завершилось неудачно по причине: %Причина%'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
СобытиеЖурнала = НСтр("ru = 'Распределение запасов'", ОбщегоНазначения.КодОсновногоЯзыка());
ЗаписьЖурналаРегистрации(СобытиеЖурнала,
УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.РаспределениеЗапасов,, ТекстСообщения);
КонецПроцедуры
#КонецОбласти