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