Пересчет товаров / Форма документа / Модуль формы

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

&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ

&НаКлиенте
Перем ТекущиеДанныеИдентификатор; //используется для передачи текущей строки в обработчик ожидания

&НаКлиенте
Перем ВыполняетсяЗапись; //используется для передачи текущей строки в обработчик ожидания

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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

	// СтандартныеПодсистемы.УправлениеДоступом
	УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.УправлениеДоступом
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.Свойства
	
	ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
	ПриЧтенииСозданииНаСервере();

	МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

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

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

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	ТекущийОбъект.ОтборПересчета = Новый ХранилищеЗначения(ОтборПересчета.Настройки, Новый СжатиеДанных(9));
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.Свойства

	МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
	
	// ИнтеграцияС1СДокументооборотом
	ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПередЗаписьюНаСервере(
		ЭтотОбъект,
		ТекущийОбъект,
		ПараметрыЗаписи);
	// Конец ИнтеграцияС1СДокументооборотом
	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтаФорма, "СканерШтрихкода");
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.Свойства

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтаФорма);
	
КонецПроцедуры

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

	// Неизвестные штрихкоды
	Если Источник = "ПодключаемоеОборудование"
		И ИмяСобытия = "НеизвестныеШтрихкоды"
		И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
		
		КэшированныеЗначения.Штрихкоды.Очистить();
		ДанныеШтрихкодов = Новый Массив;
		
		Для Каждого ПолученныйШтрихкод Из Параметр.ПолученыНовыеШтрихкоды Цикл
			ДанныеШтрихкодов.Добавить(ПолученныйШтрихкод);
		КонецЦикла;
		
		Для Каждого ПолученныйШтрихкод Из Параметр.ЗарегистрированныеШтрихкоды Цикл
			ДанныеШтрихкодов.Добавить(ПолученныйШтрихкод);
		КонецЦикла;
		
		ОбработатьШтрихкоды(ДанныеШтрихкодов);
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	Оповестить("Запись_ПересчетТоваров", ПараметрыЗаписи, Объект.Ссылка);

	МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);

	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	// Конец СтандартныеПодсистемы.Свойства

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

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

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

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

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

&НаКлиенте
Процедура СкладПриИзменении(Элемент)
	
	СкладПомещениеПриИзмененииСервер();
	Объект.УчетныеДанныеЗаполнены = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ПомещениеПриИзменении(Элемент)
	
	СкладПомещениеПриИзмененииСервер();
	Объект.УчетныеДанныеЗаполнены = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
	
	Объект.УчетныеДанныеЗаполнены = Ложь;
	ДатаПриИзмененииСервер();
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ИспользоватьЯчейкуИзлишкиПриИзменении(Элемент)
	
	Элементы.ЯчейкаКонсолидацииИзлишковТоваров.Доступность = Объект.ИспользоватьОтдельнуюЯчейкуИзлишков;
	
	Если Не(Объект.ИспользоватьОтдельнуюЯчейкуИзлишков) Тогда
		Объект.ЯчейкаКонсолидацииИзлишковТоваров = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьЯчейкуПорчиПриИзменении(Элемент)
	
	Элементы.ЯчейкаКонсолидацииИспорченныхТоваров.Доступность = Объект.ИспользоватьОтдельнуюЯчейкуПорчи;
	
	Если Не(Объект.ИспользоватьОтдельнуюЯчейкуПорчи) Тогда
		Объект.ЯчейкаКонсолидацииИспорченныхТоваров = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ТолькоРасхожденияПриИзменении(Элемент)
	
	Если ТолькоРасхождения Тогда
		Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Расхождение",Истина);
	Иначе
		Элементы.Товары.ОтборСтрок = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	Если НоваяСтрока Тогда
		
		Элементы.Товары.ТекущиеДанные.Количество = 0;
		Элементы.Товары.ТекущиеДанные.КоличествоФакт = 0;
		Элементы.Товары.ТекущиеДанные.КоличествоУпаковок = 0;
		Элементы.Товары.ТекущиеДанные.КоличествоУпаковокФакт = 0;
		Элементы.Товары.ТекущиеДанные.КоличествоУпаковокОтклонение = 0;
		
		Если Не Копирование
			И Объект.Проведен Тогда
			Элементы.Товары.ТекущиеДанные.Ячейка = Объект.ЯчейкаКонсолидацииИзлишковТоваров;
		КонецЕсли;
		
		Если СостояниеРедактирования = "ОграниченноеРедактирование" Тогда
			Элементы.Товары.ТекущиеДанные.ИзлишекПорча = Истина;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура УпаковкаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс", "Факт");
	СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");

	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
	
	Если Не ТекущаяСтрока.ИзлишекПорча Тогда
		Объект.УчетныеДанныеЗаполнены = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКоличествоУпаковокФактПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
	
	СтруктураДействий = Новый Структура;
	
	ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействий);
	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);			
	
