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