#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область Проведение
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
МеханизмыДокумента.Добавить("ПланированиеЗапасов");
КонецПроцедуры
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
Если ДопПараметры = Неопределено Тогда
ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
КонецЕсли;
Если ТипЗнч(Документ) = Тип("ДокументОбъект.ПланПродаж") Тогда
ДокументСсылка = Документ.Ссылка;
Иначе
ДокументСсылка = Документ;
КонецЕсли;
Запрос = Новый Запрос;
ТекстыЗапроса = Новый СписокЗначений;
Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
ТекстЗапросаТаблицаПланыПродаж(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПланыОплатКлиентов(Запрос, ТекстыЗапроса, Регистры);
КонецЕсли;
Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
КонецФункции
#КонецОбласти
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
БизнесПроцессы.Задание.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
КонецПроцедуры
Функция ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании) Экспорт
Если ПравоДоступа("Добавление", Метаданные.Документы.ПланПродаж) Тогда
КомандаСоздатьНаОсновании = КомандыСозданияНаОсновании.Добавить();
КомандаСоздатьНаОсновании.Менеджер = Метаданные.Документы.ПланПродаж.ПолноеИмя();
КомандаСоздатьНаОсновании.Представление = ОбщегоНазначенияУТ.ПредставлениеОбъекта(Метаданные.Документы.ПланПродаж);
КомандаСоздатьНаОсновании.РежимЗаписи = "Проводить";
КомандаСоздатьНаОсновании.ФункциональныеОпции = "ИспользоватьПланированиеПродаж";
Возврат КомандаСоздатьНаОсновании;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
Отчеты.СбалансированностьПлановУТ.ДобавитьКомандуСбалансированностьПланов(КомандыОтчетов);
КонецПроцедуры
Функция ПроверкаПередСменойСтатуса(ВыборкаПроверки, НовыйСтатус, ДополнительныеПараметры) Экспорт
Возврат Истина;
КонецФункции
Функция СформироватьЗапросПроверкиПриСменеСтатуса(МассивДокументов, НовыйСтатус, ДополнительныеПараметры) Экспорт
ЗначениеНовогоСтатуса = Перечисления.СтатусыПланов[НовыйСтатус];
ТекстЗапроса =
"ВЫБРАТЬ
| ТаблицаДокументов.Ссылка КАК Ссылка,
| ПРЕДСТАВЛЕНИЕ(ТаблицаДокументов.Ссылка) КАК Представление,
| ПРЕДСТАВЛЕНИЕ(ТаблицаДокументов.Статус) КАК ПредставлениеТекущегоСтатуса,
| ПРЕДСТАВЛЕНИЕ(&Статус) КАК ПредставлениеНовогоСтатуса,
| ВЫБОР
| КОГДА ТаблицаДокументов.Статус = &Статус
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК СтатусСовпадает,
| ТаблицаДокументов.Проведен КАК Проведен,
| ТаблицаДокументов.ПометкаУдаления КАК ПометкаУдаления,
| ИСТИНА КАК ЗаписьПроведением
|ИЗ
| Документ.ПланПродаж КАК ТаблицаДокументов
|ГДЕ
| ТаблицаДокументов.Ссылка В(&МассивДокументов)
|УПОРЯДОЧИТЬ ПО
| Дата
|";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Статус", ЗначениеНовогоСтатуса);
Запрос.УстановитьПараметр("МассивДокументов", МассивДокументов);
Возврат Запрос;
КонецФункции
Процедура ДополнительныеПараметрыДляРасчетаПоФормуле(Параметры, ДопПараметры) Экспорт
ВидПлана = Параметры.ВидПланаРеквизиты;
Сценарий = Параметры.СценарийРеквизиты;
ПутьКРеквизиту = Параметры.ПутьКРеквизиту;
ЭтоПланПродажПоКатегориям = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланПродажПоКатегориям;
ЭтоПланСборки = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланСборкиРазборки;
ЭтоПланЗакупок = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланЗакупок;
ЭтоПланПроизводства = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланПроизводства;
ЭтоПланПродаж = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланПродаж;
ЭтоПланОстатков = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланОстатков;
ЭтоПланВнутреннихПотреблений = ВидПлана.ТипПлана = Перечисления.ТипыПланов.ПланВнутреннихПотреблений;
ЗаполнятьНазначениеВТЧ = ВидПлана.ЗаполнятьНазначениеВТЧ;
СоздаватьРеквизитСОтбором = ВидПлана.ЗаполнятьПартнера
ИЛИ ВидПлана.ЗаполнятьСоглашение
ИЛИ ВидПлана.ЗаполнятьСклад
ИЛИ (ВидПлана.ЗаполнятьПодразделение И (ЭтоПланПродаж ИЛИ ЭтоПланПродажПоКатегориям))
ИЛИ ВидПлана.ЗаполнятьМенеджера
ИЛИ (Сценарий.ПланированиеПоНазначениям И Не ВидПлана.ЗаполнятьНазначениеВТЧ);
ИспользоватьПланыПродаж = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПродаж") И Сценарий.ИспользоватьВПланированииПродаж;
ИспользоватьСезонныеКоэффициенты = ПолучитьФункциональнуюОпцию("ИспользоватьСезонныеКоэффициенты");
ИспользоватьПланыОстатков = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеОстатков") И Сценарий.ИспользоватьВПланированииОстатков;
ЧтениеФактаПродаж = ПравоДоступа("Чтение", Метаданные.РегистрыНакопления.ВыручкаИСебестоимостьПродаж);
#Область ДоляДнейНаличияТовараНаОстатках
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ДоляДнейНаличияТовараНаОстатках");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(3, 2)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='Доля дней наличия товара на остатках'"));
ДопПараметр.Вставить("СоздаватьРеквизит", Не ЭтоПланПродажПоКатегориям);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", Не ЭтоПланПродажПоКатегориям);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='Доля дней наличия товара на остатках'"));
ДопПараметр.Вставить("ВходитВОперанд", "ВспомогательныеОперанды");
ДопПараметры.Вставить("ДоляДнейНаличияТовараНаОстатках",ДопПараметр);
#КонецОбласти
#Область СезонныйКоэффициент
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "СезонныйКоэффициент");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='Сезонный коэффициент'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьСезонныеКоэффициенты
И Не ЭтоПланПродажПоКатегориям
И Не ЗаполнятьНазначениеВТЧ);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьСезонныеКоэффициенты
И Не ЭтоПланПродажПоКатегориям
И Не ЗаполнятьНазначениеВТЧ);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='Сезонный коэффициент'"));
ДопПараметр.Вставить("ВходитВОперанд", "ВспомогательныеОперанды");
ДопПараметры.Вставить("СезонныйКоэффициент",ДопПараметр);
#КонецОбласти
#Область ПланыПродаж
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПродаж");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План продаж'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланыПродаж);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланыПродаж);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План продаж'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПродаж");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланы");
ДопПараметры.Вставить("ПланыПродаж", ДопПараметр);
#КонецОбласти
#Область ПланыПродажСОтбором
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ПланыПродажСОтбором");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", НСтр("ru='План продаж*'"));
ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПланыПродаж И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПланыПродаж И СоздаватьРеквизитСОтбором);
ДопПараметр.Вставить("ЗаголовокОперанда", НСтр("ru='План продаж*'"));
ДопПараметр.Вставить("Расшифровка", "Документ.ПланПродаж");
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыПланыСОтбором");
ДопПараметры.Вставить("ПланыПродажСОтбором", ДопПараметр);
#КонецОбласти
#Область ФактыПродаж
ДопПараметр = Новый Структура();
ДопПараметр.Вставить("Имя", "ФактыПродаж");
ДопПараметр.Вставить("Тип", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ДопПараметр.Вставить("Путь", ПутьКРеквизиту);
ДопПараметр.Вставить("Заголовок", ?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт продаж*'"), НСтр("ru='Факт продаж'")));
ДопПараметр.Вставить("СоздаватьРеквизит", ЧтениеФактаПродаж);
ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
ДопПараметр.Вставить("СоздаватьОперанд", ЧтениеФактаПродаж);
ДопПараметр.Вставить("ЗаголовокОперанда", ?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт продаж*'"), НСтр("ru='Факт продаж'")));
ДопПараметр.Вставить("ВходитВОперанд", "ДополнительныеОперандыФакты");
ДопПараметры.Вставить("ФактыПродаж", ДопПараметр);
#КонецОбласти
КонецПроцедуры
Функция МакетыОперандовПлана(Макеты = Неопределено) Экспорт
Если Макеты = Неопределено Тогда
Макеты = Новый Соответствие;
КонецЕсли;
Макеты.Вставить("ДоляДнейНаличияТовараНаОстатках", ПолучитьМакет("СКД_ДоляДнейНаличияТовараНаОстатках"));
Макеты.Вставить("СезонныйКоэффициент", ПолучитьМакет("СКД_СезонныйКоэффициент"));
Макеты.Вставить("ПланыПродаж", ПолучитьМакет("СКД_ПланыПродаж"));
Макеты.Вставить("ПланыПродажСОтбором", ПолучитьМакет("СКД_ПланыПродажСОтбором"));
Макеты.Вставить("ФактыПродаж", ПолучитьМакет("СКД_ФактыПродаж"));
Макеты.Вставить("АссортиментПродаж", ПолучитьМакет("СКД_АссортиментПродаж"));
Макеты.Вставить("ТоварыПриобретенныеКлиентом", ПолучитьМакет("СКД_ТоварыПриобретенныеКлиентом"));
Если ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25() Тогда
Макеты.Вставить("ЦеныНоменклатуры", ПолучитьМакет("СКД_ЦеныНоменклатуры2_5"));
Иначе
Макеты.Вставить("ЦеныНоменклатуры", ПолучитьМакет("СКД_ЦеныНоменклатуры"));
КонецЕсли;
Возврат Макеты;
КонецФункции
Процедура ЗаполнитьДокумент(Знач Параметры, Знач АдресХранилища, Знач АдресХранилищаДополнительный = "") Экспорт
Настройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(Параметры.КлючОбщихНастроек,
"НастройкиФоновогоЗадания_"+Параметры.УникальныйИдентификатор);
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Параметры.Вставить("Периоды", Настройки.Периоды);
Если Параметры.Свойство("ЗаполнятьПоФормуле") Тогда
Параметры.Вставить("ЗаполняемаяТЧ", Настройки.ЗаполняемаяТЧ);
ЗаполнитьДокументПоФормуле(Параметры, АдресХранилища, АдресХранилищаДополнительный);
ИначеЕсли Параметры.Свойство("ЗаполнятьПоПравилу") Тогда
Параметры.Вставить("ПравилоЗаполнения", Настройки.ПравилоЗаполнения);
Параметры.Вставить("ПользовательскиеНастройки", Настройки.ПользовательскиеНастройки);
Параметры.Вставить("ЗаполняемаяТЧ", Настройки.ЗаполняемаяТЧ);
ЗаполнитьПоПравилуЗаполнения(Параметры, АдресХранилища);
ИначеЕсли Параметры.Свойство("ЗаполнитьДляЗамещения") Тогда
Параметры.Вставить("ЗаполняемаяТЧ", Настройки.ЗаполняемаяТЧ);
ЗаполнитьДокументДляЗамещения(Параметры, АдресХранилища);
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ОбщегоНазначения.ХранилищеОбщихНастроекУдалить(Параметры.КлючОбщихНастроек,
"НастройкиФоновогоЗадания_"+Параметры.УникальныйИдентификатор, Пользователи.ТекущийПользователь());
КонецПроцедуры
Процедура ЗаполнитьДокументПоФормуле(Знач Параметры, Знач АдресХранилища, Знач АдресХранилищаДополнительный) Экспорт
Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Документ.ПланПродаж.МодульМенеджера.ЗаполнитьДокументПоФормуле");
Если Не Параметры.Свойство("ЗаполнятьПоФормуле") Тогда
Возврат;
КонецЕсли;
ИмяКолонкиПериода = "ДатаОтгрузки";
Периоды = Параметры.Периоды;
Планирование.ПодготовитьТаблицуПериодовПередЗаполнением(Параметры);
Планирование.ЗаполнитьТаблицуПериодов(Периоды, Параметры.Периодичность, Параметры.НачалоПериодаСмещения, Параметры.КонецПериодаСмещения,,, Параметры.НачалоАктивныхПериодов);
НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда
ПоместитьВоВременноеХранилище(Новый ТаблицаЗначений, АдресХранилища);
ПоместитьВоВременноеХранилище(Неопределено, АдресХранилищаДополнительный);
Возврат;
КонецЕсли;
Параметры.Вставить("Периоды", Периоды);
ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
КолонкаПериода = ЗаполняемаяТЧ.Колонки[ИмяКолонкиПериода];
КолонкаПериода.Имя = "ПериодСостава";
Результат = Планирование.ЗаполнитьПоФормуле(Параметры);
Если Результат.Колонки.Найти("ПериодСостава") = Неопределено Тогда
Результат.Колонки.Добавить("ПериодСостава", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата))
КонецЕсли;
Результат.Колонки["ПериодСостава"].Имя = ИмяКолонкиПериода;
ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
Если Параметры.НачалоАктивныхПериодов > Параметры.НачалоПериодаСмещения Тогда
ПоместитьВоВременноеХранилище(Периоды, АдресХранилищаДополнительный);
Иначе
ПоместитьВоВременноеХранилище(Неопределено, АдресХранилищаДополнительный);
КонецЕсли;
КоличествоОбработанных = Периоды.Количество();
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанных);
КонецПроцедуры
Процедура ЗаполнитьПоПравилуЗаполнения(Знач Параметры, Знач АдресХранилища) Экспорт
Если Не Параметры.Свойство("ЗаполнятьПоПравилу") Тогда
Возврат;
КонецЕсли;
ИмяКолонкиПериода = "ДатаОтгрузки";
Периоды = Параметры.Периоды;
НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда
Возврат;
КонецЕсли;
Коэффициенты = Новый Массив;
Для Индекс = 1 По ВсегоПериодов Цикл
Коэффициенты.Добавить(1);
КонецЦикла;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПараметрыДанных", Планирование.ПолучитьПараметрыПлана(Параметры));
Если Параметры.Свойство("Отбор") Тогда
ДополнительныеПараметры.Вставить("Отбор", Параметры.Отбор);
КонецЕсли;
Если ЗначениеЗаполнено(Параметры.ИзменитьРезультатНа) Тогда
ДополнительныеПараметры.ПараметрыДанных.Вставить("Коэффициент", (100 + Параметры.ИзменитьРезультатНа) / 100);
КонецЕсли;
Если Параметры.Свойство("ТочностьОкругления") Тогда
ДополнительныеПараметры.ПараметрыДанных.Вставить("ТочностьОкругления", Параметры.ТочностьОкругления);
КонецЕсли;
ПравилоЗаполнения = Параметры.ПравилоЗаполнения;
ПользовательскиеНастройки = Параметры.ПользовательскиеНастройки;
Результат = Планирование.ВыбратьДанныеПоПравилам(
Перечисления.ТипыПланов.ПланПродаж,
ПравилоЗаполнения,
ПользовательскиеНастройки,
ДополнительныеПараметры);
ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
Если Результат <> Неопределено Тогда
РазрядностьОкругления = Параметры.ТочностьОкругления + 3;
ВыходныеДниКалендарей = Новый Соответствие;
ОсновнойКалендарьПредприятия = Константы.ОсновнойКалендарьПредприятия.Получить();
КалендарьСкладаПлана = Справочники.Календари.ПустаяСсылка();
Если ЗначениеЗаполнено(Параметры.Склад) Тогда
КалендарьСкладаПлана = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Склад, "Календарь");
КонецЕсли;
Для каждого СтрокаРезультата Из Результат Цикл
Если Параметры.ТочностьОкругления <> 0 Тогда
ИмяФункции = НСтр("ru = 'Окр(%1; %2)'");
СтрокаРезультата.Расшифровка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяФункции, СтрокаРезультата.Расшифровка, Pow(10, -РазрядностьОкругления));
СтрокаРезультата.ЧисловоеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяФункции, СтрокаРезультата.ЧисловоеПредставление, Pow(10, -РазрядностьОкругления));
КонецЕсли;
Если СтрокаРезультата.Количество = null Тогда
Продолжить;
КонецЕсли;
Если Цел(СтрокаРезультата.Количество * Pow(10, РазрядностьОкругления)) = 0 Тогда
Продолжить;
КонецЕсли;
Количество = Окр(СтрокаРезультата.Количество, РазрядностьОкругления);
Если Параметры.РаспределитьПоРабочимДням И Не Параметры.КроссТаблица Тогда
Если ЗначениеЗаполнено(Параметры.Склад) Тогда
КалендарьСклада = КалендарьСкладаПлана;
Иначе
КалендарьСклада = СтрокаРезультата.СкладКалендарь;
КонецЕсли;
Если Не ЗначениеЗаполнено(КалендарьСклада) Тогда
КалендарьСклада = ОсновнойКалендарьПредприятия;
КонецЕсли;
ДлительностьПериода = ДлительностьПериода(Параметры.НачалоПериода, Параметры.ОкончаниеПериода, КалендарьСклада, ВыходныеДниКалендарей);
РезультатРаспределения = Новый Массив;
Пока Количество > 0 Цикл
Пока ДлительностьПериода > 0 Цикл
КоличествоКРаспределению = Окр(Цел(Количество * Pow(10, РазрядностьОкругления) / ДлительностьПериода) / Pow(10, РазрядностьОкругления), РазрядностьОкругления);
Если КоличествоКРаспределению > 0 Тогда
Прервать;
Иначе
ДлительностьПериода = ДлительностьПериода - 1;
КонецЕсли;
КонецЦикла;
Если ДлительностьПериода = 0 Тогда
Прервать;
КонецЕсли;
ИндексПериода = 0;
Пока ИндексПериода < ДлительностьПериода Цикл
Если ИндексПериода <= РезультатРаспределения.ВГраница() Тогда
РезультатРаспределения[ИндексПериода] = РезультатРаспределения[ИндексПериода] + КоличествоКРаспределению;
Иначе
РезультатРаспределения.Вставить(ИндексПериода, КоличествоКРаспределению);
КонецЕсли;
Количество = Количество - КоличествоКРаспределению;
ИндексПериода = ИндексПериода + 1;
КонецЦикла;
КонецЦикла;
Если РезультатРаспределения.Количество() > 0 Тогда
ДатаКалендаря = Параметры.НачалоПериода;
Для каждого РаспределенноеКоличество Из РезультатРаспределения Цикл
Пока Классификация.ЭтоВыходнойДень(ДатаКалендаря, КалендарьСклада, ВыходныеДниКалендарей) Цикл
ДатаКалендаря = ДатаКалендаря + 86400;
КонецЦикла;
НоваяСтрока = ЗаполняемаяТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
НоваяСтрока.Количество = РаспределенноеКоличество;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока[ИмяКолонкиПериода] = ДатаКалендаря;
ДатаКалендаря = ДатаКалендаря + 86400;
КонецЦикла;
КонецЕсли;
ИначеЕсли Параметры.КроссТаблица Тогда
Если ЗначениеЗаполнено(СтрокаРезультата.Период)
И СтрокаРезультата.Период >= Параметры.НачалоПериода
И СтрокаРезультата.Период <= Параметры.ОкончаниеПериода Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
КонецЕсли;
НоваяСтрока = ЗаполняемаяТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
НоваяСтрока.Количество = Количество;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока[ИмяКолонкиПериода] = СтрокаРезультата.Период;
Продолжить;
ИначеЕсли ЗначениеЗаполнено(СтрокаРезультата.Период) Тогда
Продолжить;
КонецЕсли;
Если СтрокаРезультата.Количество < 0 Тогда
ЗнакКоличества = -1;
Иначе
ЗнакКоличества = 1;
КонецЕсли;
РаспределениеКоличества = Планирование.РаспределитьСуммуПропорциональноКоэффициентам(ЗнакКоличества * СтрокаРезультата.Количество, Коэффициенты, РазрядностьОкругления);
Если РаспределениеКоличества = Неопределено Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
КонецЕсли;
Продолжить;
КонецЕсли;
Если РаспределениеКоличества[0] < 0 Тогда
РаспределениеКоличества[0] = 0;
КонецЕсли;
СтрокаРезультата.Расшифровка = "(" + СтрокаРезультата.Расшифровка + ") * " + НСтр("ru = 'Коэфф распределения'");
СтрокаРезультата.ЧисловоеПредставление = "(" + СтрокаРезультата.ЧисловоеПредставление + ") * ";
Индекс = РаспределениеКоличества.ВГраница();
Пока Индекс >= 0 Цикл
Количество = РаспределениеКоличества[Индекс];
ДатаПериода = НайденныеСтрокиПериодов[НайденныеСтрокиПериодов.ВГраница() - Индекс].ДатаНачала;
Индекс = Индекс - 1;
Если Количество = 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ЗаполняемаяТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
НоваяСтрока.Количество = ЗнакКоличества * Количество;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока[ИмяКолонкиПериода] = ДатаПериода;
НоваяСтрока.Расшифровка = СтрокаРезультата.Расшифровка + " = "
+ СтрокаРезультата.ЧисловоеПредставление
+ Строка(Окр(НоваяСтрока.Количество/СтрокаРезультата.Количество, 3, 1))
+ " = " + Строка(НоваяСтрока.Количество);
КонецЦикла;
Иначе
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + СтрокаРезультата.ЧисловоеПредставление;
Если СтрокаРезультата.ЧисловоеПредставление <> Строка(Количество) Тогда
СтрокаРезультата.Расшифровка = СтрокаРезультата.Расшифровка + " = " + Строка(Количество);
КонецЕсли;
НоваяСтрока = ЗаполняемаяТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
НоваяСтрока.Количество = Количество;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока[ИмяКолонкиПериода] = СтрокаРезультата.Период;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПоместитьВоВременноеХранилище(ЗаполняемаяТЧ, АдресХранилища);
КонецПроцедуры
Процедура ЗаполнитьДокументДляЗамещения(Знач Параметры, Знач АдресХранилища) Экспорт
Если Не Параметры.Свойство("ЗаполнитьДляЗамещения") Тогда
Возврат;
КонецЕсли;
ИмяКолонкиПериода = "ДатаОтгрузки";
Периоды = Параметры.Периоды;
НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда
ПоместитьВоВременноеХранилище(Новый ТаблицаЗначений, АдресХранилища);
Возврат;
КонецЕсли;
Параметры.Вставить("Периоды", Периоды);
ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
КолонкаПериода = ЗаполняемаяТЧ.Колонки[ИмяКолонкиПериода];
КолонкаПериода.Имя = "ПериодСостава";
Результат = Планирование.ЗаполнитьДляЗамещения(Параметры);
Если Результат.Колонки.Найти("ПериодСостава") = Неопределено Тогда
Результат.Колонки.Добавить("ПериодСостава", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата))
КонецЕсли;
Результат.Колонки["ПериодСостава"].Имя = ИмяКолонкиПериода;
ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
КонецПроцедуры
#Область ДляВызоваИзДругихПодсистем
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Подразделение)
| И ЗначениеРазрешено(Склад)
| И ЗначениеРазрешено(Партнер)
| И ЗначениеРазрешено(Сценарий)
| И ЗначениеРазрешено(ВидПлана)";
Ограничение.ТекстДляВнешнихПользователей =
"ПрисоединитьДополнительныеТаблицы
|ЭтотСписок КАК ЭтотСписок
|
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВнешниеПользователи КАК ВнешниеПользователиПартнеры
| ПО ВнешниеПользователиПартнеры.ОбъектАвторизации = ЭтотСписок.Партнер
|
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
| ПО КонтактныеЛицаПартнеров.Владелец = ЭтотСписок.Партнер
|
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВнешниеПользователи КАК ВнешниеПользователиКонтактныеЛица
| ПО ВнешниеПользователиКонтактныеЛица.ОбъектАвторизации = КонтактныеЛицаПартнеров.Ссылка
|;
|РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(ВнешниеПользователиПартнеры.Ссылка)
| ИЛИ ЗначениеРазрешено(ВнешниеПользователиКонтактныеЛица.Ссылка)";
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецЕсли
#Область ОбработчикиСобытий
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
Если ВидФормы = "ФормаОбъекта" Тогда
Если ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь() Тогда
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "ФормаДокументаСамообслуживание";
КонецЕсли;
ИначеЕсли ВидФормы = "ФормаСписка" Тогда
Если ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь()
И Параметры.Свойство("ТекущаяСтрока") Тогда
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "ФормаСпискаСамообслуживание";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
Если ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь() Тогда
Представление = НСтр("ru = 'План закупок'");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныеПроцедурыИФункции
#Область Проведение
Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт
ИсточникиДанных = Новый Соответствие;
Возврат ИсточникиДанных;
КонецФункции
Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеДокумента.Ссылка КАК Ссылка,
| ДанныеДокумента.Статус КАК Статус,
| ДанныеДокумента.Сценарий КАК Сценарий,
| ДанныеДокумента.ВидПлана КАК ВидПлана,
| ДанныеДокумента.Замещающий КАК Замещающий,
| ДанныеДокумента.Подразделение КАК Подразделение,
| ДанныеДокумента.Менеджер КАК Менеджер,
| ДанныеДокумента.Партнер КАК Партнер,
| ДанныеДокумента.Договор КАК Договор,
| ДанныеДокумента.Склад КАК Склад,
| ДанныеДокумента.ФорматМагазина КАК ФорматМагазина,
| ДанныеДокумента.ОкончаниеПериода КАК ОкончаниеПериода,
| ДанныеДокумента.НачалоПериода КАК НачалоПериода,
| ДанныеДокумента.Назначение КАК Назначение,
| ДанныеДокумента.ВидПлана.ЗаполнятьНазначениеВТЧ КАК ЗаполнятьНазначениеВТЧ
|ИЗ
| Документ.ПланПродаж КАК ДанныеДокумента
|ГДЕ
| ДанныеДокумента.Ссылка = &Ссылка
|";
РезультатыЗапроса = Запрос.ВыполнитьПакет();
Реквизиты = РезультатыЗапроса[0].Выбрать();
Реквизиты.Следующий();
Запрос.УстановитьПараметр("Статус", Реквизиты.Статус);
Запрос.УстановитьПараметр("Подразделение", Реквизиты.Подразделение);
Запрос.УстановитьПараметр("Сценарий", Реквизиты.Сценарий);
Запрос.УстановитьПараметр("ВидПлана", Реквизиты.ВидПлана);
Запрос.УстановитьПараметр("Замещающий", Реквизиты.Замещающий);
Запрос.УстановитьПараметр("Менеджер", Реквизиты.Менеджер);
Запрос.УстановитьПараметр("Партнер", Реквизиты.Партнер);
Запрос.УстановитьПараметр("Договор", Реквизиты.Договор);
Запрос.УстановитьПараметр("ФорматМагазина", Реквизиты.ФорматМагазина);
Запрос.УстановитьПараметр("НачалоПериода", Реквизиты.НачалоПериода);
Запрос.УстановитьПараметр("ОкончаниеПериода", Реквизиты.ОкончаниеПериода);
Запрос.УстановитьПараметр("Назначение", Реквизиты.Назначение);
Запрос.УстановитьПараметр("ЗаполнятьНазначениеВТЧ", Реквизиты.ЗаполнятьНазначениеВТЧ);
КонецПроцедуры
Функция ТекстЗапросаТаблицаПланыПродаж(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ПланыПродаж";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| ТаблицаТовары.Ссылка КАК ПланПродаж,
| &Статус КАК Статус,
| ВЫБОР
| КОГДА ТаблицаТовары.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА &НачалоПериода
| ИНАЧЕ ТаблицаТовары.ДатаОтгрузки
| КОНЕЦ КАК Период,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ВЫБОР
| КОГДА СпрНоменклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| ИНАЧЕ ТаблицаТовары.Назначение
| КОНЕЦ КАК Назначение,
| ВЫБОР
| КОГДА СпрНоменклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
| ИЛИ СпрНоменклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)
| ТОГДА ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| ИНАЧЕ ТаблицаТовары.Склад
| КОНЕЦ КАК Склад,
| &Подразделение КАК Подразделение,
| &Сценарий КАК Сценарий,
| &ВидПлана КАК ВидПлана,
| ТаблицаТовары.Партнер КАК Партнер,
| ТаблицаТовары.Соглашение КАК Соглашение,
| &ФорматМагазина КАК ФорматМагазина,
| &Менеджер КАК Менеджер,
| ВЫБОР
| КОГДА ТаблицаТовары.Замещен
| ТОГДА 0
| ИНАЧЕ ТаблицаТовары.Количество
| КОНЕЦ КАК Количество,
| ВЫБОР
| КОГДА &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден)
| ТОГДА ТаблицаТовары.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК КЗаказу,
| ТаблицаТовары.Сумма КАК Сумма
|ИЗ
| Документ.ПланПродаж.Товары КАК ТаблицаТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
| ПО ТаблицаТовары.Номенклатура = СпрНоменклатура.Ссылка
|ГДЕ
| ТаблицаТовары.Ссылка = &Ссылка
| И НЕ ТаблицаТовары.Отменено
| И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Отменен)
| И (НЕ ТаблицаТовары.Замещен
| И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден)
| ИЛИ НЕ ТаблицаТовары.ЗамещенКЗаказу
| И &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден))
|";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаТаблицаПланыОплатКлиентов(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ПланыОплатКлиентов";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| ТаблицаДокумента.НомерСтроки КАК НомерСтроки,
| &Статус КАК Статус,
| ТаблицаДокумента.ДатаПлатежа КАК Период,
| &Сценарий КАК Сценарий,
| &Партнер КАК Партнер,
| &Договор КАК Договор,
| ТаблицаДокумента.Ссылка КАК План,
| ТаблицаДокумента.СуммаПлатежа КАК Сумма
|ИЗ
| Документ.ПланПродаж.ПланОплаты КАК ТаблицаДокумента
|ГДЕ
| ТаблицаДокумента.Ссылка = &Ссылка
| И НЕ ТаблицаДокумента.Замещен
| И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Отменен)
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция АдаптированныйТекстЗапросаДвиженийПоРегистру(ИмяРегистра) Экспорт
Запрос = Новый Запрос;
ТекстыЗапроса = Новый СписокЗначений;
ПолноеИмяДокумента = "Документ.ПланПродаж";
ЗначенияПараметров = Новый Структура;
ПереопределениеРасчетаПараметров = Новый Структура;
Если ИмяРегистра = "ПланыПродаж" Тогда
ТекстЗапроса = ТекстЗапросаТаблицаПланыПродаж(Запрос, ТекстыЗапроса, ИмяРегистра);
СинонимТаблицыДокумента = "ТаблицаТовары";
Иначе
ТекстИсключения = НСтр("ru = 'В документе %ПолноеИмяДокумента% не реализована адаптация текста запроса формирования движений по регистру %ИмяРегистра%.'");
ТекстИсключения = СтрЗаменить(ТекстИсключения, "%ПолноеИмяДокумента%", ПолноеИмяДокумента);
ТекстИсключения = СтрЗаменить(ТекстИсключения, "%ИмяРегистра%", ИмяРегистра);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
Результат = ОбновлениеИнформационнойБазыУТ.РезультатАдаптацииЗапроса();
Результат.ТекстЗапроса = ОбновлениеИнформационнойБазыУТ.АдаптироватьЗапросМеханизмаПроведения(ТекстЗапроса,
ПолноеИмяДокумента,
СинонимТаблицыДокумента,
ПереопределениеРасчетаПараметров);
Возврат Результат;
КонецФункции
Функция ЗапросЗамещенныеИЗамещающиеПланы(Параметры) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПланПродажЗамещающий.Ссылка КАК ЗамещаемыйПлан,
| ВЫБОР
| КОГДА &НачалоПериода > ПланПродажЗамещающий.НачалоПериода
| ТОГДА &НачалоПериода
| ИНАЧЕ ПланПродажЗамещающий.НачалоПериода
| КОНЕЦ КАК НачалоПериода,
| ВЫБОР
| КОГДА &ОкончаниеПериода < ПланПродажЗамещающий.ОкончаниеПериода
| ТОГДА &ОкончаниеПериода
| ИНАЧЕ ПланПродажЗамещающий.ОкончаниеПериода
| КОНЕЦ КАК ОкончаниеПериода,
| ПланПродажЗамещающий.Статус КАК Статус
|ИЗ
| Документ.ПланПродаж КАК ПланПродажЗамещающий
|ГДЕ
| ПланПродажЗамещающий.ОкончаниеПериода >= &НачалоПериода
| И ПланПродажЗамещающий.НачалоПериода <= &ОкончаниеПериода
| И ПланПродажЗамещающий.Ссылка <> &Ссылка
| И ПланПродажЗамещающий.Проведен
| И ПланПродажЗамещающий.ВидПлана = &ВидПлана
| И (ПланПродажЗамещающий.Статус.Порядок >= &СтатусИндекс
| ИЛИ ПланПродажЗамещающий.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.НаУтверждении)
| И &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден))
| И &Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Отменен)
| И ПланПродажЗамещающий.Дата > &Дата
| И ПланПродажЗамещающий.Подразделение = &Подразделение
| И ПланПродажЗамещающий.Партнер = &Партнер
| И ПланПродажЗамещающий.Соглашение = &Соглашение
| И ПланПродажЗамещающий.Менеджер = &Менеджер
| И ПланПродажЗамещающий.ФорматМагазина = &ФорматМагазина
| И ПланПродажЗамещающий.Склад = &Склад
| И ПланПродажЗамещающий.Назначение = &Назначение
|
|УПОРЯДОЧИТЬ ПО
| НачалоПериода,
| Статус
|;
|
|
|ВЫБРАТЬ
| ПланПродажЗамещенный.Ссылка КАК ЗамещенныйПлан,
| ВЫБОР
| КОГДА &НачалоПериода > ПланПродажЗамещенный.НачалоПериода
| ТОГДА &НачалоПериода
| ИНАЧЕ ПланПродажЗамещенный.НачалоПериода
| КОНЕЦ КАК НачалоПериода,
| ВЫБОР
| КОГДА &ОкончаниеПериода < ПланПродажЗамещенный.ОкончаниеПериода
| ТОГДА &ОкончаниеПериода
| ИНАЧЕ ПланПродажЗамещенный.ОкончаниеПериода
| КОНЕЦ КАК ОкончаниеПериода,
| ПланПродажЗамещенный.Статус КАК Статус
|ИЗ
| Документ.ПланПродаж КАК ПланПродажЗамещенный
|ГДЕ
| ПланПродажЗамещенный.ОкончаниеПериода >= &НачалоПериода
| И ПланПродажЗамещенный.НачалоПериода <= &ОкончаниеПериода
| И ПланПродажЗамещенный.Ссылка <> &Ссылка
| И ПланПродажЗамещенный.Проведен
| И ПланПродажЗамещенный.ВидПлана = &ВидПлана
| И (ПланПродажЗамещенный.Статус.Порядок <= &СтатусИндекс
| ИЛИ ПланПродажЗамещенный.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден)
| И &Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.НаУтверждении))
| И ПланПродажЗамещенный.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Отменен)
| И ПланПродажЗамещенный.Дата < &Дата
| И ПланПродажЗамещенный.Подразделение = &Подразделение
| И ПланПродажЗамещенный.Партнер = &Партнер
| И ПланПродажЗамещенный.Соглашение = &Соглашение
| И ПланПродажЗамещенный.Склад = &Склад
| И ПланПродажЗамещенный.Менеджер = &Менеджер
| И ПланПродажЗамещенный.ФорматМагазина = &ФорматМагазина
| И ПланПродажЗамещенный.Назначение = &Назначение
|
|УПОРЯДОЧИТЬ ПО
| НачалоПериода,
| Статус";
Запрос.УстановитьПараметр("Ссылка", Параметры.Ссылка);
Запрос.УстановитьПараметр("ВидПлана", Параметры.ВидПлана);
Запрос.УстановитьПараметр("Статус", Параметры.Статус);
Запрос.УстановитьПараметр("СтатусИндекс", Перечисления.СтатусыПланов.Индекс(Параметры.Статус));
Запрос.УстановитьПараметр("Дата", Параметры.Дата);
Запрос.УстановитьПараметр("Подразделение", Параметры.Подразделение);
Запрос.УстановитьПараметр("Партнер", Параметры.Партнер);
Запрос.УстановитьПараметр("Соглашение", Параметры.Соглашение);
Запрос.УстановитьПараметр("Менеджер", Параметры.Менеджер);
Запрос.УстановитьПараметр("ФорматМагазина", Параметры.ФорматМагазина);
Запрос.УстановитьПараметр("Склад", Параметры.Склад);
Запрос.УстановитьПараметр("Назначение", Параметры.Назначение);
Запрос.УстановитьПараметр("НачалоПериода", Параметры.НачалоПериода);
Запрос.УстановитьПараметр("ОкончаниеПериода", Параметры.ОкончаниеПериода);
Запрос.УстановитьПараметр("Периодичность", Параметры.Периодичность);
Возврат Запрос;
КонецФункции
Функция ЗапросЗамещения(Параметры) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПланыПродажОбороты.Период КАК ПериодСостава,
| ПланыПродажОбороты.Сценарий КАК Сценарий,
| ПланыПродажОбороты.Статус КАК Статус,
| ПланыПродажОбороты.Номенклатура КАК Номенклатура,
| ПланыПродажОбороты.Характеристика КАК Характеристика,
| ПланыПродажОбороты.Назначение КАК Назначение,
| ПланыПродажОбороты.Подразделение КАК Подразделение,
| ПланыПродажОбороты.Склад КАК Склад,
| ПланыПродажОбороты.Партнер КАК Партнер,
| ПланыПродажОбороты.Соглашение КАК Соглашение,
| ПланыПродажОбороты.ФорматМагазина КАК ФорматМагазина,
| ПланыПродажОбороты.Менеджер КАК Менеджер,
| ПланыПродажОбороты.КоличествоОборот КАК КоличествоУпаковок,
| ПланыПродажОбороты.СуммаОборот КАК Сумма
|ИЗ
| РегистрНакопления.ПланыПродаж.Обороты(
| &НачалоПериода,
| &КонецПериода,
| Запись,
| Сценарий = &Сценарий
| И ВидПлана = &ВидПлана
| И (&ЗаполнятьНазначениеВТЧ
| ИЛИ Назначение = &Назначение)
| И Статус В (&Статусы)
| И &ТекстЗапросаОтборСоглашение
| И &ТекстЗапросаОтборМенеджер
| И &ТекстЗапросаОтборПартнер
| И &ТекстЗапросаОтборПодразделение
| И &ТекстЗапросаОтборСклад
| И &ТекстЗапросаОтборФорматМагазина) КАК ПланыПродажОбороты";
Запрос.УстановитьПараметр("КонецПериода", Параметры.КонецПериодаСмещения);
Запрос.УстановитьПараметр("НачалоПериода", Параметры.НачалоПериодаСмещения);
Запрос.УстановитьПараметр("Статусы", Параметры.Статусы);
Запрос.УстановитьПараметр("Сценарий", Параметры.Сценарий);
Запрос.УстановитьПараметр("ВидПлана", Параметры.ВидПлана);
Запрос.УстановитьПараметр("Менеджер", Параметры.Менеджер);
Запрос.УстановитьПараметр("Партнер", Параметры.Партнер);
Запрос.УстановитьПараметр("Подразделение", Параметры.Подразделение);
Запрос.УстановитьПараметр("Склад", Параметры.Склад);
Запрос.УстановитьПараметр("Соглашение", Параметры.Соглашение);
Запрос.УстановитьПараметр("ФорматМагазина", Параметры.ФорматМагазина);
Запрос.УстановитьПараметр("ЗаполнятьНазначениеВТЧ", Параметры.ЗаполнятьНазначениеВТЧ);
Запрос.УстановитьПараметр("Назначение", Параметры.Назначение);
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"&ТекстЗапросаОтборМенеджер",
?(ЗначениеЗаполнено(Параметры.Менеджер),"Менеджер = &Менеджер","Истина"));
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"&ТекстЗапросаОтборПартнер",
?(ЗначениеЗаполнено(Параметры.Партнер),"Партнер = &Партнер","Истина"));
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"&ТекстЗапросаОтборПодразделение",
?(ЗначениеЗаполнено(Параметры.Подразделение),"Подразделение = &Подразделение","Истина"));
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"&ТекстЗапросаОтборСклад",
?(ЗначениеЗаполнено(Параметры.Склад),"Склад = &Склад","Истина"));
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"&ТекстЗапросаОтборСоглашение",
?(ЗначениеЗаполнено(Параметры.Соглашение),"Соглашение = &Соглашение","Истина"));
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"&ТекстЗапросаОтборФорматМагазина",
?(ЗначениеЗаполнено(Параметры.ФорматМагазина),"ФорматМагазина = &ФорматМагазина","Истина"));
Возврат Запрос;
КонецФункции
Функция МакетФормыВыбораНазначений() Экспорт
МакетФормы = Справочники.Назначения.МакетФормыВыбораНазначений();
ШаблонНазначения = Справочники.Назначения.ДобавитьШаблонНазначений(МакетФормы);
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.Товары.Назначение", "ОбеспечениеЗаказовСкладВШапке");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад И Объект.Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.Товары.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.Товары.Характеристика";
ОписаниеКолонок.ПутиКДанным.Склад = "Объект.Склад";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.Товары.Назначение", "ОбеспечениеЗаказовСкладВТЧ");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСкладВТЧ И Объект.Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.Товары.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.Товары.Характеристика";
ОписаниеКолонок.ПутиКДанным.Склад = "Объект.Товары.Склад";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовВсеСклады", Истина, "Объект.Товары.Назначение", "ОбеспечениеЗаказовВсеСклады");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад = ЛОЖЬ И Объект.ВидПлана.ЗаполнятьСкладВТЧ = ЛОЖЬ И Объект.Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.Товары.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.Товары.Характеристика";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовРаботами", Истина, "Объект.Товары.Назначение", "ОбеспечениеЗаказовРаботами");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьПодразделение И Объект.Товары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.Товары.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.Товары.Характеристика";
ОписаниеКолонок.ПутиКДанным.Подразделение = "Объект.Подразделение";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.ТоварыПоПериодам.Назначение", "ОбеспечениеЗаказовПоПериодамСкладВШапке");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад И Объект.ТоварыПоПериодам.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.ТоварыПоПериодам.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.ТоварыПоПериодам.Характеристика";
ОписаниеКолонок.ПутиКДанным.Склад = "Объект.Склад";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.ТоварыПоПериодам.Назначение", "ОбеспечениеЗаказовПоПериодамСкладВТЧ");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСкладВТЧ И Объект.ТоварыПоПериодам.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.ТоварыПоПериодам.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.ТоварыПоПериодам.Характеристика";
ОписаниеКолонок.ПутиКДанным.Склад = "Объект.ТоварыПоПериодам.Склад";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовВсеСклады", Истина, "Объект.ТоварыПоПериодам.Назначение", "ОбеспечениеЗаказовВсеСкладыПоПериодам");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьСклад = ЛОЖЬ И Объект.ВидПлана.ЗаполнятьСкладВТЧ = ЛОЖЬ И Объект.ТоварыПоПериодам.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.ТоварыПоПериодам.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.ТоварыПоПериодам.Характеристика";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказовРаботами", Истина, "Объект.ТоварыПоПериодам.Назначение", "ОбеспечениеЗаказовРаботамиПоПериодам");
ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
ОписаниеКолонок.УсловиеИспользования = "Объект.ВидПлана.ЗаполнятьПодразделение И Объект.ТоварыПоПериодам.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)";
ОписаниеКолонок.ПутиКДанным.Номенклатура = "Объект.ТоварыПоПериодам.Номенклатура";
ОписаниеКолонок.ПутиКДанным.Характеристика = "Объект.ТоварыПоПериодам.Характеристика";
ОписаниеКолонок.ПутиКДанным.Подразделение = "Объект.Подразделение";
ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ВсеНазначения", Ложь, "Объект.Назначение");
Возврат МакетФормы;
КонецФункции
#КонецОбласти
#Область Прочее
#КонецОбласти
Функция ДлительностьПериода(НачалоПериода, ОкончаниеПериода, Календарь, ВыходныеДниКалендарей)
ДлительностьПериода = (ОкончаниеПериода - НачалоПериода) / 86400 + 1;
ДатаКалендаря = НачалоПериода;
Пока ДатаКалендаря <= ОкончаниеПериода Цикл
Если Классификация.ЭтоВыходнойДень(ДатаКалендаря, Календарь, ВыходныеДниКалендарей) Тогда
ДлительностьПериода = ДлительностьПериода - 1;
КонецЕсли;
ДатаКалендаря = ДатаКалендаря + 86400;
КонецЦикла;
Возврат ДлительностьПериода;
КонецФункции
#Область ЗагрузкаДанныхИзФайла
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
Планирование.СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры);
КонецПроцедуры
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
Планирование.ЗаполнитьСписокНеоднозначностей(СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры);
КонецПроцедуры
#КонецОбласти
#Область Печать
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
Если ПраваПользователяПовтИсп.ЭтоПартнер() Тогда
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ПланПродаж";
КомандаПечати.Представление = НСтр("ru = 'Печать'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КомандаПечати.ДополнительныеПараметры.Вставить("ВыводитьСценарий", Ложь);
КомандаПечати.ДополнительныеПараметры.Вставить("ВыводитьПодразделение", Ложь);
КомандаПечати.ДополнительныеПараметры.Вставить("ВыводитьСоглашениеВТЧ", Ложь);
КомандаПечати.ДополнительныеПараметры.Вставить("ВыводитьСкладВТЧ", Ложь);
КомандаПечати.ДополнительныеПараметры.Вставить("ВыводитьПартнераВТЧ", Ложь);
Иначе
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ПланПродаж";
КомандаПечати.Представление = НСтр("ru = 'План продаж'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КонецЕсли;
КонецПроцедуры
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПланПродаж") Тогда
Если ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь() Тогда
Если МассивОбъектов.Количество() = 1 Тогда
ПараметрыВывода.ЗаголовокФормы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'План закупок %1 от %2'"), МассивОбъектов[0].Номер, МассивОбъектов[0].Дата);
КонецЕсли;
СинонимМакета = НСтр("ru = 'План закупок'");
Иначе
СинонимМакета = НСтр("ru = 'План продаж'");
КонецЕсли;
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПланПродаж",
СинонимМакета,
СформироватьПечатнуюФормуПлана(МассивОбъектов, ОбъектыПечати, ПараметрыПечати));
КонецЕсли;
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
КонецПроцедуры
Функция СформироватьПечатнуюФормуПлана(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)
УстановитьПривилегированныйРежим(Истина);
Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("КроссТаблица") Тогда
ПоУмолчаниюКроссТаблица = ПараметрыПечати.КроссТаблица = Истина;
ПоУмолчаниюТаблица = ПараметрыПечати.КроссТаблица = Ложь;
Иначе
ПоУмолчаниюКроссТаблица = Ложь;
ПоУмолчаниюТаблица = Ложь;
КонецЕсли;
ВыводитьШапку = Истина;
Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("ВыводитьШапку") Тогда
ВыводитьШапку = ПараметрыПечати.ВыводитьШапку;
КонецЕсли;
ВыводитьСценарий = Истина;
ВыводитьПериодСтатус = Истина;
ВыводитьПодразделение = Истина;
ВыводитьМенеджера = Истина;
ВыводитьПартнера = Истина;
ВыводитьСоглашение = Истина;
ВыводитьСклад = Истина;
ВыводитьФорматМагазина = Истина;
ВыводитьПартнераВТЧ = Истина;
ВыводитьСоглашениеВТЧ = Истина;
ВыводитьСкладВТЧ = Истина;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьСценарий", ВыводитьСценарий) Тогда
ВыводитьСценарий = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьПериодСтатус", ВыводитьПериодСтатус) Тогда
ВыводитьПериодСтатус = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьПодразделение", ВыводитьПодразделение) Тогда
ВыводитьПодразделение = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьМенеджера", ВыводитьМенеджера) Тогда
ВыводитьМенеджера = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьПартнера", ВыводитьПартнера) Тогда
ВыводитьПартнера = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьСоглашение", ВыводитьСоглашение) Тогда
ВыводитьСоглашение = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьСклад", ВыводитьСклад) Тогда
ВыводитьСклад = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьФорматМагазина", ВыводитьФорматМагазина) Тогда
ВыводитьФорматМагазина = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьПартнераВТЧ", ВыводитьПартнераВТЧ) Тогда
ВыводитьПартнераВТЧ = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьСоглашениеВТЧ", ВыводитьСоглашениеВТЧ) Тогда
ВыводитьСоглашениеВТЧ = Истина;
КонецЕсли;
Если ПараметрыПечати <> Неопределено И НЕ ПараметрыПечати.Свойство("ВыводитьСкладВТЧ", ВыводитьСкладВТЧ) Тогда
ВыводитьСкладВТЧ = Истина;
КонецЕсли;
КолонкаКодов = ФормированиеПечатныхФорм.ДополнительнаяКолонкаПечатныхФормДокументов();
ИмяКолонкиКодов = КолонкаКодов.ИмяКолонки;
ПредставлениеКолонкиКодов = КолонкаКодов.ПредставлениеКолонки;
ВыводитьКоды = ЗначениеЗаполнено(ИмяКолонкиКодов);
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТаблицаДокумента.Ссылка КАК Ссылка,
| ТаблицаДокумента.Номер КАК Номер,
| ТаблицаДокумента.Дата КАК Дата,
| ТаблицаДокумента.Ответственный КАК Ответственный,
| ТаблицаДокумента.Статус КАК Статус,
| ТаблицаДокумента.Периодичность КАК Периодичность,
| ТаблицаДокумента.НачалоПериода КАК НачалоПериода,
| ТаблицаДокумента.ОкончаниеПериода КАК ОкончаниеПериода,
| ТаблицаДокумента.Сценарий КАК Сценарий,
| ТаблицаДокумента.ВидПлана КАК ВидПлана,
| ВЫБОР
| КОГДА &ПоУмолчаниюКроссТаблица
| ИЛИ ТаблицаДокумента.КроссТаблица
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК КроссТаблица,
| ТаблицаДокумента.ЗаполненоАвтоматически КАК ЗаполненоАвтоматически,
| СпрВидыПланов.ЗаполнятьПодразделение КАК ЗаполнятьПодразделение,
| СпрВидыПланов.ЗаполнятьПартнера КАК ЗаполнятьПартнера,
| СпрВидыПланов.ЗаполнятьСоглашение КАК ЗаполнятьСоглашение,
| СпрВидыПланов.ЗаполнятьМенеджера КАК ЗаполнятьМенеджера,
| СпрВидыПланов.ЗаполнятьСклад КАК ЗаполнятьСклад,
| СпрВидыПланов.ЗаполнятьФорматМагазина КАК ЗаполнятьФорматМагазина,
| СпрВидыПланов.ЗаполнятьПартнераВТЧ КАК ЗаполнятьПартнераВТЧ,
| СпрВидыПланов.ЗаполнятьСоглашениеВТЧ КАК ЗаполнятьСоглашениеВТЧ,
| СпрВидыПланов.ЗаполнятьСкладВТЧ КАК ЗаполнятьСкладВТЧ,
| СценарииПланирования.ОтображатьНомерПериода КАК ОтображатьНомерПериода,
| Пользователи.ФизическоеЛицо КАК ОтветственныйФизЛицо,
| ТаблицаДокумента.Валюта КАК Валюта,
| ТаблицаДокумента.ПланироватьПоСумме КАК ПланироватьПоСумме,
| ТаблицаДокумента.Партнер КАК Партнер,
| ТаблицаДокумента.Подразделение КАК Подразделение,
| ТаблицаДокумента.Менеджер КАК Менеджер,
| ТаблицаДокумента.Соглашение КАК Соглашение,
| ТаблицаДокумента.ФорматМагазина КАК ФорматМагазина,
| ТаблицаДокумента.Склад КАК Склад,
| ТаблицаДокумента.Назначение КАК Назначение,
| СценарииПланирования.ПланированиеПоНазначениям КАК ПланированиеПоНазначениям,
| СпрВидыПланов.ЗаполнятьНазначениеВТЧ КАК ЗаполнятьНазначениеВТЧ
|ИЗ
| Документ.ПланПродаж КАК ТаблицаДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СценарииТоварногоПланирования КАК СценарииПланирования
| ПО ТаблицаДокумента.Сценарий = СценарииПланирования.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыПланов КАК СпрВидыПланов
| ПО ТаблицаДокумента.ВидПлана = СпрВидыПланов.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
| ПО ТаблицаДокумента.Ответственный = Пользователи.Ссылка
|ГДЕ
| ТаблицаДокумента.Ссылка В(&МассивДокументов)
|
|УПОРЯДОЧИТЬ ПО
| Ссылка
|;
|
|
|ВЫБРАТЬ
| ТаблицаТовары.Ссылка КАК Ссылка,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Номенклатура.НаименованиеПолное КАК ТоварНаименованиеПолное,
| ТаблицаТовары.Номенклатура.Код КАК Код,
| ТаблицаТовары.Номенклатура.Артикул КАК Артикул,
| ВЫБОР
| КОГДА ТаблицаТовары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА ТаблицаТовары.Номенклатура.ЕдиницаИзмерения
| ИНАЧЕ ТаблицаТовары.Упаковка
| КОНЕЦ КАК ЕдиницаИзмерения,
| ТаблицаТовары.Характеристика.НаименованиеПолное КАК ХарактеристикаНаименованиеПолное,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ТаблицаТовары.Упаковка КАК Упаковка,
| ТаблицаТовары.НомерСтроки КАК НомерСтроки,
| ТаблицаТовары.ДатаОтгрузки КАК ДатаПериода,
| ТаблицаТовары.КоличествоУпаковок КАК Количество,
| ТаблицаТовары.Комментарий КАК Комментарий,
| ТаблицаТовары.Цена КАК Цена,
| ТаблицаТовары.Сумма КАК Сумма,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.Партнер КАК Партнер,
| ТаблицаТовары.Соглашение КАК Соглашение,
| ТаблицаТовары.Назначение.Наименование КАК НазначениеНаименование,
| ТаблицаТовары.Назначение КАК Назначение
|ИЗ
| Документ.ПланПродаж.Товары КАК ТаблицаТовары
|ГДЕ
| (&ПоУмолчаниюТаблица
| ИЛИ НЕ ТаблицаТовары.Ссылка.КроссТаблица)
| И ТаблицаТовары.Ссылка В(&МассивДокументов)
| И НЕ ТаблицаТовары.Отменено
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВложенныйЗапрос.Ссылка,
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Номенклатура.НаименованиеПолное,
| ВложенныйЗапрос.Номенклатура.Код,
| ВложенныйЗапрос.Номенклатура.Артикул,
| ВЫБОР
| КОГДА ВложенныйЗапрос.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА ВложенныйЗапрос.Номенклатура.ЕдиницаИзмерения
| ИНАЧЕ ВложенныйЗапрос.Упаковка
| КОНЕЦ,
| ВложенныйЗапрос.Характеристика.НаименованиеПолное,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Упаковка,
| МИНИМУМ(ВложенныйЗапрос.НомерСтроки),
| ВложенныйЗапрос.ДатаПериода,
| СУММА(ВложенныйЗапрос.КоличествоУпаковок),
| МАКСИМУМ(ВложенныйЗапрос.Комментарий),
| ВложенныйЗапрос.Цена,
| СУММА(ВложенныйЗапрос.Сумма),
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Партнер,
| ВложенныйЗапрос.Соглашение,
| ВложенныйЗапрос.Назначение.Наименование,
| ВложенныйЗапрос.Назначение
|ИЗ
| (ВЫБРАТЬ
| ТаблицаТовары.Ссылка КАК Ссылка,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ТаблицаТовары.Упаковка КАК Упаковка,
| ВЫБОР ТаблицаДокумента.Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаОтгрузки, ГОД)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаОтгрузки, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаОтгрузки, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаОтгрузки, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаОтгрузки, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ТаблицаТовары.ДатаОтгрузки, НЕДЕЛЯ)
| ИНАЧЕ ТаблицаТовары.ДатаОтгрузки
| КОНЕЦ КАК ДатаПериода,
| ТаблицаТовары.НомерСтроки КАК НомерСтроки,
| ВЫБОР КОГДА ТаблицаТовары.Отменено ТОГДА 0 ИНАЧЕ ТаблицаТовары.КоличествоУпаковок КОНЕЦ КАК КоличествоУпаковок,
| ВЫБОР КОГДА ТаблицаТовары.Отменено ТОГДА """" ИНАЧЕ ВЫРАЗИТЬ(ТаблицаТовары.Комментарий КАК СТРОКА(1000)) КОНЕЦ КАК Комментарий,
| ВЫБОР КОГДА ТаблицаТовары.Отменено ТОГДА 0 ИНАЧЕ ТаблицаТовары.Цена КОНЕЦ КАК Цена,
| ВЫБОР КОГДА ТаблицаТовары.Отменено ТОГДА 0 ИНАЧЕ ТаблицаТовары.Сумма КОНЕЦ КАК Сумма,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.Партнер КАК Партнер,
| ТаблицаТовары.Соглашение КАК Соглашение,
| ТаблицаТовары.Назначение КАК Назначение
| ИЗ
| Документ.ПланПродаж.Товары КАК ТаблицаТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПланПродаж КАК ТаблицаДокумента
| ПО ТаблицаТовары.Ссылка = ТаблицаДокумента.Ссылка
| ГДЕ
| (&ПоУмолчаниюКроссТаблица
| ИЛИ ТаблицаТовары.Ссылка.КроссТаблица)
| И ТаблицаТовары.Ссылка В(&МассивДокументов)
| ) КАК ВложенныйЗапрос
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Ссылка,
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Номенклатура.НаименованиеПолное,
| ВложенныйЗапрос.Номенклатура.Код,
| ВложенныйЗапрос.Номенклатура.Артикул,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Характеристика.НаименованиеПолное,
| ВложенныйЗапрос.Назначение,
| ВложенныйЗапрос.Назначение.Наименование,
| ВложенныйЗапрос.Цена,
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Партнер,
| ВложенныйЗапрос.Соглашение,
| ВложенныйЗапрос.ДатаПериода,
| ВЫБОР
| КОГДА ВложенныйЗапрос.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА ВложенныйЗапрос.Номенклатура.ЕдиницаИзмерения
| ИНАЧЕ ВложенныйЗапрос.Упаковка
| КОНЕЦ,
| ВложенныйЗапрос.Упаковка
|
|УПОРЯДОЧИТЬ ПО
| Ссылка,
| НомерСтроки,
| ТоварНаименованиеПолное,
| ХарактеристикаНаименованиеПолное,
| НазначениеНаименование,
| Партнер,
| Соглашение,
| Склад,
| ЕдиницаИзмерения,
| ДатаПериода
|ИТОГИ ПО
| Ссылка");
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПланПродаж_ПланПродаж";
Запрос.УстановитьПараметр("МассивДокументов", МассивОбъектов);
Запрос.УстановитьПараметр("ПоУмолчаниюКроссТаблица", ПоУмолчаниюКроссТаблица);
Запрос.УстановитьПараметр("ПоУмолчаниюТаблица", ПоУмолчаниюТаблица);
МассивРезультатов = Запрос.ВыполнитьПакет();
ДанныеПечати = МассивРезультатов[0].Выбрать();
ВыборкаПоДокументам = МассивРезультатов[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ПервыйДокумент = Истина;
ЕстьДокументыССуммами = Ложь;
ЕстьКроссТаблицы = Ложь;
НачалоШапки = 0;
ОкончаниеШапки = 0;
ШиринаНомера = 0;
ОкончаниеНомера = 0;
ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
Пока ДанныеПечати.Следующий() Цикл
ПланироватьПоСумме = ДанныеПечати.ПланироватьПоСумме;
СтруктураПоиска = Новый Структура("Ссылка", ДанныеПечати.Ссылка);
НайденСледующий = ВыборкаПоДокументам.НайтиСледующий(СтруктураПоиска);
ВыборкаПоТоварам = ВыборкаПоДокументам.Выбрать();
КроссТаблица = ДанныеПечати.КроссТаблица;
Если КроссТаблица Тогда
ТаблицаПериодов = Планирование.ШаблонТаблицыПериодов();
Планирование.ЗаполнитьТаблицуПериодов(ТаблицаПериодов,
ДанныеПечати.Периодичность,
ДанныеПечати.НачалоПериода,
ДанныеПечати.ОкончаниеПериода,
?(ВыводитьШапку, ДанныеПечати.ОтображатьНомерПериода, Ложь));
КроссТаблица = ТаблицаПериодов.Количество() > 1 ИЛИ НЕ ВыводитьШапку;
КонецЕсли;
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.ПланПродаж.ПФ_MXL_ПланПродаж");
Если Не ПервыйДокумент Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
Если ВыводитьШапку Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ШтрихкодированиеПечатныхФорм.ВывестиШтрихкодВТабличныйДокумент(ТабличныйДокумент, Макет, ОбластьМакета, ДанныеПечати.Ссылка);
Если ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь() Тогда
ТекстЗаголовка = ОбщегоНазначенияУТКлиентСервер.СформироватьЗаголовокДокумента(ДанныеПечати, НСтр("ru = 'План закупок'", ОбщегоНазначения.КодОсновногоЯзыка()));
Иначе
ТекстЗаголовка = ОбщегоНазначенияУТКлиентСервер.СформироватьЗаголовокДокумента(ДанныеПечати, НСтр("ru = 'План продаж'", ОбщегоНазначения.КодОсновногоЯзыка()));
КонецЕсли;
ОбластьМакета.Параметры.ТекстЗаголовка = ТекстЗаголовка;
ТабличныйДокумент.Вывести(ОбластьМакета);
Если ВыводитьСценарий Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Сценарий");
ПредставлениеСценария = Строка(ДанныеПечати.Сценарий) + ", "+ Строка(ДанныеПечати.Периодичность);
Если ПланироватьПоСумме Тогда
ПредставлениеСценария = ПредставлениеСценария + ", " + Строка(ДанныеПечати.Валюта);
КонецЕсли;
ОбластьМакета.Параметры.ПредставлениеСценария = ПредставлениеСценария;
ОбластьМакета.Параметры.Сценарий = ДанныеПечати.Сценарий;
ПредставлениеВидаПлана = Строка(ДанныеПечати.ВидПлана);
ОбластьМакета.Параметры.ПредставлениеВидаПлана = ПредставлениеВидаПлана;
ОбластьМакета.Параметры.ВидПлана = ДанныеПечати.ВидПлана;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ВыводитьПериодСтатус Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Период");
ПредставлениеПериода = НСтр("ru='Период с %1 по %2'", ОбщегоНазначения.КодОсновногоЯзыка());
ПредставлениеПериода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредставлениеПериода,
Формат(ДанныеПечати.НачалоПериода, "ДЛФ=D"),
Формат(ДанныеПечати.ОкончаниеПериода, "ДЛФ=D"));
ОбластьМакета.Параметры.ПредставлениеПериода = ПредставлениеПериода;
ОбластьМакета.Параметры.Статус = Строка(ДанныеПечати.Статус);
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьПодразделение И ВыводитьПодразделение Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Подразделение");
ПредставлениеПодразделения = Строка(ДанныеПечати.Подразделение);
ОбластьМакета.Параметры.ПредставлениеПодразделения = ПредставлениеПодразделения;
ОбластьМакета.Параметры.Подразделение = ДанныеПечати.Подразделение;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьПартнера И ВыводитьПартнера Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Партнер");
ПредставлениеПартнер = Строка(ДанныеПечати.Партнер);
ОбластьМакета.Параметры.ПредставлениеПартнера = ПредставлениеПартнер;
ОбластьМакета.Параметры.Партнер = ДанныеПечати.Партнер;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьСоглашение И ВыводитьСоглашение Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Соглашение");
ПредставлениеСоглашения = Строка(ДанныеПечати.Соглашение);
ОбластьМакета.Параметры.ПредставлениеСоглашения = ПредставлениеСоглашения;
ОбластьМакета.Параметры.Соглашение = ДанныеПечати.Соглашение;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьМенеджера И ВыводитьМенеджера Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Менеджер");
ПредставлениеМенеджера = Строка(ДанныеПечати.Менеджер);
ОбластьМакета.Параметры.ПредставлениеМенеджера = ПредставлениеМенеджера;
ОбластьМакета.Параметры.Менеджер = ДанныеПечати.Менеджер;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьФорматМагазина И ВыводитьФорматМагазина Тогда
ОбластьМакета = Макет.ПолучитьОбласть("ФорматМагазина");
ПредставлениеФорматаМагазина = Строка(ДанныеПечати.ФорматМагазина);
ОбластьМакета.Параметры.ПредставлениеФорматаМагазина = ПредставлениеФорматаМагазина;
ОбластьМакета.Параметры.ФорматМагазина = ДанныеПечати.ФорматМагазина;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьСклад И ВыводитьСклад Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Склад");
ПредставлениеСклада = Строка(ДанныеПечати.Склад);
ОбластьМакета.Параметры.ПредставлениеСклада = ПредставлениеСклада;
ОбластьМакета.Параметры.Склад = ДанныеПечати.Склад;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДанныеПечати.ПланированиеПоНазначениям
И Не ДанныеПечати.ЗаполнятьНазначениеВТЧ Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Назначение");
ПредставлениеНазначение = Строка(ДанныеПечати.Назначение);
ОбластьМакета.Параметры.ПредставлениеНазначение = ПредставлениеНазначение;
ОбластьМакета.Параметры.Назначение = ДанныеПечати.Назначение;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
КонецЕсли;
ДопПоля = Новый Массив;
Если ДанныеПечати.ПланированиеПоНазначениям
И ДанныеПечати.ЗаполнятьНазначениеВТЧ Тогда
СтруктураДопПоля = Новый Структура;
СтруктураДопПоля.Вставить("Заголовок", НСтр("ru='Назначение'", ОбщегоНазначения.КодОсновногоЯзыка()));
СтруктураДопПоля.Вставить("КолонкаЗначения", "Назначение");
ДопПоля.Добавить(СтруктураДопПоля);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьПартнераВТЧ Тогда
СтруктураДопПоля = Новый Структура;
СтруктураДопПоля.Вставить("Заголовок", НСтр("ru='Клиент'", ОбщегоНазначения.КодОсновногоЯзыка()));
СтруктураДопПоля.Вставить("КолонкаЗначения", "Партнер");
ДопПоля.Добавить(СтруктураДопПоля);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьСоглашениеВТЧ Тогда
СтруктураДопПоля = Новый Структура;
СтруктураДопПоля.Вставить("Заголовок", НСтр("ru='Соглашение'", ОбщегоНазначения.КодОсновногоЯзыка()));
СтруктураДопПоля.Вставить("КолонкаЗначения", "Соглашение");
ДопПоля.Добавить(СтруктураДопПоля);
КонецЕсли;
Если ДанныеПечати.ЗаполнятьСкладВТЧ Тогда
СтруктураДопПоля = Новый Структура;
СтруктураДопПоля.Вставить("Заголовок", НСтр("ru='Склад'", ОбщегоНазначения.КодОсновногоЯзыка()));
СтруктураДопПоля.Вставить("КолонкаЗначения", "Склад");
ДопПоля.Добавить(СтруктураДопПоля);
КонецЕсли;
ТоварДопПоле = ?(ПланироватьПоСумме, "ТоварСуммаДопПоле", "ТоварДопПоле");
КоличествоКроссОкончание = ?(ПланироватьПоСумме, "КоличествоСуммаКроссОкончание", "КоличествоКроссОкончание");
Количество = "Количество";
Если ПланироватьПоСумме И КроссТаблица Тогда
Количество = "КоличествоСуммаКросс";
ИначеЕсли НЕ ПланироватьПоСумме И КроссТаблица Тогда
Количество = "КоличествоКросс";
ИначеЕсли ПланироватьПоСумме И НЕ КроссТаблица Тогда
Количество = "КоличествоСумма";
КонецЕсли;
Товар = ?(НЕ (ВыводитьШапку ИЛИ ИспользоватьХарактеристикиНоменклатуры), "ТоварБезХарактеристик", "Товар");
ШиринаКолонкиТовара = Макет.Область(Товар).ШиринаКолонки * 2;
Если ПланироватьПоСумме Тогда
ШиринаКолонкиТовара = ШиринаКолонкиТовара - 12;
КонецЕсли;
Если НЕ ВыводитьКоды Тогда
ШиринаКолонкиТовара = ШиринаКолонкиТовара + Макет.Область("КолонкаКодов").ШиринаКолонки;
КонецЕсли;
Если ДопПоля.Количество() > 0 Тогда
ШиринаКолонкиТовара = ШиринаКолонкиТовара - Макет.Область(ТоварДопПоле + Формат(ДопПоля.Количество(), "ЧДЦ=0; ЧГ=0")).ШиринаКолонки * ДопПоля.Количество();
КонецЕсли;
Если ВыводитьШапку ИЛИ ИспользоватьХарактеристикиНоменклатуры Тогда
ШиринаКолонкиТовара = ШиринаКолонкиТовара / 2;
КонецЕсли;
Макет.Область(Товар).ШиринаКолонки = ШиринаКолонкиТовара;
ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтроки");
ОбластьУИ = Макет.ПолучитьОбласть("ШапкаТаблицы|УникальныеИдентификаторы");
ОбластьКодов = Макет.ПолучитьОбласть("ШапкаТаблицы|КолонкаКодов");
ОбластьТовар = Макет.ПолучитьОбласть(?(ВыводитьШапку,"ШапкаТаблицы","ШапкаТаблицыНХ") + "|" + Товар);
ОбластьДанных = Макет.ПолучитьОбласть(?(ВыводитьШапку ИЛИ КроссТаблица, "ШапкаТаблицы", "ШапкаТаблицыНХ") + "|" + Количество);
ОбластьДанныхКроссОкончание = Макет.ПолучитьОбласть("ШапкаТаблицы|" + КоличествоКроссОкончание);
ОбластьДатаПериод = Макет.ПолучитьОбласть("ШапкаТаблицы|ДатаПериод");
ОбластьКроссЕдиницаИзмерения = Макет.ПолучитьОбласть("ШапкаТаблицы|КроссЕдиницаИзмерения");
Если ДопПоля.Количество() > 0 Тогда
ОбластьТоварДопПоле = Макет.ПолучитьОбласть("ШапкаТаблицы|" + ТоварДопПоле + Формат(ДопПоля.Количество(), "ЧДЦ=0; ЧГ=0"));
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьНомера);
Если Не ВыводитьШапку Тогда
ТабличныйДокумент.Присоединить(ОбластьУИ);
КонецЕсли;
Если ВыводитьКоды Тогда
ОбластьКодов.Параметры.ИмяКолонкиКодов = ПредставлениеКолонкиКодов;
ТабличныйДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ТабличныйДокумент.Присоединить(ОбластьТовар);
Для каждого ДопПоле Из ДопПоля Цикл
ОбластьТоварДопПоле.Параметры.Заголовок = ДопПоле.Заголовок;
ТабличныйДокумент.Присоединить(ОбластьТоварДопПоле);
КонецЦикла;
Если КроссТаблица Тогда
ТабличныйДокумент.Присоединить(ОбластьКроссЕдиницаИзмерения);
СуммыПериодов = Новый Структура;
Для каждого Период Из ТаблицаПериодов Цикл
СуммыПериодов.Вставить("Сумма_"+Период.ИмяКолонки, 0);
Индекс = ТаблицаПериодов.Индекс(Период);
Если Индекс = ТаблицаПериодов.Количество()-1 Тогда
ОбластьДанныхКроссОкончание.Параметры.Заголовок = Период.Заголовок;
ТабличныйДокумент.Присоединить(ОбластьДанныхКроссОкончание);
Иначе
ОбластьДанных.Параметры.Заголовок = Период.Заголовок;
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
КонецЦикла;
Иначе
ТабличныйДокумент.Присоединить(ОбластьДатаПериод);
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
НачалоШапки = ТабличныйДокумент.ВысотаТаблицы - ОбластьНомера.ВысотаТаблицы +1;
ОкончаниеШапки = ТабличныйДокумент.ВысотаТаблицы;
ШиринаНомера = ОбластьНомера.ШиринаТаблицы;
ОбластьНомера = Макет.ПолучитьОбласть("СтрокаТаблицы|НомерСтроки");
ОбластьУИ = Макет.ПолучитьОбласть("СтрокаТаблицы|УникальныеИдентификаторы");
ОбластьКодов = Макет.ПолучитьОбласть("СтрокаТаблицы|КолонкаКодов");
ОбластьТовар = Макет.ПолучитьОбласть("СтрокаТаблицы|" + Товар);
ОбластьДанных = Макет.ПолучитьОбласть("СтрокаТаблицы|" + Количество);
ОбластьДанныхКроссОкончание = Макет.ПолучитьОбласть("СтрокаТаблицы|" + КоличествоКроссОкончание);
ОбластьДатаПериод = Макет.ПолучитьОбласть("СтрокаТаблицы|ДатаПериод");
ОбластьКроссЕдиницаИзмерения = Макет.ПолучитьОбласть("СтрокаТаблицы|КроссЕдиницаИзмерения");
Если ДопПоля.Количество() > 0 Тогда
ОбластьТоварДопПоле = Макет.ПолучитьОбласть("СтрокаТаблицы|" + ТоварДопПоле + Формат(ДопПоля.Количество(), "ЧДЦ=0; ЧГ=0") );
КонецЕсли;
ТекущаяСтрока = Новый Структура("Номенклатура, Характеристика, Назначение, Партнер, Соглашение, Склад, ЕдиницаИзмерения");
Сумма = 0;
ТекущийПериод = 0;
НомерСтроки = 0;
Пока ВыборкаПоТоварам.Следующий() Цикл
ОдинаковыеСтроки = Истина;
Если КроссТаблица Тогда
Для каждого Элемент Из ТекущаяСтрока Цикл
Если ВыборкаПоТоварам[Элемент.Ключ] <> Элемент.Значение Тогда
ОдинаковыеСтроки = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ КроссТаблица ИЛИ КроссТаблица И НЕ ОдинаковыеСтроки Тогда
Если КроссТаблица И ТекущийПериод <> 0 И ТекущийПериод < ТаблицаПериодов.Количество() Тогда
Пока ТекущийПериод < ТаблицаПериодов.Количество() Цикл
ТекущийПериод = ТекущийПериод + 1;
Если ТекущийПериод < ТаблицаПериодов.Количество() Тогда
ТабличныйДокумент.Присоединить(Макет.ПолучитьОбласть("СтрокаТаблицы|" + Количество));
Иначе
ТабличныйДокумент.Присоединить(Макет.ПолучитьОбласть("СтрокаТаблицы|" + КоличествоКроссОкончание));
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, ВыборкаПоТоварам);
ТекущийПериод = 0;
НомерСтроки = НомерСтроки + 1;
ОбластьНомера.Параметры.НомерСтроки = НомерСтроки;
ТабличныйДокумент.Вывести(ОбластьНомера);
Если Не ВыводитьШапку Тогда
ОбластьУИ.Параметры.УникальныйИдентификаторНоменклатура = Строка(ВыборкаПоТоварам.Номенклатура.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторХарактеристика = Строка(ВыборкаПоТоварам.Характеристика.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторНазначение = Строка(ВыборкаПоТоварам.Назначение.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторУпаковка = Строка(ВыборкаПоТоварам.Упаковка.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторПартнер = Строка(ВыборкаПоТоварам.Партнер.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторСоглашение = Строка(ВыборкаПоТоварам.Соглашение.УникальныйИдентификатор());
ОбластьУИ.Параметры.УникальныйИдентификаторСклад = Строка(ВыборкаПоТоварам.Склад.УникальныйИдентификатор());
ТабличныйДокумент.Присоединить(ОбластьУИ);
КонецЕсли;
Если ВыводитьКоды Тогда
ОбластьКодов.Параметры.Артикул = ВыборкаПоТоварам[ИмяКолонкиКодов];
ТабличныйДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ДопПараметрыПредставлениеНоменклатуры = НоменклатураКлиентСервер.ДополнительныеПараметрыПредставлениеНоменклатурыДляПечати();
ДопПараметрыПредставлениеНоменклатуры.КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
ОбластьТовар.Параметры.Заполнить(ВыборкаПоТоварам);
ОбластьТовар.Параметры.Товар = НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати(
ВыборкаПоТоварам.ТоварНаименованиеПолное,
ВыборкаПоТоварам.ХарактеристикаНаименованиеПолное,
,
,
ДопПараметрыПредставлениеНоменклатуры);
ТабличныйДокумент.Присоединить(ОбластьТовар);
Для каждого ДопПоле Из ДопПоля Цикл
ОбластьТоварДопПоле.Параметры.Значение = ВыборкаПоТоварам[ДопПоле.КолонкаЗначения];
ТабличныйДокумент.Присоединить(ОбластьТоварДопПоле);
КонецЦикла;
Если КроссТаблица Тогда
ОбластьКроссЕдиницаИзмерения.Параметры.Заполнить(ВыборкаПоТоварам);
ТабличныйДокумент.Присоединить(ОбластьКроссЕдиницаИзмерения);
КонецЕсли;
КонецЕсли;
Если КроссТаблица Тогда
Период = ТаблицаПериодов.Найти(ВыборкаПоТоварам.ДатаПериода, "ДатаНачала");
Индекс = ТаблицаПериодов.Индекс(Период);
ПустаяОбластьДанных = Макет.ПолучитьОбласть("СтрокаТаблицы|" + Количество);
ПустаяОбластьДанныхКроссОкончание = Макет.ПолучитьОбласть("СтрокаТаблицы|" + КоличествоКроссОкончание);
Пока ТекущийПериод < Период.НомерКолонки Цикл
ТекущийПериод = ТекущийПериод + 1;
ОбластьДанных = ПустаяОбластьДанных;
ОбластьДанныхКроссОкончание = ПустаяОбластьДанныхКроссОкончание;
Если ТекущийПериод = Период.НомерКолонки Тогда
Если Индекс < ТаблицаПериодов.Количество()-1 Тогда
ОбластьДанных.Параметры.Заполнить(ВыборкаПоТоварам);
Область = ОбластьДанных.Область("R1C1:R1C1");
Область.Примечание.Текст = ВыборкаПоТоварам.Комментарий;
ТабличныйДокумент.Присоединить(ОбластьДанных);
Иначе
ОбластьДанныхКроссОкончание.Параметры.Заполнить(ВыборкаПоТоварам);
Область = ОбластьДанныхКроссОкончание.Область("R1C1:R1C1");
Область.Примечание.Текст = ВыборкаПоТоварам.Комментарий;
ТабличныйДокумент.Присоединить(ОбластьДанныхКроссОкончание);
КонецЕсли;
Иначе
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
КонецЦикла;
Если ТекущийПериод = ТаблицаПериодов.Количество() Тогда
ТекущийПериод = 0;
КонецЕсли;
СуммыПериодов["Сумма_"+Период.ИмяКолонки] = СуммыПериодов["Сумма_"+Период.ИмяКолонки] + ВыборкаПоТоварам.Сумма;
Иначе
ОбластьДатаПериод.Параметры.Заполнить(ВыборкаПоТоварам);
ТабличныйДокумент.Присоединить(ОбластьДатаПериод);
ОбластьДанных.Параметры.Заполнить(ВыборкаПоТоварам);
Область = ОбластьДанных.Область("R1C1:R1C1");
Область.Примечание.Текст = ВыборкаПоТоварам.Комментарий;
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
Сумма = Сумма + ВыборкаПоТоварам.Сумма;
КонецЦикла;
Если КроссТаблица И ТекущийПериод <> 0 И ТекущийПериод < ТаблицаПериодов.Количество() Тогда
Пока ТекущийПериод < ТаблицаПериодов.Количество() Цикл
ТекущийПериод = ТекущийПериод + 1;
Если ТекущийПериод < ТаблицаПериодов.Количество() Тогда
ТабличныйДокумент.Присоединить(Макет.ПолучитьОбласть("СтрокаТаблицы|" + Количество));
Иначе
ТабличныйДокумент.Присоединить(Макет.ПолучитьОбласть("СтрокаТаблицы|" + КоличествоКроссОкончание));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ВыводитьШапку Тогда
ОбластьНомера = Макет.ПолучитьОбласть("ПодвалТаблицы|НомерСтроки");
ОбластьУИ = Макет.ПолучитьОбласть("ПодвалТаблицы|УникальныеИдентификаторы");
ОбластьКодов = Макет.ПолучитьОбласть("ПодвалТаблицы|КолонкаКодов");
ОбластьТовар = Макет.ПолучитьОбласть("ПодвалТаблицы|" + Товар);
ОбластьДанных = Макет.ПолучитьОбласть("ПодвалТаблицы|" + Количество);
ОбластьДанныхКроссОкончание = Макет.ПолучитьОбласть("ПодвалТаблицы|" + КоличествоКроссОкончание);
ОбластьДатаПериод = Макет.ПолучитьОбласть("ПодвалТаблицы|ДатаПериод");
ОбластьКроссЕдиницаИзмерения = Макет.ПолучитьОбласть("ПодвалТаблицы|КроссЕдиницаИзмерения");
Если ДопПоля.Количество() > 0 Тогда
ОбластьТоварДопПоле = Макет.ПолучитьОбласть("ПодвалТаблицы|" + ТоварДопПоле + Формат(ДопПоля.Количество(), "ЧДЦ=0; ЧГ=0") );
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьНомера);
Если ВыводитьКоды Тогда
ТабличныйДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ТабличныйДокумент.Присоединить(ОбластьТовар);
Для каждого ДопПоле Из ДопПоля Цикл
ТабличныйДокумент.Присоединить(ОбластьТоварДопПоле);
КонецЦикла;
Если ПланироватьПоСумме И НЕ КроссТаблица Тогда
ТабличныйДокумент.Присоединить(ОбластьДатаПериод);
ОбластьДанных.Параметры.Всего = ФормированиеПечатныхФорм.ФорматСумм(Сумма);
ТабличныйДокумент.Присоединить(ОбластьДанных);
ИначеЕсли КроссТаблица Тогда
ТабличныйДокумент.Присоединить(ОбластьКроссЕдиницаИзмерения);
Для каждого Период Из ТаблицаПериодов Цикл
Если Период.Активная И Период.НомерКолонки <= 0 Тогда
Продолжить;
КонецЕсли;
Если ПланироватьПоСумме Тогда
ОбластьДанных.Параметры.Всего = ФормированиеПечатныхФорм.ФорматСумм(СуммыПериодов["Сумма_"+Период.ИмяКолонки]);
КонецЕсли;
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЦикла;
Иначе
ТабличныйДокумент.Присоединить(ОбластьДатаПериод);
ТабличныйДокумент.Присоединить(ОбластьДанных);
КонецЕсли;
ОкончаниеНомера = ТабличныйДокумент.ВысотаТаблицы;
ОбластьМакета = Макет.ПолучитьОбласть("ИтоговаяСтрока");
Если ПланироватьПоСумме Тогда
СуммаКПрописи = Сумма;
ИтоговаяСтрока = НСтр("ru='Всего наименований %КоличествоНаименований%, на сумму %СуммаДокумента%'", ОбщегоНазначения.КодОсновногоЯзыка());
ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%КоличествоНаименований%", НомерСтроки);
ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%СуммаДокумента%", ФормированиеПечатныхФорм.ФорматСумм(СуммаКПрописи, ДанныеПечати.Валюта));
ОбластьМакета.Параметры.ИтоговаяСтрока = ИтоговаяСтрока;
ТабличныйДокумент.Вывести(ОбластьМакета);
ОбластьМакета = Макет.ПолучитьОбласть("СуммаПрописью");
ОбластьМакета.Параметры.СуммаПрописью = РаботаСКурсамиВалютУТ.СформироватьСуммуПрописью(СуммаКПрописи, ДанныеПечати.Валюта);
ТабличныйДокумент.Вывести(ОбластьМакета);
Иначе
ИтоговаяСтрока = НСтр("ru='Всего наименований %КоличествоНаименований%.'", ОбщегоНазначения.КодОсновногоЯзыка());
ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%КоличествоНаименований%", НомерСтроки);
ОбластьМакета.Параметры.ИтоговаяСтрока = ИтоговаяСтрока;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
ОбластьМакета = Макет.ПолучитьОбласть("Подписи");
Если ЗначениеЗаполнено(ДанныеПечати.ОтветственныйФизЛицо) Тогда
ОбластьМакета.Параметры.ПредставлениеОтветственного =
ФизическиеЛицаУТ.ФамилияИнициалыФизЛица(ДанныеПечати.ОтветственныйФизЛицо, ДанныеПечати.Дата);
ОбластьМакета.Параметры.Ответственный = ДанныеПечати.ОтветственныйФизЛицо;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеПечати.Ссылка);
Если КроссТаблица Тогда
ЕстьКроссТаблицы = Истина;
КонецЕсли;
Если ПланироватьПоСумме Тогда
ЕстьДокументыССуммами = Истина;
КонецЕсли;
КонецЦикла;
Если ДанныеПечати.Количество() = 1 И ЕстьКроссТаблицы Тогда
ОбластьШапки = ТабличныйДокумент.Область(НачалоШапки, , ОкончаниеШапки, );
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ОбластьШапки;
ОбластьНомера = ТабличныйДокумент.Область(, 1, , ШиринаНомера);
ТабличныйДокумент.ПовторятьПриПечатиКолонки = ОбластьНомера;
КонецЕсли;
ТабличныйДокумент.АвтоМасштаб = Истина;
Возврат ТабличныйДокумент;
КонецФункции
Функция СоздатьПрисоединенныйФайлExcel(ДокументСсылка, ИдентификаторФормы) Экспорт
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ВыводитьШапку", Ложь);
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(ДокументСсылка);
ОбъектыПечати = Новый СписокЗначений;
ОбъектыПечати.Добавить(ДокументСсылка);
ТабличныйДокумент = СформироватьПечатнуюФормуПлана(МассивДокументов, ОбъектыПечати, ПараметрыПечати);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS97);
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), ИдентификаторФормы);
ТекущаяДата = ТекущаяДатаСеанса();
ПараметрыФайла = Новый Структура();
ПараметрыФайла.Вставить("Автор", Пользователи.АвторизованныйПользователь());
ПараметрыФайла.Вставить("ВладелецФайлов", ДокументСсылка);
ПараметрыФайла.Вставить("ИмяБезРасширения", "Excel" + " " + Формат(ТекущаяДата, НСтр("ru = 'ДФ=''dd.MM.yyyy ЧЧ.мм.сс'''")));
ПараметрыФайла.Вставить("РасширениеБезТочки", "xls");
ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяДата);
Файл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище, Неопределено);
УдалитьФайлы(ИмяВременногоФайла);
Если Файл <> Неопределено Тогда
РаботаСФайламиСлужебный.ЗанятьФайлДляРедактированияСервер(Файл);
ДанныеФайла = РаботаСФайлами.ДанныеФайла(Файл, ИдентификаторФормы, Истина);
СтруктураДействийExcel = Новый Структура;
СтруктураДействийExcel.Вставить("AutoFilter", Новый Структура("СтрокаНачало, КолонкаНачало", 2, 2));
МассивКолонок = Новый Массив;
МассивКолонок.Добавить(3);
МассивКолонок.Добавить(4);
МассивКолонок.Добавить(5);
МассивКолонок.Добавить(6);
МассивКолонок.Добавить(7);
МассивКолонок.Добавить(8);
МассивКолонок.Добавить(9);
СтруктураДействийExcel.Вставить("HiddenColumns", МассивКолонок);
Возврат Новый Структура("ДанныеФайла, Файл, СтруктураДействийExcel", ДанныеФайла, Файл, СтруктураДействийExcel);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область ТекущиеДела
Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
ИмяФормы = "Документ.ПланПродаж.Форма.ФормаСписка";
ОбщиеПараметрыЗапросов = ТекущиеДелаСлужебный.ОбщиеПараметрыЗапросов();
Доступность =
(ОбщиеПараметрыЗапросов.ЭтоПолноправныйПользователь
Или ПравоДоступа("Просмотр", Метаданные.Документы.ПланПродаж))
И ПравоДоступа("Добавление", Метаданные.Документы.ПланПродаж)
И ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПродаж");
Если НЕ Доступность Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КОЛИЧЕСТВО(*) КАК ПланыПродажОжидающиеСогласования,
| МИНИМУМ(Планы.Статус.Порядок) КАК СтатусПорядок
|ИЗ
| Документ.ПланПродаж КАК Планы
|ГДЕ
| НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ) <= Планы.ОкончаниеПериода
| И ВЫБОР
| КОГДА НЕ Планы.Замещающий
| ТОГДА Планы.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.НаУтверждении)
| КОГДА Планы.Замещающий
| И Планы.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПланов.Утвержден)
| И Планы.Статус.Порядок >= 2
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ
| И Планы.Проведен";
Результат = ТекущиеДелаСлужебный.ЧисловыеПоказателиТекущихДел(Запрос, ОбщиеПараметрыЗапросов);
ДелоРодитель = ТекущиеДела.Найти("ПланыЗакупок", "Идентификатор");
Если ДелоРодитель = Неопределено Тогда
ДелоРодитель = ТекущиеДела.Добавить();
ДелоРодитель.Идентификатор = "ПланыЗакупок";
ДелоРодитель.Представление = НСтр("ru = 'Планы ожидающие согласования'");
ДелоРодитель.Владелец = Планирование.ПодсистемаПланирование();
КонецЕсли;
ПараметрыОтбора = Новый Структура;
Если Перечисления.СтатусыПланов[Результат.СтатусПорядок] = Перечисления.СтатусыПланов.НаУтверждении Тогда
ПараметрыОтбора.Вставить("Статус", Перечисления.СтатусыПланов.НаУтверждении);
КонецЕсли;
ПараметрыОтбора.Вставить("ПометкаУдаления", Ложь);
Дело = ТекущиеДела.Добавить();
Дело.Идентификатор = "ПланыПродажОжидающиеСогласования";
Дело.ЕстьДела = Результат.ПланыПродажОжидающиеСогласования > 0;
Дело.Представление = НСтр("ru = 'Планы продаж'");
Дело.Количество = Результат.ПланыПродажОжидающиеСогласования;
Дело.Важное = Ложь;
Дело.Форма = ИмяФормы;
Дело.ПараметрыФормы = Новый Структура("СтруктураБыстрогоОтбора", ПараметрыОтбора);
Дело.Владелец = "ПланыЗакупок";
Если Результат.ПланыПродажОжидающиеСогласования > 0 Тогда
ДелоРодитель.ЕстьДела = Истина;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецЕсли