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