#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область Проведение
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
МеханизмыДокумента.Добавить("Бюджетирование");
МеханизмыДокумента.Добавить("ПланированиеЗапасов");
КонецПроцедуры
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
Если ДопПараметры = Неопределено Тогда
ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
КонецЕсли;
Если ТипЗнч(Документ) = Тип("ДокументОбъект.ПланПроизводства") Тогда
ДокументСсылка = Документ.Ссылка;
Иначе
ДокументСсылка = Документ;
КонецЕсли;
Запрос = Новый Запрос;
ТекстыЗапроса = Новый СписокЗначений;
Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
ТекстЗапросаТаблицаПланыПроизводства(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПланыВыпуска(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОборотыБюджетов(Запрос, ТекстыЗапроса, Регистры);
КонецЕсли;
Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
КонецФункции
#КонецОбласти
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
БизнесПроцессы.Задание.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
Документы.КорректировкаПлановыхПотребностей.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
КонецПроцедуры
Функция ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании) Экспорт
Если ПравоДоступа("Добавление", Метаданные.Документы.ПланПроизводства) Тогда
КомандаСоздатьНаОсновании = КомандыСозданияНаОсновании.Добавить();
КомандаСоздатьНаОсновании.Менеджер = Метаданные.Документы.ПланПроизводства.ПолноеИмя();
КомандаСоздатьНаОсновании.Представление = ОбщегоНазначенияУТ.ПредставлениеОбъекта(Метаданные.Документы.ПланПроизводства);
КомандаСоздатьНаОсновании.РежимЗаписи = "Проводить";
КомандаСоздатьНаОсновании.ФункциональныеОпции = "ИспользоватьПланированиеПроизводства";
Возврат КомандаСоздатьНаОсновании;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
Отчеты.СбалансированностьПлановУТ.ДобавитьКомандуСбалансированностьПланов(КомандыОтчетов);
Отчеты.ПлановаяПотребностьВМатериалах.ДобавитьКомандуОтчета(КомандыОтчетов);
Отчеты.ПлановаяПотребностьВТрудовыхРесурсах.ДобавитьКомандуОтчета(КомандыОтчетов);
КонецПроцедуры
Функция ПроверкаПередСменойСтатуса(ВыборкаПроверки, НовыйСтатус, ДополнительныеПараметры) Экспорт
Возврат Истина;
КонецФункции
Функция СформироватьЗапросПроверкиПриСменеСтатуса(МассивДокументов, НовыйСтатус, ДополнительныеПараметры) Экспорт
ЗначениеНовогоСтатуса = Перечисления.СтатусыПланов[НовыйСтатус];
ТекстЗапроса =
"ВЫБРАТЬ
| ТаблицаДокументов.Ссылка КАК Ссылка,
| ПРЕДСТАВЛЕНИЕ(ТаблицаДокументов.Ссылка) КАК Представление,
| ПРЕДСТАВЛЕНИЕ(ТаблицаДокументов.Статус) КАК ПредставлениеТекущегоСтатуса,
| ПРЕДСТАВЛЕНИЕ(&Статус) КАК ПредставлениеНовогоСтатуса,
| ВЫБОР
| КОГДА ТаблицаДокументов.Статус = &Статус
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК СтатусСовпадает,
| ТаблицаДокументов.Проведен КАК Проведен,
| ТаблицаДокументов.ПометкаУдаления КАК ПометкаУдаления,
| ИСТИНА КАК ЗаписьПроведением
|ИЗ
| Документ.ПланПроизводства КАК ТаблицаДокументов
|ГДЕ
| ТаблицаДокументов.Ссылка В(&МассивДокументов)
|УПОРЯДОЧИТЬ ПО
| Дата
|";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Статус", ЗначениеНовогоСтатуса);
Запрос.УстановитьПараметр("МассивДокументов", МассивДокументов);
Возврат Запрос;
КонецФункции
Процедура ДополнительныеПараметрыДляРасчетаПоФормуле(Параметры, ДопПараметры) Экспорт
ВидПлана = Параметры.ВидПланаРеквизиты;
Сценарий = Параметры.СценарийРеквизиты;
ПутьКРеквизиту = Параметры.ПутьКРеквизиту;
ЭтоПланПроизводства = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланПроизводства;
ЭтоПланЗакупок = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланЗакупок;
ЭтоПланСборкиРазборки = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланСборкиРазборки;
ЭтоПланОстатков = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланОстатков;
СоздаватьРеквизитСОтбором = (ВидПлана.ЗаполнятьПодразделение И ЭтоПланПроизводства)
ИЛИ (Сценарий.ПланированиеПоНазначениям И Не ВидПлана.ЗаполнятьНазначениеВТЧ);
ИспользоватьПланированиеПроизводства = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства") И Сценарий.ИспользоватьВПланированииПроизводства;
ИспользоватьДляПланированияМатериалов = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства") И Сценарий.ИспользоватьДляПланированияМатериалов;
ИспользоватьПланыОстатков = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеОстатков") И Сценарий.ИспользоватьВПланированииОстатков;
ИспользоватьПроизводство = ПолучитьФункциональнуюОпцию("ИспользоватьПроизводство");
ДоступноОписаниеТипаПроизводственногоПроцесса = Ложь;
ЧтениеФактаПроизводства = ПравоДоступа("Чтение", Метаданные.РегистрыНакопления.ВыпускПродукции);
ЧтениеФактаПроизводстваМатериалы = ПравоДоступа("Чтение", Метаданные.РегистрыНакопления.МатериалыИРаботыВПроизводстве);
#Область ПланыПроизводства
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводства");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", ?(ДоступноОписаниеТипаПроизводственногоПроцесса,
НСтр("ru='План производства (сборка)'"),
НСтр("ru='План производства'")));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства);
ДопПараметр.Вставить("ЗаголовокОперанда", ?(ДоступноОписаниеТипаПроизводственногоПроцесса,
НСтр("ru='План производства (сборка)'"),
НСтр("ru='План производства'")));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланы");
ДопПараметры.Вставить("ПланыПроизводства", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваСОтбором
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваСОтбором");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", ?(ДоступноОписаниеТипаПроизводственногоПроцесса,
НСтр("ru='План производства (сборка)*'"),
НСтр("ru='План производства*'")));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("ЗаголовокОперанда", ?(ДоступноОписаниеТипаПроизводственногоПроцесса,
НСтр("ru='План производства (сборка)*'"),
НСтр("ru='План производства*'")));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланыСОтбором");
ДопПараметры.Вставить("ПланыПроизводстваСОтбором", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваРазборка
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваРазборка");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (разборка)'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (разборка)'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланы");
ДопПараметры.Вставить("ПланыПроизводстваРазборка", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваРазборкаСОтбором
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваРазборкаСОтбором");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (разборка)*'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (разборка)*'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланыСОтбором");
ДопПараметры.Вставить("ПланыПроизводстваРазборкаСОтбором", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваРемонт
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваРемонт");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (ремонт)'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (ремонт)'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланы");
ДопПараметры.Вставить("ПланыПроизводстваРемонт", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваРемонтСОтбором
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваРемонтСОтбором");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (ремонт)*'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (ремонт)*'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланыСОтбором");
ДопПараметры.Вставить("ПланыПроизводстваРемонтСОтбором", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваМатериалы
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваМатериалы");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (потребность в материалах)'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьДляПланированияМатериалов);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьДляПланированияМатериалов);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (потребность в материалах)'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланы");
ДопПараметры.Вставить("ПланыПроизводстваМатериалы", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваМатериалыСОтбором
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваМатериалыСОтбором");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (потребность в материалах)*'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьДляПланированияМатериалов И (СоздаватьРеквизитСОтбором ИЛИ ВидПлана.ЗаполнятьСклад));
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьДляПланированияМатериалов И (СоздаватьРеквизитСОтбором ИЛИ ВидПлана.ЗаполнятьСклад));
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (потребность в материалах)*'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланыСОтбором");
ДопПараметры.Вставить("ПланыПроизводстваМатериалыСОтбором", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваПолуфабрикаты
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваПолуфабрикаты");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (полуфабрикаты)'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (полуфабрикаты)'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланы");
ДопПараметры.Вставить("ПланыПроизводстваПолуфабрикаты", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваПолуфабрикатыСОтбором
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваПолуфабрикатыСОтбором");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (полуфабрикаты)*'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (полуфабрикаты)*'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланыСОтбором");
ДопПараметры.Вставить("ПланыПроизводстваПолуфабрикатыСОтбором", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваПотребностьВПолуфабрикатах
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваПотребностьВПолуфабрикатах");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (потребность в полуфабрикатах)'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьДляПланированияМатериалов);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьДляПланированияМатериалов);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (потребность в полуфабрикатах)'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланы");
ДопПараметры.Вставить("ПланыПроизводстваПотребностьВПолуфабрикатах", ДопПараметр);
#КонецОбласти
#Область ПланыПроизводстваПотребностьВПолуфабрикатахСОтбором
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПроизводстваПотребностьВПолуфабрикатахСОтбором");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (потребность в полуфабрикатах)*'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьДляПланированияМатериалов И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьДляПланированияМатериалов И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (потребность в полуфабрикатах)*'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланыСОтбором");
ДопПараметры.Вставить("ПланыПроизводстваПотребностьВПолуфабрикатахСОтбором", ДопПараметр);
#КонецОбласти
#Область ФактыПроизводства
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ФактыПроизводства");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", ?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт производства*'"),
НСтр("ru='Факт производства'")));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПроизводство И ЧтениеФактаПроизводства);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПроизводство И ЧтениеФактаПроизводства);
ДопПараметр.Вставить("ЗаголовокОперанда", ?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт производства*'"),
НСтр("ru='Факт производства'")));
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыФакты");
ДопПараметры.Вставить("ФактыПроизводства", ДопПараметр);
#КонецОбласти
#Область ФактыПроизводстваМатериалы
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ФактыПроизводстваМатериалы");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", ?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт производства (материалы)*'"),
НСтр("ru='Факт производства (материалы)'")));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПроизводство И ЧтениеФактаПроизводстваМатериалы);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПроизводство И ЧтениеФактаПроизводстваМатериалы);
ДопПараметр.Вставить("ЗаголовокОперанда", ?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт производства (материалы)*'"),
НСтр("ru='Факт производства (материалы)'")));
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыФакты");
ДопПараметры.Вставить("ФактыПроизводстваМатериалы", ДопПараметр);
#КонецОбласти
#Область ПланыВыпуска
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыВыпуска");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (весь выпуск)'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (весь выпуск)'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланы");
ДопПараметры.Вставить("ПланыВыпуска", ДопПараметр);
#КонецОбласти
#Область ПланыВыпускаСОтбором
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыВыпускаСОтбором");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План производства (весь выпуск)*'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План производства (весь выпуск)*'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПроизводства");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланыСОтбором");
ДопПараметры.Вставить("ПланыВыпускаСОтбором", ДопПараметр);
#КонецОбласти
КонецПроцедуры
Функция МакетыОперандовПлана(Макеты = Неопределено) Экспорт
Если Макеты = Неопределено Тогда
Макеты = Новый Соответствие;
КонецЕсли;
Макеты.Вставить("ПланыПроизводства", ПолучитьМакет("СКД_ПланыПроизводства"));
Макеты.Вставить("ПланыПроизводстваСОтбором", ПолучитьМакет("СКД_ПланыПроизводстваСОтбором"));
Макеты.Вставить("ПланыПроизводстваРазборка", ПолучитьМакет("СКД_ПланыПроизводстваРазборка"));
Макеты.Вставить("ПланыПроизводстваРазборкаСОтбором", ПолучитьМакет("СКД_ПланыПроизводстваРазборкаСОтбором"));
Макеты.Вставить("ПланыПроизводстваРемонт", ПолучитьМакет("СКД_ПланыПроизводстваРемонт"));
Макеты.Вставить("ПланыПроизводстваРемонтСОтбором", ПолучитьМакет("СКД_ПланыПроизводстваРемонтСОтбором"));
Макеты.Вставить("ПланыПроизводстваПолуфабрикаты", ПолучитьМакет("СКД_ПланыПроизводстваПолуфабрикаты"));
Макеты.Вставить("ПланыПроизводстваПолуфабрикатыСОтбором", ПолучитьМакет("СКД_ПланыПроизводстваПолуфабрикатыСОтбором"));
Макеты.Вставить("ПланыПроизводстваМатериалы", ПолучитьМакет("СКД_ПланыПроизводстваМатериалы"));
Макеты.Вставить("ПланыПроизводстваМатериалыСОтбором", ПолучитьМакет("СКД_ПланыПроизводстваМатериалыСОтбором"));
Макеты.Вставить("ПланыПроизводстваПотребностьВПолуфабрикатах", ПолучитьМакет("СКД_ПланыПроизводстваПотребностьВПолуфабрикатах"));
Макеты.Вставить("ПланыПроизводстваПотребностьВПолуфабрикатахСОтбором", ПолучитьМакет("СКД_ПланыПроизводстваПотребностьВПолуфабрикатахСОтбором"));
Макеты.Вставить("ФактыПроизводства", ПолучитьМакет("СКД_ФактыПроизводства"));
Макеты.Вставить("ФактыПроизводстваМатериалы", ПолучитьМакет("СКД_ФактыПроизводстваМатериалы"));
Макеты.Вставить("ПроизводимаяПродукция", ПолучитьМакет("СКД_ПроизводимаяПродукция"));
Макеты.Вставить("ПланыВыпуска", ПолучитьМакет("СКД_ПланыВыпуска"));
Макеты.Вставить("ПланыВыпускаСОтбором", ПолучитьМакет("СКД_ПланыВыпускаСОтбором"));
Возврат Макеты;
КонецФункции
Процедура ЗаполнитьДокумент(Знач Параметры, Знач АдресХранилища, Знач АдресХранилищаДополнительный = "") Экспорт
Настройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(Параметры.КлючОбщихНастроек,
"НастройкиФоновогоЗадания_"+Параметры.УникальныйИдентификатор);
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Параметры.Вставить("ЗаполняемаяТЧ", Настройки.ЗаполняемаяТЧ);
Параметры.Вставить("Периоды", Настройки.Периоды);
Если Параметры.Свойство("ЗаполнятьПоФормуле") Тогда
ЗаполнитьДокументПоФормуле(Параметры, АдресХранилища, АдресХранилищаДополнительный);
ИначеЕсли Параметры.Свойство("ЗаполнятьПоПравилу") Тогда
Параметры.Вставить("ПравилоЗаполнения", Настройки.ПравилоЗаполнения);
Параметры.Вставить("ПользовательскиеНастройки", Настройки.ПользовательскиеНастройки);
ЗаполнитьПоПравилуЗаполнения(Параметры, АдресХранилища);
ИначеЕсли Параметры.Свойство("ЗаполнитьДляЗамещения") Тогда
Параметры.Вставить("ЗаполняемаяТЧ", Настройки.ЗаполняемаяТЧ);
ЗаполнитьДокументДляЗамещения(Параметры, АдресХранилища);
КонецЕсли;
Если Параметры.Свойство("ПланироватьПолуфабрикаты") Тогда
ЗаполнитьДокументПолуфабрикатами(Параметры, АдресХранилища);
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ОбщегоНазначения.ХранилищеОбщихНастроекУдалить(Параметры.КлючОбщихНастроек,
"НастройкиФоновогоЗадания_"+Параметры.УникальныйИдентификатор, Пользователи.ТекущийПользователь());
КонецПроцедуры
Процедура ЗаполнитьДокументПоФормуле(Знач Параметры, Знач АдресХранилища, Знач АдресХранилищаДополнительный) Экспорт
Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Документ.ПланПроизводства.МодульМенеджера.ЗаполнитьДокументПоФормуле");
Если НЕ Параметры.Свойство("ЗаполнятьПоФормуле") Тогда
Возврат;
КонецЕсли;
ТипПроизводственногоПроцесса = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Ссылка, "ТипПроизводственногоПроцесса");
Если ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка Тогда
ИмяКолонкиПериода = "ДатаЗапуска";
Иначе
ИмяКолонкиПериода = "ДатаВыпуска";
КонецЕсли;
Периоды = Параметры.Периоды;
Планирование.ПодготовитьТаблицуПериодовПередЗаполнением(Параметры);
Планирование.ЗаполнитьТаблицуПериодов(Периоды, Параметры.Периодичность, Параметры.НачалоПериодаСмещения, Параметры.КонецПериодаСмещения,,, Параметры.НачалоАктивныхПериодов);
НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда
ПоместитьВоВременноеХранилище(Новый ТаблицаЗначений, АдресХранилища);
ПоместитьВоВременноеХранилище(Неопределено, АдресХранилищаДополнительный);
Возврат;
КонецЕсли;
Параметры.Вставить("Периоды", Периоды);
ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
КолонкаПериода = ЗаполняемаяТЧ.Колонки[ИмяКолонкиПериода];
КолонкаПериода.Имя = "ПериодСостава";
Результат = Планирование.ЗаполнитьПоФормуле(Параметры);
Если Результат.Колонки.Найти("ПериодСостава") = Неопределено Тогда
Результат.Колонки.Добавить("ПериодСостава", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата))
КонецЕсли;
Результат.Колонки["ПериодСостава"].Имя = ИмяКолонкиПериода;
Параметры.Вставить("ЗаполняемаяТЧ", Результат);
ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
Если Параметры.НачалоАктивныхПериодов > Параметры.НачалоПериодаСмещения Тогда
ПоместитьВоВременноеХранилище(Периоды, АдресХранилищаДополнительный);
Иначе
ПоместитьВоВременноеХранилище(Неопределено, АдресХранилищаДополнительный);
КонецЕсли;
КоличествоОбработанных = Периоды.Количество();
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанных);
КонецПроцедуры
Процедура ЗаполнитьПоПравилуЗаполнения(Знач Параметры, Знач АдресХранилища) Экспорт
Если НЕ Параметры.Свойство("ЗаполнятьПоПравилу") Тогда
Возврат;
КонецЕсли;
ТипПроизводственногоПроцесса = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Ссылка, "ТипПроизводственногоПроцесса");
Если ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка Тогда
ИмяКолонкиПериода = "ДатаЗапуска";
Иначе
ИмяКолонкиПериода = "ДатаВыпуска";
КонецЕсли;
Периоды = Параметры.Периоды;
НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда
Возврат;
КонецЕсли;
Коэффициенты = Новый Массив;
Для Индекс = 1 По ВсегоПериодов Цикл
Коэффициенты.Добавить(1);
КонецЦикла;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПараметрыДанных", Планирование.ПолучитьПараметрыПлана(Параметры));
Если Параметры.Свойство("Отбор") Тогда
ДополнительныеПараметры.Вставить("Отбор", Параметры.Отбор);
КонецЕсли;
Если ЗначениеЗаполнено(Параметры.ИзменитьРезультатНа) Тогда
ДополнительныеПараметры.ПараметрыДанных.Вставить("Коэффициент", (100 + Параметры.ИзменитьРезультатНа) / 100);
КонецЕсли;
Если Параметры.Свойство("ТочностьОкругления") Тогда
ДополнительныеПараметры.ПараметрыДанных.Вставить("ТочностьОкругления", Параметры.ТочностьОкругления);
КонецЕсли;
ПравилоЗаполнения = Параметры.ПравилоЗаполнения;
ПользовательскиеНастройки = Параметры.ПользовательскиеНастройки;
ПараметрыВыбораСпецификаций = Параметры.ПараметрыВыбораСпецификаций;
КэшированныеЗначения = Неопределено;
Результат = Планирование.ВыбратьДанныеПоПравилам(
Перечисления.ТипыПланов.ПланПроизводства,
ПравилоЗаполнения,
ПользовательскиеНастройки,
ДополнительныеПараметры);
ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
Если Результат <> Неопределено Тогда
РазрядностьОкругления = Параметры.ТочностьОкругления + 3;
Для каждого СтрокаРезультата Из Результат Цикл
Если Параметры.ТочностьОкругления <> 0 Тогда
ИмяФункции = НСтр("ru = 'Окр(%1; %2)'");
СтрокаРезультата.Расшифровка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяФункции, СтрокаРезультата.Расшифровка, Pow(10, -РазрядностьОкругления));
СтрокаРезультата.ЧисловоеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяФункции, СтрокаРезультата.ЧисловоеПредставление, Pow(10, -РазрядностьОкругления));
КонецЕсли;
Если СтрокаРезультата.Количество = null Тогда
Продолжить;
КонецЕсли;
Если Цел(СтрокаРезультата.Количество * Pow(10, РазрядностьОкругления)) = 0 Тогда
Продолжить;
КонецЕсли;
Количество = Окр(СтрокаРезультата.Количество, РазрядностьОкругления);
Если Параметры.КроссТаблица Тогда
Если ЗначениеЗаполнено(СтрокаРезультата.Период)
И СтрокаРезультата.Период >= Параметры.НачалоПериода
И СтрокаРезультата.Период <= Параметры.ОкончаниеПериода Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
КонецЕсли;
НоваяСтрока = ЗаполняемаяТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
НоваяСтрока.Количество = Количество;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока[ИмяКолонкиПериода] = СтрокаРезультата.Период;
Продолжить;
ИначеЕсли ЗначениеЗаполнено(СтрокаРезультата.Период) Тогда
Продолжить;
КонецЕсли;
Если СтрокаРезультата.Количество < 0 Тогда
ЗнакКоличества = -1;
Иначе
ЗнакКоличества = 1;
КонецЕсли;
РаспределениеКоличества = Планирование.РаспределитьСуммуПропорциональноКоэффициентам(ЗнакКоличества * СтрокаРезультата.Количество, Коэффициенты, РазрядностьОкругления);
Если РаспределениеКоличества = Неопределено Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
КонецЕсли;
Продолжить;
КонецЕсли;
Если РаспределениеКоличества[0] < 0 Тогда
РаспределениеКоличества[0] = 0;
КонецЕсли;
СтрокаРезультата.Расшифровка = "(" + СтрокаРезультата.Расшифровка + ") * " + НСтр("ru = 'Коэфф распределения'");
СтрокаРезультата.ЧисловоеПредставление = "(" + СтрокаРезультата.ЧисловоеПредставление + ") * ";
Индекс = РаспределениеКоличества.ВГраница();
Пока Индекс >= 0 Цикл
Количество = РаспределениеКоличества[Индекс];
ДатаПериода = НайденныеСтрокиПериодов[НайденныеСтрокиПериодов.ВГраница() - Индекс].ДатаНачала;
Индекс = Индекс - 1;
Если Количество = 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ЗаполняемаяТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
НоваяСтрока.Количество = ЗнакКоличества * Количество;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока[ИмяКолонкиПериода] = ДатаПериода;
НоваяСтрока.Расшифровка = СтрокаРезультата.Расшифровка + " = "
+ СтрокаРезультата.ЧисловоеПредставление
+ Строка(Окр(НоваяСтрока.Количество/СтрокаРезультата.Количество, 3, 1))
+ " = " + Строка(НоваяСтрока.Количество);
КонецЦикла;
Иначе
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
КонецЕсли;
НоваяСтрока = ЗаполняемаяТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
НоваяСтрока.Количество = Количество;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока[ИмяКолонкиПериода] = СтрокаРезультата.Период;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Параметры.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
ПоместитьВоВременноеХранилище(ЗаполняемаяТЧ, АдресХранилища);
КонецПроцедуры
Процедура ЗаполнитьДокументПолуфабрикатами(Знач Параметры, Знач АдресХранилища) Экспорт
Если НЕ Параметры.Свойство("ПланироватьПолуфабрикаты") Тогда
Возврат;
КонецЕсли;
ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
Если ЗаполняемаяТЧ.Колонки.Найти("Полуфабрикат") = Неопределено Тогда
ЗаполняемаяТЧ.Колонки.Добавить("Полуфабрикат", Новый ОписаниеТипов("Булево"));
КонецЕсли;
Если ЗаполняемаяТЧ.Колонки.Найти("Характеристика") = Неопределено Тогда
ЗаполняемаяТЧ.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
КонецЕсли;
ПараметрыВыбораСпецификаций = Параметры.ПараметрыВыбораСпецификаций;
ПараметрыВыбораСпецификацийМатериалов = ОбщегоНазначения.СкопироватьРекурсивно(ПараметрыВыбораСпецификаций, Ложь);
ПараметрыВыбораСпецификацийМатериалов.ДоступныеТипы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Перечисления.ТипыПроизводственныхПроцессов.Сборка);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц", Новый Структура("НужноОкруглять", Ложь));
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтрокиРассчитатьДатуЗапуска = Новый Массив;
МассивДанных = Новый Массив;
МассивСтрок = Новый Массив;
ОбрабатываемыеСтроки = Новый Массив;
Для каждого СтрокаТЧ Из ЗаполняемаяТЧ Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТЧ.Спецификация) Тогда
ПараметрыЗаполнения = УправлениеДаннымиОбИзделияхКлиентСервер.ПараметрыДействияПроверитьЗаполнитьСпецификацию(
Параметры, СтрокаТЧ, ПараметрыВыбораСпецификаций,, Новый Структура("КлючПутейКДанным", "Объект.Продукция"));
ПараметрыЗаполнения.ДанныеОбИзделии.НачалоПроизводства = ?(Параметры.Свойство("НачалоПериодаСмещения"),
Параметры.НачалоПериодаСмещения,
Параметры.НачалоПериода);
СтрокиРассчитатьДатуЗапуска.Добавить(СтрокаТЧ);
МассивДанных.Добавить(ПараметрыЗаполнения.ДанныеОбИзделии);
МассивСтрок.Добавить(СтрокаТЧ);
КонецЕсли;
Если СтрокаТЧ.Количество = 0
И СтрокаТЧ.КоличествоУпаковок <> 0 Тогда
ОбрабатываемыеСтроки.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
ЗаполняемаяТЧ,
КэшированныеЗначения);
УправлениеДаннымиОбИзделиях.ЗаполнитьСпецификациюВСтроках(МассивСтрок, МассивДанных, ПараметрыВыбораСпецификаций);
Если СтрокиРассчитатьДатуЗапуска.Количество() > 0 Тогда
Планирование.ПолучитьДлительностьСпецификацийИЗаполнитьДатыПоГрафику(
СтрокиРассчитатьДатуЗапуска,
"ДатаВыпуска",
"ДатаЗапуска",
Параметры.Сценарий,
Ложь,
Параметры.СпособРасчетаПотребностейВМатериалах);
КонецЕсли;
ПараметрыГрафика = Неопределено;
ПараметрыВыборки = Справочники.РесурсныеСпецификации.ПараметрыВыборкиДанных(
"МатериалыИУслуги",
,
ОбеспечениеПроизводства.ВариантЗаполненияОбеспеченияПоВерсииПроизводства(Параметры.УправлениеПроизводством2_2));
ПараметрыВыборки.СпособРасчетаМатериалов = Параметры.СпособРасчетаПотребностейВМатериалах;
ПараметрыВыборки.ОкруглятьКоличествоШтучныхТоваров = Ложь;
ЗаполняемаяТЧ.Колонки.Добавить("ИспользуемыеСпецификации");
ЕстьКолонкаОтменено = ЗаполняемаяТЧ.Колонки.Найти("Отменено")<> Неопределено;
Если ЗаполняемаяТЧ.Колонки.Найти("ДатаВыпускаПродукцииПолуфабриката") = Неопределено Тогда
ЗаполняемаяТЧ.Колонки.Добавить("ДатаВыпускаПродукцииПолуфабриката", Новый ОписаниеТипов("Дата"));
КонецЕсли;
Для каждого СтрокаТЧ Из ЗаполняемаяТЧ Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТЧ.Спецификация) ИЛИ СтрокаТЧ.Количество = 0
ИЛИ (ЕстьКолонкаОтменено И СтрокаТЧ.Отменено) Тогда
СтрокаТЧ.ИспользуемыеСпецификации = Неопределено;
Продолжить;
КонецЕсли;
ЗнакКоличества = 1;
ДанныеПоНоменклатуре = Справочники.РесурсныеСпецификации.ДанныеПоНоменклатуреРасширенный();
ЗаполнитьЗначенияСвойств(ДанныеПоНоменклатуре, СтрокаТЧ);
ДанныеПоНоменклатуре.ПодразделениеДиспетчер = Параметры.Подразделение;
ДанныеПоНоменклатуре.НачалоПроизводства = СтрокаТЧ.ДатаЗапуска;
Если СтрокаТЧ.Количество < 0 Тогда
ДанныеПоНоменклатуре.Количество = -ДанныеПоНоменклатуре.Количество;
ЗнакКоличества = -1;
КонецЕсли;
ДанныеСпецификации = Справочники.РесурсныеСпецификации.ДанныеСпецификацииСПолуфабрикатами(
ДанныеПоНоменклатуре,
Истина,
ПараметрыВыборки);
Если Параметры.ПереноситьПотребностьПодразделенийЧерезПеремещения Тогда
РасчетПланаПроизводства.ПроброситьПеремещения(ДанныеСпецификации.МатериалыИУслуги);
КонецЕсли;
СтрокиРассчитатьДатуЗапуска.Очистить();
МассивДанных = Новый Массив;
МассивСтрок = Новый Массив;
Для каждого ЭлементМатериал Из ДанныеСпецификации.МатериалыИУслуги Цикл
Если НЕ ЭлементМатериал.Запланировать Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ЗаполняемаяТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементМатериал, "Номенклатура,Характеристика, Количество");
НоваяСтрока.Полуфабрикат = ЭлементМатериал.Запланировать;
НоваяСтрока.Количество = ЗнакКоличества * НоваяСтрока.Количество;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока.ДатаВыпуска = ПолучитьДатуПоГрафику(СтрокаТЧ.ДатаВыпуска, ЭлементМатериал.ДнейОтПотребности, ПараметрыГрафика);
Если ЗначениеЗаполнено(СтрокаТЧ.ДатаВыпускаПродукцииПолуфабриката) Тогда
НоваяСтрока.ДатаВыпускаПродукцииПолуфабриката = СтрокаТЧ.ДатаВыпускаПродукцииПолуфабриката;
Иначе
НоваяСтрока.ДатаВыпускаПродукцииПолуфабриката = ПланированиеКлиентСервер.РассчитатьДатуНачалаПериода(СтрокаТЧ.ДатаВыпуска, Параметры.Периодичность);
КонецЕсли;
Если ЭлементМатериал.Обособленно Тогда
НоваяСтрока.Назначение = СтрокаТЧ.Назначение;
НоваяСтрока.НаправлениеДеятельности = СтрокаТЧ.НаправлениеДеятельности;
КонецЕсли;
Если Параметры.ЗаполнятьСпецификациюПоПериодам Тогда
Дата = НоваяСтрока.ДатаВыпуска;
Иначе
Если Параметры.Свойство("НачалоПериодаСмещения") Тогда
Дата = Мин(Параметры.НачалоПериодаСмещения, НоваяСтрока.ДатаВыпуска);
ИначеЕсли Параметры.Свойство("НачалоПериода") Тогда
Дата = Мин(Параметры.НачалоПериода, НоваяСтрока.ДатаВыпуска);
КонецЕсли;
КонецЕсли;
ПараметрыЗаполнения = УправлениеДаннымиОбИзделияхКлиентСервер.ПараметрыДействияПроверитьЗаполнитьСпецификацию(
Параметры, НоваяСтрока, ПараметрыВыбораСпецификацийМатериалов);
ПараметрыЗаполнения.ДанныеОбИзделии.НачалоПроизводства = Дата;
МассивДанных.Добавить(ПараметрыЗаполнения.ДанныеОбИзделии);
МассивСтрок.Добавить(НоваяСтрока);
КонецЦикла;
УправлениеДаннымиОбИзделиях.ЗаполнитьСпецификациюВСтроках(МассивСтрок, МассивДанных, ПараметрыВыбораСпецификаций);
Для каждого НоваяСтрока Из МассивСтрок Цикл
Если ЗначениеЗаполнено(СтрокаТЧ.ИспользуемыеСпецификации) Тогда
Если СтрокаТЧ.ИспользуемыеСпецификации.Найти(НоваяСтрока.Спецификация) <> Неопределено Тогда
НоваяСтрока.Спецификация = Неопределено;
Продолжить;
КонецЕсли;
ФМИспользуемыеСпецификации = Новый ФиксированныйМассив(СтрокаТЧ.ИспользуемыеСпецификации);
ИспользуемыеСпецификации = Новый Массив(ФМИспользуемыеСпецификации);
ИспользуемыеСпецификации.Добавить(НоваяСтрока.Спецификация);
НоваяСтрока.ИспользуемыеСпецификации = ИспользуемыеСпецификации;
Иначе
ИспользуемыеСпецификации = Новый Массив;
ИспользуемыеСпецификации.Добавить(НоваяСтрока.Спецификация);
НоваяСтрока.ИспользуемыеСпецификации = ИспользуемыеСпецификации;
КонецЕсли;
СтрокиРассчитатьДатуЗапуска.Добавить(НоваяСтрока);
КонецЦикла;
Если СтрокиРассчитатьДатуЗапуска.Количество() > 0 Тогда
Планирование.ПолучитьДлительностьСпецификацийИЗаполнитьДатыПоГрафику(
СтрокиРассчитатьДатуЗапуска,
"ДатаВыпуска",
"ДатаЗапуска",
Параметры.Сценарий,
Ложь,
Параметры.СпособРасчетаПотребностейВМатериалах);
КонецЕсли;
СтрокаТЧ.ИспользуемыеСпецификации = Неопределено;
КонецЦикла;
КолонкиГруппировок = "";
Для Каждого Колонка Из ЗаполняемаяТЧ.Колонки Цикл
Если Колонка.Имя = "Количество"
Или Колонка.Имя = "КоличествоУпаковок" Тогда
Продолжить;
КонецЕсли;
Если КолонкиГруппировок <> "" Тогда
КолонкиГруппировок = КолонкиГруппировок + ",";
КонецЕсли;
КолонкиГруппировок = КолонкиГруппировок + Колонка.Имя;
КонецЦикла;
ЗаполняемаяТЧ.Свернуть(КолонкиГруппировок, "Количество, КоличествоУпаковок");
ПоместитьВоВременноеХранилище(ЗаполняемаяТЧ, АдресХранилища);
КонецПроцедуры
Процедура ЗаполнитьДокументДляЗамещения(Знач Параметры, Знач АдресХранилища) Экспорт
Если НЕ Параметры.Свойство("ЗаполнитьДляЗамещения") Тогда
Возврат;
КонецЕсли;
ТипПроизводственногоПроцесса = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Ссылка, "ТипПроизводственногоПроцесса");
Если ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка Тогда
ИмяКолонкиПериода = "ДатаЗапуска";
Иначе
ИмяКолонкиПериода = "ДатаВыпуска";
КонецЕсли;
Периоды = Параметры.Периоды;
НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда
ПоместитьВоВременноеХранилище(Новый ТаблицаЗначений, АдресХранилища);
Возврат;
КонецЕсли;
Параметры.Вставить("Периоды", Периоды);
ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
КолонкаПериода = ЗаполняемаяТЧ.Колонки[ИмяКолонкиПериода];
КолонкаПериода.Имя = "ПериодСостава";
Результат = Планирование.ЗаполнитьДляЗамещения(Параметры);
Если Результат.Колонки.Найти("ПериодСостава") = Неопределено Тогда
Результат.Колонки.Добавить("ПериодСостава", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата))
КонецЕсли;
Результат.Колонки["ПериодСостава"].Имя = ИмяКолонкиПериода;
ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
КонецПроцедуры
Функция ДоступныеТипыАналитикБюджетирования(ДокументСсылка, ИмяТаблицы = "") Экспорт
ДоступныеТипыАналитик = Новый Соответствие;
Если ДокументСсылка <> Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеРеквизиты.НомерСтроки,
| ДополнительныеРеквизиты.Значение,
| ТИПЗНАЧЕНИЯ(ДополнительныеРеквизиты.Значение) КАК Тип
|ИЗ
| Документ.ПланПроизводства.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты
|ГДЕ
| ДополнительныеРеквизиты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если НЕ ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.Значение) Тогда
Продолжить;
КонецЕсли;
ДоступныеТипыАналитик.Вставить(ВыборкаДетальныеЗаписи.Тип, "&ДополнительныйРеквизит"+Формат(ВыборкаДетальныеЗаписи.НомерСтроки, "ЧГ=0"));
КонецЦикла;
КонецЕсли;
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.СтруктураПредприятия"), "Продукция.Ссылка.Подразделение");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.Номенклатура"), "Продукция.Номенклатура");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.ВидыНоменклатуры"), "Продукция.Номенклатура.ВидНоменклатуры");
ДоступныеТипыАналитик.Вставить(Тип("ПеречислениеСсылка.ТипыНоменклатуры"), "Продукция.Номенклатура.ТипНоменклатуры");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.Марки"), "Продукция.Номенклатура.Марка");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.Производители"), "Продукция.Номенклатура.Производитель");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.СезонныеГруппы"), "Продукция.Номенклатура.СезоннаяГруппа");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.ЦеновыеГруппы"), "Продукция.Номенклатура.ЦеноваяГруппа");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.ТоварныеКатегории"), "Продукция.Номенклатура.ТоварнаяКатегория");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.ГруппыАналитическогоУчетаНоменклатуры"), "Продукция.Номенклатура.ГруппаАналитическогоУчета");
ДоступныеТипыАналитик.Вставить(Тип("СправочникСсылка.НаправленияДеятельности"), "Продукция.Назначение.НаправлениеДеятельности");
ДоступныеТипыАналитик.Вставить(Тип("ДокументСсылка.ЗаказКлиента"), "Продукция.Назначение.Заказ");
Возврат ДоступныеТипыАналитик;
КонецФункции
Функция МакетФормыВыбораНазначений() Экспорт
МакетФормы = Справочники.Назначения.МакетФормыВыбораНазначений();
ШаблонНазначения = Справочники.Назначения.ДобавитьШаблонНазначений(МакетФормы);
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовВсеСклады", Истина, "Объект.Продукция.Назначение", "ОбеспечениеЗаказовВсеСклады");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад = ЛОЖЬ И Объект.Продукция.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.Продукция.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.Продукция.Характеристика";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ВсеНазначения", Ложь, "Объект.Продукция.Назначение");
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовВсеСклады", Истина, "Объект.ПродукцияПоДатам.Назначение", "ОбеспечениеЗаказовВсеСкладыПоПериодам");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад = ЛОЖЬ И Объект.ПродукцияПоДатам.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.ПродукцияПоДатам.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.ПродукцияПоДатам.Характеристика";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ВсеНазначения", Ложь, "Объект.ПродукцияПоДатам.Назначение");
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ВсеНазначения", Ложь, "Объект.Назначение");
Возврат МакетФормы;
КонецФункции
Функция ПараметрыВыбораСпецификаций(Объект) Экспорт
ПараметрыВыбораСпецификаций = УправлениеДаннымиОбИзделияхКлиентСервер.ПараметрыВыбораСпецификаций();
ПараметрыВыбораСпецификаций.ДоступныеТипы.Добавить(Объект.ТипПроизводственногоПроцесса);
ПараметрыВыбораСпецификаций.ДоступныеСтатусы.Добавить(Перечисления.СтатусыСпецификаций.Действует);
ЭтоРазборка = (Объект.ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка);
ЗаполнятьСпецификациюПоПериодам = (ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидПлана, "ЗаполнятьСпецификациюПоПериодам") = Истина);
СвязиПараметровВыбора = Новый Структура(УправлениеДаннымиОбИзделияхКлиентСервер.ПоляСтруктурыДанныхОбИзделииДляВыбораСпецификации());
СвязиПараметровВыбора.Номенклатура = "Объект.Продукция.Номенклатура";
СвязиПараметровВыбора.Характеристика = "Объект.Продукция.Характеристика";
СвязиПараметровВыбора.ПодразделениеДиспетчер = "Объект.Подразделение";
СвязиПараметровВыбора.НаправлениеДеятельности = "Объект.Продукция.НаправлениеДеятельности";
Если НЕ Объект.КроссТаблица И ЗаполнятьСпецификациюПоПериодам Тогда
СвязиПараметровВыбора.НачалоПроизводства = СтрШаблон("Объект.Продукция.%1", ?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска"));
Иначе
СвязиПараметровВыбора.НачалоПроизводства = "Объект.НачалоПериода";
КонецЕсли;
ПараметрыВыбораСпецификаций.СвязиПараметровВыбора.Вставить("Объект.Продукция.Спецификация", СвязиПараметровВыбора);
СвязиПараметровВыбора = Новый Структура(УправлениеДаннымиОбИзделияхКлиентСервер.ПоляСтруктурыДанныхОбИзделииДляВыбораСпецификации());
СвязиПараметровВыбора.Номенклатура = "ПродукцияПоДатам.Номенклатура";
СвязиПараметровВыбора.Характеристика = "ПродукцияПоДатам.Характеристика";
СвязиПараметровВыбора.ПодразделениеДиспетчер = "Объект.Подразделение";
СвязиПараметровВыбора.НаправлениеДеятельности = "ПродукцияПоДатам.НаправлениеДеятельности";
СвязиПараметровВыбора.НачалоПроизводства = "Объект.НачалоПериода";
ПараметрыВыбораСпецификаций.СвязиПараметровВыбора.Вставить("ПродукцияПоДатам.Спецификация", СвязиПараметровВыбора);
Возврат ПараметрыВыбораСпецификаций;
КонецФункции
Функция ИменаРеквизитовДляЗаполненияПараметровВыбораСпецификаций() Экспорт
ИменаРеквизитов = "ВидПлана,ТипПроизводственногоПроцесса,Сценарий,КроссТаблица";
Возврат ИменаРеквизитов;
КонецФункции
Процедура ПересчитатьПланыПроизводства(Параметры, АдресХранилища) Экспорт
НепроведенныеДокументы = ОбщегоНазначения.ПроверитьПроведенностьДокументов(Параметры.Ссылки);
ОшибкиПроведения = ОбщегоНазначения.ПровестиДокументы(НепроведенныеДокументы);
Если ОшибкиПроведения.Количество() > 0 Тогда
НепроведенныеДокументы = Новый Массив();
Для каждого ОписаниеОшибки Из ОшибкиПроведения Цикл
НепроведенныеДокументы.Добавить(ОписаниеОшибки.Ссылка);
КонецЦикла;
КонецЕсли;
СписокДокументов = ОбщегоНазначенияКлиентСервер.РазностьМассивов(Параметры.Ссылки,
НепроведенныеДокументы);
Для каждого Документ Из СписокДокументов Цикл
ПересчитатьПланПроизводства(Документ);
КонецЦикла;
РегистрыСведений.ОчередьРасчетаПланаПроизводства.ЗапуститьЗадание();
КонецПроцедуры
Процедура ПересчитатьПланПроизводства(Ссылка, ЗапуститьЗадание = Ложь) Экспорт
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Документ.ПланПроизводства");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссылка);
Блокировка.Заблокировать();
ДокументОбъект = Ссылка.ПолучитьОбъект();
ДокументОбъект.ДополнительныеСвойства.Вставить("ПолныйПересчет", Истина);
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
РегистрыСведений.ОчередьРасчетаПланаПроизводства.ДобавитьЗадание(ДокументОбъект.Сценарий, Ссылка, ЗапуститьЗадание);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Событие = РасчетПланаПроизводства.СобытиеЖурналаРегистрации();
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстСообщения = СтрШаблон(НСтр("ru = 'Не удалось установить новую границу расчета в документе: %Ссылка% по причине: %Причина%'"), Ссылка, ТекстОшибки);
ЗаписьЖурналаРегистрации(
Событие,
УровеньЖурналаРегистрации.Ошибка,
Ссылка.Метаданные(),
Ссылка,
ТекстСообщения);
КонецПопытки;
КонецПроцедуры
#Область ДляВызоваИзДругихПодсистем
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Подразделение)
| И ЗначениеРазрешено(Сценарий)
| И ЗначениеРазрешено(ВидПлана)";
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область Проведение
Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт
ИсточникиДанных = Новый Соответствие;
Возврат ИсточникиДанных;
КонецФункции
Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеДокумента.Ссылка КАК Ссылка,
| ДанныеДокумента.Дата КАК Дата,
| ДанныеДокумента.Статус КАК Статус,
| ДанныеДокумента.Сценарий КАК Сценарий,
| ДанныеДокумента.НачалоПериода КАК НачалоПериода,
| ДанныеДокумента.ОкончаниеПериода КАК ОкончаниеПериода,
| ДанныеДокумента.Подразделение КАК Подразделение,
| ДанныеДокумента.СтатьяБюджетов КАК СтатьяБюджетов,
| ДанныеДокумента.СценарийБюджетирования КАК СценарийБюджетирования,
| ДанныеДокумента.СценарийБюджетирования.Валюта КАК ВалютаСценария,
| ДанныеДокумента.ОтражаетсяВБюджетировании КАК ОтражаетсяВБюджетировании,
| ДанныеДокумента.Сценарий КАК СценарийПланирования,
| ДанныеДокумента.ВидПлана КАК ВидПлана,
| ДанныеДокумента.Сценарий.Периодичность КАК Периодичность,
| ЕСТЬNULL(ДанныеДокумента.Сценарий.ИспользоватьДляПланированияМатериалов, ЛОЖЬ) КАК ИспользоватьДляПланированияМатериалов,
| ДанныеДокумента.Назначение КАК Назначение,
| ДанныеДокумента.Замещающий КАК Замещающий,
| ДанныеДокумента.ТипПроизводственногоПроцесса КАК ТипПроизводственногоПроцесса,
| ДанныеДокумента.МоментВремени КАК МоментВремени,
| ДанныеДокумента.РазделительРасчета КАК РазделительРасчета,
| ДанныеДокумента.ВидПлана.ЗаполнятьНазначениеВТЧ КАК ЗаполнятьНазначениеВТЧ,
| ДанныеДокумента.ВидПлана.ПланироватьПолуфабрикатыАвтоматически КАК ПланироватьПолуфабрикатыАвтоматически
|ИЗ
| Документ.ПланПроизводства КАК ДанныеДокумента
|ГДЕ
| ДанныеДокумента.Ссылка = &Ссылка
|;
|
|
|ВЫБРАТЬ
| ДополнительныеРеквизиты.НомерСтроки КАК НомерСтроки,
| ДополнительныеРеквизиты.Значение КАК Значение
|ИЗ
| Документ.ПланПроизводства.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты
|ГДЕ
| ДополнительныеРеквизиты.Ссылка = &Ссылка";
УстановитьПривилегированныйРежим(Истина);
РезультатыЗапроса = Запрос.ВыполнитьПакет();
Реквизиты = РезультатыЗапроса[0].Выбрать();
Реквизиты.Следующий();
Запрос.УстановитьПараметр("Дата", Реквизиты.Дата);
Запрос.УстановитьПараметр("Статус", Реквизиты.Статус);
Запрос.УстановитьПараметр("Сценарий", Реквизиты.Сценарий);
Запрос.УстановитьПараметр("ВидПлана", Реквизиты.ВидПлана);
Запрос.УстановитьПараметр("НачалоПериода", Реквизиты.НачалоПериода);
Запрос.УстановитьПараметр("ОкончаниеПериода", Реквизиты.ОкончаниеПериода);
Запрос.УстановитьПараметр("Подразделение", Реквизиты.Подразделение);
Запрос.УстановитьПараметр("СтатьяБюджетов", Реквизиты.СтатьяБюджетов);
Запрос.УстановитьПараметр("СценарийБюджетирования", Реквизиты.СценарийБюджетирования);
Запрос.УстановитьПараметр("ВалютаСценария", Реквизиты.ВалютаСценария);
Запрос.УстановитьПараметр("ОтражаетсяВБюджетировании", Реквизиты.ОтражаетсяВБюджетировании);
Запрос.УстановитьПараметр("Назначение", Реквизиты.Назначение);
Запрос.УстановитьПараметр("ЗаполнятьНазначениеВТЧ", Реквизиты.ЗаполнятьНазначениеВТЧ);
Запрос.УстановитьПараметр("Замещающий", Реквизиты.Замещающий);
Запрос.УстановитьПараметр("ТипПроизводственногоПроцесса", Реквизиты.ТипПроизводственногоПроцесса);
Запрос.УстановитьПараметр("Периодичность", Реквизиты.Периодичность);
Запрос.УстановитьПараметр("МоментВремени", Реквизиты.МоментВремени);
Запрос.УстановитьПараметр("РазделительРасчета", Реквизиты.РазделительРасчета);
Запрос.УстановитьПараметр("ПланироватьПолуфабрикатыАвтоматически", Реквизиты.ПланироватьПолуфабрикатыАвтоматически);
Запрос.УстановитьПараметр("ИспользоватьДляПланированияМатериалов", Реквизиты.ИспользоватьДляПланированияМатериалов);
ВыборкаДетальныеЗаписи = РезультатыЗапроса[1].Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если НЕ ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.Значение) Тогда
Продолжить;
КонецЕсли;
Запрос.УстановитьПараметр("ДополнительныйРеквизит"+Формат(ВыборкаДетальныеЗаписи.НомерСтроки, "ЧГ=0"), ВыборкаДетальныеЗаписи.Значение);
КонецЦикла;
КонецПроцедуры
Функция ТекстЗапросаТаблицаПланыПроизводства(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ПланыПроизводства";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
Если НЕ ПроведениеДокументов.ЕстьТаблицаЗапроса("ВТПродукция", ТекстыЗапроса) Тогда
ТекстЗапросаВТПродукция(Запрос, ТекстыЗапроса);
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Период КАК Период,
| &Сценарий КАК Сценарий,
| &Статус КАК Статус,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| &Подразделение КАК Подразделение,
| &Ссылка КАК ПланПроизводства,
| Таблица.Спецификация КАК Спецификация,
| Таблица.Назначение КАК Назначение,
| ДАТАВРЕМЯ(1,1,1) КАК ДатаВыпускаПолуфабриката,
| Таблица.ДатаЗапускаВыпуска КАК ДатаЗапускаВыпуска,
| ЛОЖЬ КАК ЭтоПолуфабрикат,
| &ТипПроизводственногоПроцесса КАК ТипПроизводственногоПроцесса,
| &ВидПлана КАК ВидПлана,
| Таблица.Количество КАК Количество,
| Таблица.КЗаказу КАК КЗаказу,
| Таблица.ЗаданИнтервалПотребности КАК ЗаданИнтервалПотребности,
| Таблица.ИнтервалПотребностиОт КАК ИнтервалПотребностиОт,
| Таблица.ИнтервалПотребностиДо КАК ИнтервалПотребностиДо
|ИЗ
| ВТПродукция КАК Таблица";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаТаблицаОборотыБюджетов(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ОборотыБюджетов";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
Если НЕ ПроведениеДокументов.ЕстьТаблицаЗапроса("ВТПродукция", ТекстыЗапроса) Тогда
ТекстЗапросаВТПродукция(Запрос, ТекстыЗапроса);
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| &Дата КАК Период,
| &Статус КАК Статус,
| Продукция.Период КАК ПериодПланирования,
| &СценарийБюджетирования КАК Сценарий,
| &ВалютаСценария КАК Валюта,
| &Подразделение КАК Подразделение,
| &СтатьяБюджетов КАК СтатьяБюджетов,
|
| &Аналитика1 КАК Аналитика1,
| &Аналитика2 КАК Аналитика2,
| &Аналитика3 КАК Аналитика3,
| &Аналитика4 КАК Аналитика4,
| &Аналитика5 КАК Аналитика5,
| &Аналитика6 КАК Аналитика6,
|
| СУММА(Продукция.Количество) КАК Количество
|ИЗ
| ВТПродукция КАК Продукция
|ГДЕ
| &ОтражаетсяВБюджетировании
| И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Отменен)
|
|СГРУППИРОВАТЬ ПО
| &Аналитика1,
| &Аналитика2,
| &Аналитика3,
| &Аналитика4,
| &Аналитика5,
| &Аналитика6,
| Продукция.Период
|
|ИМЕЮЩИЕ
| СУММА(Продукция.Количество) <> 0";
БюджетированиеСервер.УстановитьВЗапросеВыраженияЗаполненияАналитики(Запрос.Параметры.Ссылка, ТекстЗапроса, Запрос.Параметры.СтатьяБюджетов, Документы.ПланПроизводства, "Аналитика");
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаТаблицаПланыВыпуска(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ПланыВыпускаИзделий";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
Если НЕ ПроведениеДокументов.ЕстьТаблицаЗапроса("ВТПродукция", ТекстыЗапроса) Тогда
ТекстЗапросаВТПродукция(Запрос, ТекстыЗапроса);
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Период КАК Период,
| &Сценарий КАК Сценарий,
| &ВидПлана КАК ВидПлана,
| &Статус КАК Статус,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Назначение КАК Назначение,
| &Подразделение КАК ПодразделениеДиспетчер,
| ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка) КАК ПодразделениеИсполнитель,
| &Ссылка КАК ПланПроизводства,
| Таблица.Спецификация КАК Спецификация,
| ЗНАЧЕНИЕ(Перечисление.ТипыВыпусковПлановПроизводства.Основной) КАК ТипВыпуска,
| Таблица.Период КАК ДатаПроизводства,
| Таблица.Спецификация КАК СпецификацияПродукции,
| Таблица.Назначение КАК НазначениеПродукции,
| Таблица.Номенклатура КАК НоменклатураПродукции,
| Таблица.Характеристика КАК ХарактеристикаПродукции,
| Таблица.Количество КАК Количество,
| Таблица.КЗаказу КАК КЗаказу
|ИЗ
| ВТПродукция КАК Таблица";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаВТПродукция(Запрос, ТекстыЗапроса)
ИмяРегистра = "ВТПродукция";
ТекстЗапроса =
"ВЫБРАТЬ
| &Ссылка КАК Ссылка,
| ВЫБОР
| КОГДА &ТипПроизводственногоПроцесса = ЗНАЧЕНИЕ(Перечисление.ТипыПроизводственныхПроцессов.Разборка)
| И Таблица.ДатаЗапуска <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА Таблица.ДатаЗапуска
| КОГДА &ТипПроизводственногоПроцесса В (ЗНАЧЕНИЕ(Перечисление.ТипыПроизводственныхПроцессов.Сборка), ЗНАЧЕНИЕ(Перечисление.ТипыПроизводственныхПроцессов.Ремонт))
| И Таблица.ДатаВыпуска <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА Таблица.ДатаВыпуска
| ИНАЧЕ Таблица.Ссылка.НачалоПериода
| КОНЕЦ КАК Период,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Спецификация КАК Спецификация,
| ВЫБОР
| КОГДА СправочникНоменклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| ИНАЧЕ Таблица.Назначение
| КОНЕЦ КАК Назначение,
| ВЫБОР
| КОГДА &ТипПроизводственногоПроцесса В (ЗНАЧЕНИЕ(Перечисление.ТипыПроизводственныхПроцессов.Сборка), ЗНАЧЕНИЕ(Перечисление.ТипыПроизводственныхПроцессов.Ремонт))
| И Таблица.ДатаЗапуска <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА Таблица.ДатаЗапуска
| ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
| КОНЕЦ КАК ДатаЗапускаВыпуска,
| ВЫБОР
| КОГДА Таблица.Замещен
| ТОГДА 0
| ИНАЧЕ Таблица.Количество
| КОНЕЦ КАК Количество,
| ВЫБОР
| КОГДА &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден)
| ТОГДА Таблица.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК КЗаказу,
| ВЫБОР
| КОГДА Таблица.ЗаданИнтервалПотребности
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК ЗаданИнтервалПотребности,
| Таблица.ИнтервалПотребностиОт КАК ИнтервалПотребностиОт,
| Таблица.ИнтервалПотребностиДо КАК ИнтервалПотребностиДо
|ПОМЕСТИТЬ ВТПродукция
|ИЗ
| Документ.ПланПроизводства.Продукция КАК Таблица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
| ПО Таблица.Номенклатура = СправочникНоменклатура.Ссылка
|ГДЕ
| Таблица.Ссылка = &Ссылка
| И (Таблица.Количество <> 0
| ИЛИ Таблица.ЗаданИнтервалПотребности)
| И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Отменен)
| И НЕ Таблица.Отменено
| И (НЕ Таблица.Замещен
| И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден)
| ИЛИ НЕ Таблица.ЗамещенКЗаказу
| И &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден))
| И НЕ &ИспользоватьДляПланированияМатериалов";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Процедура ОтразитьВБюджетировании(ДокументСсылка, Отказ = Ложь) Экспорт
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьБюджетирование") Тогда
Возврат;
КонецЕсли;
Регистры = Новый Структура;
Регистры.Вставить("ОборотыБюджетов", ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("РегистрНакопления.ОборотыБюджетов"));
УстановитьПривилегированныйРежим(Истина);
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Документ.ПланПроизводства");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый;
ЭлементБлокировки.УстановитьЗначение("Ссылка", ДокументСсылка);
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ПланыПроизводства");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый;
ЭлементБлокировки.УстановитьЗначение("ПланПроизводства", ДокументСсылка);
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОборотыБюджетов.НаборЗаписей");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Регистратор", ДокументСсылка);
Блокировка.Заблокировать();
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
Запрос = Новый Запрос;
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
ТекстыЗапроса = Новый СписокЗначений();
ТекстЗапроса =
"ВЫБРАТЬ
| &Ссылка КАК Ссылка,
| Таблица.Период КАК Период,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Спецификация КАК Спецификация,
| Таблица.Назначение КАК Назначение,
| Таблица.Количество КАК Количество
|ПОМЕСТИТЬ ВТПродукция
|ИЗ
| РегистрНакопления.ПланыПроизводства КАК Таблица
|ГДЕ
| Таблица.ПланПроизводства = &Ссылка
| И Таблица.РазделительРасчета = &РазделительРасчета
| И Таблица.Количество <> 0";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ВТПродукция");
ТекстЗапросаТаблицаОборотыБюджетов(Запрос, ТекстыЗапроса, Регистры);
ТаблицыДляДвижений = ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос,
ТекстыЗапроса,
Неопределено);
БюджетированиеСервер.ОтразитьДвижения(ТаблицыДляДвижений, ДокументОбъект.Движения, Отказ);
ДокументОбъект.Движения.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ВызватьИсключение ТекстОшибки;
КонецПопытки;
КонецПроцедуры
Функция ЗапросЗамещенныеИЗамещающиеПланы(Параметры) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПланПроизводстваЗамещающий.Ссылка КАК ЗамещаемыйПлан,
| ВЫБОР
| КОГДА &НачалоПериодаЗамещения > ПланПроизводстваЗамещающий.НачалоПериодаЗамещения
| ТОГДА &НачалоПериодаЗамещения
| ИНАЧЕ ПланПроизводстваЗамещающий.НачалоПериодаЗамещения
| КОНЕЦ КАК НачалоПериода,
| ВЫБОР
| КОГДА &ОкончаниеПериода < ПланПроизводстваЗамещающий.ОкончаниеПериода
| ТОГДА &ОкончаниеПериода
| ИНАЧЕ ПланПроизводстваЗамещающий.ОкончаниеПериода
| КОНЕЦ КАК ОкончаниеПериода,
| ПланПроизводстваЗамещающий.Статус КАК Статус
|ИЗ
| Документ.ПланПроизводства КАК ПланПроизводстваЗамещающий
|ГДЕ
| ПланПроизводстваЗамещающий.ОкончаниеПериода >= &НачалоПериодаЗамещения
| И ПланПроизводстваЗамещающий.НачалоПериодаЗамещения <= &ОкончаниеПериода
| И ПланПроизводстваЗамещающий.Ссылка <> &Ссылка
| И ПланПроизводстваЗамещающий.Проведен
| И ПланПроизводстваЗамещающий.ВидПлана = &ВидПлана
| И (ПланПроизводстваЗамещающий.Статус.Порядок >= &СтатусИндекс
| ИЛИ ПланПроизводстваЗамещающий.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.НаУтверждении)
| И &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден))
| И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Отменен)
| И ПланПроизводстваЗамещающий.Дата > &Дата
| И ПланПроизводстваЗамещающий.Подразделение = &Подразделение
| И ПланПроизводстваЗамещающий.Назначение = &Назначение
|
|УПОРЯДОЧИТЬ ПО
| НачалоПериодаЗамещения,
| Статус
|;
|
|
|ВЫБРАТЬ
| ПланПроизводстваЗамещенный.Ссылка КАК ЗамещенныйПлан,
| ВЫБОР
| КОГДА &НачалоПериодаЗамещения > ПланПроизводстваЗамещенный.НачалоПериодаЗамещения
| ТОГДА &НачалоПериодаЗамещения
| ИНАЧЕ ПланПроизводстваЗамещенный.НачалоПериодаЗамещения
| КОНЕЦ КАК НачалоПериода,
| ВЫБОР
| КОГДА &ОкончаниеПериода < ПланПроизводстваЗамещенный.ОкончаниеПериода
| ТОГДА &ОкончаниеПериода
| ИНАЧЕ ПланПроизводстваЗамещенный.ОкончаниеПериода
| КОНЕЦ КАК ОкончаниеПериода,
| ПланПроизводстваЗамещенный.Статус КАК Статус
|ИЗ
| Документ.ПланПроизводства КАК ПланПроизводстваЗамещенный
|ГДЕ
| ПланПроизводстваЗамещенный.ОкончаниеПериода >= &НачалоПериодаЗамещения
| И ПланПроизводстваЗамещенный.НачалоПериодаЗамещения <= &ОкончаниеПериода
| И ПланПроизводстваЗамещенный.Ссылка <> &Ссылка
| И ПланПроизводстваЗамещенный.Проведен
| И ПланПроизводстваЗамещенный.ВидПлана = &ВидПлана
| И (ПланПроизводстваЗамещенный.Статус.Порядок <= &СтатусИндекс
| ИЛИ ПланПроизводстваЗамещенный.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден)
| И &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.НаУтверждении))
| И ПланПроизводстваЗамещенный.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Отменен)
| И ПланПроизводстваЗамещенный.Дата < &Дата
| И ПланПроизводстваЗамещенный.Подразделение = &Подразделение
| И ПланПроизводстваЗамещенный.Назначение = &Назначение
|
|УПОРЯДОЧИТЬ ПО
| НачалоПериодаЗамещения,
| Статус";
Запрос.УстановитьПараметр("Ссылка", Параметры.Ссылка);
Запрос.УстановитьПараметр("ВидПлана", Параметры.ВидПлана);
Запрос.УстановитьПараметр("СтатусИндекс", Перечисления.СтатусыПланов.Индекс(Параметры.Статус));
Запрос.УстановитьПараметр("Статус", Параметры.Статус);
Запрос.УстановитьПараметр("Дата", Параметры.Дата);
Запрос.УстановитьПараметр("Подразделение", Параметры.Подразделение);
Запрос.УстановитьПараметр("Назначение", Параметры.Назначение);
Запрос.УстановитьПараметр("НачалоПериодаЗамещения", Параметры.НачалоПериодаЗамещения);
Запрос.УстановитьПараметр("ОкончаниеПериода", Параметры.ОкончаниеПериода);
Запрос.УстановитьПараметр("Периодичность", Параметры.Периодичность);
Возврат Запрос;
КонецФункции
Функция ЗапросЗамещения(Параметры) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПланыПроизводстваОбороты.Период КАК ПериодСостава,
| ПланыПроизводстваОбороты.Сценарий КАК Сценарий,
| ПланыПроизводстваОбороты.Статус КАК Статус,
| ПланыПроизводстваОбороты.Номенклатура КАК Номенклатура,
| ПланыПроизводстваОбороты.Характеристика КАК Характеристика,
| ПланыПроизводстваОбороты.Назначение КАК Назначение,
| ПланыПроизводстваОбороты.Подразделение КАК Подразделение,
| ПланыПроизводстваОбороты.ЭтоПолуфабрикат КАК Полуфабрикат,
| ПланыПроизводстваОбороты.КоличествоОборот КАК КоличествоУпаковок
|ИЗ
| РегистрНакопления.ПланыПроизводства.Обороты(
| &НачалоПериода,
| &КонецПериода,
| Запись,
| Сценарий = &Сценарий
| И ВидПлана = &ВидПлана
| И (&ЗаполнятьНазначениеВТЧ
| ИЛИ Назначение = &Назначение)
| И Статус В (&Статусы)
| И НЕ Запланировать
| И &ТекстЗапросаОтборПодразделение) КАК ПланыПроизводстваОбороты
|УПОРЯДОЧИТЬ ПО
| Полуфабрикат";
Запрос.УстановитьПараметр("КонецПериода", Параметры.КонецПериодаСмещения);
Запрос.УстановитьПараметр("НачалоПериода", Параметры.НачалоПериодаСмещения);
Запрос.УстановитьПараметр("Подразделение", Параметры.Подразделение);
Запрос.УстановитьПараметр("Статусы", Параметры.Статусы);
Запрос.УстановитьПараметр("Сценарий", Параметры.Сценарий);
Запрос.УстановитьПараметр("ВидПлана", Параметры.ВидПлана);
Запрос.УстановитьПараметр("ЗаполнятьНазначениеВТЧ", Параметры.ЗаполнятьНазначениеВТЧ);
Запрос.УстановитьПараметр("Назначение", Параметры.Назначение);
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"&ТекстЗапросаОтборПодразделение",
?(ЗначениеЗаполнено(Параметры.Подразделение),"Подразделение = &Подразделение","Истина"));
Возврат Запрос;
КонецФункции
#КонецОбласти
#Область Печать
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ПланПроизводства";
КомандаПечати.Представление = НСтр("ru = 'План производства'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КонецПроцедуры
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПланПроизводства") Тогда
Если ПараметрыПечати = Неопределено Тогда
ПараметрыПечати = Новый Структура;
КонецЕсли;
ПараметрыПечати.Вставить("ВключатьПолуфабрикаты", Ложь);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПланПроизводства",
НСтр("ru = 'План производства'"),
СформироватьПечатнуюФормуПлана(МассивОбъектов, ОбъектыПечати, ПараметрыПечати));
КонецЕсли;
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
КонецПроцедуры
Функция СформироватьПечатнуюФормуПлана(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)
УстановитьПривилегированныйРежим(Истина);
Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("КроссТаблица") Тогда
ПоУмолчаниюКроссТаблица = ПараметрыПечати.КроссТаблица = Истина;
ПоУмолчаниюТаблица = ПараметрыПечати.КроссТаблица = Ложь;
Иначе
ПоУмолчаниюКроссТаблица = Ложь;
ПоУмолчаниюТаблица = Ложь;
КонецЕсли;
ВыводитьШапку = Истина;
Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("ВыводитьШапку") Тогда
ВыводитьШапку = ПараметрыПечати.ВыводитьШапку;
КонецЕсли;
ВыводитьСценарий = Истина;
ВыводитьПериодСтатус = Истина;
ВыводитьПодразделение = Истина;
ВключатьПолуфабрикаты = Истина;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьСценарий", ВыводитьСценарий) Тогда
ВыводитьСценарий = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьПериодСтатус", ВыводитьПериодСтатус) Тогда
ВыводитьПериодСтатус = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьПодразделение", ВыводитьПодразделение) Тогда
ВыводитьПодразделение = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВключатьПолуфабрикаты", ВключатьПолуфабрикаты) Тогда
ВключатьПолуфабрикаты = Истина;
КонецЕсли;
КолонкаКодов = ФормированиеПечатныхФорм.ДополнительнаяКолонкаПечатныхФормДокументов();
ИмяКолонкиКодов = КолонкаКодов.ИмяКолонки;
ПредставлениеКолонкиКодов = КолонкаКодов.ПредставлениеКолонки;
ВыводитьКоды = ЗначениеЗаполнено(ИмяКолонкиКодов);
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТаблицаДокумента.Ссылка КАК Ссылка,
| ТаблицаДокумента.Номер КАК Номер,
| ТаблицаДокумента.Дата КАК Дата,
| ТаблицаДокумента.Ответственный КАК Ответственный,
| ТаблицаДокумента.Статус КАК Статус,
| ТаблицаДокумента.Периодичность КАК Периодичность,
| МИНИМУМ(ВЫБОР
| КОГДА &ВключатьПолуфабрикаты И (&ПоУмолчаниюКроссТаблица ИЛИ ТаблицаДокумента.КроссТаблица)
| И ЕСТЬNULL(ПланыПроизводства.ДатаВыпускаПолуфабриката, ТаблицаДокумента.НачалоПериода) < ТаблицаДокумента.НачалоПериода
| ТОГДА ПланыПроизводства.ДатаВыпускаПолуфабриката
| ИНАЧЕ ТаблицаДокумента.НачалоПериода
| КОНЕЦ) КАК НачалоПериода,
| ТаблицаДокумента.ОкончаниеПериода КАК ОкончаниеПериода,
| ТаблицаДокумента.Сценарий КАК Сценарий,
| ТаблицаДокумента.ВидПлана КАК ВидПлана,
| ВЫБОР
| КОГДА &ПоУмолчаниюКроссТаблица
| ИЛИ ТаблицаДокумента.КроссТаблица
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК КроссТаблица,
| ТаблицаДокумента.ЗаполненоАвтоматически КАК ЗаполненоАвтоматически,
| ТаблицаДокумента.Подразделение КАК Подразделение,
| ТаблицаДокумента.Назначение КАК Назначение,
| ТаблицаДокумента.ТипПроизводственногоПроцесса КАК ТипПроизводственногоПроцесса,
| СпрВидыПланов.ЗаполнятьПодразделение КАК ЗаполнятьПодразделение,
| СценарииПланирования.ИспользоватьДляПланированияМатериалов КАК ЗаполнятьСпецификациюВТЧ,
| СценарииПланирования.ОтображатьНомерПериода КАК ОтображатьНомерПериода,
| Пользователи.ФизическоеЛицо КАК ОтветственныйФизЛицо,
| СценарииПланирования.ПланированиеПоНазначениям КАК ПланированиеПоНазначениям,
| СпрВидыПланов.ПланироватьПолуфабрикатыАвтоматически КАК ПланироватьПолуфабрикатыАвтоматически,
| СпрВидыПланов.ЗаполнятьНазначениеВТЧ КАК ЗаполнятьНазначениеВТЧ
|ИЗ
| Документ.ПланПроизводства КАК ТаблицаДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СценарииТоварногоПланирования КАК СценарииПланирования
| ПО ТаблицаДокумента.Сценарий = СценарииПланирования.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыПланов КАК СпрВидыПланов
| ПО ТаблицаДокумента.ВидПлана = СпрВидыПланов.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
| ПО ТаблицаДокумента.Ответственный = Пользователи.Ссылка
| {ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПланыПроизводства КАК ПланыПроизводства
| ПО &ВключатьПолуфабрикаты
| И ТаблицаДокумента.Ссылка = ПланыПроизводства.ПланПроизводства
| И (&ПоУмолчаниюКроссТаблица ИЛИ ТаблицаДокумента.КроссТаблица)
| И СпрВидыПланов.ПланироватьПолуфабрикатыАвтоматически
| И ПланыПроизводства.ЭтоПолуфабрикат}
|ГДЕ
| ТаблицаДокумента.Ссылка В(&МассивДокументов)
|
|СГРУППИРОВАТЬ ПО
| ТаблицаДокумента.Ссылка,
| ТаблицаДокумента.Номер,
| ТаблицаДокумента.Дата,
| ТаблицаДокумента.Ответственный,
| ТаблицаДокумента.Статус,
| ТаблицаДокумента.Периодичность,
| ТаблицаДокумента.НачалоПериода,
| ТаблицаДокумента.Сценарий,
| ТаблицаДокумента.ВидПлана,
| ТаблицаДокумента.ЗаполненоАвтоматически,
| ТаблицаДокумента.Подразделение,
| ТаблицаДокумента.Назначение,
| ТаблицаДокумента.ТипПроизводственногоПроцесса,
| СпрВидыПланов.ЗаполнятьПодразделение,
| СценарииПланирования.ИспользоватьДляПланированияМатериалов,
| СценарииПланирования.ОтображатьНомерПериода,
| Пользователи.ФизическоеЛицо,
| СценарииПланирования.ПланированиеПоНазначениям,
| СпрВидыПланов.ПланироватьПолуфабрикатыАвтоматически,
| СпрВидыПланов.ЗаполнятьНазначениеВТЧ
|УПОРЯДОЧИТЬ ПО
| Ссылка
|;
|
|
|ВЫБРАТЬ
| ТаблицаТовары.Ссылка КАК Ссылка,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Номенклатура.НаименованиеПолное КАК ТоварНаименованиеПолное,
| ТаблицаТовары.Номенклатура.Код КАК Код,
| ТаблицаТовары.Номенклатура.Артикул КАК Артикул,
| ВЫБОР
| КОГДА ТаблицаТовары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА ТаблицаТовары.Номенклатура.ЕдиницаИзмерения
| ИНАЧЕ ТаблицаТовары.Упаковка
| КОНЕЦ КАК ЕдиницаИзмерения,
| ТаблицаТовары.Характеристика.НаименованиеПолное КАК ХарактеристикаНаименованиеПолное,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ТаблицаТовары.Упаковка КАК Упаковка,
| ТаблицаТовары.НомерСтроки КАК НомерСтроки,
| ТаблицаТовары.Полуфабрикат КАК Полуфабрикат,
| ВЫБОР
| КОГДА ТаблицаТовары.Ссылка.ТипПроизводственногоПроцесса = ЗНАЧЕНИЕ(Перечисление.ТипыПроизводственныхПроцессов.Разборка)
| ТОГДА ТаблицаТовары.ДатаЗапуска
| ИНАЧЕ ТаблицаТовары.ДатаВыпуска
| КОНЕЦ КАК ДатаПериода,
| ТаблицаТовары.КоличествоУпаковок КАК Количество,
| ТаблицаТовары.Комментарий КАК Комментарий,
| ТаблицаТовары.Спецификация КАК Спецификация,
| ТаблицаТовары.Назначение.Наименование КАК НазначениеНаименование,
| ТаблицаТовары.Назначение КАК Назначение
|ИЗ
| Документ.ПланПроизводства.Продукция КАК ТаблицаТовары
|ГДЕ
| (&ПоУмолчаниюТаблица
| ИЛИ НЕ ТаблицаТовары.Ссылка.КроссТаблица)
| И (&ВключатьПолуфабрикаты ИЛИ ТаблицаТовары.Полуфабрикат = ЛОЖЬ)
| И ТаблицаТовары.Ссылка В(&МассивДокументов)
| И НЕ ТаблицаТовары.Отменено
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВложенныйЗапрос.Ссылка,
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Номенклатура.НаименованиеПолное,
| ВложенныйЗапрос.Номенклатура.Код,
| ВложенныйЗапрос.Номенклатура.Артикул,
| ВЫБОР
| КОГДА ВложенныйЗапрос.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА ВложенныйЗапрос.Номенклатура.ЕдиницаИзмерения
| ИНАЧЕ ВложенныйЗапрос.Упаковка
| КОНЕЦ,
| ВложенныйЗапрос.Характеристика.НаименованиеПолное,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Упаковка,
| МИНИМУМ(ВложенныйЗапрос.НомерСтроки),
| ВложенныйЗапрос.Полуфабрикат,
| ВложенныйЗапрос.ДатаПериода,
| СУММА(ВложенныйЗапрос.КоличествоУпаковок),
| МАКСИМУМ(ВложенныйЗапрос.Комментарий),
| ВложенныйЗапрос.Спецификация,
| ВложенныйЗапрос.Назначение.Наименование,
| ВложенныйЗапрос.Назначение
|ИЗ
| (ВЫБРАТЬ
| ТаблицаТовары.Ссылка КАК Ссылка,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ТаблицаТовары.Упаковка КАК Упаковка,
| ВЫБОР
| КОГДА ТаблицаТовары.Ссылка.ТипПроизводственногоПроцесса = ЗНАЧЕНИЕ(Перечисление.ТипыПроизводственныхПроцессов.Разборка)
| ТОГДА ВЫБОР ТаблицаДокумента.Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаЗапуска, ГОД)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаЗапуска, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаЗапуска, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаЗапуска, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаЗапуска, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаЗапуска, НЕДЕЛЯ)
| ИНАЧЕ ТаблицаТовары.ДатаЗапуска
| КОНЕЦ
| ИНАЧЕ ВЫБОР ТаблицаДокумента.Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаВыпуска, ГОД)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаВыпуска, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаВыпуска, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаВыпуска, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаВыпуска, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаВыпуска, НЕДЕЛЯ)
| ИНАЧЕ ТаблицаТовары.ДатаВыпуска
| КОНЕЦ
| КОНЕЦ КАК ДатаПериода,
| ТаблицаТовары.НомерСтроки КАК НомерСтроки,
| ТаблицаТовары.Полуфабрикат КАК Полуфабрикат,
| ВЫБОР
| КОГДА ТаблицаТовары.Отменено
| ТОГДА 0
| ИНАЧЕ ТаблицаТовары.КоличествоУпаковок
| КОНЕЦ КАК КоличествоУпаковок,
| ВЫБОР
| КОГДА ТаблицаТовары.Отменено
| ТОГДА """"
| ИНАЧЕ ВЫРАЗИТЬ(ТаблицаТовары.Комментарий КАК СТРОКА(1000))
| КОНЕЦ КАК Комментарий,
| ТаблицаТовары.Спецификация КАК Спецификация,
| ТаблицаТовары.Назначение КАК Назначение
| ИЗ
| Документ.ПланПроизводства.Продукция КАК ТаблицаТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПланПроизводства КАК ТаблицаДокумента
| ПО ТаблицаТовары.Ссылка = ТаблицаДокумента.Ссылка
| ГДЕ
| (&ПоУмолчаниюКроссТаблица
| ИЛИ ТаблицаТовары.Ссылка.КроссТаблица)
| И (&ВключатьПолуфабрикаты ИЛИ ТаблицаТовары.Полуфабрикат = ЛОЖЬ)
| И ТаблицаТовары.Ссылка В(&МассивДокументов)) КАК ВложенныйЗапрос
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Ссылка,
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Номенклатура.НаименованиеПолное,
| ВложенныйЗапрос.Номенклатура.Код,
| ВложенныйЗапрос.Номенклатура.Артикул,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Характеристика.НаименованиеПолное,
| ВложенныйЗапрос.Назначение,
| ВложенныйЗапрос.Назначение.Наименование,
| ВложенныйЗапрос.Полуфабрикат,
| ВложенныйЗапрос.ДатаПериода,
| ВЫБОР
| КОГДА ВложенныйЗапрос.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА ВложенныйЗапрос.Номенклатура.ЕдиницаИзмерения
| ИНАЧЕ ВложенныйЗапрос.Упаковка
| КОНЕЦ,
| ВложенныйЗапрос.Упаковка,
| ВложенныйЗапрос.Спецификация
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВложенныйЗапрос.ПланПроизводства,
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Номенклатура.НаименованиеПолное,
| ВложенныйЗапрос.Номенклатура.Код,
| ВложенныйЗапрос.Номенклатура.Артикул,
| ВложенныйЗапрос.Номенклатура.ЕдиницаИзмерения,
| ВложенныйЗапрос.Характеристика.НаименованиеПолное,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Номенклатура.ЕдиницаИзмерения,
| МИНИМУМ(ВложенныйЗапрос.НомерСтроки),
| ВложенныйЗапрос.ЭтоПолуфабрикат,
| ВложенныйЗапрос.Период,
| СУММА(ВложенныйЗапрос.Количество),
| МАКСИМУМ(ВложенныйЗапрос.Комментарий),
| ВложенныйЗапрос.Спецификация,
| ВложенныйЗапрос.Назначение.Наименование,
| ВложенныйЗапрос.Назначение
|ИЗ
| (ВЫБРАТЬ
| ПланыПроизводства.ПланПроизводства КАК ПланПроизводства,
| ПланыПроизводства.Номенклатура КАК Номенклатура,
| ПланыПроизводства.Характеристика КАК Характеристика,
| ПланыПроизводства.Назначение КАК Назначение,
| ПланыПроизводства.Спецификация КАК Спецификация,
|
| ВЫБОР ТаблицаДокумента.Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ПланыПроизводства.ДатаВыпускаПолуфабриката, ГОД)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ПланыПроизводства.ДатаВыпускаПолуфабриката, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ПланыПроизводства.ДатаВыпускаПолуфабриката, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ПланыПроизводства.ДатаВыпускаПолуфабриката, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ПланыПроизводства.ДатаВыпускаПолуфабриката, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ПланыПроизводства.ДатаВыпускаПолуфабриката, НЕДЕЛЯ)
| ИНАЧЕ ПланыПроизводства.ДатаВыпускаПолуфабриката
| КОНЕЦ КАК Период,
|
| 1 КАК НомерСтроки,
| ПланыПроизводства.ЭтоПолуфабрикат КАК ЭтоПолуфабрикат,
| ПланыПроизводства.Количество КАК Количество,
| ПланыПроизводства.Комментарий КАК Комментарий
| ИЗ
| РегистрНакопления.ПланыПроизводства КАК ПланыПроизводства
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПланПроизводства КАК ТаблицаДокумента
| ПО ПланыПроизводства.ПланПроизводства = ТаблицаДокумента.Ссылка
| ГДЕ
| &ВключатьПолуфабрикаты
| И ТаблицаДокумента.Ссылка В (&МассивДокументов)
| И ПланыПроизводства.ВидПлана.ПланироватьПолуфабрикатыАвтоматически
| И ПланыПроизводства.ЭтоПолуфабрикат) КАК ВложенныйЗапрос
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.ПланПроизводства,
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Номенклатура.НаименованиеПолное,
| ВложенныйЗапрос.Номенклатура.Код,
| ВложенныйЗапрос.Номенклатура.Артикул,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Характеристика.НаименованиеПолное,
| ВложенныйЗапрос.Назначение,
| ВложенныйЗапрос.Назначение.Наименование,
| ВложенныйЗапрос.Период,
| ВложенныйЗапрос.Номенклатура.ЕдиницаИзмерения,
| ВложенныйЗапрос.ЭтоПолуфабрикат,
| ВложенныйЗапрос.Спецификация
|
|УПОРЯДОЧИТЬ ПО
| Ссылка,
| Полуфабрикат,
| НомерСтроки,
| ТоварНаименованиеПолное,
| ХарактеристикаНаименованиеПолное,
| Спецификация,
| НазначениеНаименование,
| ЕдиницаИзмерения,
| ДатаПериода
|ИТОГИ ПО
| Ссылка");
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПланПроизводства_ПланПроизводства";
Запрос.УстановитьПараметр("МассивДокументов", МассивОбъектов);
Запрос.УстановитьПараметр("ПоУмолчаниюКроссТаблица", ПоУмолчаниюКроссТаблица);
Запрос.УстановитьПараметр("ПоУмолчаниюТаблица", ПоУмолчаниюТаблица);
Запрос.УстановитьПараметр("ВключатьПолуфабрикаты", ВключатьПолуфабрикаты);
МассивРезультатов = Запрос.ВыполнитьПакет();
ДанныеПечати = МассивРезультатов[0].Выбрать();
ВыборкаПоДокументам = МассивРезультатов[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ПервыйДокумент = Истина;
ЕстьКроссТаблицы = Ложь;
НачалоШапки = 0;
ОкончаниеШапки = 0;
ШиринаНомера = 0;
ОкончаниеНомера = 0;
ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
Пока ДанныеПечати.Следующий() Цикл
СтруктураПоиска = Новый Структура("Ссылка", ДанныеПечати.Ссылка);
НайденСледующий = ВыборкаПоДокументам.НайтиСледующий(СтруктураПоиска);
ВыборкаПоТоварам = ВыборкаПоДокументам.Выбрать();
КроссТаблица = ДанныеПечати.КроссТаблица;
Если КроссТаблица Тогда
ТаблицаПериодов = Планирование.ШаблонТаблицыПериодов();
Планирование.ЗаполнитьТаблицуПериодов(ТаблицаПериодов,
ДанныеПечати.Периодичность,
ДанныеПечати.НачалоПериода,
ДанныеПечати.ОкончаниеПериода,
?(ВыводитьШапку, ДанныеПечати.ОтображатьНомерПериода, Ложь));
КроссТаблица = ТаблицаПериодов.Количество() > 1 ИЛИ НЕ ВыводитьШапку;
КонецЕсли;
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.ПланПроизводства.ПФ_MXL_ПланПроизводства");
Если Не ПервыйДокумент Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
Если ВыводитьШапку Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ШтрихкодированиеПечатныхФорм.ВывестиШтрихкодВТабличныйДокумент(ТабличныйДокумент, Макет, ОбластьМакета, ДанныеПечати.Ссылка);
ТекстЗаголовка = ОбщегоНазначенияУТКлиентСервер.СформироватьЗаголовокДокумента(
ДанныеПечати,
НСтр("ru='План производства'", ОбщегоНазначения.КодОсновногоЯзыка()));
ОбластьМакета.Параметры.ТекстЗаголовка = ТекстЗаголовка;
ТабличныйДокумент.Вывести(ОбластьМакета);
Если ВыводитьСценарий Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Сценарий");
ПредставлениеСценария = Строка(ДанныеПечати.Сценарий) + ", "+ Строка(ДанныеПечати.Периодичность);
ОбластьМакета.Параметры.ПредставлениеСценария = ПредставлениеСценария;
ОбластьМакета.Параметры.Сценарий = ДанныеПечати.Сценарий;
ПредставлениеВидаПлана = Строка(ДанныеПечати.ВидПлана);
ОбластьМакета.Параметры.ПредставлениеВидаПлана = ПредставлениеВидаПлана;
ОбластьМакета.Параметры.ВидПлана = ДанныеПечати.ВидПлана;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ВыводитьПериодСтатус Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Период");
ПредставлениеПериода = НСтр("ru='Период с %1 по %2'", ОбщегоНазначения.КодОсновногоЯзыка());
ПредставлениеПериода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредставлениеПериода,
Формат(ДанныеПечати.НачалоПериода, "ДЛФ=D"),
Формат(ДанныеПечати.ОкончаниеПериода, "ДЛФ=D"));
ОбластьМакета.Параметры.ПредставлениеПериода = ПредставлениеПериода;
ОбластьМакета.Параметры.Статус = Строка(ДанныеПечати.Статус);
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьПодразделение И ВыводитьПодразделение Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Подразделение");
ПредставлениеПодразделения = Строка(ДанныеПечати.Подразделение);
ОбластьМакета.Параметры.ПредставлениеПодразделения = ПредставлениеПодразделения;
ОбластьМакета.Параметры.Подразделение = ДанныеПечати.Подразделение;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ПланированиеПоНазначениям
И Не ДанныеПечати.ЗаполнятьНазначениеВТЧ Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Назначение");
ПредставлениеНазначение = Строка(ДанныеПечати.Назначение);
ОбластьМакета.Параметры.ПредставлениеНазначение = ПредставлениеНазначение;
ОбластьМакета.Параметры.Назначение = ДанныеПечати.Назначение;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
КонецЕсли;
ДопПоля = Новый Массив;
Если ДанныеПечати.ПланированиеПоНазначениям
И ДанныеПечати.ЗаполнятьНазначениеВТЧ Тогда
СтруктураДопПоля = Новый Структура;
СтруктураДопПоля.Вставить("Заголовок", НСтр("ru='Назначение'", ОбщегоНазначения.КодОсновногоЯзыка()));
СтруктураДопПоля.Вставить("КолонкаЗначения", "Назначение");
ДопПоля.Добавить(СтруктураДопПоля);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьСпецификациюВТЧ Тогда
СтруктураДопПоля = Новый Структура;
СтруктураДопПоля.Вставить("Заголовок", НСтр("ru='Спецификация'", ОбщегоНазначения.КодОсновногоЯзыка()));
СтруктураДопПоля.Вставить("КолонкаЗначения", "Спецификация");
ДопПоля.Добавить(СтруктураДопПоля);
КонецЕсли;
Количество = ?(КроссТаблица, "КоличествоКросс","Количество");
Товар = ?(НЕ (ВыводитьШапку ИЛИ ИспользоватьХарактеристикиНоменклатуры),"ТоварБезХарактеристик", "Товар");
ШиринаКолонкиТовара = Макет.Область(Товар).ШиринаКолонки * 2;
Если НЕ ВыводитьКоды Тогда
ШиринаКолонкиТовара = ШиринаКолонкиТовара + Макет.Область("КолонкаКодов").ШиринаКолонки;
КонецЕсли;
Если ДопПоля.Количество() > 0 Тогда
ШиринаКолонкиТовара = ШиринаКолонкиТовара -Макет.Область("ТоварДопПоле"+ Формат(ДопПоля.Количество(), "ЧДЦ=0; ЧГ=0")).ШиринаКолонки * ДопПоля.Количество();
КонецЕсли;
Если ВыводитьШапку ИЛИ ИспользоватьХарактеристикиНоменклатуры Тогда
ШиринаКолонкиТовара = ШиринаКолонкиТовара / 2;
КонецЕсли;
Макет.Область(Товар).ШиринаКолонки = ШиринаКолонкиТовара;
ПериодовНаПервойСтранице = 2;
ПериодовНаСтранице = 7;
ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтроки");
ОбластьУИ = Макет.ПолучитьОбласть("ШапкаТаблицы|УникальныеИдентификаторы");
ОбластьКодов = Макет.ПолучитьОбласть("ШапкаТаблицы|КолонкаКодов");
ОбластьТовар = Макет.ПолучитьОбласть(?(ВыводитьШапку,"ШапкаТаблицы","ШапкаТаблицыНХ") + "|" + Товар);
ОбластьДанных = Макет.ПолучитьОбласть(?(ВыводитьШапку ИЛИ КроссТаблица, "ШапкаТаблицы", "ШапкаТаблицыНХ") + "|" + Количество);
ОбластьДанныхКроссОкончание = Макет.ПолучитьОбласть("ШапкаТаблицы|КоличествоКроссОкончание");
ОбластьДатаПериод = Макет.ПолучитьОбласть("ШапкаТаблицы|ДатаПериод");
ОбластьКроссЕдиницаИзмерения = Макет.ПолучитьОбласть("ШапкаТаблицы|КроссЕдиницаИзмерения");
Если ДопПоля.Количество() > 0 Тогда
ОбластьТоварДопПоле = Макет.ПолучитьОбласть("ШапкаТаблицы|ТоварДопПоле"+ Формат(ДопПоля.Количество(), "ЧДЦ=0; ЧГ=0"));
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьНомера);
Если Не ВыводитьШапку Тогда
ТабличныйДокумент.Присоединить(ОбластьУИ);
КонецЕсли;
Если ВыводитьКоды Тогда
ОбластьКодов.Параметры.ИмяКолонкиКодов = ПредставлениеКолонкиКодов;
ТабличныйДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ТабличныйДокумент.Присоединить(ОбластьТовар);
Для каждого ДопПоле Из ДопПоля Цикл
ОбластьТоварДопПоле.Параметры.Заголовок = ДопПоле.Заголовок;
ТабличныйДокумент.Присоединить(ОбластьТоварДопПоле);
КонецЦикла;
НомерСтраницы = 1;
Если КроссТаблица Тогда
ТабличныйДокумент.Присоединить(ОбластьКроссЕдиницаИзмерения);
Для каждого Период Из ТаблицаПериодов Цикл
Индекс = ТаблицаПериодов.Индекс(Период);
Если Индекс = ТаблицаПериодов.Количество()-1 Тогда
ОбластьДанныхКроссОкончание.Параметры.Заголовок = Период.Заголовок;
ТабличныйДокумент.Присоединить(ОбластьДанныхКроссОкончание);
Иначе
ОбластьДанных.Параметры.Заголовок = Период.Заголовок;
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
КонецЦикла;
Иначе
Если ДанныеПечати.ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка Тогда
ОбластьДатаПериод.Параметры.Заголовок = НСтр("ru = 'Дата запуска'", ОбщегоНазначения.КодОсновногоЯзыка());
Иначе
ОбластьДатаПериод.Параметры.Заголовок = НСтр("ru = 'Дата выпуска'", ОбщегоНазначения.КодОсновногоЯзыка());
КонецЕсли;
ТабличныйДокумент.Присоединить(ОбластьДатаПериод);
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
НачалоШапки = ТабличныйДокумент.ВысотаТаблицы - ОбластьНомера.ВысотаТаблицы +1;
ОкончаниеШапки = ТабличныйДокумент.ВысотаТаблицы;
ШиринаНомера = ОбластьНомера.ШиринаТаблицы;
ОбластьНомера = Макет.ПолучитьОбласть("СтрокаТаблицы|НомерСтроки");
ОбластьУИ = Макет.ПолучитьОбласть("СтрокаТаблицы|УникальныеИдентификаторы");
ОбластьКодов = Макет.ПолучитьОбласть("СтрокаТаблицы|КолонкаКодов");
ОбластьТовар = Макет.ПолучитьОбласть("СтрокаТаблицы|" + Товар);
ОбластьДанных = Макет.ПолучитьОбласть("СтрокаТаблицы|" + Количество);
ОбластьДанныхКроссОкончание = Макет.ПолучитьОбласть("СтрокаТаблицы|КоличествоКроссОкончание");
ОбластьДатаПериод = Макет.ПолучитьОбласть("СтрокаТаблицы|ДатаПериод");
ОбластьКроссЕдиницаИзмерения = Макет.ПолучитьОбласть("СтрокаТаблицы|КроссЕдиницаИзмерения");
Если ДопПоля.Количество() > 0 Тогда
ОбластьТоварДопПоле = Макет.ПолучитьОбласть("СтрокаТаблицы|ТоварДопПоле"+ Формат(ДопПоля.Количество(), "ЧДЦ=0; ЧГ=0") );
КонецЕсли;
ТекущаяСтрока = Новый Структура("Номенклатура, Характеристика, Спецификация, Назначение, ЕдиницаИзмерения");
ТекущийПериод = 0;
НомерСтроки = 0;
Пока ВыборкаПоТоварам.Следующий() Цикл
ОдинаковыеСтроки = Истина;
Если КроссТаблица Тогда
Для каждого Элемент Из ТекущаяСтрока Цикл
Если ВыборкаПоТоварам[Элемент.Ключ] <> Элемент.Значение Тогда
ОдинаковыеСтроки = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ КроссТаблица ИЛИ КроссТаблица И НЕ ОдинаковыеСтроки Тогда
Если КроссТаблица И ТекущийПериод <> 0 И ТекущийПериод < ТаблицаПериодов.Количество() Тогда
Пока ТекущийПериод < ТаблицаПериодов.Количество() Цикл
ТекущийПериод = ТекущийПериод + 1;
Если ТекущийПериод < ТаблицаПериодов.Количество() Тогда
ТабличныйДокумент.Присоединить(Макет.ПолучитьОбласть("СтрокаТаблицы|" + Количество));
Иначе
ТабличныйДокумент.Присоединить(Макет.ПолучитьОбласть("СтрокаТаблицы|КоличествоКроссОкончание"));
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, ВыборкаПоТоварам);
ТекущийПериод = 0;
НомерСтроки = НомерСтроки + 1;
ОбластьНомера.Параметры.НомерСтроки = НомерСтроки;
ТабличныйДокумент.Вывести(ОбластьНомера);
Если Не ВыводитьШапку Тогда
ОбластьУИ.Параметры.УникальныйИдентификаторНоменклатура = Строка(ВыборкаПоТоварам.Номенклатура.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторХарактеристика = Строка(ВыборкаПоТоварам.Характеристика.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторУпаковка = Строка(ВыборкаПоТоварам.Упаковка.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторСпецификация = Строка(ВыборкаПоТоварам.Спецификация.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторНазначение = Строка(ВыборкаПоТоварам.Назначение.УникальныйИдентификатор());
ТабличныйДокумент.Присоединить(ОбластьУИ);
КонецЕсли;
Если ВыводитьКоды Тогда
ОбластьКодов.Параметры.Артикул = ВыборкаПоТоварам[ИмяКолонкиКодов];
ТабличныйДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ДопПараметрыПредставлениеНоменклатуры = НоменклатураКлиентСервер.ДополнительныеПараметрыПредставлениеНоменклатурыДляПечати();
ДопПараметрыПредставлениеНоменклатуры.КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
ОбластьТовар.Параметры.Заполнить(ВыборкаПоТоварам);
ОбластьТовар.Параметры.Товар = НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати(
ВыборкаПоТоварам.ТоварНаименованиеПолное,
ВыборкаПоТоварам.ХарактеристикаНаименованиеПолное,
,
,
ДопПараметрыПредставлениеНоменклатуры);
ТабличныйДокумент.Присоединить(ОбластьТовар);
Для каждого ДопПоле Из ДопПоля Цикл
ОбластьТоварДопПоле.Параметры.Значение = ВыборкаПоТоварам[ДопПоле.КолонкаЗначения];
ТабличныйДокумент.Присоединить(ОбластьТоварДопПоле);
КонецЦикла;
Если КроссТаблица Тогда
ОбластьКроссЕдиницаИзмерения.Параметры.Заполнить(ВыборкаПоТоварам);
ТабличныйДокумент.Присоединить(ОбластьКроссЕдиницаИзмерения);
КонецЕсли;
КонецЕсли;
Если КроссТаблица Тогда
Период = ТаблицаПериодов.Найти(ВыборкаПоТоварам.ДатаПериода, "ДатаНачала");
Индекс = ТаблицаПериодов.Индекс(Период);
Для ГлавныйИндекс = ТекущийПериод По ТаблицаПериодов.Количество()-1 Цикл
Если ГлавныйИндекс>Индекс Тогда
Продолжить;
Иначе
ТекущийПериод = ТекущийПериод + 1;
КонецЕсли;
Если Индекс < ТаблицаПериодов.Количество()-1 Тогда
Если Индекс = ГлавныйИндекс Тогда
ОбластьДанных.Параметры.Заполнить(ВыборкаПоТоварам);
Область = ОбластьДанных.Область("R1C1:R1C1");
Область.Примечание.Текст = ВыборкаПоТоварам.Комментарий;
ТабличныйДокумент.Присоединить(ОбластьДанных);
ИначеЕсли
ГлавныйИндекс<Индекс Тогда
Область = ОбластьДанных.Область("R1C1:R1C1");
ОбластьДанных.Параметры.Количество = 0;
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
Иначе
Если Индекс = ГлавныйИндекс Тогда
ОбластьДанныхКроссОкончание.Параметры.Заполнить(ВыборкаПоТоварам);
Область = ОбластьДанныхКроссОкончание.Область("R1C1:R1C1");
Область.Примечание.Текст = ВыборкаПоТоварам.Комментарий;
ТабличныйДокумент.Присоединить(ОбластьДанныхКроссОкончание);
ИначеЕсли
ГлавныйИндекс<Индекс Тогда
Область = ОбластьДанных.Область("R1C1:R1C1");
ОбластьДанных.Параметры.Количество = 0;
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
ОбластьДатаПериод.Параметры.Заполнить(ВыборкаПоТоварам);
ТабличныйДокумент.Присоединить(ОбластьДатаПериод);
ОбластьДанных.Параметры.Заполнить(ВыборкаПоТоварам);
Область = ОбластьДанных.Область("R1C1:R1C1");
Область.Примечание.Текст = ВыборкаПоТоварам.Комментарий;
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
КонецЦикла;
Если КроссТаблица И ТекущийПериод <> 0 И ТекущийПериод < ТаблицаПериодов.Количество() Тогда
Пока ТекущийПериод < ТаблицаПериодов.Количество() Цикл
ТекущийПериод = ТекущийПериод + 1;
Если ТекущийПериод < ТаблицаПериодов.Количество() Тогда
ТабличныйДокумент.Присоединить(Макет.ПолучитьОбласть("СтрокаТаблицы|" + Количество));
Иначе
ТабличныйДокумент.Присоединить(Макет.ПолучитьОбласть("СтрокаТаблицы|КоличествоКроссОкончание"));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ВыводитьШапку Тогда
ОбластьНомера = Макет.ПолучитьОбласть("ПодвалТаблицы|НомерСтроки");
ОбластьУИ = Макет.ПолучитьОбласть("ПодвалТаблицы|УникальныеИдентификаторы");
ОбластьКодов = Макет.ПолучитьОбласть("ПодвалТаблицы|КолонкаКодов");
ОбластьТовар = Макет.ПолучитьОбласть("ПодвалТаблицы|" + Товар);
ОбластьДанных = Макет.ПолучитьОбласть("ПодвалТаблицы|" + Количество);
ОбластьДанныхКроссОкончание = Макет.ПолучитьОбласть("ПодвалТаблицы|КоличествоКроссОкончание");
ОбластьДатаПериод = Макет.ПолучитьОбласть("ПодвалТаблицы|ДатаПериод");
ОбластьКроссЕдиницаИзмерения = Макет.ПолучитьОбласть("ПодвалТаблицы|КроссЕдиницаИзмерения");
Если ДопПоля.Количество() > 0 Тогда
ОбластьТоварДопПоле = Макет.ПолучитьОбласть("ПодвалТаблицы|ТоварДопПоле"+ Формат(ДопПоля.Количество(), "ЧДЦ=0; ЧГ=0") );
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьНомера);
Если ВыводитьКоды Тогда
ТабличныйДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ТабличныйДокумент.Присоединить(ОбластьТовар);
Для каждого ДопПоле Из ДопПоля Цикл
ТабличныйДокумент.Присоединить(ОбластьТоварДопПоле);
КонецЦикла;
Если КроссТаблица Тогда
ТабличныйДокумент.Присоединить(ОбластьКроссЕдиницаИзмерения);
Для каждого Период Из ТаблицаПериодов Цикл
Если Период.Активная И Период.НомерКолонки <= 0 Тогда
Продолжить;
КонецЕсли;
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЦикла;
Иначе
ТабличныйДокумент.Присоединить(ОбластьДатаПериод);
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
ОкончаниеНомера = ТабличныйДокумент.ВысотаТаблицы;
ОбластьМакета = Макет.ПолучитьОбласть("ИтоговаяСтрока");
ИтоговаяСтрока = НСтр("ru='Всего наименований %КоличествоНаименований%.'", ОбщегоНазначения.КодОсновногоЯзыка());
ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%КоличествоНаименований%", НомерСтроки);
ОбластьМакета.Параметры.ИтоговаяСтрока = ИтоговаяСтрока;
ТабличныйДокумент.Вывести(ОбластьМакета);
ОбластьМакета = Макет.ПолучитьОбласть("Подписи");
Если ЗначениеЗаполнено(ДанныеПечати.ОтветственныйФизЛицо) Тогда
ОбластьМакета.Параметры.ПредставлениеОтветственного =
ФизическиеЛицаУТ.ФамилияИнициалыФизЛица(ДанныеПечати.ОтветственныйФизЛицо, ДанныеПечати.Дата);
ОбластьМакета.Параметры.Ответственный = ДанныеПечати.ОтветственныйФизЛицо;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеПечати.Ссылка);
Если КроссТаблица Тогда
ЕстьКроссТаблицы = Истина;
КонецЕсли;
КонецЦикла;
Если ДанныеПечати.Количество() = 1 И ЕстьКроссТаблицы Тогда
ОбластьШапки = ТабличныйДокумент.Область(НачалоШапки, , ОкончаниеШапки, );
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ОбластьШапки;
ОбластьНомера = ТабличныйДокумент.Область(, 1, , ШиринаНомера);
ТабличныйДокумент.ПовторятьПриПечатиКолонки = ОбластьНомера;
КонецЕсли;
ТабличныйДокумент.АвтоМасштаб = Истина;
Возврат ТабличныйДокумент;
КонецФункции
Функция СоздатьПрисоединенныйФайлExcel(ДокументСсылка, ИдентификаторФормы) Экспорт
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ВыводитьШапку", Ложь);
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(ДокументСсылка);
ОбъектыПечати = Новый СписокЗначений;
ОбъектыПечати.Добавить(ДокументСсылка);
ТабличныйДокумент = СформироватьПечатнуюФормуПлана(МассивДокументов, ОбъектыПечати, ПараметрыПечати);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS97);
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), ИдентификаторФормы);
ТекущаяДата = ТекущаяДатаСеанса();
ПараметрыФайла = Новый Структура();
ПараметрыФайла.Вставить("Автор", Пользователи.АвторизованныйПользователь());
ПараметрыФайла.Вставить("ВладелецФайлов", ДокументСсылка);
ПараметрыФайла.Вставить("ИмяБезРасширения", "Excel" + " " + Формат(ТекущаяДата, НСтр("ru = 'ДФ=''dd.MM.yyyy ЧЧ.мм.сс'''")));
ПараметрыФайла.Вставить("РасширениеБезТочки", "xls");
ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяДата);
Файл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище, Неопределено);
УдалитьФайлы(ИмяВременногоФайла);
Если Файл <> Неопределено Тогда
РаботаСФайламиСлужебный.ЗанятьФайлДляРедактированияСервер(Файл);
ДанныеФайла = РаботаСФайлами.ДанныеФайла(Файл, ИдентификаторФормы, Истина);
СтруктураДействийExcel = Новый Структура;
СтруктураДействийExcel.Вставить("AutoFilter", Новый Структура("СтрокаНачало, КолонкаНачало", 2, 2));
МассивКолонок = Новый Массив;
МассивКолонок.Добавить(3);
МассивКолонок.Добавить(4);
МассивКолонок.Добавить(5);
МассивКолонок.Добавить(6);
СтруктураДействийExcel.Вставить("HiddenColumns", МассивКолонок);
Возврат Новый Структура("ДанныеФайла, Файл, СтруктураДействийExcel", ДанныеФайла, Файл, СтруктураДействийExcel);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область ТекущиеДела
Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
ИмяФормы = "Документ.ПланПроизводства.Форма.ФормаСписка";
ОбщиеПараметрыЗапросов = ТекущиеДелаСлужебный.ОбщиеПараметрыЗапросов();
Доступность =
(ОбщиеПараметрыЗапросов.ЭтоПолноправныйПользователь
Или ПравоДоступа("Просмотр", Метаданные.Документы.ПланПроизводства))
И ПравоДоступа("Добавление", Метаданные.Документы.ПланПроизводства)
И ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства");
Если НЕ Доступность Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КОЛИЧЕСТВО(*) КАК ПланыПроизводстваОжидающиеСогласования,
| МИНИМУМ(Планы.Статус.Порядок) КАК СтатусПорядок
|ИЗ
| Документ.ПланПроизводства КАК Планы
|ГДЕ
| НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ) <= Планы.ОкончаниеПериода
| И ВЫБОР
| КОГДА НЕ Планы.Замещающий
| ТОГДА Планы.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.НаУтверждении)
| КОГДА Планы.Замещающий
| И Планы.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден)
| И Планы.Статус.Порядок >= 2
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ
| И Планы.Проведен";
Результат = ТекущиеДелаСлужебный.ЧисловыеПоказателиТекущихДел(Запрос, ОбщиеПараметрыЗапросов);
ДелоРодитель = ТекущиеДела.Найти("ПланыЗакупок", "Идентификатор");
Если ДелоРодитель = Неопределено Тогда
ДелоРодитель = ТекущиеДела.Добавить();
ДелоРодитель.Идентификатор = "ПланыЗакупок";
ДелоРодитель.Представление = НСтр("ru = 'Планы ожидающие согласования'");
ДелоРодитель.Владелец = Метаданные.Подсистемы.БюджетированиеИПланирование;
КонецЕсли;
ПараметрыОтбора = Новый Структура;
Если Перечисления.СтатусыПланов[Результат.СтатусПорядок] = Перечисления.СтатусыПланов.НаУтверждении Тогда
ПараметрыОтбора.Вставить("Статус", Перечисления.СтатусыПланов.НаУтверждении);
КонецЕсли;
ПараметрыОтбора.Вставить("ПометкаУдаления", Ложь);
Дело = ТекущиеДела.Добавить();
Дело.Идентификатор = "ПланыПроизводстваОжидающиеСогласования";
Дело.ЕстьДела = Результат.ПланыПроизводстваОжидающиеСогласования > 0;
Дело.Представление = НСтр("ru = 'Планы производства'");
Дело.Количество = Результат.ПланыПроизводстваОжидающиеСогласования;
Дело.Важное = Ложь;
Дело.Форма = ИмяФормы;
Дело.ПараметрыФормы = Новый Структура("СтруктураБыстрогоОтбора", ПараметрыОтбора);
Дело.Владелец = "ПланыЗакупок";
Если Результат.ПланыПроизводстваОжидающиеСогласования > 0 Тогда
ДелоРодитель.ЕстьДела = Истина;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СостоянияРасчетаПланаПроизводства
Функция СостоянияРасчетаПланаПроизводства(МассивСсылок) Экспорт
ВыполняетсяРасчет = РегистрыСведений.ОчередьРасчетаПланаПроизводства.ВыполняетсяОбработкаОчереди();
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ОчередьРасчета.ПланПроизводства КАК ПланПроизводства,
| ОчередьРасчета.ЕстьОшибки КАК ЕстьОшибки
|ПОМЕСТИТЬ ОчередьРасчета
|ИЗ
| (ВЫБРАТЬ
| ОчередьРасчета.ПланПроизводства КАК ПланПроизводства,
| МАКСИМУМ(ОчередьРасчета.ЕстьОшибки) КАК ЕстьОшибки
| ИЗ
| РегистрСведений.ОчередьРасчетаПланаПроизводства КАК ОчередьРасчета
| ГДЕ
| ОчередьРасчета.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРасчетаПланаПроизводства.ТребуетсяРасчет)
| И ОчередьРасчета.ПланПроизводства В(&МассивСсылок)
|
| СГРУППИРОВАТЬ ПО
| ОчередьРасчета.ПланПроизводства) КАК ОчередьРасчета
|;
|ВЫБРАТЬ
| Таблица.Ссылка КАК Ссылка,
|
| ВЫБОР
| КОГДА Таблица.Сценарий.ИспользоватьДляПланированияМатериалов
| ТОГДА ВЫБОР
| КОГДА &ВыполняетсяРасчет
| И ИСТИНА В (
| ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
| ИЗ
| РегистрСведений.ОчередьРасчетаПланаПроизводства КАК АктивныеЗадания
| ГДЕ
| АктивныеЗадания.ПланПроизводства = Таблица.Ссылка
| И АктивныеЗадания.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРасчетаПланаПроизводства.Рассчитывается)
| )
| ТОГДА ВЫБОР
| КОГДА Таблица.Проведен
| ТОГДА &Рассчитывается
| ИНАЧЕ &Отменяется
| КОНЕЦ
| КОГДА ОчередьРасчета.ПланПроизводства ЕСТЬ НЕ NULL
| ТОГДА ВЫБОР
| КОГДА НЕ ОчередьРасчета.ЕстьОшибки
| ТОГДА &ОжидаетРасчета
| ИНАЧЕ &НеРассчитанЕстьОшибки
| КОНЕЦ
| ИНАЧЕ
| ВЫБОР
| КОГДА Таблица.Проведен
| ТОГДА &Рассчитан
| ИНАЧЕ &НеРассчитан
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ &НеРассчитан
| КОНЕЦ КАК Код
|
|ИЗ
| Документ.ПланПроизводства КАК Таблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ ОчередьРасчета КАК ОчередьРасчета
| ПО Таблица.Ссылка = ОчередьРасчета.ПланПроизводства
|
|ГДЕ
| Таблица.Ссылка В(&МассивСсылок)");
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
Запрос.УстановитьПараметр("ВыполняетсяРасчет", ВыполняетсяРасчет);
КодыСостояний = КодыСостоянийРасчетаПланаПроизводства();
Запрос.УстановитьПараметр("НеРассчитан", КодыСостояний.НеРассчитан);
Запрос.УстановитьПараметр("Рассчитан", КодыСостояний.Рассчитан);
Запрос.УстановитьПараметр("ОжидаетРасчета", КодыСостояний.ОжидаетРасчета);
Запрос.УстановитьПараметр("Рассчитывается", КодыСостояний.Рассчитывается);
Запрос.УстановитьПараметр("Отменяется", КодыСостояний.Отменяется);
Запрос.УстановитьПараметр("НеРассчитанЕстьОшибки", КодыСостояний.НеРассчитанЕстьОшибки);
УстановитьПривилегированныйРежим(Истина);
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
ОжидаетРасчета = Ложь;
Результат = Новый Соответствие;
Пока Выборка.Следующий() Цикл
ОжидаетРасчета = ОжидаетРасчета ИЛИ Выборка.Код = КодыСостояний.ОжидаетРасчета;
Результат.Вставить(Выборка.Ссылка, Новый Структура("Код", Выборка.Код));
КонецЦикла;
Если ОжидаетРасчета
И Не ВыполняетсяРасчет Тогда
РегистрыСведений.ОчередьРасчетаПланаПроизводства.ЗапуститьЗадание();
КонецЕсли;
Возврат Результат;
КонецФункции
Функция КодыСостоянийРасчетаПланаПроизводства() Экспорт
Состояния = Новый Структура();
Состояния.Вставить("НеРассчитан", 0);
Состояния.Вставить("Рассчитан", 1);
Состояния.Вставить("ОжидаетРасчета", 2);
Состояния.Вставить("Рассчитывается", 3);
Состояния.Вставить("Отменяется", 4);
Состояния.Вставить("НеРассчитанЕстьОшибки", 5);
Возврат Новый ФиксированнаяСтруктура(Состояния);
КонецФункции
#КонецОбласти
#Область ЗагрузкаДанныхИзФайла
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
Планирование.СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры);
КонецПроцедуры
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
Планирование.ЗаполнитьСписокНеоднозначностей(СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры);
КонецПроцедуры
#КонецОбласти
#Область Прочее
Функция ПолучитьДатуПоГрафику(Знач ДатаОт, Знач КоличествоДней, ПараметрыГрафика) Экспорт
ДатаОт = НачалоДня(ДатаОт);
Если КоличествоДней = 0 Тогда
Возврат ДатаОт;
КонецЕсли;
Если ПараметрыГрафика = Неопределено Тогда
ПараметрыГрафика = Новый Структура;
КонецЕсли;
Если НЕ ПараметрыГрафика.Свойство("Календарь") ИЛИ НЕ ЗначениеЗаполнено(ПараметрыГрафика.Календарь) Тогда
ПараметрыГрафика.Вставить("Календарь", Константы.ОсновнойКалендарьПредприятия.Получить());
КонецЕсли;
Если НЕ ПараметрыГрафика.Свойство("КалендарныйГрафик") Тогда
ПараметрыГрафика.Вставить("КалендарныйГрафик", Новый Соответствие);
ПараметрыГрафика.Вставить("РабочиеДни", Новый Соответствие);
ПараметрыГрафика.Вставить("ДнейВГрафике", Новый Соответствие);
КонецЕсли;
ГодГрафика = Год(ДатаОт);
Если ПараметрыГрафика.КалендарныйГрафик.Получить(ГодГрафика) = Неопределено Тогда
ПолучитьДанныеГрафикаЗаГод(ПараметрыГрафика, ГодГрафика);
КонецЕсли;
КалендарныйГрафикГодГрафика = ПараметрыГрафика.КалендарныйГрафик.Получить(ГодГрафика);
ТекущийРабочийДень = КалендарныйГрафикГодГрафика.Получить(ДатаОт);
Если ТекущийРабочийДень = Неопределено Тогда
Возврат ДатаОт + КоличествоДней * 86400;
КонецЕсли;
Если КоличествоДней > 0 Тогда
КоличествоДнейВГрафике = ПараметрыГрафика.ДнейВГрафике.Получить(ГодГрафика);
Если КоличествоДнейВГрафике = Неопределено
Или КоличествоДнейВГрафике = 0 Тогда
Возврат ДатаОт + КоличествоДней * 86400;
ИначеЕсли КоличествоДнейВГрафике > ТекущийРабочийДень + КоличествоДней Тогда
РабочиеДниГодГрафика = ПараметрыГрафика.РабочиеДни.Получить(ГодГрафика);
Возврат РабочиеДниГодГрафика.Получить(ТекущийРабочийДень + КоличествоДней);
КонецЕсли;
ОсталосьДней = КоличествоДней - КоличествоДнейВГрафике + ТекущийРабочийДень;
Пока ГодГрафика >= 0 Цикл
ГодГрафика = ГодГрафика +1;
Если ПараметрыГрафика.КалендарныйГрафик.Получить(ГодГрафика) = Неопределено Тогда
ПолучитьДанныеГрафикаЗаГод(ПараметрыГрафика, ГодГрафика);
КонецЕсли;
КоличествоДнейВГрафике = ПараметрыГрафика.ДнейВГрафике.Получить(ГодГрафика);
Если КоличествоДнейВГрафике = Неопределено
Или КоличествоДнейВГрафике = 0 Тогда
Возврат ДатаОт + КоличествоДней * 86400;
ИначеЕсли КоличествоДнейВГрафике >= ОсталосьДней Тогда
РабочиеДниГодГрафика = ПараметрыГрафика.РабочиеДни.Получить(ГодГрафика);
Возврат РабочиеДниГодГрафика.Получить(КоличествоДнейВГрафике - ОсталосьДней);
Иначе
ОсталосьДней = ОсталосьДней - КоличествоДнейВГрафике;
КонецЕсли;
КонецЦикла;
Иначе
КоличествоДней = -КоличествоДней;
Если ТекущийРабочийДень > КоличествоДней Тогда
РабочиеДниГодГрафика = ПараметрыГрафика.РабочиеДни.Получить(ГодГрафика);
Возврат РабочиеДниГодГрафика.Получить(ТекущийРабочийДень - КоличествоДней);
КонецЕсли;
ОсталосьДней = КоличествоДней - ТекущийРабочийДень;
Пока ГодГрафика >= 0 Цикл
ГодГрафика = ГодГрафика -1;
Если ПараметрыГрафика.КалендарныйГрафик.Получить(ГодГрафика) = Неопределено Тогда
ПолучитьДанныеГрафикаЗаГод(ПараметрыГрафика, ГодГрафика);
КонецЕсли;
КоличествоДнейВГрафике = ПараметрыГрафика.ДнейВГрафике.Получить(ГодГрафика);
Если КоличествоДнейВГрафике = Неопределено Тогда
Возврат ДатаОт - КоличествоДней * 86400;
ИначеЕсли КоличествоДнейВГрафике > ОсталосьДней Тогда
РабочиеДниГодГрафика = ПараметрыГрафика.РабочиеДни.Получить(ГодГрафика);
Возврат РабочиеДниГодГрафика.Получить(КоличествоДнейВГрафике - ОсталосьДней);
Иначе
ОсталосьДней = ОсталосьДней - КоличествоДнейВГрафике;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецФункции
Процедура ПолучитьДанныеГрафикаЗаГод(ПараметрыГрафика, ГодГрафика)
ПараметрыГрафика.КалендарныйГрафик.Вставить(ГодГрафика, Новый Соответствие);
ПараметрыГрафика.РабочиеДни.Вставить(ГодГрафика, Новый Соответствие);
КоличествоДнейВГрафике = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КалендарныеГрафики.ДатаГрафика,
| КалендарныеГрафики.ДеньВключенВГрафик
|ИЗ
| РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики
|ГДЕ
| КалендарныеГрафики.Год = &Год
| И КалендарныеГрафики.Календарь = &Календарь
|
|УПОРЯДОЧИТЬ ПО
| КалендарныеГрафики.ДатаГрафика";
Запрос.УстановитьПараметр("Год", ГодГрафика);
Запрос.УстановитьПараметр("Календарь", ПараметрыГрафика.Календарь);
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
КалендарныйГрафик = ПараметрыГрафика.КалендарныйГрафик.Получить(ГодГрафика);
РабочиеДни = ПараметрыГрафика.РабочиеДни.Получить(ГодГрафика);
КоличествоРабочихДнейВГрафикеСНачалаГода = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.ДеньВключенВГрафик Тогда
КоличествоРабочихДнейВГрафикеСНачалаГода = КоличествоРабочихДнейВГрафикеСНачалаГода + 1;
РабочиеДни.Вставить(КоличествоРабочихДнейВГрафикеСНачалаГода, ВыборкаДетальныеЗаписи.ДатаГрафика);
КонецЕсли;
КалендарныйГрафик.Вставить(ВыборкаДетальныеЗаписи.ДатаГрафика, КоличествоРабочихДнейВГрафикеСНачалаГода);
КонецЦикла;
ПараметрыГрафика.ДнейВГрафике.Вставить(ГодГрафика, КоличествоРабочихДнейВГрафикеСНачалаГода);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецЕсли