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