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