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

файл

#Область ОписаниеПеременных

&НаКлиенте
Перем ВыполняетсяЗакрытие Экспорт;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	
	// Пропускаем инициализацию, чтобы гарантировать получение формы при передаче параметра "АвтоТест".
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Параметры.Владелец) Тогда
		ВызватьИсключение НСтр("ru='Предусмотрено открытие обработки только из документов.'");
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(Объект, Параметры);
	
	Параметры.Свойство("МенеджерОбъекта", МенеджерОбъекта);
	Параметры.Свойство("ХозяйственнаяОперация", ХозяйственнаяОперация);
	Параметры.Свойство("СвернутьНомераГТД", СвернутьНомераГТД);
	Параметры.Свойство("АдресПлатежейВХранилище", АдресПлатежейВХранилище);
	Параметры.Свойство("ПоРезультатамИнвентаризации", ПоРезультатамИнвентаризации);
	Параметры.Свойство("ИспользоватьУчетПрослеживаемыхИмпортныхТоваров", ИспользоватьУчетПрослеживаемыхИмпортныхТоваров);
	Параметры.Свойство("КомиссионерНеВедетУчетПоРНПТ", КомиссионерНеВедетУчетПоРНПТ);
	
	УстановитьУсловноеОформление();
	
	Если ПоРезультатамИнвентаризации Тогда
		Элементы.ТоварыКоличествоОсталосьПодобрать.ТолькоПросмотр = Ложь;
		Элементы.ТоварыКоличествоОсталосьПодобрать.Заголовок = НСтр("ru = 'Остаток(Факт)'");
		Элементы.ТоварыКоличествоОстаток.Заголовок = НСтр("ru = 'Остаток(Учет)'");
	КонецЕсли;
	
	Параметры.Свойство("Заголовок", Заголовок);
	АвтоЗаголовок = Не ЗначениеЗаполнено(Заголовок);
	
	ЗаполнитьТаблицуТовары();
	
	СформироватьИнформационнуюНадписьОтборы();
	
	СформироватьЗаголовок();
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ЗавершениеРаботы
		И Модифицированность Тогда
		
		Отказ = Истина;
		ТекстПредупреждения = НСтр("ru = 'Данные были изменены. Все изменения будут потеряны.'");
		
		Возврат;
		
	КонецЕсли;
	
	Если ПеренестиВДокумент
		Или ВыполняетсяЗакрытие
		Или Не ТоварыПодобраны Тогда
		
		Возврат;
		
	Иначе
		Отказ = Истина;
		
		ТекстВопроса       = НСтр("ru = 'Подобранные товары не перенесены в документ. Перенести?'");
		ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект);
		
		ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Если ПеренестиВДокумент Тогда
		Структура = Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище());
		
		ОповеститьОВыборе(Структура);
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ТоварыПометкаПриИзменении(Элемент)
	
	Модифицированность = Истина;
	
	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	
	РасчитатьКоличествоВСтроке(Объект.Товары, ТекущиеДанные, ТоварыПодобраны);
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКоличествоПодобраноПриИзменении(Элемент)
	
	Модифицированность = Истина;
	
	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	
	ТекущиеДанные.Пометка = ТекущиеДанные.КоличествоПодобрано > 0;
	
	РасчитатьКоличествоВСтроке(Объект.Товары, ТекущиеДанные, ТоварыПодобраны);
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКоличествоОсталосьПодобратьПриИзменении(Элемент)
	
	Модифицированность = Истина;
	
	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	
	ТекущиеДанные.КоличествоПодобрано = ТекущиеДанные.КоличествоОстаток - ТекущиеДанные.КоличествоОсталосьПодобрать;
	ТекущиеДанные.Пометка = ТекущиеДанные.КоличествоПодобрано > 0;
	
	РасчитатьКоличествоВСтроке(Объект.Товары, ТекущиеДанные, ТоварыПодобраны);
	
КонецПроцедуры
#КонецОбласти

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура ОтметитьВсе(Команда)
	
	ОтметитьВсеНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура СнятьПометку(Команда)
	
	СнятьПометкуНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура Обновить(Команда)
	
	ЗаполнитьТаблицуТовары();
	
