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