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