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