КонецПроцедуры

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

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

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

	Если Не Элементы.Товары.ТекущиеДанные.ИзлишекПорча Тогда
		Объект.УчетныеДанныеЗаполнены = Ложь;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды


// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды


// СтандартныеПодсистемы.Свойства

&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	
	УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.Свойства


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

&НаКлиенте
Процедура Заполнить(Команда)
	
	Если Не СкладПомещениеЗаполнены() Тогда
		Возврат;
	КонецЕсли;
	
	Если Объект.Товары.Количество() > 0 Тогда
		Ответ = Неопределено;

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

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

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

&НаКлиенте
Процедура ЗаполнитьФрагмент()
    
    ЗаполнитьСервер();
    Объект.УчетныеДанныеЗаполнены = Ложь;

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

&НаКлиенте
Процедура ЗаполнитьФактПоУчету(Команда)
	
	Если КоличествоФактЗаполнено() Тогда
		
		ТекстВопроса = НСтр("ru='В табличной части уже есть строки с заполненным фактическим количеством.
			|При заполнении эта информация будет утеряна. Продолжить?'");
		
		Ответ = Неопределено;

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

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

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

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

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

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

&НаКлиенте
Процедура ПровестиДокумент(Команда)
	
	ОбщегоНазначенияУТКлиент.Провести(ЭтаФорма);
	
КонецПроцедуры

&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
	
	ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтаФорма);
	
КонецПроцедуры

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

&НаКлиенте
Процедура РазбитьСтрокуЗавершение(НоваяСтрока, ДополнительныеПараметры) Экспорт 
	
	ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
	
	Если НоваяСтрока <> Неопределено Тогда
		
		Если ЗначениеЗаполнено(Объект.ЯчейкаКонсолидацииИзлишковТоваров) Тогда
			НоваяСтрока.Ячейка = Объект.ЯчейкаКонсолидацииИзлишковТоваров
		КонецЕсли;
		НоваяСтрока.ИзлишекПорча       = Истина;
		НоваяСтрока.Количество         = 0;
		НоваяСтрока.КоличествоУпаковок = 0;
		НоваяСтрока.КоличествоУпаковокОтклонение = 0;
		
		СтруктураДействий = Новый Структура;
		ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействий);
		
		ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
		ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, КэшированныеЗначения);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоискПоШтрихкодуВыполнить(Команда)

	ОчиститьСообщения();
	Оповещение = Новый ОписаниеОповещения("ПоискПоШтрихкодуЗавершение", ЭтотОбъект);
	ШтрихкодированиеНоменклатурыКлиент.ПоказатьВводШтрихкода(Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура ПоискПоШтрихкодуЗавершение(ДанныхШтрихкода, ДополнительныеПараметры) Экспорт
	
	ОбработатьШтрихкоды(ДанныхШтрихкода);
	
КонецПроцедуры

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

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

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

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

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

// ИнтеграцияС1СДокументооборотом
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
	
	ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(
		Команда,
		ЭтотОбъект,
		Объект);
	
КонецПроцедуры
// Конец ИнтеграцияС1СДокументооборотом

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

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

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

// СтандартныеПодсистемы.Свойства 
&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
	УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
КонецПроцедуры

&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()

	УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);

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

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
//Конец СтандартныеПодсистемы.Свойства

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Упаковка");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыНоменклатуры.Товар;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненноеПолеТаблицы);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНазначение.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыЯчейка.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатураЕдиницаИзмерения.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковок.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНомерСтроки.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСерия.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатураЕдиницаИзмерения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СостояниеРедактирования");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = НСтр("ru = '%1'");
	ОтборЭлемента.ПравоеЗначение = СтрШаблон(ОтборЭлемента.ПравоеЗначение, "ОграниченноеРедактирование");
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ИзлишекПорча");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.FormBackColor);
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма);
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);

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

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокОтклонение.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокФакт.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Статус");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
	СписокЗначений = Новый СписокЗначений;
	СписокЗначений.Добавить(Перечисления.СтатусыПересчетовТоваров.ВРаботе);
	СписокЗначений.Добавить(Перечисления.СтатусыПересчетовТоваров.Подготовлено);
	ОтборЭлемента.ПравоеЗначение = СписокЗначений;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<для внесения результата>'"));
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНазначение.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыЯчейка.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковок.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокФакт.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокОтклонение.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНомерСтроки.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСерия.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатураЕдиницаИзмерения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СостояниеРедактирования");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = НСтр("ru = '%1'");
	ОтборЭлемента.ПравоеЗначение = СтрШаблон(ОтборЭлемента.ПравоеЗначение, "НеРедактируется");
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.FormBackColor);
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	//
	
	ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения(Истина, Истина);
	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма, ПараметрыУсловногоОформления);
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьАдресноеХранение");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыНоменклатуры.Товар;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипИзмеряемойВеличины");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыИзмеряемыхВеличин.КоличествоШтук;

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

	//
	
	НоменклатураСервер.УстановитьУсловноеОформлениеСерийНоменклатуры(ЭтаФорма, "СерииВсегдаВТЧТовары");
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокФакт.Имя);

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

	ГруппаОтбора2 = ГруппаОтбора1.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора2.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

	ОтборЭлемента = ГруппаОтбора2.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыНоменклатуры.МногооборотнаяТара;

	ОтборЭлемента = ГруппаОтбора2.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ХарактеристикиИспользуются");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	ОтборЭлемента = ГруппаОтбора2.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Характеристика");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьАдресноеХранение");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<пустая ячейка>'"));
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьАдресноеХранение");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);

	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковок.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СостояниеРедактирования");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = НСтр("ru = '%1'");
	ОтборЭлемента.ПравоеЗначение = СтрШаблон(ОтборЭлемента.ПравоеЗначение, "РедактированиеБезСтатусов");
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма);

	//

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

