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