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