&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоНоменклатуре()
	
	ПараметрыЗаполненияРеквизитов = Новый Структура;
	ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются",
											Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
	ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакТипНоменклатуры",
											Новый Структура("Номенклатура", "ТипНоменклатуры"));
	ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакАртикул",
											Новый Структура("Номенклатура", "Артикул"));
	ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакТипИзмеряемойВеличины",
											Новый Структура("Номенклатура", "ТипИзмеряемойВеличины"));
	
	НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(Объект.Товары,ПараметрыЗаполненияРеквизитов);
	
КонецПроцедуры

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

#Область ПриИзмененииРеквизитов

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

&НаСервере
Процедура ДатаПриИзмененииСервер()
	
	НастроитьПоСкладуПомещению();
	ПодготовитьЗаполнитьУстановитьВидимостьСерий();
	
КонецПроцедуры

&НаСервере
Процедура ОтветственныйПриИзмененииСервер()
	
	Объект.ПечататьКоличествоПоУчету = Документы.ПересчетТоваров.ПолучитьЗначениеПризнакаПечататьКоличествоПоУчетуПоУмолчанию(Объект.Ссылка, Объект.Ответственный);
	
КонецПроцедуры

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

#Область ПодборыИОбработкаПроверкиКоличества

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

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

#Область ШтрихкодыИТорговоеОборудование

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

&НаСервере
Процедура ОбработатьШтрихкодыСервер(СтруктураПараметровДействия,КэшированныеЗначения)
	
	ШтрихкодированиеНоменклатурыСервер.ОбработатьШтрихкоды(ЭтаФорма, Объект, СтруктураПараметровДействия, КэшированныеЗначения);
	
КонецПроцедуры

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

#Область Серии

&НаСервере
Процедура УстановитьВидимостьЭлементовСерий()
	
	Элементы.ТоварыСерия.Видимость = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОткрытьПодборСерийПриСканированииШтрихкодаНоменклатуры()
	
	Если ТекущиеДанныеИдентификатор = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущиеДанныеИдентификатор);
	ОткрытьПодборСерий(,ТекущиеДанные);
		
КонецПроцедуры

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

#Область Прочее

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

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

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

&НаСервере
Процедура ЗаполнитьФактПоУчетуСервер()
	
	Для Каждого СтрТабл Из Объект.Товары Цикл
		
		СтрТабл.КоличествоФакт = СтрТабл.Количество;
		СтрТабл.КоличествоУпаковокФакт = СтрТабл.КоличествоУпаковок;
		СтрТабл.Расхождение = (СтрТабл.КоличествоФакт <> СтрТабл.Количество) Или (СтрТабл.КоличествоУпаковок <> СтрТабл.КоличествоУпаковокФакт);
		СтрТабл.КоличествоУпаковокОтклонение = СтрТабл.КоличествоУпаковокФакт - СтрТабл.КоличествоУпаковок;
		
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура УстановитьЗначениеПараметраНастроек(Настройки, ИмяПараметра, Значение)
	
	Параметр = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
	
	Если Параметр <> Неопределено Тогда
		Параметр.Значение = Значение;
		Параметр.Использование = Истина;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаСервере
