Диспетчирование, сборка и доставка / Форма / Модуль формы

файл

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Диспетчер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователи.ТекущийПользователь(), "ФизическоеЛицо");
	
	СтруктураБыстрогоОтбора = Неопределено;
	Параметры.Свойство("СтруктураБыстрогоОтбора", СтруктураБыстрогоОтбора);

	СписокЗаказов.Параметры.УстановитьЗначениеПараметра("ДатаАктуальности", НачалоДня(ТекущаяДатаСеанса()));

	ОтборыСписковКлиентСервер.ЗаполнитьСписокВыбораОтбораПоАктуальности(Элементы.ОтборСрокВыполнения.СписокВыбора);
	ОтборыСписковКлиентСервер.ОтборПоАктуальностиПриСозданииНаСервере(СписокЗаказов, Актуальность, Элементы.ОтборСрокВыполнения.СписокВыбора, ДатаСобытия, СтруктураБыстрогоОтбора);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	ЗаполнитьКурьеровИСборщиков();
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокЗаказов, "Статус", Статус, ВидСравненияКомпоновкиДанных.Равно,, ЗначениеЗаполнено(Статус));
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокЗаказов, "ДатаСобытия", ДатаСобытия, ВидСравненияКомпоновкиДанных.Равно,, ЗначениеЗаполнено(ДатаСобытия));
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокЗаказов, "Склад", СкладОтбор, ВидСравненияКомпоновкиДанных.Равно,, ЗначениеЗаполнено(СкладОтбор));
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокЗаказов, "ЗонаДоставки", ЗонаДоставки, ВидСравненияКомпоновкиДанных.Равно,, ЗначениеЗаполнено(ЗонаДоставки));

КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)

	ОтборыСписковКлиентСервер.ОтборПоАктуальностиПриЗагрузкеИзНастроек(СписокЗаказов, Актуальность, Элементы.ОтборСрокВыполнения.СписокВыбора, ДатаСобытия, СтруктураБыстрогоОтбора, Настройки);

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОтборСрокВыполненияПриИзменении(Элемент)

	ОтборыСписковКлиентСервер.ПриИзмененииОтбораПоАктуальности(СписокЗаказов, Актуальность, ДатаСобытия, Элементы.ОтборСрокВыполнения.СписокВыбора);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтборСрокВыполненияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	ОбщегоНазначенияУТКлиент.ПриВыбореОтбораПоАктуальности(
		ВыбранноеЗначение, 
		СтандартнаяОбработка, 
		ЭтотОбъект,
		СписокЗаказов, 
		"Актуальность",
		"ОтборСрокВыполнения",
		"ДатаСобытия");
	
КонецПроцедуры

&НаКлиенте
Процедура ОтборСрокВыполненияОчистка(Элемент, СтандартнаяОбработка)
	
	ОтборыСписковКлиентСервер.ПриОчисткеОтбораПоАктуальности(СписокЗаказов, Актуальность, ДатаСобытия, СтандартнаяОбработка);
	ЗаполнитьКурьеровИСборщиков();
	Если НЕ ЗначениеЗаполнено(Актуальность) Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура СтатусПриИзменении(Элемент)

	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокЗаказов, "Статус", Статус, ВидСравненияКомпоновкиДанных.Равно,, ЗначениеЗаполнено(Статус));

КонецПроцедуры

&НаКлиенте
Процедура СкладПриИзменении(Элемент)

	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокЗаказов, "Склад", СкладОтбор, ВидСравненияКомпоновкиДанных.Равно,, ЗначениеЗаполнено(СкладОтбор));
	ЗаполнитьКурьеровИСборщиков();

КонецПроцедуры

&НаКлиенте
Процедура ЗонаДоставкиПриИзменении(Элемент)

	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокЗаказов, "ЗонаДоставки", ЗонаДоставки, ВидСравненияКомпоновкиДанных.Равно,, ЗначениеЗаполнено(ЗонаДоставки));

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокЗаказов

&НаКлиенте
Процедура СписокЗаказовПриАктивизацииСтроки(Элемент)
	ТекущееРаспоряжение = Элемент.ТекущаяСтрока;
	ПодключитьОбработчикОжидания("ОбработатьАктивизациюСтрокиСписка", 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(СтатусыСборкиИДоставки.Статус, ЗНАЧЕНИЕ(Перечисление.СтатусыСборкиИДоставки.ПустаяСсылка)) КАК Статус
	|ИЗ
	|	Документ.ЗаказКлиента КАК ЗаказКлиента
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСборкиИДоставки КАК СтатусыСборкиИДоставки
	|		ПО ЗаказКлиента.Ссылка = СтатусыСборкиИДоставки.Распоряжение
	|ГДЕ
	|	ЗаказКлиента.Ссылка В(&Распоряжения)";

	Запрос.УстановитьПараметр("Распоряжения", Распоряжения);
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат Статусы;
	КонецЕсли;

	Выборка = Результат.Выбрать();
	Пока Выборка.Следующий() Цикл
		Статусы.Вставить(Выборка.Распоряжение, Выборка.Статус);
	КонецЦикла;
	Возврат Статусы;

КонецФункции

#КонецОбласти

Связанные материалы