КонецПроцедуры

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

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	// Установка условного оформления для элемента 'КоличествоПодобрано' табличной части 'Товары'.
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоПодобрано.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Пометка");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
	
	// Установка условного оформления для элемента 'НомерГТД' табличной части 'Товары'.
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНомерГТД.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СвернутьНомераГТД");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	Если ЗначениеЗаполнено(Объект.Договор)
		И Не СвернутьНомераГТД
		И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Договор, "ТипДоговора") = Перечисления.ТипыДоговоров.СКомиссионером Тогда
		
		УчетПрослеживаемыхТоваровЛокализация.УстановитьУсловноеОформлениеУчетаПоГТДВДокументахКомиссионера(ЭтотОбъект);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТаблицуТовары()
	
	Перем КэшированныеЗначения;
	
	Если Не ПравоДоступа("Чтение", Метаданные.РегистрыНакопления.ТоварыОрганизаций) Тогда
		
		Объект.Товары.Очистить();
		
		Возврат;
		
	Иначе
		
		Если ЗначениеЗаполнено(МенеджерОбъекта) Тогда
			
			МенеджерОбъектаДокумента = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(МенеджерОбъекта);
			Обработчик      = МенеджерОбъектаДокумента.ОбработчикДействий(ХозяйственнаяОперация);
			
			ТекстЗапроса = Обработчик.ТекстЗапросаТоварыПереданные();
			
		Иначе
			ТекстЗапроса = Обработки.ПодборТоваровПереданныхНаОтветственноеХранение.ТекстЗапросаТоварыПереданные();
		КонецЕсли;
		
	КонецЕсли;
	
	Если СвернутьНомераГТД Тогда
		
		УдаляемыеПоля = Новый Массив;
		УдаляемыеПоля.Добавить("НомерГТД");
		УдаляемыеПоля.Добавить("СтранаПроисхождения");
		
		ТекстЗапроса = СхемыЗапросов.УдалитьПоляИзЗапроса(ТекстЗапроса, УдаляемыеПоля);
		
	КонецЕсли;
	
	ДатаПериода = КонецДня(ТекущаяДатаСеанса());
	Период      = Новый Граница(ДатаПериода, ВидГраницы.Включая);
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	
	Запрос.УстановитьПараметр("Период",      Период);
	Запрос.УстановитьПараметр("Организация", Объект.Организация);
	Запрос.УстановитьПараметр("Договор",     Объект.Договор);
	Запрос.УстановитьПараметр("ХозяйственнаяОперация", ХозяйственнаяОперация);
	Запрос.УстановитьПараметр("КомиссионерНеВедетУчетПоРНПТ", СвернутьНомераГТД);
	
	Если ЗначениеЗаполнено(АдресПлатежейВХранилище) Тогда
		Товары = ПолучитьИзВременногоХранилища(АдресПлатежейВХранилище); // ТаблицаЗначений
		Товары.Свернуть("Номенклатура, Характеристика, НомерГТД, Серия", "Количество");
		Запрос.УстановитьПараметр("Товары", Товары);
	КонецЕсли;
	
	Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
	
	СтруктураДействий = Новый Структура();
	СтруктураДействий.Вставить("ЗаполнитьПризнакВедетсяУчетПоГТД", Новый Структура("Номенклатура", "ВедетсяУчетПоГТД"));
	УчетПрослеживаемыхТоваровКлиентСерверЛокализация.ДополнитьОписаниеНастроекЗаполненияСлужебныхРеквизитовТабличнойЧасти(
		СтруктураДействий);
	
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Объект.Товары, СтруктураДействий, КэшированныеЗначения)
	
КонецПроцедуры

&НаСервере
Процедура СформироватьИнформационнуюНадписьОтборы()
	
	Отборы = Новый Массив;
	Отборы.Добавить(Объект.Организация);
	Отборы.Добавить(Объект.Владелец);
	Отборы.Добавить(Объект.Договор);
	
	Если ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.СписаниеНедостачЗаСчетКомитента") 
		Или ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.СписаниеНедостачЗаСчетПоклажедателя")
		Или ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.СписаниеОтгруженныхТоваров") Тогда
		Отборы.Добавить(НСтр("ru='Собственный товар'"));
	КонецЕсли;
	
	ОтборыПредставление = СтрСоединить(Отборы, ", ");
	
	ИнформационнаяНадписьОтборы = НСтр("ru='Отбор по: %Отборы%.'");
	ИнформационнаяНадписьОтборы = СтрЗаменить(ИнформационнаяНадписьОтборы, "%Отборы%", ОтборыПредставление);
	
КонецПроцедуры

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


&НаСервере
Функция РазрешитьПереносРезультатовВДокумент()
	
	Возврат ПроверитьЗаполнение();
	
КонецФункции

&НаСервере
Функция АдресТоваровВХранилище()
	
	Отбор = Новый Структура("Пометка", Истина);
	ОтобранныеТовары      = Объект.Товары.Выгрузить(Отбор);
	
	Возврат ПоместитьВоВременноеХранилище(ОтобранныеТовары, УникальныйИдентификатор);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура РасчитатьКоличествоВСтроке(Товары, ТекущиеДанные, ФормаМодифицирована)
	
	ТекущиеДанные.КоличествоОсталосьПодобрать = ТекущиеДанные.КоличествоОстаток - ТекущиеДанные.КоличествоПодобрано;
	
	Отбор = Новый Структура("Пометка", Истина);
	ПомеченныеСтроки = Товары.НайтиСтроки(Отбор);
	
	ТоварыПодобраны = ПомеченныеСтроки.Количество() > 0;
	
КонецПроцедуры

&НаСервере
Процедура ОтметитьВсеНаСервере()
	
	Модифицированность = Истина;
	
	Для Каждого СтрокаТоваров Из Объект.Товары Цикл
		СтрокаТоваров.КоличествоПодобрано = СтрокаТоваров.КоличествоОстаток;
		СтрокаТоваров.Пометка = Истина;
		
		РасчитатьКоличествоВСтроке(Объект.Товары, СтрокаТоваров, ТоварыПодобраны);
	КонецЦикла;
	
КонецПроцедуры

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

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

#Область Инициализация

ВыполняетсяЗакрытие = Ложь;

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

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