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