Процедура ЗаполнитьПризнакРасхождение()
	
	Для Каждого СтрТабл Из Объект.Товары Цикл
		СтрТабл.Расхождение = СтрТабл.КоличествоФакт <> СтрТабл.Количество Или СтрТабл.КоличествоУпаковок <> СтрТабл.КоличествоУпаковокФакт;
		СтрТабл.КоличествоУпаковокОтклонение = СтрТабл.КоличествоУпаковокФакт - СтрТабл.КоличествоУпаковок;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция КоличествоФактЗаполнено()
	
	НайденныеСтроки = Объект.Товары.НайтиСтроки(Новый Структура("КоличествоФакт", 0));
	Возврат НайденныеСтроки.Количество() <> Объект.Товары.Количество();
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействий)
	
	СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс", "Факт");
	СтруктураДействий.Вставить("ЗаполнитьФлагРасхождение");
	СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковокОтклонение");
	
КонецПроцедуры

&НаКлиенте
Функция СкладПомещениеЗаполнены()

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

&НаСервере
Процедура ОтображениеДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписи()

	Если ЗначениеЗаполнено(Объект.Склад)
		И Объект.Проведен
		И Объект.Статус = Перечисления.СтатусыПересчетовТоваров.Выполнено Тогда
		
		ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач = 
			СкладыСервер.ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач(Объект.Склад, Объект.Дата); 
		
		МассивСтрок = Новый Массив;
		
		Если ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач 
			И ПравоДоступа("Использование", Метаданные.Обработки.ПомощникОформленияСкладскихАктов) Тогда 
			ТаблицаНоменклатуры = Обработки.ПомощникОформленияСкладскихАктов.ТоварыКОформлениюСкладскихАктов(Объект.Склад,,,Объект.Дата);
			Если ТаблицаНоменклатуры.Количество() > 0 Тогда
				ЧастьФорматированнойСтроки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не по всем расхождениям оформлены складские акты. <a href=""%1"">Оформить</a>.'"),
					"ПомощникОформленияСкладскихАктов");
				МассивСтрок.Добавить(ЧастьФорматированнойСтроки);
			КонецЕсли;
		КонецЕсли;
		
		Если ПравоДоступа("Изменение", Метаданные.Документы.ИнвентаризационнаяОпись) Тогда 
			ПараметрыФормирования = УправлениеПечатьюУТВызовСервера.ПолучитьПараметрыФормирования(Объект.Ссылка);
			ОформленныеОписи.ЗагрузитьЗначения(ПараметрыФормирования.Описи);
			ВыборкаОрганизаций = ПараметрыФормирования.Организации;
			КоличествоОрганизаций = ВыборкаОрганизаций.Количество();
			Если КоличествоОрганизаций > 0 Тогда
				Если ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций") Тогда 		
					ОрганизацииВДательномПадеже = ОбщегоНазначенияУТКлиентСервер.СклонениеСлова(
						КоличествоОрганизаций,
						НСтр("ru = 'организации, организациям, организациям, м'"));

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

				ЧастьФорматированнойСтроки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Необходимо <a href=""%1"">сформировать</a> описи по %2 %3.'"),
					"СформироватьОписи",
					КоличествоОрганизацийБезОписей,
					ОрганизацииБезОписейВДательномПадеже);
				МассивСтрок.Добавить(ЧастьФорматированнойСтроки);
			КонецЕсли;
			
		КонецЕсли;
		
		ИнвентаризационныйПериодНеоформленныхСкладскихАктов.ДатаНачала = НачалоДня(Объект.Дата);
		ИнвентаризационныйПериодНеоформленныхСкладскихАктов.ДатаОкончания = КонецМесяца(ТекущаяДатаСеанса());		
		
		Если МассивСтрок.Количество() = 0 Тогда 
			Элементы.ГруппаОформитьСкладскиеАкты.ТекущаяСтраница = Элементы.ГруппаДекорацияНеВидна;
		Иначе
			Элементы.ГруппаОформитьСкладскиеАкты.ТекущаяСтраница = Элементы.ГруппаДекорацияВидна;
			Элементы.ДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписи.Заголовок =
				СтроковыеФункции.ФорматированнаяСтрока(СтрСоединить(МассивСтрок, Символы.ПС));
		КонецЕсли;
	Иначе
		Элементы.ГруппаОформитьСкладскиеАкты.ТекущаяСтраница = Элементы.ГруппаДекорацияНеВидна;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокОтклонение(СтруктураДействий)
	
	СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковокСуффиксИзОтклонения", "Факт");
	СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс", "Факт");
	СтруктураДействий.Вставить("ЗаполнитьФлагРасхождение");
	
КонецПроцедуры

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

&НаКлиенте
Процедура ДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписиОбработкаНавигационнойСсылкиЗавершение(Результат, ДополнительныеПараметры) Экспорт
	ОтображениеДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписи();
КонецПроцедуры


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

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

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

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

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

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