#Область ОписаниеПеременных
&НаКлиенте
Перем КэшированныеЗначения;
&НаКлиенте
Перем ПередЗаписьюПовторныйВызов;
&НаКлиенте
Перем ПараметрыОбработчикаОжидания;
&НаКлиенте
Перем ОповещениеПослеЗаписи Экспорт;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
Планирование.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
Параметры.Свойство("ТекущаяСтрока", ТекущаяСтрокаПриОткрытии);
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
ОбновлятьПравило = Объект.ПравилоЗаполнения.Количество() = 0;
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана);
ЗаполнитьЗначенияСвойств(Объект, ПараметрыВидаПлана,"ЗаполнятьПланОплат,ЗаполнятьПоФормуле,Замещающий");
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Сценарий,
"Периодичность, СценарийБюджетирования, СпособРасчетаПотребностейВМатериалах");
ЗаполнитьЗначенияСвойств(Объект, ПараметрыСценария);
Если КоличествоПериодов > 0 И НЕ ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(
Объект.Периодичность,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекущаяДатаСеанса(),
КоличествоПериодов);
КонецЕсли;
ПриЧтенииСозданииНаСервере();
Если ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
УстановитьВидимость();
КонецЕсли;
СохранитьНовыйПериодСервер();
Если ЗначениеЗаполнено(Объект.ПравилоЗаполнения) Тогда
Для Каждого Правило Из Объект.ПравилоЗаполнения Цикл
Если Правило.ОтборИзШапкиУстановлен Тогда
ОтборУстановлен = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
УстановитьУсловноеОформлениеКроссТаблицы();
ПродажиСервер.УстановитьОтметкуНезаполненногоДоговора(Элементы, "Договор");
ИмяДополнительнойКолонки = ФормированиеПечатныхФорм.ДополнительнаяКолонкаПечатныхФормДокументов().ИмяКолонки;
УстановитьДоступностьКомандБуфераОбмена();
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПриСозданииНаСервере(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
Справочники.Назначения.ФормаДокументаПриСозданииНаСервере(ЭтаФорма);
СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
ПараметрыГиперссылки = РаботаСФайлами.ГиперссылкаФайлов();
ПараметрыГиперссылки.Размещение = "КоманднаяПанель";
РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыГиперссылки);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
Если Объект.Замещающий И КонтрольЗамещенияПланаНаСервере(Объект.Ссылка) Тогда
ПропуститьПроверкуЗапретаИзменения = Истина;
ЭтотОбъект.Записать();
ЭтотОбъект.Прочитать();
ПропуститьПроверкуЗапретаИзменения = Ложь;
КонецЕсли;
ПланированиеКлиент.СпозиционироватьсяПоСтроке(ЭтаФорма, "ГруппаТовары", "Товары", "ТоварыПоПериодам");
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
РаботаСФайламиКлиент.ПриОткрытии(ЭтотОбъект, Отказ);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора.ИмяФормы = "Обработка.ПодборТоваровВДокументПродажи.Форма.Форма" Тогда
ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
Планирование.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, Ложь, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана,, "КоличествоПериодов");
ПриЧтенииСозданииНаСервере();
СохранитьНовыйПериодСервер();
УстановитьВидимость();
ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ПланПродаж.ФормаДокумента.Событие.ПередЗаписью");
ПараметрыЗаписи.Вставить("КэшированныеЗначения", КэшированныеЗначения);
Если ПередЗаписьюПовторныйВызов = Истина Тогда
ПередЗаписьюПовторныйВызов = Ложь;
Возврат;
Иначе
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ТекстВопроса = "";
Кнопки = Новый СписокЗначений;
ЕстьВопросКПользователю = Ложь;
СуммаЭтаповОплаты = 0;
Для Каждого ЭтапОплаты Из Объект.ПланОплаты Цикл
СуммаЭтаповОплаты = СуммаЭтаповОплаты + ЭтапОплаты.СуммаПлатежа;
КонецЦикла;
Если Объект.ЗаполнятьПланОплат Тогда
Если Объект.СуммаДокумента = 0 И Объект.ПланОплаты.Количество() > 0 Тогда
КоличествоЗапланированныхСтрок = Объект.Товары.НайтиСтроки(Новый Структура("Отменено", Ложь)).Количество();
ЕстьВопросКПользователю = Истина;
ДополнительныеПараметры.Вставить("ОчиститьПланОплат", Истина);
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='ОК'"));
Если НЕ Объект.Проведен Тогда
Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Отмена'"));
КонецЕсли;
Если КоличествоЗапланированныхСтрок = 0 И Объект.ПланОплаты.Количество() > 0 Тогда
ТекстВопроса = ?(Объект.Проведен,
НСтр("ru='В плане все строки отменены. Таблица плана оплаты будет очищена'"),
НСтр("ru='В плане все строки отменены. Очистить таблицу плана оплаты?'"));
Иначе
ТекстВопроса = ?(Объект.Проведен,
НСтр("ru='Сумма запланированных строк нулевая. Таблица плана оплаты будет очищена'"),
НСтр("ru='Сумма запланированных строк нулевая. Очистить таблицу плана оплаты?'"));
КонецЕсли;
ИначеЕсли Объект.СуммаДокумента <> СуммаЭтаповОплаты Тогда
ЕстьВопросКПользователю = Истина;
ГрафикСоглашенияЗаполнен = ЭтапыОплатыВызовСервера.ГрафикСоглашенияЗаполнен(Объект.Соглашение);
ГрафикЗаполнен = (ИспользоватьГрафикиОплаты И ЗначениеЗаполнено(Объект.ГрафикОплаты)) ИЛИ Объект.ЭтапыГрафикаОплаты.Количество() > 0;
Если Объект.ПланОплаты.Количество() = 0 Тогда
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Заполнить'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Не заполнять'"));
Если ГрафикСоглашенияЗаполнен Тогда
ТекстВопроса = НСтр("ru='Отсутствуют этапы плана оплаты.
|Заполнить этапы в соответствии с соглашением?'");
ИначеЕсли ГрафикЗаполнен Тогда
ТекстВопроса = НСтр("ru='Отсутствуют этапы плана оплаты.
|Заполнить этапы в соответствии с графиком?'");
Иначе
ТекстВопроса = НСтр("ru='Отсутствуют этапы плана оплаты.
|Заполнить этапы, добавив один этап ""%ВариантОплаты%"" на период с оплатой 100%?'");
ТекстВопроса = СтрЗаменить(ТекстВопроса, "%ВариантОплаты%", ПредопределенноеЗначение("Перечисление.ВариантыКонтроляОплатыКлиентом.ПредоплатаДоОтгрузки"));
КонецЕсли;
Иначе
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Перезаполнить'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Не заполнять'"));
Если ГрафикСоглашенияЗаполнен Тогда
ТекстВопроса = НСтр("ru='Сумма этапов плана оплаты не совпадает с суммой запланированных строк.
|Перезаполнить этапы в соответствии с соглашением?'");
ИначеЕсли ГрафикЗаполнен Тогда
ТекстВопроса = НСтр("ru='Сумма этапов плана оплаты не совпадает с суммой запланированных строк.
|Перезаполнить этапы в соответствии с графиком?'");
Иначе
ТекстВопроса = НСтр("ru='Сумма этапов плана оплаты не совпадает с суммой запланированных строк.
|Перезаполнить этапы, добавив один этап ""%ВариантОплаты%"" на период с оплатой 100%?'");
ТекстВопроса = СтрЗаменить(ТекстВопроса, "%ВариантОплаты%", ПредопределенноеЗначение("Перечисление.ВариантыКонтроляОплатыКлиентом.ПредоплатаДоОтгрузки"));
КонецЕсли;
КонецЕсли;
ДополнительныеПараметры.Вставить("ПерезаполнитьЭтапы", Истина);
ДополнительныеПараметры.Вставить("ГрафикСоглашенияЗаполнен", ГрафикСоглашенияЗаполнен);
ДополнительныеПараметры.Вставить("ГрафикЗаполнен", ГрафикЗаполнен);
ИначеЕсли Объект.Замещающий Тогда
ТекстПериод = ПроверитьСоответстивеГрафикаОплатИПериодовОтгрузкиПлана();
Если ЗначениеЗаполнено(ТекстПериод) Тогда
ЕстьВопросКПользователю = Истина;
ГрафикСоглашенияЗаполнен = ЭтапыОплатыВызовСервера.ГрафикСоглашенияЗаполнен(Объект.Соглашение);
ГрафикЗаполнен = (ИспользоватьГрафикиОплаты И ЗначениеЗаполнено(Объект.ГрафикОплаты)) ИЛИ Объект.ЭтапыГрафикаОплаты.Количество() > 0;
ДополнительныеПараметры.Вставить("ПерезаполнитьЭтапы", Истина);
ДополнительныеПараметры.Вставить("ГрафикСоглашенияЗаполнен", ГрафикСоглашенияЗаполнен);
ДополнительныеПараметры.Вставить("ГрафикЗаполнен", ГрафикЗаполнен);
ТекстВопроса = НСтр("ru='Сумма этапов плана оплаты не совпадает с суммой запланированных строк за периоды: %ТекстПериод%.
|Перезаполнить этапы в соответствии с графиком?'");
ТекстВопроса = СтрЗаменить(ТекстВопроса, "%ТекстПериод%", ТекстПериод);
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Перезаполнить'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Не заполнять'"));
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЕстьВопросКПользователю Тогда
Оповещение = Новый ОписаниеОповещения(
"ПередЗаписьюЗавершение",
ЭтотОбъект,
ДополнительныеПараметры);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
ПередЗаписьюПовторныйВызов = Истина;
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
СкопироватьИзКроссТаблицы(ПараметрыЗаписи["КэшированныеЗначения"], ТекущийОбъект);
Планирование.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
Если Объект.ЗаполнятьПоФормуле Тогда
ЗаписатьДополнительныеПараметры(ТекущийОбъект);
КонецЕсли;
Если ПропуститьПроверкуЗапретаИзменения Тогда
ТекущийОбъект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
КонецЕсли;
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
ЗаполнитьСлужебныеРеквизитыПланаОплаты();
Если Объект.ЗаполнятьПоФормуле Тогда
ПрочитатьДополнительныеПараметры(ТекущийОбъект);
КонецЕсли;
УстановитьВидимость();
МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект, ПараметрыЗаписи);
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланПродаж");
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "КопированиеСтрокВБуферОбмена" Тогда
УстановитьДоступностьКомандБуфераОбменаНаКлиенте();
ИначеЕсли ИмяСобытия = "РаботаСExcelКлиент_ЗагрузитьИзExcel"
И Параметр.УникальныйИдентификаторФормы = ЭтаФорма.УникальныйИдентификатор Тогда
ЗагрузитьИзExcelНаКлиентеПродолжение(Параметр.ДанныеЗагрузки);
КонецЕсли;
Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
РаботаСФайламиКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия);
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
МассивНепроверяемыхРеквизитов.Добавить("ТоварыПоПериодам");
Если Объект.КроссТаблица Тогда
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПредставлениеТаблицы",НСтр("ru='Товары'"));
СтруктураДействий.Вставить("ПутьКТаблице","ТоварыПоПериодам");
СтруктураДействий.Вставить("ЗаполнятьНоменклатуру");
Если Не Объект.ЗаполнятьПоДаннымСервиса Тогда
СтруктураДействий.Вставить("ЗаполнятьХарактеристикуВТЧ");
Если ЗаполнятьПартнераВТЧ Тогда
СтруктураДействий.Вставить("ЗаполнятьПартнераВТЧ",НСтр("ru='Клиент'"));
КонецЕсли;
Если ЗаполнятьСкладВТЧ Тогда
СтруктураДействий.Вставить("ЗаполнятьСкладВТЧ");
КонецЕсли;
КонецЕсли;
Если ЗаполнятьСоглашениеВТЧ Тогда
СтруктураДействий.Вставить("ЗаполнятьСоглашениеВТЧ");
КонецЕсли;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("Периоды", ЭтотОбъект["Периоды"].Выгрузить(Новый Структура("Активная", Истина)));
ПараметрыПроверки.Вставить("ПрефиксПоля", "Количество_");
ПараметрыПроверки.Вставить("ИмяПоля", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПроверкаКоличестваПоПериодам", ПараметрыПроверки);
СтруктураДействий.Вставить("ПоляГруппировки", "Номенклатура, Характеристика, Назначение, Упаковка, Склад, Партнер, Соглашение");
Планирование.ОбработкаПроверкиЗаполненияВФорме(ТоварыПоПериодам, СтруктураДействий, Отказ, ПроверяемыеРеквизиты, Объект.КроссТаблица);
КонецЕсли;
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты,МассивНепроверяемыхРеквизитов);
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_ПланПродаж", , Объект.Ссылка);
МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);
Если ОповещениеПослеЗаписи <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОповещениеПослеЗаписи, Истина);
ОповещениеПослеЗаписи = Неопределено;
КонецЕсли;
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
Если ЭтаФорма.Модифицированность Тогда
Если КонтрольЗамещенияПланаНаСервере(Объект.Ссылка) Тогда
ЭтотОбъект.Прочитать();
ЭтотОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура СценарийПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("СценарийПриИзмененииЗавершение", ЭтотОбъект);
ПланированиеКлиент.ПоказатьВопросПриИзмененииСценария(ЭтаФорма, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ВидПланаПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("ВидПланаПриИзмененииЗавершение", ЭтотОбъект);
ПланированиеКлиент.ПоказатьВопросПриИзмененииВидПлана(ЭтаФорма, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура НачалоПериодаПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ТоварыПоПериодам", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОкончаниеПериодаПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ТоварыПоПериодам", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПодразделениеПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПартнерПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура СоглашениеПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
Если Объект.ЗаполнятьПланОплат Тогда
СоглашениеПриИзмененииСервер();
Иначе
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НазначениеПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура СоглашениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ПараметрыВыбораСоглашения = ПродажиКлиент.ПараметрыНачалаВыбораСоглашенияСКлиентом();
ПараметрыВыбораСоглашения.Элемент = Элемент;
ПараметрыВыбораСоглашения.Партнер = Объект.Партнер;
ПараметрыВыбораСоглашения.Документ = Объект.Соглашение;
ПараметрыВыбораСоглашения.ДанныеФормыСтруктура = Объект;
ПродажиКлиент.НачалоВыбораСоглашенияСКлиентом(ПараметрыВыбораСоглашения, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура СкладПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ФорматМагазинаПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ДоговорПриИзменении(Элемент)
ДоговорПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
Если Не ЗначениеЗаполнено(Объект.Статус) Тогда
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыПланов.Отменен");
КонецЕсли;
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
Если ТекущаяСтраница.Имя = "ГруппаДополнительныеРеквизиты"
И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
СвойстваВыполнитьОтложеннуюИнициализацию();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
Если ТекущаяСтраница <> Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.ГруппаТовары ИЛИ НЕ Объект.КроссТаблица Тогда
ИтогоПоСтрокеКолонке = "";
КонецЕсли;
Если Объект.Замещающий
И (Объект.КроссТаблица И ТоварыПоПериодам.Количество() = 0
ИЛИ Не Объект.КроссТаблица И Объект.Товары.Количество() = 0)
И Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаТовары Тогда
ЗаполнитьДаннымиДляЗамещения();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары
&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
Объект.ЗаполненоАвтоматически = Ложь;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если НоваяСтрока Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПослеУдаления(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПланПродажПрисоединенныеФайлы") Тогда
ЗагрузитьИзExcelНаКлиенте(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
Если Не Объект.ЗаполнятьПоФормуле И Элементы.Товары.ВыделенныеСтроки.Количество() > 0 Тогда
ВГраница = Элементы.Товары.ВыделенныеСтроки.ВГраница();
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ВыделенныеСтроки[ВГраница]));
Иначе
Расшифровка = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект, ТекущаяСтрока);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыХарактеристикаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ХарактеристикаПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
Если ТекущаяСтрока.Количество > 0 Тогда
СтруктураДействий.Вставить("ПересчитатьЦенуЗаУпаковку", ТекущаяСтрока.Количество);
КонецЕсли;
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
ТекущаяСтрока.Расшифровка = Строка(ТекущаяСтрока.КоличествоУпаковок);
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущаяСтрока);
Если ТекущаяСтрока.Свойство("Отклонение") И ЗначениеЗаполнено(ТекущаяСтрока.Формула) Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(ТекущаяСтрока.Формула, ТекущаяСтрока, Неопределено, Неопределено);
ТекущаяСтрока.Отклонение = РезультатВычисления.Результат - ТекущаяСтрока.КоличествоУпаковок;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСуммаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ПересчитатьЦенуПоСумме");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСоглашениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ПараметрыВыбораСоглашения = ПродажиКлиент.ПараметрыНачалаВыбораСоглашенияСКлиентом();
ПараметрыВыбораСоглашения.Элемент = Элемент;
ПараметрыВыбораСоглашения.Партнер = ТекущиеДанные.Партнер;
ПараметрыВыбораСоглашения.Документ = ТекущиеДанные.Соглашение;
ПродажиКлиент.НачалоВыбораСоглашенияСКлиентом(ПараметрыВыбораСоглашения, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыОтмененоПриИзменении(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыДатаОтгрузкиПриИзменении(Элемент)
Если Объект.Замещающий
И Объект.Проведен
И ЗамещенныеПериоды.Количество() > 0 Тогда
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ДатаПоступленияНачалоПериода = ПланированиеКлиентСерверПовтИсп.РассчитатьДатуНачалаПериода(ТекущиеДанные.ДатаОтгрузки, Объект.Периодичность);
Отбор = Новый Структура("ЗамещенныйПериод", ДатаПоступленияНачалоПериода);
ЗамещенныйПериодСтроки = ЗамещенныеПериоды.НайтиСтроки(Отбор);
Если ЗамещенныйПериодСтроки.Количество() > 0 Тогда
ТекущиеДанные.Замещен = ЗамещенныйПериодСтроки[0].Замещен;
ТекущиеДанные.ЗамещенКЗаказу = ЗамещенныйПериодСтроки[0].ЗамещенКЗаказу;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТоварыПоПериодам
&НаКлиенте
Процедура ТоварыПоПериодамПриИзменении(Элемент)
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоПериодам");
Объект.ЗаполненоАвтоматически = Ложь;
ТоварыКоличествоСтрокДоИзменения = ТоварыКоличествоСтрок;
РассчитатьКоличествоСтрок(ЭтаФорма);
Если ТоварыКоличествоСтрок <> ТоварыКоличествоСтрокДоИзменения Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если НоваяСтрока Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамПриАктивизацииЯчейки(Элемент)
ПодключитьОбработчикОжидания("ТоварыПоПериодамПриАктивизацииЯчейкиНаКлиенте", 0.5, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПланПродажПрисоединенныеФайлы") Тогда
ЗагрузитьИзExcelНаКлиенте(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ТоварыПоПериодам.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "ТоварыПоПериодам"));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект, ТекущаяСтрока);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ТоварыПоПериодам.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПересчитыватьЦену = Объект.ПланироватьПоСумме И ТекущаяСтрока.Цена > 0;
Если ТекущаяСтрока.Количество > 0 И ПересчитыватьЦену Тогда
СтруктураДействий.Вставить("ПересчитатьЦенуЗаУпаковку", ТекущаяСтрока.Количество);
КонецЕсли;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
Если ПересчитыватьЦену Тогда
Для каждого СтрокаПериода Из ЭтаФорма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
ТекущаяСтрока["Цена_" + СтрокаПериода.ИмяКолонки] = ТекущаяСтрока.Цена;
КонецЦикла;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, ТекущаяСтрока);
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииКоличества(Элемент)
СтрокаТоваров = Элементы.ТоварыПоПериодам.ТекущиеДанные;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
Если Объект.ЗаполнятьПоФормуле Тогда
ПриИзмененииКоличестваОтклонение(СтрокаТоваров);
КонецЕсли;
Если НЕ Объект.ЗаполнятьПоФормуле Тогда
ТекущееИмяКолонки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Элемент.Имя, "ТоварыПоПериодам" + "Количество_")[1];
СтрокаТоваров["Расшифровка_" + ТекущееИмяКолонки] = Строка(СтрокаТоваров["Количество_" + ТекущееИмяКолонки]);
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(СтрокаТоваров, "Расшифровка_" + ТекущееИмяКолонки);
КонецЕсли;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокаТоваров, СтруктураДействий, КэшированныеЗначения);
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
ТоварыПоПериодамПриАктивизацииЯчейки(Элементы.ТоварыПоПериодам);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииЦены(Элемент)
СтрокаТоваров = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Цена = Неопределено;
Для каждого СтрокаПериода Из ЭтаФорма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
Если Цена = Неопределено Тогда
Цена = СтрокаТоваров["Цена_" + СтрокаПериода.ИмяКолонки];
ИначеЕсли Цена <> СтрокаТоваров["Цена_" + СтрокаПериода.ИмяКолонки] Тогда
Цена = 0;
Прервать;
КонецЕсли;
КонецЦикла;
СтрокаТоваров["Цена"] = Цена;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
ТоварыПоПериодамПриАктивизацииЯчейки(Элементы.ТоварыПоПериодам);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииСуммы(Элемент)
СтрокаТоваров = Элементы.ТоварыПоПериодам.ТекущиеДанные;
ИмяКолонки = СтрЗаменить(Элемент.Имя, "ТоварыПоПериодам" + "Сумма_", "");
Если СтрокаТоваров["Количество_" + ИмяКолонки] > 0 Тогда
СтрокаТоваров["Цена_" + ИмяКолонки] = СтрокаТоваров["Сумма_" + ИмяКолонки] / СтрокаТоваров["Количество_" + ИмяКолонки];
КонецЕсли;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
ТоварыПоПериодамПриАктивизацииЯчейки(Элементы.ТоварыПоПериодам);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамЦенаПриИзменении(Элемент)
СтрокаТоваров = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Для каждого СтрокаПериода Из ЭтаФорма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТоваров["Цена_" + СтрокаПериода.ИмяКолонки] = СтрокаТоваров["Цена"];
КонецЦикла;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамСоглашениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
ПараметрыВыбораСоглашения = ПродажиКлиент.ПараметрыНачалаВыбораСоглашенияСКлиентом();
ПараметрыВыбораСоглашения.Элемент = Элемент;
ПараметрыВыбораСоглашения.Партнер = ТекущиеДанные.Партнер;
ПараметрыВыбораСоглашения.Документ = ТекущиеДанные.Соглашение;
ПродажиКлиент.НачалоВыбораСоглашенияСКлиентом(ПараметрыВыбораСоглашения, СтандартнаяОбработка);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыПланОплаты
&НаКлиенте
Процедура НадписьОплатаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Попытка
ЗаблокироватьДанныеФормыДляРедактирования();
Исключение
ПоказатьПредупреждение(,КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Статус", Объект.Статус);
ПараметрыФормы.Вставить("Календарь", Объект.Календарь);
ХозяйственнаяОперация = ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(Объект.Соглашение, "ХозяйственнаяОперация");
Если НЕ ЗначениеЗаполнено(ХозяйственнаяОперация) Тогда
ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.РеализацияКлиенту");
КонецЕсли;
ПараметрыФормы.Вставить("ХозяйственнаяОперация", ХозяйственнаяОперация);
ПараметрыФормы.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыФормы.Вставить("АдресВоВременномХранилище", ПоместитьЭтапыГрафикаОплатыВоВременноеХранилищеНаСервере());
ПараметрыФормы.Вставить("ТолькоПросмотр", ЭтаФорма.ТолькоПросмотр);
Оповещение = Новый ОписаниеОповещения(
"НадписьОплатаНажатиеЗавершение",
ЭтотОбъект);
ОткрытьФорму("Документ.ПланПродаж.Форма.ФормаОплаты",
ПараметрыФормы,
ЭтаФорма,
,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
РассчитатьИтоговыеПоказателиПланаОплат(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыПослеУдаления(Элемент)
РассчитатьИтоговыеПоказателиПланаОплат(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыСуммаПлатежаПриИзменении(Элемент)
ЭтапОплаты = Элементы.ПланОплаты.ТекущиеДанные;
ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - ЭтапОплаты.СуммаПлатежа - ЭтапОплаты.СуммаПлатежей;
ЭтапОплаты.ПроцентПлатежа = ?(ЭтапОплаты.СуммаОтгрузок > 0, 100 * ЭтапОплаты.СуммаПлатежа / ЭтапОплаты.СуммаОтгрузок, 0);
ПересчитатьСуммыПланаОплатПоСтроке(ЭтапОплаты);
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыПроцентПлатежаПриИзменении(Элемент)
ЭтапОплаты = Элементы.ПланОплаты.ТекущиеДанные;
ЭтапОплаты.СуммаПлатежа = ЭтапОплаты.СуммаОтгрузок * ЭтапОплаты.ПроцентПлатежа / 100;
ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - ЭтапОплаты.СуммаПлатежа - ЭтапОплаты.СуммаПлатежей;
ПересчитатьСуммыПланаОплатПоСтроке(ЭтапОплаты);
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыДатаПлатежаПриИзменении(Элемент)
Объект.ПланОплаты.Сортировать("ДатаПлатежа");
Если Объект.ПланОплаты.Количество() > 0 Тогда
ОбовитьСуммыПланаОплат();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьЭтапыГрафикаОплаты(Команда)
СуммаОплатыПоЭтапам = Объект.ПланОплаты.Итог("СуммаПлатежа");
ГрафикСоглашенияЗаполнен = ЭтапыОплатыВызовСервера.ГрафикСоглашенияЗаполнен(Объект.Соглашение);
ГрафикЗаполнен = (ИспользоватьГрафикиОплаты И ЗначениеЗаполнено(Объект.ГрафикОплаты))
ИЛИ Объект.ЭтапыГрафикаОплаты.Количество() > 0;
Если Объект.СуммаДокумента = 0 Тогда
Если Объект.ПланОплаты.Количество() = 0 Тогда
ПоказатьПредупреждение(,НСтр("ru='Сумма запланированных строк нулевая. Заполнение плана оплаты не требуется.'"));
Возврат;
КонецЕсли;
Объект.ПланОплаты.Очистить();
ПоказатьОповещениеПользователя(
НСтр("ru = 'Этапы оплаты очищены'"),
,
НСтр("ru = 'Сумма запланированных строк нулевая. Таблица этапов оплаты очищена'"),
БиблиотекаКартинок.Информация32);
Возврат;
КонецЕсли;
ВариантыОтветов = Новый СписокЗначений;
ВариантыОтветов.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Перезаполнить таблицу'"));
ВариантыОтветов.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Отменить'"));
ЕстьВопросКПользователю = Истина;
ТекстВопроса = "";
ПерезаполнитьЭтапы = Ложь;
Если Объект.СуммаДокумента = СуммаОплатыПоЭтапам Тогда
ТекстВопроса = НСтр("ru='Сумма запланированных строк совпадает с суммой этапов оплаты'") + Символы.ПС +
НСтр("ru='Перезаполнить этапы оплаты %ИсточникЗаполнения%?'");
ИначеЕсли Объект.ПланОплаты.Количество() > 0 Тогда
ТекстВопроса = НСтр("ru='Таблица этапов оплаты заполнена'")+ Символы.ПС +
НСтр("ru='Перезаполнить этапы оплаты %ИсточникЗаполнения%?'");
Иначе
ПерезаполнитьЭтапы = Истина;
ЕстьВопросКПользователю = Ложь;
КонецЕсли;
Если ЕстьВопросКПользователю Тогда
Если ГрафикЗаполнен Тогда
ТекстВопроса = СтрЗаменить(ТекстВопроса, "%ИсточникЗаполнения%", НСтр("ru='по графику'"));
ИначеЕсли ГрафикСоглашенияЗаполнен Тогда
ТекстВопроса = СтрЗаменить(ТекстВопроса, "%ИсточникЗаполнения%", НСтр("ru='по соглашению'"));
Иначе
ТекстВопроса = СтрЗаменить(ТекстВопроса, "%ИсточникЗаполнения%", НСтр("ru='по умолчанию'"));
КонецЕсли;
ДополнительныеПараметры = Новый Структура(
"ПерезаполнитьЭтапы, ГрафикСоглашенияЗаполнен, ГрафикЗаполнен",
ПерезаполнитьЭтапы,
ГрафикСоглашенияЗаполнен,
ГрафикЗаполнен);
Оповещение = Новый ОписаниеОповещения(
"ЗаполнитьЭтапыГрафикаОплатыЗавершение",
ЭтотОбъект,
ДополнительныеПараметры);
ПоказатьВопрос(Оповещение,ТекстВопроса, ВариантыОтветов);
ИначеЕсли ПерезаполнитьЭтапы Тогда
ЗаполнитьПланОплаты(ГрафикСоглашенияЗаполнен, ГрафикЗаполнен);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыДатаОтгрузкиПриИзменении(Элемент)
Если Объект.Замещающий
И Объект.Проведен
И ЗамещенныеПериоды.Количество() > 0 Тогда
ТекущиеДанные = Элементы.ПланОплаты.ТекущиеДанные;
ДатаПоступленияНачалоПериода = ПланированиеКлиентСерверПовтИсп.РассчитатьДатуНачалаПериода(ТекущиеДанные.ДатаОтгрузки, Объект.Периодичность);
Отбор = Новый Структура("ЗамещенныйПериод, Замещен", ДатаПоступленияНачалоПериода, Истина);
ТекущиеДанные.Замещен = ЗамещенныеПериоды.НайтиСтроки(Отбор).Количество() > 0;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбовитьСуммыПланаОплат()
ПланОплаты =Объект.ПланОплаты.Выгрузить();
Если Объект.КроссТаблица Тогда
ПланОплаты.Свернуть("ВариантОплаты, ДатаПлатежа, ДатаОтгрузки, Замещен","СуммаПлатежа, СуммаЗадолженности, СуммаОтгрузок");
ПланОплаты.Колонки.Добавить("ПроцентПлатежа");
ПланОплаты.Колонки.Добавить("СуммаПлатежей");
ПланОплаты.Сортировать("ДатаПлатежа");
СуммаПлатежей = 0;
Для каждого ЭтапОплаты Из ПланОплаты Цикл
ЭтапОплаты.СуммаОтгрузок = 0;
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Если НЕ Период.Активная ИЛИ Период.НомерКолонки = 0 ИЛИ ЭтапОплаты.ДатаПлатежа < Период.ДатаНачала Тогда
Продолжить;
КонецЕсли;
ЭтапОплаты.СуммаОтгрузок = ЭтапОплаты.СуммаОтгрузок + ЭтаФорма["ТоварыПоПериодам" + "Сумма_"+Период.ИмяКолонки];
КонецЦикла;
ЭтапОплаты.СуммаПлатежей = СуммаПлатежей;
СуммаПлатежей = СуммаПлатежей + ЭтапОплаты.СуммаПлатежа;
ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - СуммаПлатежей;
ЭтапОплаты.ПроцентПлатежа = ?(ЭтапОплаты.СуммаОтгрузок > 0, 100 * ЭтапОплаты.СуммаПлатежа / ЭтапОплаты.СуммаОтгрузок, 0);
КонецЦикла;
Иначе
СуммыПоДатам = Объект.Товары.Выгрузить(Новый Структура("Отменено", Ложь), "ДатаОтгрузки, Замещен, Сумма");
СуммыПоДатам.Свернуть("ДатаОтгрузки, Замещен", "Сумма");
СуммыПоДатам.Сортировать("ДатаОтгрузки");
ПланОплаты.Свернуть("ВариантОплаты, ДатаПлатежа, ДатаОтгрузки, Замещен","СуммаПлатежа, СуммаЗадолженности, СуммаОтгрузок");
ПланОплаты.Колонки.Добавить("ПроцентПлатежа");
ПланОплаты.Колонки.Добавить("СуммаПлатежей");
ПланОплаты.Сортировать("ДатаПлатежа");
СуммаПлатежей = 0;
Для каждого ЭтапОплаты Из ПланОплаты Цикл
ЭтапОплаты.СуммаОтгрузок = 0;
Для каждого СуммаНаДату Из СуммыПоДатам Цикл
Если ЭтапОплаты.ДатаПлатежа < СуммаНаДату.ДатаОтгрузки Тогда
Продолжить;
КонецЕсли;
ЭтапОплаты.СуммаОтгрузок = ЭтапОплаты.СуммаОтгрузок + СуммаНаДату.Сумма;
КонецЦикла;
ЭтапОплаты.СуммаПлатежей = СуммаПлатежей;
СуммаПлатежей = СуммаПлатежей + ЭтапОплаты.СуммаПлатежа;
ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - СуммаПлатежей;
ЭтапОплаты.ПроцентПлатежа = ?(ЭтапОплаты.СуммаОтгрузок > 0, 100 * ЭтапОплаты.СуммаПлатежа / ЭтапОплаты.СуммаОтгрузок, 0);
КонецЦикла;
КонецЕсли;
Объект.ПланОплаты.Загрузить(ПланОплаты);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПроверкаПеретаскивания(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПеретаскивание(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраНажатие(Элемент, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраНажатие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПодобратьТовары(Команда)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ПланПродаж.ФормаДокумента.Команда.ПодобратьТовары");
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Отказ = Ложь;
Если Объект.ПланироватьПоСумме
И ИспользоватьСоглашенияСКлиентами
И ЗаполнятьСоглашение
И (Не ЗначениеЗаполнено(Объект.Соглашение)
Или Не ЗначениеЗаполнено(Объект.Валюта)) Тогда
ОчиститьСообщения();
Если ИспользоватьСоглашенияСКлиентами И Не ЗначениеЗаполнено(Объект.Соглашение) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Поле ""Соглашение"" не заполнено'"), Объект.Ссылка, "Объект.Соглашение",,Отказ);
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.Валюта) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Поле ""Валюта"" не заполнено'"), Объект.Ссылка, "Объект.Валюта",,Отказ);
КонецЕсли;
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
Если Объект.ПланироватьПоСумме И ЗаполнятьСоглашение Тогда
ПараметрыФормы.Вставить("Соглашение", Объект.Соглашение);
ПараметрыФормы.Вставить("Валюта", Объект.Валюта);
ПараметрыФормы.Вставить("ЦенаВключаетНДС", ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(Объект.Соглашение, "ЦенаВключаетНДС"));
Иначе
ПараметрыФормы.Вставить("РежимПодбораБезСуммовыхПараметров", Истина);
ПараметрыФормы.Вставить("СкрыватьКолонкуВидЦены", Истина);
ПараметрыФормы.Вставить("СкрыватьКомандуЦеныНоменклатуры", Истина);
КонецЕсли;
Если ЗаполнятьСклад Тогда
ПараметрыФормы.Вставить("Склад", Объект.Склад);
КонецЕсли;
Если ЗаполнятьСкладВТЧ Тогда
ПараметрыФормы.Вставить("РежимПодбораИспользоватьСкладыВТабличнойЧасти", Истина);
ПараметрыФормы.Вставить("ОстаткиПоВсемСкладам", Истина);
КонецЕсли;
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Подбор товаров'"));
ПараметрыФормы.Вставить("Дата", Объект.Дата);
ПараметрыФормы.Вставить("Документ", Объект.Ссылка);
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
ПараметрыФормы.Вставить("СкрыватьРучныеСкидки", Истина);
ОткрытьФорму("Обработка.ПодборТоваровВДокументПродажи.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьИЗаполнитьПоПравилуЗаполнения(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбновитьДополнить", Объект.ОбновитьДополнить);
ПараметрыФормы.Вставить("АдресПравилаЗаполнения", АдресПравилаЗаполнения);
ПараметрыФормы.Вставить("ИзменитьРезультатНа", Объект.ИзменитьРезультатНа);
ПараметрыФормы.Вставить("ТочностьОкругления", Объект.ТочностьОкругления);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("ПланироватьПоСумме", Объект.ПланироватьПоСумме);
ПараметрыФормы.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыФормы.Вставить("АдресПользовательскихНастроек", АдресПользовательскихНастроек);
Если НЕ Объект.КроссТаблица Тогда
ПараметрыФормы.Вставить("РаспределитьПоРабочимДням", Объект.РаспределитьПоРабочимДням);
КонецЕсли;
ПараметрыФормы.Вставить("ТолькоПросмотр", ЭтаФорма.ТолькоПросмотр);
ПараметрыФормы.Вставить("КоличествоПериодов", КоличествоПериодов);
ПараметрыФормы.Вставить("Отбор", ПланированиеКлиентСервер.ОтборДляВыборки(ПараметрыОтбора(ЭтотОбъект), ПараметрыВидаПлана(ЭтотОбъект)));
ПараметрыФормы.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
Оповещение = Новый ОписаниеОповещения("НастроитьИЗаполнитьПоПравилуЗаполненияЗавершение", ЭтотОбъект);
ОткрытьФорму("Справочник.ИсточникиДанныхПланирования.Форма.ФормаЗаполнения",
ПараметрыФормы,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоПравилуЗаполнения(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполнятьПоПравилу", Истина);
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДаннымиДляЗамещения()
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполнитьДляЗамещения");
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиДокумент(Команда)
ОбщегоНазначенияУТКлиент.Провести(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтроку(Команда)
ТаблицаФормы = Элементы.Товары;
ДанныеТаблицы = Объект.Товары;
Оповещение = Новый ОписаниеОповещения("РазбитьСтрокуЗавершение", ЭтотОбъект);
РаботаСТабличнымиЧастямиКлиент.РазбитьСтроку(ДанныеТаблицы, ТаблицаФормы, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтрокуЗавершение(НоваяСтрока, ДополнительныеПараметры) Экспорт
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если НоваяСтрока <> Неопределено Тогда
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, КэшированныеЗначения);
ТекущаяСтрока.Расшифровка = "";
НоваяСтрока.Расшифровка = "";
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВставитьСтроки(Команда)
Если Объект.КроссТаблица Тогда
ОписаниеОповещение = Новый ОписаниеОповещения("ПереключитьПериодыВСтрокиЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Копирование и вставка строк возможны в режиме ""Периоды в строках"". Переключить режим?'"),
РежимДиалогаВопрос.ДаНет);
Возврат;
Иначе
КоличествоТоваровДоВставки = Объект.Товары.Количество();
ПолучитьСтрокиИзБуфераОбмена();
КоличествоВставленных = Объект.Товары.Количество()-КоличествоТоваровДоВставки;
РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОВставкеСтрок(КоличествоВставленных);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьСтроки(Команда)
Если Объект.КроссТаблица Тогда
ОписаниеОповещение = Новый ОписаниеОповещения("ПереключитьПериодыВСтрокиЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Копирование и вставка строк возможны в режиме ""Периоды в строках"". Переключить режим?'"),
РежимДиалогаВопрос.ДаНет);
Возврат;
Иначе
ТаблицаФормы = Элементы.Товары;
КонецЕсли;
Если РаботаСТабличнымиЧастямиКлиент.ВыбранаСтрокаДляВыполненияКоманды(ТаблицаФормы) Тогда
СкопироватьСтрокиНаСервере();
РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОКопированииСтрок(ТаблицаФормы.ВыделенныеСтроки.Количество());
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИнтервал(Команда)
Оповещение = Новый ОписаниеОповещения(
"УстановитьИнтервалЗавершение",
ЭтотОбъект);
ОбщегоНазначенияУТКлиент.РедактироватьПериод(
Объект,
Новый Структура("ДатаНачала, ДатаОкончания", "НачалоПериода", "ОкончаниеПериода"),
Оповещение);
КонецПроцедуры
#Область ЗагрузкаДанныхИзФайла
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
ДополнительныеПараметры = ПланированиеКлиент.ДополнительныеПараметрыЗагрузкиИзФайла();
ДополнительныеПараметры.ТипПлана = "ПланПродаж";
ДополнительныеПараметры.ИспользуютсяНазначения = ЗаполнятьНазначениеВТЧ;
ДополнительныеПараметры.ИспользуютсяПартнеры = ЗаполнятьПартнераВТЧ;
ДополнительныеПараметры.ИспользуютсяСклады = ЗаполнятьСкладВТЧ;
ДополнительныеПараметры.ИспользуютсяСоглашения = ЗаполнятьСоглашениеВТЧ;
ДополнительныеПараметры.ПланироватьПоСумме = Объект.ПланироватьПоСумме;
Если Объект.КроссТаблица Тогда
ДополнительныеПараметры.КроссТаблица = Истина;
ДополнительныеПараметры.Периоды = ЭтотОбъект["Периоды"];
КонецЕсли;
ПоказатьФормуЗагрузкиИзФайла(ДополнительныеПараметры);
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
РаботаСExcelКлиент.ВыгрузитьВExcel(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
РаботаСExcelКлиент.ВыбратьПрисоединенныйФайлExcel(ЭтаФорма, ?(Объект.КроссТаблица, "ТоварыПоПериодам", "Товары"));
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВКолонки(Команда)
Если НЕ Объект.КроссТаблица Тогда
Отказ = Ложь;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("ИмяТЧ", "Товары");
ПараметрыПроверки.Вставить("ПредставлениеТЧ", НСтр("ru='Товары'"));
ПараметрыПроверки.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПроверки.Вставить("ДатаНачала", Объект.НачалоПериода);
ПараметрыПроверки.Вставить("ДатаОкончания", Объект.ОкончаниеПериода);
ПараметрыПроверки.Вставить("ИмяПоляДатыПериода", "ДатаОтгрузки");
ПараметрыПроверки.Вставить("ПредставлениеДатыПериода", НСтр("ru='Дата отгрузки'"));
ПараметрыПроверки.Вставить("ПрефиксПутиКТЧ", "Объект.");
ПланированиеКлиентСервер.ПроверитьДатуПериодаТЧ(Объект, Отказ, ПараметрыПроверки);
Если Отказ Тогда
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Удалить строки'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Отменить'"));
ТекстВопроса = НСтр("ru='В строках списка ""Товары"" указаны даты за границами планирования - строки будут удалены. Удалить строки?'");
Оповещение = Новый ОписаниеОповещения("ПереключитьПериодыВКолонкиЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
Возврат;
КонецЕсли;
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВСтроки(Команда)
ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения)
Если Объект.КроссТаблица Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
Объект.КроссТаблица = Ложь;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтбору(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ДобавитьТоварыПоОтборуНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Если ЗапретитьРедактированиеФормулы Тогда
НастроитьФормулуИЗаполнить(СтруктураНастроек, Неопределено);
Возврат;
КонецЕсли;
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланПродаж");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ТипПлана", ТипПлана);
ПараметрыФормы.Вставить("НачалоПериодаПлан", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериодаПлан", Объект.ОкончаниеПериода);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("ЗаполнятьПартнера", ЗаполнятьПартнера);
ПараметрыФормы.Вставить("ЗаполнятьСоглашение", ЗаполнятьСоглашение);
ПараметрыФормы.Вставить("АдресХранилищаДереваОператоров", АдресХранилищаДереваОператоров);
ПараметрыФормы.Вставить("ДополнительныеПоля", ДополнительныеПоля);
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
ПараметрыФормы.Вставить("Владелец", Объект.Ссылка);
ПараметрыФормы.Вставить("Отбор", ОтборПоказатели);
ПараметрыФормы.Вставить("ПланироватьПоСумме", Объект.ПланироватьПоСумме);
Оповещение = Новый ОписаниеОповещения("НастроитьФормулуИЗаполнить",ЭтотОбъект);
ОткрытьФорму("Справочник.ВидыПланов.Форма.ФормаНастроек",
Новый Структура("СтруктураНастроек",ПараметрыФормы),
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
ОбщегоНазначенияУТКлиент.Записать(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоказатели(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("НачалоПериодаПлан", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериодаПлан", Объект.ОкончаниеПериода);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
ПараметрыФормы.Вставить("Владелец", Объект.Ссылка);
Если СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыеНачальныеОстатки")<>0
Или СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыеКонечныеОстатки")<>0
Или СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыйКонечныйДефицит")<>0 Тогда
НастроитьСмещениеИЗаполнить(ПараметрыФормы.СтруктураНастроек, Неопределено);
Иначе
Оповещение = Новый ОписаниеОповещения("НастроитьСмещениеИЗаполнить", ЭтотОбъект);
ОткрытьФорму("Справочник.ВидыПланов.Форма.ФормаНастроекСмещения",
Новый Структура("СтруктураНастроек",ПараметрыФормы),
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьЦены(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
Оповещение = Новый ОписаниеОповещения("НастроитьЦеныИЗаполнить", ЭтотОбъект);
ОткрытьФорму("Документ.ПланПродаж.Форма.ФормаНастроекЦен",
Новый Структура("СтруктураНастроек",ПараметрыФормы),
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьНаПроцент(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ИзменитьНаПроцентЗавершение", ЭтотОбъект);
ПланированиеКлиент.ИзменитьФормулуНаПроцент(
ЭтаФорма,
?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары),
?(Объект.КроссТаблица, "ТоварыПоПериодам", "Товары"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОкруглитьКоличество(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ОкруглитьКоличествоЗавершение", ЭтотОбъект);
ПланированиеКлиент.ОкруглитьФормулу(
ЭтаФорма,
?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары),
?(Объект.КроссТаблица, "ТоварыПоПериодам", "Товары"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьПроизвольнуюФормулу(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
Для каждого Период Из АктивныеПериоды Цикл
ДополнительныеПараметры = Новый Структура("ИмяКолонки",Период.ИмяКолонки);
Если Объект.КроссТаблица И АктивныеПериоды.Количество() > 1 Тогда
Если Элементы.ТоварыПоПериодам.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущийЭлементИмя = Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя;
Если СтрНайти(ТекущийЭлементИмя, "ТоварыПоПериодам" + "Количество_") = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Активируйте колонку с периодом'"));
Возврат;
КонецЕсли;
Если ТекущийЭлементИмя = "ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки Тогда
ТекстВопроса = НСтр("ru='Установить формулу для всех периодов?'");
СписокКнопок = Новый СписокЗначений;
СписокКнопок.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Да, для всех'"));
СписокКнопок.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Только'") + " " + Период.Заголовок);
СписокКнопок.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Отмена'"));
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВопросаЗадатьПроизвольнуюФормулу", ЭтотОбъект, ДополнительныеПараметры);
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, СписокКнопок);
КонецЕсли;
Иначе
Если (Объект.КроссТаблица И Элементы.ТоварыПоПериодам.ТекущиеДанные = Неопределено)
ИЛИ (Не Объект.КроссТаблица И Элементы.Товары.ТекущиеДанные = Неопределено) Тогда
Возврат;
КонецЕсли;
ПослеВопросаЗадатьПроизвольнуюФормулу(КодВозвратаДиалога.Нет, ДополнительныеПараметры);
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьПустыеСтроки(Команда)
УдалитьПустыеСтрокиНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьСкладПоЗначению(Команда)
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ТоварыПоПериодам.ВыделенныеСтроки,Элементы.Товары.ВыделенныеСтроки);
ТаблицаТовары = ?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары);
Если СкладыКлиент.ПроверитьВозможностьЗаполненияСкладовВТабличнойЧасти(Объект, ТаблицаТовары, НСтр("ru='Товары'"), ВыделенныеСтроки) Тогда
СтруктураОтбора = Новый Структура("ЭтоГруппа", Ложь);
СтруктураПараметров = Новый Структура("Отбор, ВыборГруппИЭлементов", СтруктураОтбора, ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму(
"Справочник.Склады.ФормаВыбора",
СтруктураПараметров,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Новый ОписаниеОповещения("ЗаполнитьПоЗначениюЗавершение",
ПланированиеКлиент,
Новый Структура("ВыделенныеСтроки, ТаблицаТовары, Колонка", ВыделенныеСтроки, ТаблицаТовары, "Склад")),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьКлиентаПоЗначению(Команда)
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ТоварыПоПериодам.ВыделенныеСтроки,Элементы.Товары.ВыделенныеСтроки);
ТаблицаТовары = ?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары);
СтруктураОтбора = Новый Структура("ЭтоГруппа, Клиент", Ложь, Истина);
СтруктураПараметров = Новый Структура("Отбор, ВыборГруппИЭлементов", СтруктураОтбора, ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму(
"Справочник.Партнеры.ФормаВыбора",
СтруктураПараметров,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Новый ОписаниеОповещения("ЗаполнитьПоЗначениюЗавершение",
ПланированиеКлиент,
Новый Структура("ВыделенныеСтроки, ТаблицаТовары, Колонка", ВыделенныеСтроки, ТаблицаТовары, "Партнер")),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьНазначениеПоЗначению(Команда)
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ТоварыПоПериодам.ВыделенныеСтроки,Элементы.Товары.ВыделенныеСтроки);
ТаблицаТовары = ?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары);
СтруктураОтбора = Новый Структура("ЭтоГруппа", Ложь);
СтруктураПараметров = Новый Структура("Отбор, ВыборГруппИЭлементов", СтруктураОтбора, ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму(
"Справочник.Назначения.ФормаВыбора",
СтруктураПараметров,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Новый ОписаниеОповещения("ЗаполнитьПоЗначениюЗавершение",
ПланированиеКлиент,
Новый Структура("ВыделенныеСтроки, ТаблицаТовары, Колонка", ВыделенныеСтроки, ТаблицаТовары, "Назначение")),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма);
ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ТоварыПоПериодамНоменклатураЕдиницаИзмерения";
ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "ТоварыПоПериодам.Упаковка";
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма, ПараметрыУсловногоОформления);
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма);
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма,
"ТоварыПоПериодамХарактеристика",
"ТоварыПоПериодам.ХарактеристикиИспользуются");
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,
"ТоварыПоПериодамНазначение",
"ТоварыПоПериодам.ТипНоменклатуры",
Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,,Ложь);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Товары.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Отменено");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Товары.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Замещен");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПланОплаты.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПланОплаты.Замещен");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоПериодамЦена.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Цена");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = 0;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Лево);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<периодическая>'"));
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСклад.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.Товар);
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненноеПолеТаблицы);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<для товаров>'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСклад.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.Товар);
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоПериодамСклад.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.Товар);
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненноеПолеТаблицы);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<для товаров>'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоПериодамСклад.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.Товар);
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПланОплатыСуммаПлатежа.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПланОплаты.СуммаПлатежаЗаполненаНеВерно");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОтметкаОтрицательногоВыполненияЗадачи);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПланОплатыСуммаПлатежа.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПланОплаты.НомерСтроки");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("НомерСтрокиПолнойОплаты");
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НомерСтрокиПолнойОплаты");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = 0;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОтметкаПоложительногоВыполненияЗадачи);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПланОплатыСуммаЗадолженности.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПланОплаты.СуммаЗадолженности");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ДопустимаяСуммаЗадолженности");
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОграничиватьСуммуЗадолженности");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОтметкаОтрицательногоВыполненияЗадачи);
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформлениеКроссТаблицы()
Если НЕ Объект.КроссТаблица Тогда
Возврат;
КонецЕсли;
ТекущийШрифт = Элементы.ТоварыПоПериодам.Шрифт;
ЗачеркнутыйШрифт = Новый Шрифт(ТекущийШрифт,,,,,,Истина);
АктивныеПериоды = ЭтотОбъект["Периоды"].НайтиСтроки(Новый Структура("Активная", Истина));
ЭтоОдинПериод = АктивныеПериоды.Количество() = 1;
Для каждого Период Из АктивныеПериоды Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки);
Если Объект.ПланироватьПоСумме Тогда
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам" + "Цена_"+Период.ИмяКолонки);
Если ЭтоОдинПериод Тогда
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам" + "Сумма_"+Период.ИмяКолонки);
КонецЕсли;
КонецЕсли;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Отменено_"+ Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ЗачеркнутыйШрифт);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки);
Если Объект.ПланироватьПоСумме Тогда
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам" + "Цена_"+Период.ИмяКолонки);
Если ЭтоОдинПериод Тогда
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам" + "Сумма_"+Период.ИмяКолонки);
КонецЕсли;
КонецЕсли;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Замещен_"+ Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИнтервалЗавершение(Период, ДополнительныеПараметры) Экспорт
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ТоварыПоПериодам", Оповещение);
КонецПроцедуры
&НаСервере
Процедура СохранитьНовыйПериодСервер()
ПланированиеКлиентСервер.СохранитьЗначенияПроверяемыхРеквизитов(Объект, ЭтаФорма, "РеквизитыДоИзменения");
НадписьПериодичностьВалюта = НСтр("ru = 'Периодичность: %Периодичность%'");
Если Объект.ПланироватьПоСумме Тогда
НадписьПериодичностьВалюта = НСтр("ru = 'Периодичность: %Периодичность%, валюта: %Валюта%'");
КонецЕсли;
НадписьПериодичностьВалюта = СтрЗаменить(НадписьПериодичностьВалюта,"%Периодичность%",Строка(Объект.Периодичность));
НадписьПериодичностьВалюта = СтрЗаменить(НадписьПериодичностьВалюта,"%Валюта%",Строка(Объект.Валюта));
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ПриИзмененииКоличестваСуммыСтроки(Объект, Форма, СтрокаТоваров)
Количество = 0;
Сумма = 0;
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная ИЛИ СтрокаТоваров["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
Количество = Количество + СтрокаТоваров["Количество_" + СтрокаПериода.ИмяКолонки];
Если Объект.ПланироватьПоСумме Тогда
СтрокаТоваров["Сумма_" + СтрокаПериода.ИмяКолонки] = СтрокаТоваров["Количество_" + СтрокаПериода.ИмяКолонки] * СтрокаТоваров["Цена_" + СтрокаПериода.ИмяКолонки];
Иначе
СтрокаТоваров["Сумма_" + СтрокаПериода.ИмяКолонки] = 0;
КонецЕсли;
Сумма = Сумма + СтрокаТоваров["Сумма_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
СтрокаТоваров.КоличествоУпаковок = Количество;
СтрокаТоваров.Сумма = Сумма;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоговыеПоказатели(Форма, РассчитыватьСтроки = Истина, ЗаполнятьПустыеЦены = Неопределено)
Объект = Форма.Объект;
Если ЗаполнятьПустыеЦены = Неопределено Тогда
ЗаполнятьПустыеЦены = РассчитыватьСтроки;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
Объект.СуммаДокумента = 0;
Если Объект.ПланироватьПоСумме Тогда
НайденныеСтроки = Объект.Товары.НайтиСтроки(Новый Структура("Отменено", Ложь));
Для каждого СтрокаТЧ Из НайденныеСтроки Цикл
Объект.СуммаДокумента = Объект.СуммаДокумента + СтрокаТЧ.Сумма;
КонецЦикла;
КонецЕсли;
Возврат;
КонецЕсли;
Товары = Форма.ТоварыПоПериодам;
Форма["КоличествоУпаковок"] = 0;
Объект.СуммаДокумента = 0;
ПрефиксКолонкиКоличество = "ТоварыПоПериодам" + "Количество_";
ПрефиксКолонкиСумма = "ТоварыПоПериодам" + "Сумма_";
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] = 0;
Форма[ПрефиксКолонкиСумма + СтрокаПериода.ИмяКолонки] = 0;
КонецЦикла;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
КэшированныеЗначения = Неопределено;
Для каждого СтрокаТЧ Из Товары Цикл
Если РассчитыватьСтроки Тогда
СтрокаТЧ.КоличествоУпаковок = 0;
СтрокаТЧ.Сумма = 0;
Цена = Неопределено;
КонецЕсли;
КолонкиЦенДляОбновления = Новый Массив;
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ["Замещен_"+ СтрокаПериода.ИмяКолонки] = СтрокаПериода.Замещен;
СтрокаТЧ["ЗамещенКЗаказу_"+ СтрокаПериода.ИмяКолонки] = СтрокаПериода.ЗамещенКЗаказу;
Если РассчитыватьСтроки Тогда
Если Цена = Неопределено
И СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки] <> 0 Тогда
Цена = СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки];
ИначеЕсли Цена <> СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки] И СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки] <> 0 Тогда
Цена = 0;
ИначеЕсли ЗаполнятьПустыеЦены
И Цена <> СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки]
И СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки] = 0
И СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки] = 0 Тогда
КолонкиЦенДляОбновления.Добавить(СтрокаПериода.ИмяКолонки);
КонецЕсли;
Если СтрокаТЧ["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
СтрокаТЧ["Сумма_" + СтрокаПериода.ИмяКолонки] = СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки] *
СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки];
СтрокаТЧ.Сумма = СтрокаТЧ.Сумма + СтрокаТЧ["Сумма_" + СтрокаПериода.ИмяКолонки];
КонецЕсли;
Если СтрокаТЧ["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] = Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
Форма[ПрефиксКолонкиСумма + СтрокаПериода.ИмяКолонки] = Форма[ПрефиксКолонкиСумма + СтрокаПериода.ИмяКолонки] + СтрокаТЧ["Сумма_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
Форма["КоличествоУпаковок"] = Форма["КоличествоУпаковок"] + СтрокаТЧ["КоличествоУпаковок"];
Объект.СуммаДокумента = Объект.СуммаДокумента + СтрокаТЧ["Сумма"];
Если РассчитыватьСтроки Тогда
СтрокаТЧ["Цена"] = Цена;
Если Цена <> Неопределено И Цена > 0 Тогда
Для каждого КолонкаЦеныДляОбновления Из КолонкиЦенДляОбновления Цикл
СтрокаТЧ["Цена_" + КолонкаЦеныДляОбновления] = Цена;
КонецЦикла;
КонецЕсли;
#Если Клиент Или ТолстыйКлиентУправляемоеПриложение Тогда
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокаТЧ, СтруктураДействий,КэшированныеЗначения);
#КонецЕсли
КонецЕсли;
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(Форма, СтрокаТЧ);
КонецЦикла;
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Если РассчитыватьСтроки Тогда
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Товары, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
ИспользоватьСоглашенияСКлиентами = ПолучитьФункциональнуюОпцию("ИспользоватьСоглашенияСКлиентами");
Если Объект.ЗаполнятьПоФормуле Тогда
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
Иначе
ИнициализироватьСтруктуруНастроек(РеквизитФормыВЗначение("Объект"));
КонецЕсли;
ПланированиеПоНазначениям = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Сценарий,"ПланированиеПоНазначениям");
ПриИзмененииПериодовНаСервере();
СкопироватьВКроссТаблицу(Неопределено);
УстановитьПометкуКроссТаблицы(ЭтаФорма);
ЗаполнитьСлужебныеРеквизитыПланаОплаты();
ДоговорПриИзмененииНаСервере();
НадписьОплата = НадписьОплата(Объект.Календарь, Объект.ЭтапыГрафикаОплаты.Количество());
ИспользоватьГрафикиОплаты = ПолучитьФункциональнуюОпцию("ИспользоватьГрафикиОплаты");
ГрафикСоглашенияЗаполнен = ЭтапыОплатыВызовСервера.ГрафикСоглашенияЗаполнен(Объект.Соглашение);
ВидимостьЭтаповОплаты = Объект.ЭтапыГрафикаОплаты.Количество() > 0
Или (Не ИспользоватьГрафикиОплаты И НЕ ГрафикСоглашенияЗаполнен);
Элементы.КомандаПереходаКОплате.Видимость = ВидимостьЭтаповОплаты;
Элементы.НадписьОплата.Видимость = ВидимостьЭтаповОплаты;
Элементы.ГрафикОплаты.Видимость = Не ВидимостьЭтаповОплаты И ИспользоватьГрафикиОплаты;
РассчитатьИтоговыеПоказателиПланаОплат(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции()
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются",
Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры",
Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул",
Новый Структура("Номенклатура", "Артикул"));
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(
?(Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки, ТоварыПоПериодам, Объект.Товары),
СтруктураДействий);
Если Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки Тогда
Для каждого СтрокаТЧ Из ТоварыПоПериодам Цикл
Для каждого Период Из ЭтотОбъект["Периоды"] Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(СтрокаТЧ["Комментарий_"+ Период.ИмяКолонки]);
КонецЦикла;
КонецЦикла;
Иначе
Для каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.КартинкаКомментарий = ЗначениеЗаполнено(СтрокаТЧ.Комментарий);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииПериодовНаСервере(КорректироватьНачалоОкончаниеПериода = Ложь)
Если КорректироватьНачалоОкончаниеПериода Тогда
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(Объект.Периодичность, Объект.НачалоПериода, Объект.ОкончаниеПериода, ТекущаяДатаСеанса());
КонецЕсли;
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
Если Объект.Замещающий
И ЗначениеЗаполнено(Объект.Периодичность) Тогда
ЗаполнитьЗамещенныеПериоды();
Планирование.ОбновитьГиперссылкуЗамещение(ЭтаФорма);
Иначе
ЗамещенныеПериоды.Очистить();
ЗамещениеФорматированнаяСтрока = Новый ФорматированнаяСтрока(Новый Массив);
КонецЕсли;
Планирование.ЗаполнитьТаблицуПериодов(ТаблицаПериоды, Объект.Периодичность, Объект.НачалоПериода, Объект.ОкончаниеПериода, ОтображатьНомерПериода, ЗамещенныеПериоды);
ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, Истина);
Если Объект.КроссТаблица Тогда
СохранитьНовыйПериодСервер();
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланПродаж");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, ПересчитыватьИтоговыеПоказатели = Истина)
КоличествоПериодов = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина)).Количество();
ЭтоОдинПериод = КоличествоПериодов = 1;
Элементы.ТоварыДатаОтгрузки.СписокВыбора.Очистить();
Для каждого Период Из ТаблицаПериоды Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
Элементы.ТоварыДатаОтгрузки.СписокВыбора.Добавить(НачалоДня(Период.ДатаНачала), Период.Заголовок);
КонецЦикла;
Элементы.ТоварыЦена.Видимость = Объект.ПланироватьПоСумме;
Элементы.ТоварыСумма.Видимость = Объект.ПланироватьПоСумме;
Элементы.ТоварыПоПериодамКоличествоУпаковок.Видимость = НЕ ЭтоОдинПериод;
Элементы.ТоварыПоПериодамЦена.Видимость = Объект.ПланироватьПоСумме И НЕ ЭтоОдинПериод;
Элементы.ТоварыПоПериодамСумма.Видимость = Объект.ПланироватьПоСумме И НЕ ЭтоОдинПериод;
Элементы.ГруппаИтоги.Видимость = Объект.ПланироватьПоСумме;
Если Не Объект.КроссТаблица
Или ЭтоОдинПериод Тогда
ИтогоПоСтрокеКолонке = "";
КонецЕсли;
Элементы.КомментарийКЯчейке.Видимость = Объект.КроссТаблица И НЕ ЭтоОдинПериод;
Элементы.ЯчейкаОтменена.Видимость = Объект.КроссТаблица И НЕ ЭтоОдинПериод;
Если НЕ Объект.КроссТаблица
И Не ИспользуютсяПланируемыеОстатки Тогда
ЗначениеВРеквизитФормы(ТаблицаПериоды,"Периоды");
СохранитьНовыйПериодСервер();
ОбновитьПризнакЗамещения();
Возврат;
Иначе
ОбновитьПризнакЗамещения(Истина);
КонецЕсли;
ПараметрыВывода = Новый Структура;
ПараметрыВывода.Вставить("ИмяРеквизитаКроссТаблицы", "ТоварыПоПериодам");
ПараметрыВывода.Вставить("ЭлементФормыКроссТаблицы", "ТоварыПоПериодам");
ПараметрыВывода.Вставить("ТаблицаПериодов", ТаблицаПериоды);
ПараметрыВывода.Вставить("Периодичность", Объект.Периодичность);
ПараметрыВывода.Вставить("Поля", Новый Массив());
ПараметрыВывода.Вставить("СоздаватьГруппуПериода", НЕ ЭтоОдинПериод И Объект.ПланироватьПоСумме);
Если НЕ ЭтоОдинПериод Тогда
Планирование.ДобавитьПолеКроссТаблицыГруппаКомментарияСКартинкой(ПараметрыВывода);
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииКоличества");
Планирование.ДобавитьПолеКроссТаблицыКоличество(
ПараметрыВывода,
Истина,
НЕ ЭтоОдинПериод,
Объект.ПланироватьПоСумме ИЛИ ЭтоОдинПериод,
СтруктураДействий);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииЦены");
Планирование.ДобавитьПолеКроссТаблицыЦена(
ПараметрыВывода,
Объект.ПланироватьПоСумме,
Ложь,
СтруктураДействий);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииСуммы");
Планирование.ДобавитьПолеКроссТаблицыСумма(ПараметрыВывода, Объект.ПланироватьПоСумме И ЭтоОдинПериод, СтруктураДействий);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииОтменено");
Планирование.ДобавитьПолеКроссТаблицыОтменено(ПараметрыВывода, ЭтоОдинПериод, СтруктураДействий);
СтруктураДействий = Новый Структура;
Планирование.ДобавитьПолеКроссТаблицыЗамещен(ПараметрыВывода, ЭтоОдинПериод И Объект.Замещающий, СтруктураДействий);
Планирование.ДобавитьПолеКроссТаблицыЗамещенКЗаказу(ПараметрыВывода, Ложь, СтруктураДействий);
Если ЭтоОдинПериод Тогда
Планирование.ДобавитьПолеКроссТаблицыГруппаКомментарияСКартинкой(ПараметрыВывода);
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииКомментария");
СтруктураДействий.Вставить("НачалоВыбора", "Подключаемый_НачалоВыбораКомментария");
Планирование.ДобавитьПолеКроссТаблицыКомментарий(ПараметрыВывода, ЭтоОдинПериод, СтруктураДействий);
Если Объект.ЗаполнятьПоФормуле Тогда
ДобавитьПоляИзДопПараметров(ПараметрыВывода);
Иначе
Планирование.ДобавитьПолеКроссТаблицыРасшифровка(ПараметрыВывода);
КонецЕсли;
Планирование.ОбновитьСтруктуруВыводаКроссТаблицы(ЭтаФорма, ПараметрыВывода);
ЗначениеВРеквизитФормы(ТаблицаПериоды,"Периоды");
УстановитьУсловноеОформление();
УстановитьУсловноеОформлениеКроссТаблицы();
Если ПересчитыватьИтоговыеПоказатели Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СценарийПриИзмененииСервер()
Если Объект.ВидПлана <> ЭтаФорма["РеквизитыДоИзменения"].ВидПлана
ИЛИ (Объект.Сценарий <> ЭтаФорма["РеквизитыДоИзменения"].Сценарий
И НЕ ЗначениеЗаполнено(Объект.ВидПлана)) Тогда
ОбновлятьВидПлана = Истина;
Иначе
ОбновлятьВидПлана = Ложь;
КонецЕсли;
Реквизиты = "Периодичность, ОтображатьНомерПериода, Валюта, ПланПродажПланироватьПоСумме, ПланированиеПоНазначениям";
Реквизиты = Реквизиты + ", СценарийБюджетирования";
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Сценарий, Реквизиты);
ЗаполнитьЗначенияСвойств(Объект, ПараметрыСценария);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыСценария);
Объект.ПланироватьПоСумме = ПараметрыСценария.ПланПродажПланироватьПоСумме;
Если Объект.ПланироватьПоСумме И Объект.Валюта <> ЭтотОбъект["РеквизитыДоИзменения"].Валюта Тогда
Если Объект.КроссТаблица Тогда
Для Каждого СтрокаТовара Из ТоварыПоПериодам Цикл
Для каждого СтрокаПериода Из ЭтотОбъект.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТовара["Цена_" + СтрокаПериода.ИмяКолонки] = 0;
КонецЦикла;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтотОбъект, СтрокаТовара);
РассчитатьИтоговыеПоказатели(ЭтотОбъект, Ложь);
КонецЦикла;
Иначе
Для Каждого СтрокаТовара Из Объект.Товары Цикл
СтрокаТовара.Цена = 0;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если ОбновлятьВидПлана Тогда
Объект.ВидПлана = Планирование.ПолучитьВидПланаПоУмолчанию(Перечисления.ТипыПланов.ПланПродаж, Объект.Сценарий);
КонецЕсли;
Если ПланированиеКлиентСервер.НеобходимоОбновитьИнтерфейс(Объект, ЭтаФорма, "РеквизитыДоИзменения") Тогда
ПриИзмененииПериодовНаСервере(Истина);
КонецЕсли;
Если ОбновлятьВидПлана Тогда
ВидПланаПриИзмененииСервер(ОбновлятьВидПлана);
Объект.ЗаполненоАвтоматически = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВидПланаПриИзмененииСервер(ОбновлятьПравило = Ложь)
ОбновлятьПравило = ОбновлятьПравило ИЛИ Объект.ВидПлана <> ЭтаФорма["РеквизитыДоИзменения"].ВидПлана;
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана,, "КоличествоПериодов");
Если ОбновлятьПравило Тогда
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана, "КоличествоПериодов");
Если КоличествоПериодов > 0 Тогда
Объект.ОкончаниеПериода = Неопределено;
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(
Объект.Периодичность,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекущаяДатаСеанса(),
ПараметрыВидаПлана.КоличествоПериодов);
КонецЕсли;
ЗаполнитьЗначенияСвойств(Объект, ПараметрыВидаПлана);
Если НЕ Объект.ПланироватьПоСумме Тогда
Объект.ЗаполнятьПланОплат = Ложь;
КонецЕсли;
Объект.ПравилоЗаполнения.Загрузить(ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Объект.ЗаполненоАвтоматически = Ложь;
Объект.ЗаполнятьПоФормуле = ПараметрыВидаПлана.ЗаполнятьПоФормуле;
Объект.Замещающий = ПараметрыВидаПлана.Замещающий;
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланПродаж");
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
Если ПараметрыВидаПлана.Свойство("СтруктураНастроек")
И ПараметрыВидаПлана.СтруктураНастроек <> Неопределено Тогда
СтруктураНастроек = ПараметрыВидаПлана.СтруктураНастроек;
КонецЕсли;
ПриИзмененииПериодовНаСервере();
КонецЕсли;
СохранитьНовыйПериодСервер();
Если ОбновлятьПравило И ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
УстановитьВидимость();
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимость()
ИспользоватьОбособленноеОбеспечениеЗаказов = ПолучитьФункциональнуюОпцию("ИспользоватьОбособленноеОбеспечениеЗаказов");
Элементы.ВидПлана.Доступность = ЗначениеЗаполнено(Объект.Сценарий);
Элементы.ГруппаОплата.Видимость = Объект.ЗаполнятьПланОплат;
Элементы.Подразделение.Видимость = ЗаполнятьПодразделение ИЛИ ЗначениеЗаполнено(Объект.Подразделение);
Элементы.ФорматМагазина.Видимость = ЗаполнятьФорматМагазина ИЛИ ЗначениеЗаполнено(Объект.ФорматМагазина);
Элементы.Менеджер.Видимость = ЗаполнятьМенеджера ИЛИ ЗначениеЗаполнено(Объект.Менеджер);
Элементы.Партнер.Видимость = ЗаполнятьПартнера ИЛИ ЗначениеЗаполнено(Объект.Партнер);
Элементы.ТоварыПартнер.Видимость = ЗаполнятьПартнераВТЧ;
Элементы.ТоварыПоПериодамПартнер.Видимость = ЗаполнятьПартнераВТЧ;
Если ИспользоватьСоглашенияСКлиентами Тогда
ИспользуютсяДоговорыКонтрагентов = ЗаполнятьСоглашение И ЗначениеЗаполнено(Объект.Соглашение)
И ОбщегоНазначенияУТ.ЗначениеРеквизитаОбъектаТипаБулево(Объект.Соглашение, "ИспользуютсяДоговорыКонтрагентов");
Иначе
ИспользуютсяДоговорыКонтрагентов = ПолучитьФункциональнуюОпцию("ИспользоватьДоговорыСКлиентами");
КонецЕсли;
Элементы.ГруппаДоговор.Видимость = ИспользуютсяДоговорыКонтрагентов И Объект.ЗаполнятьПланОплат;
ОграничиватьСуммуЗадолженности = ЗначениеЗаполнено(Объект.Договор) И ОграничиватьСуммуЗадолженности;
Элементы.КартинкаДопустимаяСуммаЗадолженности.Видимость = ОграничиватьСуммуЗадолженности;
Элементы.НадписьДопустимаяСуммаЗадолженности.Видимость = ОграничиватьСуммуЗадолженности;
Элементы.Соглашение.Видимость = ЗаполнятьСоглашение ИЛИ ЗначениеЗаполнено(Объект.Соглашение);
Элементы.ТоварыСоглашение.Видимость = ЗаполнятьСоглашениеВТЧ;
Элементы.ТоварыПоПериодамСоглашение.Видимость = ЗаполнятьСоглашениеВТЧ;
Элементы.Склад.Видимость = ЗаполнятьСклад ИЛИ ЗначениеЗаполнено(Объект.Склад);
Элементы.ТоварыСклад.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыПоПериодамСклад.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыЗаполнитьСкладПоЗначению.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыПоПериодамЗаполнитьСкладПоЗначению.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыЗаполнитьНазначениеПоЗначению.Видимость = ЗаполнятьНазначениеВТЧ;
Элементы.ТоварыПоПериодамЗаполнитьНазначениеПоЗначению.Видимость = ЗаполнятьНазначениеВТЧ;
Элементы.ТоварыЗаполнитьКлиентаПоЗначению.Видимость = ЗаполнятьПартнераВТЧ;
Элементы.ТоварыПоПериодамЗаполнитьКлиентаПоЗначению.Видимость = ЗаполнятьПартнераВТЧ;
Элементы.ТоварыЗаполнитьКолонки.Видимость = ЗаполнятьСкладВТЧ ИЛИ ЗаполнятьНазначениеВТЧ ИЛИ ЗаполнятьПартнераВТЧ;
Элементы.ТоварыПоПериодамЗаполнитьКолонки.Видимость = ЗаполнятьСкладВТЧ ИЛИ ЗаполнятьНазначениеВТЧ ИЛИ ЗаполнятьПартнераВТЧ;
Элементы.ТоварыНастроитьИЗаполнитьПоПравилуЗаполнения.Видимость = НЕ ЗапретитьРедактированиеПравила;
Элементы.ТоварыПоПериодамНастроитьИЗаполнитьПоПравилуЗаполнения.Видимость = НЕ ЗапретитьРедактированиеПравила;
Элементы.ТоварыЗаполнить.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыРазбитьСтроку.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоПериодамЗаполнить.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыЗаполнитьТовары.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоПериодамЗаполнитьТовары.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыЗаполнитьПоказатели.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоПериодамЗаполнитьПоказатели.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыГруппаИзменитьКоличество.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыГруппаПоПериодамИзменитьКоличество.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыЗаполнитьЦены.Видимость = (Объект.ЗаполнятьПоФормуле Или Объект.ЗаполнятьПоДаннымСервиса) И Объект.ПланироватьПоСумме;
Элементы.ТоварыПоПериодамЗаполнитьЦены.Видимость = (Объект.ЗаполнятьПоФормуле Или Объект.ЗаполнятьПоДаннымСервиса) И Объект.ПланироватьПоСумме;
Элементы.ТоварыДополнительныеПараметрыФормула.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыДополнительныеПараметрыОтклонение.Видимость = Объект.ЗаполнятьПоФормуле;
Если Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы.Найти("ТоварыПоПериодам" + "Отклонение") <> Неопределено Тогда
Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы["ТоварыПоПериодам" + "Отклонение"].Видимость = Объект.ЗаполнятьПоФормуле;
КонецЕсли;
Если Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы.Найти("ТоварыПоПериодам" + "ФормулаВычисление") <> Неопределено Тогда
Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы["ТоварыПоПериодам" + "ФормулаВычисление"].Видимость = Объект.ЗаполнятьПоФормуле;
КонецЕсли;
Элементы.ТоварыДополнительныеПараметры.Видимость = Объект.ЗаполнятьПоФормуле;
ПравоПросмотраСтатейБюджетов = ПравоДоступа("Просмотр", Метаданные.Справочники.СтатьиБюджетов);
Элементы.СтатьяБюджетов.Видимость = Объект.ОтражаетсяВБюджетировании И ПравоПросмотраСтатейБюджетов;
Элементы.СтатьяБюджетовОплатыДоОтгрузки.Видимость = Объект.ОтражаетсяВБюджетированииОплаты И ПравоПросмотраСтатейБюджетов;
Элементы.СтатьяБюджетовОплатыПослеОтгрузки.Видимость = Объект.ОтражаетсяВБюджетированииОплатыКредит И ПравоПросмотраСтатейБюджетов;
Элементы.СтатьяБюджетовОплатыДоОтгрузки.Заголовок =
?(Объект.ОтражаетсяВБюджетированииОплаты И ПравоПросмотраСтатейБюджетов И Не Объект.ОтражаетсяВБюджетированииОплатыКредит,
НСтр("ru = 'Оплаты'"),
НСтр("ru = 'Оплаты (до отгрузки)'"));
Элементы.Расшифровка.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоПериодамКонтекстноеМенюГруппаПоФормуле.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыКонтекстноеМенюГруппаПоФормуле.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.Назначение.Видимость = ПланированиеПоНазначениям И Не ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыНазначение.Видимость = ПланированиеПоНазначениям И ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыПоПериодамНазначение.Видимость = ПланированиеПоНазначениям И ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыЗамещен.Видимость = Объект.Замещающий;
Элементы.ПланОплатыЗамещен.Видимость = Объект.Замещающий;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПараметрыВидаПлана(Знач ВидПлана, Знач ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек)
Реквизиты = "КоличествоПериодов, ЗаполнятьПодразделение, ЗаполнятьПартнера,
|ЗаполнятьПартнераВТЧ, ЗаполнятьСоглашение, ЗаполнятьСоглашениеВТЧ, ЗаполнятьСклад,
|ЗаполнятьСкладВТЧ, ЗапретитьРедактированиеПравила, ЗаполнятьПоФормуле, ЗаполнятьПоДаннымСервиса, Замещающий,
|ЗаполнятьПланОплат, ЗаполнятьМенеджера, ЗаполнятьФорматМагазина, ЗаполнятьНазначениеВТЧ,
|ЗапретитьРедактированиеФормулы";
Реквизиты = Реквизиты + ", ОтражаетсяВБюджетировании, СтатьяБюджетов,
|ОтражаетсяВБюджетированииОплаты, СтатьяБюджетовОплат,
|ОтражаетсяВБюджетированииОплатыКредит, СтатьяБюджетовОплатКредит";
ПараметрыВидаПлана = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидПлана, Реквизиты);
Если ОбновлятьПравило Тогда
АдресПравилаЗаполнения = Планирование.ПолучитьАдресПравилаЗаполненияПоУмолчанию(Перечисления.ТипыПланов.ПланПродаж,
ВидПлана, АдресПравилаЗаполнения);
АдресПользовательскихНастроек = Планирование.ПолучитьАдресПользовательскихНастроекПоУмолчанию(Перечисления.ТипыПланов.ПланПродаж,
ВидПлана, АдресПользовательскихНастроек);
СтруктураНастроек = Планирование.ПолучитьНастройкиПоУмолчанию(Перечисления.ТипыПланов.ПланПродаж, ВидПлана);
Если СтруктураНастроек.Свойство("Формула") Тогда
ПараметрыВидаПлана.Вставить("СтруктураНастроек", СтруктураНастроек);
КонецЕсли;
Для каждого Элемент Из СтруктураНастроек Цикл
ПараметрыВидаПлана.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
КонецЕсли;
Возврат ПараметрыВидаПлана;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьСвязанныеРеквизитыОбъекта(Объект, Форма)
Если Объект.КроссТаблица
Или Форма.ИспользуютсяПланируемыеОстатки Тогда
Товары = Форма.ТоварыПоПериодам;
Иначе
Товары = Объект.Товары;
КонецЕсли;
Если НЕ Форма.ЗаполнятьПодразделение Тогда
Объект.Подразделение = Неопределено;
КонецЕсли;
Если НЕ Форма.ЗаполнятьФорматМагазина Тогда
Объект.ФорматМагазина = Неопределено;
КонецЕсли;
Если НЕ Форма.ЗаполнятьМенеджера Тогда
Объект.Менеджер = Неопределено;
КонецЕсли;
Если НЕ Форма.ЗаполнятьПартнера Тогда
Объект.Партнер = Неопределено;
КонецЕсли;
Если НЕ Форма.ЗаполнятьСоглашение Тогда
Объект.Соглашение = Неопределено;
КонецЕсли;
Если НЕ Форма.ЗаполнятьСклад Тогда
Объект.Склад = Неопределено;
КонецЕсли;
Если НЕ Форма.ПланированиеПоНазначениям Тогда
Объект.Назначение = Неопределено;
КонецЕсли;
Для каждого СтрокаТЧ Из Товары Цикл
Если Форма.ЗаполнятьПартнера Тогда
СтрокаТЧ.Партнер = Объект.Партнер;
ИначеЕсли НЕ Форма.ЗаполнятьПартнераВТЧ Тогда
СтрокаТЧ.Партнер = Неопределено;
КонецЕсли;
Если Форма.ЗаполнятьСоглашение Тогда
СтрокаТЧ.Соглашение = Объект.Соглашение;
ИначеЕсли НЕ Форма.ЗаполнятьСоглашениеВТЧ Тогда
СтрокаТЧ.Соглашение = Неопределено;
КонецЕсли;
Если Форма.ЗаполнятьСклад Тогда
СтрокаТЧ.Склад = Объект.Склад;
ИначеЕсли НЕ Форма.ЗаполнятьСкладВТЧ Тогда
СтрокаТЧ.Склад = Неопределено;
КонецЕсли;
Если НЕ Форма.ПланированиеПоНазначениям
Или СтрокаТЧ.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Услуга")
Или СтрокаТЧ.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.МногооборотнаяТара") Тогда
СтрокаТЧ.Назначение = Неопределено;
ИначеЕсли НЕ Форма.ЗаполнятьНазначениеВТЧ Тогда
СтрокаТЧ.Назначение = Объект.Назначение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьПользователяОЗаполненииДанных()
ПоказатьОповещениеПользователя(
НСтр("ru = 'Заполнение данных в документ завершено'"),
,
,
БиблиотекаКартинок.Информация32);
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьПользователяОНачалеЗаполненииДанных()
Состояние(НСтр("ru = 'Выполняется заполнение данных в документ'"));
КонецПроцедуры
&НаСервере
Функция ПолучитьАдресТаблицыПериодов()
Возврат ПоместитьВоВременноеХранилище(ЭтаФорма.Периоды.Выгрузить(), УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ДобавитьТовары(ТаблицаТоваров, КэшированныеЗначения = Неопределено, ЗагрузкаИзФайла = Ложь)
Модифицированность = Истина;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ПересчитатьЦенуПоСумме");
ОбрабатываемыеСтроки = Новый Массив();
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
Объект.ЗаполненоАвтоматически = Ложь;
Если Объект.КроссТаблица И НЕ ЗагрузкаИзФайла Тогда
ТекущаяСтрока = ТоварыПоПериодам.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
АктуальныйПериод = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина))[0];
Если ТекущаяСтрока["Количество_" + АктуальныйПериод.ИмяКолонки] = 0
И ТекущаяСтрока.Количество <> 0 Тогда
ТекущаяСтрока["Количество_" + АктуальныйПериод.ИмяКолонки] = ТекущаяСтрока.КоличествоУпаковок;
КонецЕсли;
Если ТекущаяСтрока["Цена_" + АктуальныйПериод.ИмяКолонки] = 0
И ТекущаяСтрока.Цена <> 0 Тогда
ТекущаяСтрока["Цена_" + АктуальныйПериод.ИмяКолонки] = ТекущаяСтрока.Цена;
КонецЕсли;
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущаяСтрока["Расшифровка_" + АктуальныйПериод.ИмяКолонки] = ""
И ТекущаяСтрока.Расшифровка <> "" Тогда
ТекущаяСтрока["Расшифровка_" + АктуальныйПериод.ИмяКолонки] = ТекущаяСтрока.Расшифровка;
КонецЕсли;
Иначе
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
Если Не ЗначениеЗаполнено(ТекущаяСтрока.ДатаОтгрузки) Тогда
ТекущаяСтрока.ДатаОтгрузки = Объект.НачалоПериода;
КонецЕсли;
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЕсли;
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
Если Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоПериодам");
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура ПолучитьЗагруженныеТоварыИзХранилища(АдресТоваровВХранилище, КэшированныеЗначения = Неопределено)
ТоварыИзХранилища = ПолучитьИзВременногоХранилища(АдресТоваровВХранилище);
ДобавитьТовары(ТоварыИзХранилища, КэшированныеЗначения);
КонецПроцедуры
#Область ПроцедурыДинамическогоФормированияСтруктурыФормы
&НаКлиенте
Процедура ПриИзмененииПериодовНаКлиенте(Результат, ДополнительныеПараметры) Экспорт
ПриИзмененииПериодовНаСервере();
КонецПроцедуры
#КонецОбласти
#Область ПроцедурыОбменаДаннымиМеждуТабличнойЧастьюИТаблицейФормы
&НаСервере
Процедура СкопироватьИзКроссТаблицы(КэшированныеЗначения, ЭтотОбъект)
Если ЭтотОбъект.КроссТаблица
Или ИспользуютсяПланируемыеОстатки Тогда
ПараметрыПреобразования = ПараметрыПреобразованияКроссТаблицы();
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ПересчитатьСумму");
Планирование.ЗаполнитьТаблицуИзКроссТаблицы(ЭтотОбъект.Товары, Объект.Товары, ТоварыПоПериодам, ПараметрыПреобразования,
СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура СкопироватьВКроссТаблицу(КэшированныеЗначения)
Если Объект.КроссТаблица
Или ИспользуютсяПланируемыеОстатки Тогда
ПараметрыПреобразования = ПараметрыПреобразованияКроссТаблицы();
Для каждого СтрокаТЧ Из Объект.Товары Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТЧ.ДатаОтгрузки) Тогда
СтрокаТЧ.ДатаОтгрузки = Объект.НачалоПериода;
КонецЕсли;
КонецЦикла;
ПланированиеКлиентСервер.ЗаполнитьКроссТаблицуИзТаблицы(ТоварыПоПериодам, Объект.Товары, ПараметрыПреобразования);
РассчитатьИтоговыеПоказатели(ЭтаФорма, , Ложь);
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоПериодам");
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
КонецПроцедуры
&НаСервере
Функция ПараметрыПреобразованияКроссТаблицы()
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
СтруктураРеквизитовПериода = Новый Структура("ДатаНачала","ДатаОтгрузки");
СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить("Количество_","КоличествоУпаковок");
СтруктураРеквизитов.Вставить("Цена_","Цена");
СтруктураРеквизитов.Вставить("Сумма_","Сумма");
СтруктураРеквизитов.Вставить("Отменено_","Отменено");
СтруктураРеквизитов.Вставить("Замещен_","Замещен");
СтруктураРеквизитов.Вставить("ЗамещенКЗаказу_","ЗамещенКЗаказу");
СтруктураРеквизитов.Вставить("Комментарий_","Комментарий");
Если Объект.ЗаполнятьПоФормуле Тогда
ДобавитьРеквизитыИзДопПараметров(СтруктураРеквизитов);
Иначе
СтруктураРеквизитов.Вставить("Расшифровка_","Расшифровка");
КонецЕсли;
ПоляГруппировки = "Номенклатура, Характеристика, Упаковка";
Если ЗаполнятьСкладВТЧ Тогда
ПоляГруппировки = ПоляГруппировки + ", Склад";
КонецЕсли;
Если ЗаполнятьНазначениеВТЧ Тогда
ПоляГруппировки = ПоляГруппировки + ", Назначение";
КонецЕсли;
Если ЗаполнятьПартнераВТЧ Тогда
ПоляГруппировки = ПоляГруппировки + ", Партнер";
КонецЕсли;
Если ЗаполнятьСоглашениеВТЧ Тогда
ПоляГруппировки = ПоляГруппировки + ", Соглашение";
КонецЕсли;
СтруктураИтоговыхРеквизитов = Новый Структура;
СтруктураИтоговыхРеквизитов.Вставить("КоличествоУпаковок", "КоличествоУпаковок");
СтруктураИтоговыхРеквизитов.Вставить("Сумма", "Сумма");
ПараметрыПреобразования = Новый Структура;
ПараметрыПреобразования.Вставить("ТаблицаПериоды", ТаблицаПериоды);
ПараметрыПреобразования.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПреобразования.Вставить("СтруктураРеквизитовПериода", СтруктураРеквизитовПериода);
ПараметрыПреобразования.Вставить("СтруктураРеквизитов", СтруктураРеквизитов);
ПараметрыПреобразования.Вставить("ПоляГруппировки", ПоляГруппировки);
ПараметрыПреобразования.Вставить("СтруктураИтоговыхРеквизитов", СтруктураИтоговыхРеквизитов);
Возврат ПараметрыПреобразования;
КонецФункции
#КонецОбласти
#Область ПриИзмененииРеквизитов
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий)
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц", Новый Структура("НужноОкруглять", Ложь));
КонецПроцедуры
#Область ПодборыИОбработкаПроверкиКоличества
&НаСервере
Процедура ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, ВыбранноеЗначение)
Если НЕ ЭтоАдресВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище) Тогда
Возврат;
КонецЕсли;
ПолучитьЗагруженныеТоварыИзХранилища(ВыбранноеЗначение.АдресТоваровВХранилище, КэшированныеЗначения);
КонецПроцедуры
#КонецОбласти
#Область ПланОплат
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоговыеПоказателиПланаОплат(Форма)
СуммаПлатежаОбщая = 0;
Форма.НомерСтрокиПолнойОплаты = 0;
Для Каждого ТекСтрока Из Форма.Объект.ПланОплаты Цикл
СуммаПлатежаОбщая = СуммаПлатежаОбщая + ТекСтрока.СуммаПлатежа;
ТекСтрока.СуммаПлатежаЗаполненаНеВерно = (СуммаПлатежаОбщая > Форма.Объект.СуммаДокумента);
Если СуммаПлатежаОбщая = Форма.Объект.СуммаДокумента Тогда
Форма.НомерСтрокиПолнойОплаты = ТекСтрока.НомерСтроки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписьюЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Если ДополнительныеПараметры.Свойство("ОчиститьПланОплат") И ДополнительныеПараметры.ОчиститьПланОплат Тогда
Объект.ПланОплаты.Очистить();
КонецЕсли;
Если ДополнительныеПараметры.Свойство("ПерезаполнитьЭтапы") И ДополнительныеПараметры.ПерезаполнитьЭтапы Тогда
ЗаполнитьПланОплаты(ДополнительныеПараметры.ГрафикСоглашенияЗаполнен, ДополнительныеПараметры.ГрафикЗаполнен);
КонецЕсли;
Записать();
Иначе
ПередЗаписьюПовторныйВызов = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НадписьОплатаНажатиеЗавершение(ПараметрыОплаты, ДополнительныеПараметры) Экспорт
Если ПараметрыОплаты <> Неопределено Тогда
Модифицированность = Истина;
Объект.Статус = ПараметрыОплаты.Статус;
Объект.Календарь = ПараметрыОплаты.Календарь;
Объект.ЭтапыГрафикаОплаты.Очистить();
Если ЗначениеЗаполнено(ПараметрыОплаты.АдресВоВременномХранилище) Тогда
ЗаполнитьЭтапыОплатыИзВременногоХранилищаСервер(ПараметрыОплаты.АдресВоВременномХранилище);
КонецЕсли;
НадписьОплата = НадписьОплата(Объект.Календарь, Объект.ЭтапыГрафикаОплаты.Количество());
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция НадписьОплата(Календарь, КоличествоЭтаповОплаты)
НадписьОплата = НСтр("ru='Этапов оплаты: %КоличествоЭтаповОплаты%, %Календарь%'");
НадписьОплата = СтрЗаменить(НадписьОплата, "%Календарь%", ?(ЗначениеЗаполнено(Календарь), НСтр("ru='по рабочим дням'"),НСтр("ru='по календарным дням'")));
НадписьОплата = СтрЗаменить(НадписьОплата, "%КоличествоЭтаповОплаты%", КоличествоЭтаповОплаты);
Возврат НадписьОплата;
КонецФункции
&НаСервере
Функция ПоместитьЭтапыГрафикаОплатыВоВременноеХранилищеНаСервере()
Возврат ПоместитьВоВременноеХранилище(Объект.ЭтапыГрафикаОплаты.Выгрузить());
КонецФункции
&НаСервере
Процедура ЗаполнитьЭтапыОплатыИзВременногоХранилищаСервер(АдресВоВременномХранилище)
ЭтапыОплаты = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
Для Каждого ТекСтрока Из ЭтапыОплаты Цикл
НоваяСтрока = Объект.ЭтапыГрафикаОплаты.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьЭтапыГрафикаОплатыЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ЗаполнитьПланОплаты(ДополнительныеПараметры.ГрафикСоглашенияЗаполнен, ДополнительныеПараметры.ГрафикЗаполнен);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПланОплаты(ГрафикСоглашенияЗаполнен, ГрафикЗаполнен)
Если ГрафикСоглашенияЗаполнен ИЛИ ГрафикЗаполнен Тогда
ЗаполнитьЭтапыОплатыПоШаблонуСервер(ГрафикСоглашенияЗаполнен, ГрафикЗаполнен);
Иначе
Объект.ПланОплаты.Очистить();
Если Объект.КроссТаблица Тогда
СуммаПлатежей = 0;
СуммаОтгрузок = 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;
КонецЕсли;
Если ИспользоватьГрафикиОплаты И ЗначениеЗаполнено(РеквизитыСоглашения.ГрафикОплаты) Тогда
Объект.ГрафикОплаты = РеквизитыСоглашения.ГрафикОплаты;
КонецЕсли;
ГрафикСоглашенияЗаполнен = ЭтапыОплатыВызовСервера.ГрафикСоглашенияЗаполнен(Объект.Соглашение);
ВидимостьЭтаповОплаты = Объект.ЭтапыГрафикаОплаты.Количество() > 0 Или (Не ИспользоватьГрафикиОплаты И Не ГрафикСоглашенияЗаполнен);
Элементы.КомандаПереходаКОплате.Видимость = ВидимостьЭтаповОплаты;
Элементы.НадписьОплата.Видимость = ВидимостьЭтаповОплаты;
Элементы.ГрафикОплаты.Видимость = Не ВидимостьЭтаповОплаты И ИспользоватьГрафикиОплаты;
УстановитьВидимость();
Если ЗаполнятьМенеджера Тогда
ОтветственныеЛицаСервер.ЗаполнитьМенеджера(Объект);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ДоговорПриИзмененииНаСервере()
Если ЗначениеЗаполнено(Объект.Договор) Тогда
РеквизитыДоговора = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Договор,
"ОграничиватьСуммуЗадолженности, ДопустимаяСуммаЗадолженности");
ЗаполнитьЗначенияСвойств(ЭтаФорма, РеквизитыДоговора);
Иначе
ОграничиватьСуммуЗадолженности = Ложь;
ДопустимаяСуммаЗадолженности = 0;
КонецЕсли;
НадписьДопустимаяСуммаЗадолженности = НадписьДопустимаяСуммаЗадолженности(ДопустимаяСуммаЗадолженности, Объект.Валюта);
УстановитьВидимость();
Если ЗаполнятьМенеджера Тогда
ОтветственныеЛицаСервер.ЗаполнитьМенеджера(Объект);
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция НадписьДопустимаяСуммаЗадолженности(СуммаЗадолженности, Валюта)
НадписьДопустимаяСуммаЗадолженности = НСтр("ru='Допустимая сумма задолженности не более: %СуммаЗадолженности% %Валюта%.'");
НадписьДопустимаяСуммаЗадолженности = СтрЗаменить(НадписьДопустимаяСуммаЗадолженности, "%СуммаЗадолженности%", Строка(СуммаЗадолженности));
НадписьДопустимаяСуммаЗадолженности = СтрЗаменить(НадписьДопустимаяСуммаЗадолженности, "%Валюта%", Валюта);
Возврат НадписьДопустимаяСуммаЗадолженности;
КонецФункции
&НаКлиенте
Процедура ПересчитатьСуммыПланаОплатПоСтроке(СтрокаПланаОплаты)
СуммаПлатежей = 0;
Для каждого ЭтапОплаты Из Объект.ПланОплаты Цикл
Если ЭтапОплаты.ДатаПлатежа <= СтрокаПланаОплаты.ДатаПлатежа Тогда
СуммаПлатежей = СуммаПлатежей + ЭтапОплаты.СуммаПлатежа;
Продолжить;
КонецЕсли;
ЭтапОплаты.СуммаПлатежей = СуммаПлатежей;
СуммаПлатежей = СуммаПлатежей + ЭтапОплаты.СуммаПлатежа;
ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - СуммаПлатежей;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область РаботаСExcel
&НаСервере
Функция ЗагрузитьИзExcelНаСервере(МассивСтруктурТовары)
Если Объект.КроссТаблица Тогда
ТоварыПоПериодам.Очистить();
Иначе
Объект.Товары.Очистить();
КонецЕсли;
Для Каждого СтруктураТовар Из МассивСтруктурТовары Цикл
Если НЕ ЗначениеЗаполнено(СтруктураТовар.ИдентификаторНоменклатура) Тогда
Продолжить;
КонецЕсли;
СтруктураТовар.Вставить("Номенклатура", Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторНоменклатура)));
СтруктураТовар.Вставить("Характеристика", Справочники.ХарактеристикиНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторХарактеристика)));
СтруктураТовар.Вставить("Упаковка", Справочники.УпаковкиЕдиницыИзмерения.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторУпаковка)));
СтруктураТовар.Вставить("Партнер", Справочники.Партнеры.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторПартнер)));
СтруктураТовар.Вставить("Соглашение", Справочники.СоглашенияСКлиентами.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторСоглашение)));
СтруктураТовар.Вставить("Склад", Справочники.Склады.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторСклад)));
СтруктураТовар.Вставить("Назначение", Справочники.Назначения.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторНазначение)));
КонецЦикла;
ДобавитьТовары(МассивСтруктурТовары);
Если НЕ Объект.КроссТаблица Тогда
ОбновитьПризнакЗамещения();
КонецЕсли;
КонецФункции
&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиенте(ПрисоединенныйФайл)
СтруктураДействийExcel = СтруктураДействийПриЗагрузкеИзExcel();
РаботаСExcelКлиент.ЗагрузитьИзExcel(ЭтаФорма, ПрисоединенныйФайл, СтруктураДействийExcel);
КонецФункции
&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиентеПродолжение(ДанныеЗагрузки)
ЕстьДобавленныеСтроки = Ложь;
Для каждого СтрокаЗагрузки Из ДанныеЗагрузки Цикл
Если НЕ ЗначениеЗаполнено(СтрокаЗагрузки.ИдентификаторНоменклатура) Тогда
ЕстьДобавленныеСтроки = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьДобавленныеСтроки Тогда
ПараметрыЗагрузки = РаботаСТабличнымиЧастямиКлиент.ПараметрыЗагрузкиНоменклатурыДляПланов();
ПараметрыЗагрузки.ВидПлана = Объект.ВидПлана;
ПараметрыЗагрузки.ПланироватьПоСумме = Объект.ПланироватьПоСумме;
ПараметрыЗагрузки.КроссТаблица = Объект.КроссТаблица;
ПараметрыЗагрузки.АдресТаблицыПериодов = ПолучитьАдресТаблицыПериодов();
ПараметрыЗагрузки.АдресТаблицыТоваров = ПоместитьВоВременноеХранилище(ДанныеЗагрузки, УникальныйИдентификатор);
ПараметрыЗагрузки.Партнер = Объект.Партнер;
ПараметрыЗагрузки.ПараметрыОтбора.Вставить("ТипНоменклатуры",
НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
ДопПараметры = Новый Структура("ОбновитьДополнить", 0);
Оповещение = Новый ОписаниеОповещения("ЗагрузитьИзВнешнегоФайлаЗавершение", ЭтотОбъект, ДопПараметры);
РаботаСТабличнымиЧастямиКлиент.ПоказатьФормуЗагрузкиНоменклатурыДляПланов(ПараметрыЗагрузки, Оповещение);
Иначе
ЗагрузитьИзExcelНаСервере(ДанныеЗагрузки);
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ЗагрузитьИзВнешнегоФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(АдресЗагруженныхДанных) Тогда
Если ДополнительныеПараметры.ОбновитьДополнить = 0 Тогда
ТоварыПоПериодам.Очистить();
Объект.Товары.Очистить();
КонецЕсли;
ПолучитьЗагруженныеТоварыИзХранилища(АдресЗагруженныхДанных, КэшированныеЗначения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция СтруктураДействийПриЗагрузкеИзExcel()
СтруктураДействийExcel = Новый Структура;
КолонкиПоиска = Новый СписокЗначений;
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Номенклатура)'"),"ИдентификаторНоменклатура");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Характеристика)'"),"ИдентификаторХарактеристика");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Упаковка)'"),"ИдентификаторУпаковка");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Клиент)'"),"ИдентификаторПартнер");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Соглашение)'"),"ИдентификаторСоглашение");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Склад)'"),"ИдентификаторСклад");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Назначение)'"),"ИдентификаторНазначение");
Если ЗначениеЗаполнено(ИмяДополнительнойКолонки) Тогда
КолонкиПоиска.Добавить(ИмяДополнительнойКолонки,"ЗагружаемыйАртикул");
КонецЕсли;
КолонкиПоиска.Добавить(НСтр("ru='Номенклатура'"),"ЗагружаемаяНоменклатура");
КолонкиПоиска.Добавить(НСтр("ru='Характеристика'"),"ЗагружаемаяХарактеристика");
Если ЗаполнятьПартнераВТЧ Тогда
КолонкиПоиска.Добавить(НСтр("ru='Клиент'"),"ЗагружаемыйПартнер");
КонецЕсли;
Если ЗаполнятьСоглашениеВТЧ Тогда
КолонкиПоиска.Добавить(НСтр("ru='Соглашение'"),"ЗагружаемоеСоглашение");
КонецЕсли;
Если ЗаполнятьСкладВТЧ Тогда
КолонкиПоиска.Добавить(НСтр("ru='Склад'"),"ЗагружаемыйСклад");
КонецЕсли;
Если ЗаполнятьНазначениеВТЧ Тогда
КолонкиПоиска.Добавить(НСтр("ru='Назначение'"),"ЗагружаемоеНазначение");
КонецЕсли;
Если Объект.КроссТаблица Тогда
КолонкиПоиска.Добавить(НСтр("ru='Ед. изм.'"),"ЗагружаемаяУпаковка");
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Если НЕ Период.Активная ИЛИ Период.НомерКолонки <=0 Тогда
Продолжить;
КонецЕсли;
КолонкиПоиска.Добавить(Период.Заголовок,"Период_"+Период.ИмяКолонки);
Если Объект.Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность.Год") Тогда
КолонкиПоиска.Добавить(СокрЛП(СтрЗаменить(Период.Заголовок, НСтр("ru = 'г.'"), "")),"Период_"+Период.ИмяКолонки);
КонецЕсли;
КолонкиПоиска.Добавить(
ПланированиеКлиентСервер.СформироватьЗаголовокПериода(
Объект.Периодичность, Период.ДатаНачала, Период.ДатаОкончания, НЕ ОтображатьНомерПериода),
"Период_"+Период.ИмяКолонки);
КонецЦикла;
РеквизитыПериода = Новый Массив;
РеквизитыПериода.Добавить("Количество_");
Если Объект.ПланироватьПоСумме Тогда
РеквизитыПериода.Добавить("Цена_");
РеквизитыПериода.Добавить("Сумма_");
КонецЕсли;
СтруктураДействийExcel.Вставить("РеквизитыПериода", РеквизитыПериода);
СтруктураДействийExcel.Вставить("Периоды", ЭтаФорма.Периоды);
Иначе
КолонкиПоиска.Добавить(НСтр("ru='Дата отгрузки'"),"ДатаОтгрузки");
КолонкиПоиска.Добавить(НСтр("ru='Количество'"),"КоличествоУпаковок");
КолонкиПоиска.Добавить(НСтр("ru='Ед. изм.'"),"ЗагружаемаяУпаковка");
Если Объект.ПланироватьПоСумме Тогда
КолонкиПоиска.Добавить(НСтр("ru='Цена'"),"Цена");
КолонкиПоиска.Добавить(НСтр("ru='Сумма'"),"Сумма");
КонецЕсли;
КонецЕсли;
СтруктураДействийExcel.Вставить("КолонкиПоиска", КолонкиПоиска);
СтруктураПоиска = Новый Структура();
СтруктураПоиска.Вставить("ИдентификаторНоменклатура",0);
СтруктураПоиска.Вставить("ИдентификаторХарактеристика",0);
СтруктураПоиска.Вставить("ИдентификаторУпаковка",0);
СтруктураПоиска.Вставить("ИдентификаторПартнер",0);
СтруктураПоиска.Вставить("ИдентификаторСоглашение",0);
СтруктураПоиска.Вставить("ИдентификаторСклад",0);
СтруктураПоиска.Вставить("ИдентификаторНазначение",0);
СтруктураДействийExcel.Вставить("СтруктураПоиска", СтруктураПоиска);
СтруктураДействийExcel.Вставить("НомерСтрокиНачалаДанных", 3);
Возврат СтруктураДействийExcel;
КонецФункции
#КонецОбласти
#Область РаботаСБуферомОбмена
&НаСервере
Процедура СкопироватьСтрокиНаСервере()
Если Объект.КроссТаблица Тогда
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(ТоварыПоПериодам, Элементы.ТоварыПоПериодам.ВыделенныеСтроки);
Иначе
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(Объект.Товары, Элементы.Товары.ВыделенныеСтроки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьСтрокиИзБуфераОбмена()
ПараметрыОтбора = Новый Соответствие;
ПараметрыОтбора.Вставить("Номенклатура.ТипНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
Колонки = "Номенклатура,Характеристика,Упаковка,КоличествоУпаковок,Количество,Цена,
|ДатаОтгрузки,Партнер,Соглашение,Склад";
ТаблицаТоваров = РаботаСТабличнымиЧастями.СтрокиИзБуфераОбмена(ПараметрыОтбора, Колонки);
Если ЗначениеЗаполнено(ТаблицаТоваров) Тогда
ДобавитьТовары(ТаблицаТоваров);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьКомандБуфераОбмена()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("ТоварыВставитьСтроки");
МассивЭлементов.Добавить("ТоварыКонтекстноеМенюВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоПериодамВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоПериодамКонтекстноеМенюВставитьСтроки");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность",
РаботаСТабличнымиЧастями.ЕстьСтрокиВБуфереОбмена());
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКомандБуфераОбменаНаКлиенте()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("ТоварыВставитьСтроки");
МассивЭлементов.Добавить("ТоварыКонтекстноеМенюВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоПериодамВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоПериодамКонтекстноеМенюВставитьСтроки");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность", Истина);
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура НастроитьИЗаполнитьПоПравилуЗаполненияЗавершение(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
ОтборУстановлен = Настройки.ОтборУстановлен;
Настройки.Вставить("ЗаполнятьПоПравилу", Истина);
ЗаполнитьЗначенияСвойств(Объект, Настройки, "ОбновитьДополнить, ИзменитьРезультатНа, ТочностьОкругления");
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
#КонецОбласти
#Область ПростоеЗаполнение
&НаСервере
Процедура ИнициализироватьНастроекПриЧтенииНаСервере(ДокументОбъект)
Если НЕ ЗначениеЗаполнено(Объект.Сценарий) ИЛИ Не ЗначениеЗаполнено(Объект.ВидПлана) Тогда
Возврат;
КонецЕсли;
ПараметрыИнициализации = Новый Структура();
ПараметрыИнициализации.Вставить("Форма", ЭтотОбъект);
ПараметрыИнициализации.Вставить("ПутьКРеквизиту", "Объект.Товары");
ПараметрыИнициализации.Вставить("ЭлементФормыТаблицы", "Товары");
ПараметрыИнициализации.Вставить("ЭлементФормыТаблицыПоПериодам", "ТоварыПоПериодам");
Планирование.ИнициализироватьДопПараметры(ДополнительныеПараметрыТовары, ДополнительныеПараметрыТоварыПоПериодам, ПараметрыИнициализации);
ИнициализироватьДереваОператоров();
ИнициализироватьОперандыФормулы();
ИнициализироватьСтруктуруНастроек(ДокументОбъект);
ОбновитьСтруктуруВыводаДопПараметров();
ПрочитатьДополнительныеПараметры(ДокументОбъект);
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьСтруктуруНастроек(ДокументОбъект)
Если ЗначениеЗаполнено(ДокументОбъект.Ссылка) Тогда
СтруктураНастроек = ДокументОбъект.СтруктураНастроек.Получить();
Если СтруктураНастроек = Неопределено Тогда
УстановитьЗначениеНастройки("СтруктураНастроек", СтруктураНастроек);
КонецЕсли;
КонецЕсли;
ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначениеНастройки(ИмяНастройки, Настройка)
ЗначениеНастройкиИзХранилища = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиРаботыПользователя" + ТипПлана, "СтруктураНастроек", Настройка);
Если ЗначениеНастройкиИзХранилища <> Неопределено Тогда
Настройка = ЗначениеНастройкиИзХранилища;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьОперандыФормулы()
МассивОперандов = ПолучитьОперанды(ЭтотОбъект);
ДополнительныеПоля.Очистить();
Для каждого Элемент Из МассивОперандов Цикл
НоваяСтрока = ДополнительныеПоля.Добавить();
НоваяСтрока.Идентификатор = Элемент.Имя;
НоваяСтрока.ПометкаУдаления = ЛОЖЬ;
НоваяСтрока.Представление = Элемент.ЗаголовокОперанда;
Элемент.Свойство("ВходитВОперанд", НоваяСтрока.ВходитВОперанд);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьДереваОператоров()
Дерево = РаботаСФормулами.ПолучитьПустоеДеревоОператоров();
Планирование.ИнициализироватьДереваОператоров(Дерево);
ПредставлениеГруппы = НСтр("ru='Примеры формул'");
ГруппаОператоров = РаботаСФормулами.ДобавитьГруппуОператоров(Дерево, "ПримерыФормул", ПредставлениеГруппы);
ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров);
АдресХранилищаДереваОператоров = ПоместитьВоВременноеХранилище(Дерево, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросаЗадатьПроизвольнуюФормулу(РезультатВопроса, ДополнительныеПараметры) Экспорт
СтруктураДанных = Новый Структура("Формула,ФормулаПредставление,Заголовок,ВключитьЗначение,МассивСтрок,ПериодИзменения");
Если Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.ТоварыПоПериодам.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 1 Тогда
ТекущиеДанные = ТоварыПоПериодам.НайтиПоИдентификатору(ВыделенныеСтроки[0]);
Для каждого Операнд Из ДополнительныеПоля Цикл
Операнд.Значение = ЭтотОбъект[Операнд.Идентификатор];
КонецЦикла;
СтруктураДанных.Формула = ЭтотОбъект.Формула;
СтруктураДанных.ФормулаПредставление= ЭтотОбъект.ФормулаПредставление;
СтруктураДанных.Заголовок = "" + ТекущиеДанные.Номенклатура +
?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика)," (" + ТекущиеДанные.Характеристика + ")","");
СтруктураДанных.ВключитьЗначение = Истина;
Иначе
СтруктураДанных.Формула = "";
СтруктураДанных.ФормулаПредставление = "";
СтруктураДанных.Заголовок = "";
СтруктураДанных.ВключитьЗначение = Ложь;
КонецЕсли;
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
СтруктураДанных.ПериодИзменения = "ВсеПериоды";
ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда
СтруктураДанных.ПериодИзменения = ДополнительныеПараметры.ИмяКолонки;
Иначе
Возврат;
КонецЕсли;
Иначе
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 1 Тогда
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ВыделенныеСтроки[0]);
Для каждого Операнд Из ДополнительныеПоля Цикл
Если ТекущиеДанные.Свойство(Операнд.Идентификатор) Тогда
Операнд.Значение = ТекущиеДанные[Операнд.Идентификатор];
КонецЕсли;
КонецЦикла;
СтруктураДанных.Формула = ТекущиеДанные.Формула;
СтруктураДанных.ФормулаПредставление= ТекущиеДанные.ФормулаПредставление;
СтруктураДанных.Заголовок = "" + ТекущиеДанные.Номенклатура +
?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика)," (" + ТекущиеДанные.Характеристика + ")","");
СтруктураДанных.ВключитьЗначение = Истина;
Иначе
СтруктураДанных.Формула = "";
СтруктураДанных.ФормулаПредставление = "";
СтруктураДанных.Заголовок = "";
СтруктураДанных.ВключитьЗначение = Ложь;
КонецЕсли;
КонецЕсли;
СтруктураДанных.МассивСтрок = ВыделенныеСтроки;
УстановитьПараметрыРасшифровки(СтруктураДанных);
УстановитьПроизвольнуюФормулу(СтруктураДанных);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПроизвольнуюФормулу(СтруктураДанных)
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланПродаж");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Расширенный", Истина);
ПараметрыФормы.Вставить("ВключитьЗначение", СтруктураДанных.ВключитьЗначение);
ПараметрыФормы.Вставить("ЗаголовокЗначения", ""+СтруктураДанных.ПараметрыРасшифровки.Отбор.Номенклатура +
?(ЗначениеЗаполнено(СтруктураДанных.ПараметрыРасшифровки.Отбор.Характеристика)," (" + СтруктураДанных.ПараметрыРасшифровки.Отбор.Характеристика + ")",""));
ПараметрыФормы.Вставить("ПараметрыРасшифровкиОперативногоПланирования", СтруктураДанных.ПараметрыРасшифровки);
ПараметрыФормы.Вставить("Формула", ?(СтруктураДанных.Формула = ПланированиеКлиентСервер.ТекстУстановкиНовойФормулы(),"", СтруктураДанных.Формула));
ПараметрыФормы.Вставить("Представление", ?(СтруктураДанных.ФормулаПредставление = ПланированиеКлиентСервер.ТекстУстановкиНовойФормулы(), "", СтруктураДанных.ФормулаПредставление));
ПараметрыФормы.Вставить("ИспользуетсяДеревоОперандов", Истина);
ПараметрыФормы.Вставить("ВыбиратьОперандПлана", Истина);
ПараметрыФормы.Вставить("ДеревоОперандов", ПоместитьДополнительныеПоляВХранилище());
ПараметрыФормы.Вставить("Операторы", АдресХранилищаДереваОператоров);
ПараметрыФормы.Вставить("КлючОбъектаСохраняемыхНастроек", "НастройкиРаботыПользователя" + ТипПлана);
ПараметрыФормы.Вставить("Отбор", ОтборПоказатели);
ПараметрыФормы.Вставить("ТипРезультата", Новый ОписаниеТипов("Число"));
ПараметрыФормы.Вставить("ФункцииИзОбщегоМодуля", ПланированиеКлиент.ФункцииИзОбщегоМодуля());
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОткрытияКонструктораУстановитьПроизвольнуюФормулу",ЭтотОбъект, СтруктураДанных);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("ОбщаяФорма.КонструкторФормул", ПараметрыФормы, ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_УстановитьПроизвольнуюФормулу(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтруктураДанных = Новый Структура("Формула,ФормулаПредставление,ПараметрыРасшифровки,ВключитьЗначение,МассивСтрок,ПериодИзменения");
МассивСтрок = Новый Массив();
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
МассивСтрок.Добавить(ТекущиеДанные.ПолучитьИдентификатор());
Для каждого Операнд Из ДополнительныеПоля Цикл
Операнд.Значение = ЭтотОбъект[Операнд.Идентификатор];
КонецЦикла;
ТекущийЭлементИмя = Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя;
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
Если АктивныеПериоды.Количество() > 1 Тогда
Если СтрНайти(ТекущийЭлементИмя, "ТоварыПоПериодам" + "Количество_") = 0
И НЕ Объект.ПланироватьПоСумме И СтрНайти(ТекущийЭлементИмя, "ТоварыПоПериодам" + "КартинкаКомментарий_") = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Активируйте колонку с периодом'"));
Возврат;
Иначе
Для каждого Период Из АктивныеПериоды Цикл
Если ТекущийЭлементИмя = "ТоварыПоПериодам" + "Количество_" + Период.ИмяКолонки
ИЛИ НЕ Объект.ПланироватьПоСумме И ТекущийЭлементИмя = "ТоварыПоПериодам" + "КартинкаКомментарий_" + Период.ИмяКолонки Тогда
СтруктураДанных.Формула = ТекущиеДанные["Формула_" + Период.ИмяКолонки];
СтруктураДанных.ФормулаПредставление = ТекущиеДанные["ФормулаПредставление_" + Период.ИмяКолонки];
СтруктураДанных.ПериодИзменения = Период.ИмяКолонки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
Для каждого Период Из АктивныеПериоды Цикл
СтруктураДанных.Формула = ТекущиеДанные["Формула_" + Период.ИмяКолонки];
СтруктураДанных.ФормулаПредставление = ТекущиеДанные["ФормулаПредставление_" + Период.ИмяКолонки];
СтруктураДанных.ПериодИзменения = Период.ИмяКолонки;
КонецЦикла;
КонецЕсли;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
МассивСтрок.Добавить(ТекущиеДанные.ПолучитьИдентификатор());
Для каждого Операнд Из ДополнительныеПоля Цикл
Если ТекущиеДанные.Свойство(Операнд.Идентификатор) Тогда
Операнд.Значение = ТекущиеДанные[Операнд.Идентификатор];
КонецЕсли;
КонецЦикла;
СтруктураДанных.Формула = ТекущиеДанные.Формула;
СтруктураДанных.ФормулаПредставление = ТекущиеДанные.ФормулаПредставление;
СтруктураДанных.ПериодИзменения = "ВсеПериоды";
КонецЕсли;
СтруктураДанных.ВключитьЗначение = Истина;
СтруктураДанных.МассивСтрок = МассивСтрок;
УстановитьПараметрыРасшифровки(СтруктураДанных);
УстановитьПроизвольнуюФормулу(СтруктураДанных);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытияКонструктораУстановитьПроизвольнуюФормулу(Результат, СтруктураДанных) Экспорт
МассивСтрок = СтруктураДанных.МассивСтрок;
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Возврат;
КонецЕсли;
Если Объект.КроссТаблица Тогда
Если СтруктураДанных.Свойство("ПериодИзменения") Тогда
ИмяПериода = СтруктураДанных.ПериодИзменения;
Иначе
ИмяПериода = "ВсеПериоды";
КонецЕсли;
Для каждого ИДСтроки Из МассивСтрок Цикл
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ИмяПериода <> "ВсеПериоды" Тогда
СтрокаТоваров = ТоварыПоПериодам.НайтиПоИдентификатору(ИДСтроки);
Если ИмяПериода = Период.ИмяКолонки Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Результат.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
ИначеЕсли ЗначениеЗаполнено(СтрокаТоваров["Формула_" + Период.ИмяКолонки]) И СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0 Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(СтрокаТоваров["Формула_" + Период.ИмяКолонки], СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
КонецЕсли;
ИначеЕсли ИмяПериода = "ВсеПериоды" Тогда
СтрокаТоваров = ТоварыПоПериодам.НайтиПоИдентификатору(ИДСтроки);
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Результат.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
КонецЦикла;
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Иначе
Для каждого ИДСтроки Из МассивСтрок Цикл
СтрокаТоваров = Объект.Товары.НайтиПоИдентификатору(ИДСтроки);
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, Неопределено, Неопределено, Результат.Представление);
СтрокаТоваров.Формула = Результат.Формула;
СтрокаТоваров.ФормулаПредставление = РезультатВычисления.Представление;
СтрокаТоваров.ФормулаВычисление = РезультатВычисления.Вычисление;
СтрокаТоваров.КоличествоУпаковок = РезультатВычисления.Результат;
СтрокаТоваров.Отклонение = 0;
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТоваров, КэшированныеЗначения);
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецЕсли;
Модифицированность = Истина;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьДопРеквизиты(Форма)
ДопРеквизиты = Новый Массив();
Если Форма.ДополнительныеПараметрыТоварыПоПериодам = Неопределено Тогда
Возврат ДопРеквизиты;
КонецЕсли;
Для каждого Поле Из Форма.ДополнительныеПараметрыТоварыПоПериодам Цикл
Если Поле.Значение.СоздаватьРеквизит Тогда
ДопРеквизиты.Добавить(Поле.Значение);
КонецЕсли;
КонецЦикла;
Возврат ДопРеквизиты;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьОперанды(Форма)
МассивОперандов = Новый Массив();
Если Форма.ДополнительныеПараметрыТоварыПоПериодам = Неопределено Тогда
Возврат МассивОперандов;
КонецЕсли;
Для каждого Поле Из Форма.ДополнительныеПараметрыТоварыПоПериодам Цикл
Если Поле.Значение.СоздаватьОперанд Тогда
МассивОперандов.Добавить(Поле.Значение);
КонецЕсли;
КонецЦикла;
Возврат МассивОперандов;
КонецФункции
&НаСервере
Функция ПоместитьДополнительныеПоляВХранилище()
Возврат Планирование.ПоместитьДополнительныеПоляВХранилище(ЭтаФорма, СтруктураНастроек.СмещениеПериода);
КонецФункции
&НаСервере
Процедура ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров)
Сценарий = Планирование.ПараметрыСценария(Объект.Сценарий);
ИспользоватьПланыПродаж = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПродаж")
И Сценарий.ИспользоватьВПланированииПродаж;
ИспользоватьПроизводство = ПолучитьФункциональнуюОпцию("ИспользоватьПроизводство");
ИспользоватьПланированиеПроизводства = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства")
И Сценарий.ИспользоватьВПланированииПроизводства;
ИспользоватьДляПланированияМатериалов = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства")
И Сценарий.ИспользоватьДляПланированияМатериалов;
ИспользоватьПланыЗакупок = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеЗакупок")
И Сценарий.ИспользоватьВПланированииЗакупок;
ИспользоватьПланыСборки = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеСборкиРазборки")
И Сценарий.ИспользоватьВПланированииСборкиРазборки;
ИспользоватьПланыОстатков = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеОстатков")
И Сценарий.ИспользоватьВПланированииОстатков;
ИспользоватьПланыВнутреннихПотреблений = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеВнутреннихПотреблений")
И Сценарий.ИспользоватьВПланированииВнутреннихПотреблений;
КонструкцияДляВставки = "[ПланыПродаж] * 1.15";
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'План продаж +15%'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = "Макс([ФактыПродаж], [ПланыПродаж])"
+ ?(ИспользоватьПланыОстатков, " - [ПланОстатков]",
?(ПланированиеПоНазначениям, " - [ФактическиеНачальныеОстатки]", " - [СвободныеОстатки]"));
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'План продаж с учетом корректировки по факту продаж'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = "[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]";
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Факт продаж с учетом наличия товаров на остатках'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "0")
+ ?(ИспользоватьПроизводство И ИспользоватьДляПланированияМатериалов, " + [ПланыПроизводстваМатериалы]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплектующие]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплекты]", "")
+ ?(ИспользоватьПланыВнутреннихПотреблений," + [ПланыВнутреннихПотреблений]","");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Планы потребностей'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
+ ?(ИспользоватьПроизводство И ИспользоватьПланированиеПроизводства, " + [ПланыПроизводства]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Планы обеспечения'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
+ ?(ИспользоватьПроизводство И ИспользоватьПланированиеПроизводства, " + [ПланыПроизводства]", "")
+ ?(ИспользоватьПроизводство И ИспользоватьДляПланированияМатериалов, " - [ПланыПроизводстваМатериалы]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "")
+ ?(ИспользоватьПланыПродаж, " - [ПланыПродаж]", "")
+ ?(ИспользоватьПланыСборки, " - [ПланыСборкиКомплектующие]", "")
+ ?(ИспользоватьПланыСборки, " - [ПланыРазборкиКомплекты]", "")
+ ?(ИспользоватьПланыВнутреннихПотреблений," - [ПланыВнутреннихПотреблений]","");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Отклонение планов'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = "ЗначениеКолонки(НомерТекущейКолонки() - 1)";
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Значение предыдущей колонки'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьФормулуИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Если СтруктураНастроек.ВариантЗаполненияСостава = "Отбор" Тогда
ТоварыПоПериодам.Очистить();
Объект.Товары.Очистить();
РассчитатьКоличествоСтрок(ЭтаФорма);
Оповещение = Новый ОписаниеОповещения("НастроитьФормулуИЗаполнитьЗавершение", ЭтотОбъект, Настройки);
ДобавитьТоварыПоОтборуНаКлиенте(Оповещение);
Возврат;
ИначеЕсли СтруктураНастроек.ВариантЗаполненияСостава = "НеМенять" Тогда
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
Иначе
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Настройки.Вставить("ЗаполнятьСостав", Истина);
ЗаполнитьДокумент(Настройки);
КонецЕсли;
Если Объект.КроссТаблица И Элементы.ТоварыПоПериодам.ТекущиеДанные = Неопределено Тогда
ПланированиеКлиентСервер.ОчиститьЗначениеФормулы(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьФормулуИЗаполнитьЗавершение(Результат, Настройки) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
Если Не Объект.КроссТаблица Тогда
ЗаполнитьСоставТовараПоОтбору(КэшированныеЗначения);
КонецЕсли;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецЕсли;
Если Объект.КроссТаблица И Элементы.ТоварыПоПериодам.ТекущиеДанные = Неопределено Тогда
ПланированиеКлиентСервер.ОчиститьЗначениеФормулы(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьСмещениеИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьЦеныИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ОбновлятьПоказатели", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
Если Настройки.Свойство("ЗаполнятьОперанды") Тогда
Настройки.Удалить("ЗаполнятьОперанды");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтборуНаКлиенте(ОповещениеОДобавлении = Неопределено)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Подбор товаров'"));
ПараметрыФормы.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
Если СтруктураНастроек.Свойство("ОтборНоменклатурыНастройки") Тогда
ПараметрыФормы.Вставить("ОтборНоменклатурыНастройки", СтруктураНастроек.ОтборНоменклатурыНастройки);
Иначе
ПараметрыФормы.Вставить("ОтборНоменклатурыНастройки", Неопределено)
КонецЕсли;
ДополнительныеПараметры = Новый Структура("ОповещениеОДобавлении", ОповещениеОДобавлении);
Оповещение = Новый ОписаниеОповещения("ДобавитьТоварыПоОтборуЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОткрытьФорму(
"Обработка.ПодборТоваровПоОтбору.Форма",
ПараметрыФормы,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтборуЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, Новый Структура("АдресТоваровВХранилище", Результат));
ОповеститьПользователяОЗаполненииДанных();
КонецЕсли;
Если ДополнительныеПараметры.ОповещениеОДобавлении <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОДобавлении, Результат);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСоставТовараПоОтбору(КэшированныеЗначения)
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
ТоварПоОтбору = Объект.Товары.Выгрузить();
Объект.Товары.Очистить();
Для каждого Период Из АктивныеПериоды Цикл
Для каждого СтрокаТовара Из ТоварПоОтбору Цикл
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
ТекущаяСтрока.ДатаОтгрузки = Период.ДатаНачала;
ТекущаяСтрока.Формула = СтруктураНастроек.Формула;
ТекущаяСтрока.ФормулаПредставление = СтруктураНастроек.ФормулаПредставление;
ТекущаяСтрока.ФормулаВычисление = СтруктураНастроек.Формула;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПараметрыРасшифровки(СтруктураДанных)
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
КонецЕсли;
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланПродаж");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ОтборПоказатели.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
ОтборПоказатели.Вставить("Характеристика", ТекущиеДанные.Характеристика);
ПараметрыЗапроса = Новый Структура();
ПараметрыЗапроса.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗапроса.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗапроса.Вставить("СмещениеПериода", ДополнительныеНастройки(СтруктураНастроек).СмещениеПериода);
ПараметрыЗапроса.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗапроса.Вставить("Поля", ДополнительныеПараметрыТоварыПоПериодам);
ПараметрыЗапроса.Вставить("Отбор", ОтборПоказатели);
УстановитьПериодЗапроса(ПараметрыЗапроса);
СтруктураДанных.Вставить("ПараметрыРасшифровки", ПараметрыЗапроса);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПериодЗапроса(ПараметрыЗапроса)
Если Объект.КроссТаблица Тогда
ТекущийЭлементИмя = Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя;
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ТекущийЭлементИмя = "ТоварыПоПериодам" + "Количество_" + Период.ИмяКолонки Тогда
ПараметрыЗапроса.Вставить("НачалоПериодаСмещения", Период.ДатаНачала);
ПараметрыЗапроса.Вставить("КонецПериодаСмещения", Период.ДатаОкончания);
КонецЕсли;
КонецЦикла;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ТаблицаПериоды = ЭтаФорма.Периоды;
МассивСтрок = ТаблицаПериоды.НайтиСтроки(Новый Структура("ДатаНачала, Активная", ТекущиеДанные.ДатаОтгрузки, Истина));
Если МассивСтрок.Количество() > 0 Тогда
ПараметрыЗапроса.Вставить("НачалоПериодаСмещения", МассивСтрок[0].ДатаНачала);
ПараметрыЗапроса.Вставить("КонецПериодаСмещения", МассивСтрок[0].ДатаОкончания);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля = Неопределено)
Если НЕ ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
СтруктураНастроек = Новый Структура();
СтруктураНастроек.Вставить("ВариантЗаполненияСостава", "Отбор");
СтруктураНастроек.Вставить("ВариантСмещения", "ПредыдущийПериод");
СтруктураНастроек.Вставить("СмещениеПериода", -1);
СтруктураНастроек.Вставить("ВариантЗаполненияЦен", "ЦеныНоменклатуры");
СтруктураНастроек.Вставить("ВидЦены",);
СтруктураНастроек.Вставить("ИспользоватьВидЦены", Ложь);
СтруктураНастроек.Вставить("Формула","[ПланыПродаж] * 1.15");
СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru='Увеличение планов продаж прошлых периодов на 15%'"));
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
Иначе
Если СтруктураНастроек.Свойство("Смещение") Тогда
СтруктураНастроек.Вставить("СмещениеПериода", -1 * СтруктураНастроек.Смещение);
СтруктураНастроек.Удалить("Смещение");
КонецЕсли;
Если СтруктураНастроек.Свойство("ВариантЗаполненияЦен") И СтруктураНастроек.ВариантЗаполненияЦен = "ВидЦены" Тогда
СтруктураНастроек.Вставить("ВариантЗаполненияЦен", "ЦеныНоменклатуры");
КонецЕсли;
Если ДополнительныеПоля <> Неопределено Тогда
МассивОперандов = Новый Массив;
Для Каждого ТекСтрока Из ДополнительныеПоля Цикл
МассивОперандов.Добавить(ТекСтрока.Идентификатор);
КонецЦикла;
ТипРезультата = Новый ОписаниеТипов("Число");
#Если Клиент Тогда
ПараметрыПроверки = РаботаСФормуламиКлиент.ПараметрыПроверкиФормулы();
ПараметрыПроверки.НеВыводитьСообщения = Истина;
РаботаСФормуламиПроверитьФормулу = РаботаСФормуламиКлиент.ПроверитьФормулу(СтруктураНастроек.Формула,
МассивОперандов, ТипРезультата, ПараметрыПроверки);
#Иначе
ПараметрыПроверки = РаботаСФормулами.ПараметрыПроверкиФормулы();
ПараметрыПроверки.НеВыводитьСообщения = Истина;
РаботаСФормуламиПроверитьФормулу = РаботаСФормулами.ПроверитьФормулу(СтруктураНастроек.Формула,
МассивОперандов, ТипРезультата, ПараметрыПроверки);
#КонецЕсли
Если Не РаботаСФормуламиПроверитьФормулу Тогда
СтруктураНастроек.Вставить("Формула","[ПланыПродаж] * 1.15");
СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru='Увеличение планов продаж прошлых периодов на 15%'"));
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не СтруктураНастроек.Свойство("ФильтроватьНезаполненныеСтроки") Тогда
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
КонецЕсли;
Возврат СтруктураНастроек;
КонецФункции
&НаСервере
Процедура ЗаписатьДополнительныеПараметры(ДокументОбъект)
МассивДопРеквизитов = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ТекущаяСтрока Из ДокументОбъект.Товары Цикл
ЭлементКоллекции = Объект.Товары.Получить(ТекущаяСтрока.НомерСтроки-1);
Если ЭлементКоллекции = Неопределено Тогда
Продолжить;
КонецЕсли;
ДопПараметр = ТекущаяСтрока.ДополнительныеПараметры.Получить();
Если ТипЗнч(ДопПараметр) <> Тип("Структура") Тогда
ДопПараметр = Новый Структура();
КонецЕсли;
Для каждого ДопРеквизит Из МассивДопРеквизитов Цикл
Идентификатор = ДопРеквизит.Имя;
Если ЭлементКоллекции.Свойство(Идентификатор) Тогда
ДопПараметр.Вставить(Идентификатор,ЭлементКоллекции[Идентификатор]);
КонецЕсли;
КонецЦикла;
ТекущаяСтрока.ДополнительныеПараметры = Новый ХранилищеЗначения(ДопПараметр);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьДополнительныеПараметры(ДокументОбъект)
Для каждого ТекущаяСтрока Из ДокументОбъект.Товары Цикл
ЭлементКоллекции = Объект.Товары.Получить(ТекущаяСтрока.НомерСтроки-1);
Если ЭлементКоллекции = Неопределено Тогда
Продолжить;
КонецЕсли;
ДопРеквизиты = ТекущаяСтрока.ДополнительныеПараметры.Получить();
Если ТипЗнч(ДопРеквизиты) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
Идентификатор = ДопРеквизит.Ключ;
Если ЭлементКоллекции.Свойство(Идентификатор) Тогда
ЭлементКоллекции[Идентификатор] = ДопРеквизит.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ПересчитатьКоличествоУпаковокИСуммуВСтроке(ТекущаяСтрока, КэшированныеЗначения)
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ПересчитатьСумму");
#Если Клиент Тогда
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
#Иначе
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииКоличестваОтклонение(СтрокаТоваров)
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Не ЗначениеЗаполнено(СтрокаТоваров["Формула_" + Период.ИмяКолонки]) Тогда
Продолжить;
КонецЕсли;
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(СтрокаТоваров["Формула_" + Период.ИмяКолонки], СтрокаТоваров, ЭтаФорма.Периоды, Период);
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Количество_" + Период.ИмяКолонки Тогда
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = РезультатВычисления.Результат - СтрокаТоваров["Количество_" + Период.ИмяКолонки];
ИначеЕсли СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0 Тогда
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
КонецЕсли;
КонецЦикла;
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтруктуруВыводаДопПараметров()
ПараметрыВыводаТаблицы = Новый Структура("Поля", ДополнительныеПараметрыТовары);
Планирование.ОбновитьСтруктуруВыводаТаблицы(ЭтотОбъект, ПараметрыВыводаТаблицы);
ПараметрыВыводаКроссТаблицы = Новый Структура("Поля", ДополнительныеПараметрыТоварыПоПериодам);
Планирование.ОбновитьСтруктуруВыводаТаблицы(ЭтотОбъект, ПараметрыВыводаКроссТаблицы);
КонецПроцедуры
&НаСервере
Процедура ДобавитьПоляИзДопПараметров(ПараметрыВывода)
ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
СтруктураПоля = Новый Структура;
СтруктураПоля.Вставить("ПрефиксРеквизитаКолонки", ДопРеквизит.Имя + "_");
СтруктураПоля.Вставить("УдалятьРеквизитыТаблицы", ДопРеквизит.УдалятьРеквизитыТаблицы);
СтруктураПоля.Вставить("СоздаватьЭлемент", Ложь);
СтруктураПоля.Вставить("ТипЭлемента", ДопРеквизит.Тип);
СтруктураПоля.Вставить("СоздаватьИтоговыеРеквизиты", Ложь);
ПараметрыВывода.Поля.Добавить(СтруктураПоля);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ДобавитьРеквизитыИзДопПараметров(СтруктураРеквизитов)
ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
СтруктураРеквизитов.Вставить(ДопРеквизит.Имя + "_", ДопРеквизит.Имя);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВКолонкиЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ОчиститьСообщения();
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВСтрокиЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ПереключитьПериодыВСтроки(Неопределено);
КонецПроцедуры
&НаСервере
Процедура ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения)
Объект.КроссТаблица = Истина;
ПриИзмененииПериодовНаСервере();
СкопироватьВКроссТаблицу(КэшированныеЗначения);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПометкуКроссТаблицы(Форма)
Если Форма.Объект.КроссТаблица Тогда
Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Истина;
Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Ложь;
Форма.Элементы.ГруппаТоварыПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаТоварыКроссТаблица;
Иначе
Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Ложь;
Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Истина;
Форма.Элементы.ГруппаТоварыПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаТоварыТаблица;
Форма.ИтогоПоСтрокеКолонке = "";
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьКоличествоСтрок(Форма)
Если Форма.Объект.КроссТаблица Тогда
Форма.ТоварыКоличествоСтрок = Форма.ТоварыПоПериодам.Количество();
Иначе
Форма.ТоварыКоличествоСтрок = Форма.Объект.Товары.Количество();
КонецЕсли;
Если Форма.ТоварыКоличествоСтрок = 0 Тогда
Форма.Расшифровка = "";
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыВидаПлана(Форма)
ПараметрыВидаПлана = Новый Структура("ЗаполнятьПодразделение, ЗаполнятьПартнера, ЗаполнятьСоглашение, ЗаполнятьСклад,
|ЗаполнятьМенеджера, ЗаполнятьФорматМагазина, ПланированиеПоНазначениям, ЗаполнятьНазначениеВТЧ, ЗаполнятьПартнераВТЧ, ЗаполнятьСоглашениеВТЧ, ЗаполнятьСкладВТЧ");
ЗаполнитьЗначенияСвойств(ПараметрыВидаПлана, Форма);
Возврат ПараметрыВидаПлана;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыОтбора(Форма)
ПараметрыОтбора = Новый Структура("Партнер, Соглашение, Склад, Подразделение, Менеджер, ФорматМагазина, ПланированиеПоНазначениям, Назначение");
ЗаполнитьЗначенияСвойств(ПараметрыОтбора, Форма.Объект);
Возврат ПараметрыОтбора;
КонецФункции
#Область ЗаполнениеВФоне
&НаКлиенте
Процедура ЗаполнитьДокумент(Настройки)
ОповеститьПользователяОНачалеЗаполненииДанных();
Результат = ЗаполнитьДокументНаСервере(Настройки, КэшированныеЗначения);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗаполнитьДокументОповещение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДокументОповещение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
Попытка
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения);
Если Объект.ЗаполнятьПоФормуле
И Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(
ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
ОповеститьПользователяОЗаполненииДанных();
Исключение
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОбработатьРезультатЗаполненияПоФормуле(Форма)
ПоследнийПериод = Форма.Периоды[Форма.Периоды.Количество()-1];
УдаляемыеСтроки = Новый Массив;
ПредыдущийПериод = Неопределено;
ЗнакКорректировки = Планирование.ПолучитьЗнакКорректировки(Форма);
Если Форма.Объект.Замещающий Тогда
ОсновнойОперандПлана = Планирование.ОсновнойОперандПлана(Форма);
ОсновнойОперандПланаСОтбором = Планирование.ОсновнойОперандПлана(Форма, Истина);
Иначе
ОсновнойОперандПлана = "";
ОсновнойОперандПланаСОтбором = "";
КонецЕсли;
ТаблицаПериоды = Форма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Для Каждого СтрокаТоваров Из Форма.ТоварыПоПериодам Цикл
Если Форма.ИспользуютсяПланируемыеОстатки Тогда
НовыйПланОстатков = Форма.ПериодыПлановОстатка.НайтиПоЗначению(Период.ДатаНачала) <> Неопределено;
НовыйПланОстатковСОтбором = Форма.ПериодыПлановОстаткаСОтбором.НайтиПоЗначению(Период.ДатаНачала) <> Неопределено;
Планирование.ВычислитьРассчитываемыеОперанды(СтрокаТоваров, Период, ПредыдущийПериод, НовыйПланОстатков, "_", ОсновнойОперандПлана, ЗнакКорректировки);
Планирование.ВычислитьРассчитываемыеОперанды(СтрокаТоваров, Период, ПредыдущийПериод, НовыйПланОстатковСОтбором, "СОтбором_", ОсновнойОперандПланаСОтбором, ЗнакКорректировки);
КонецЕсли;
Если Период.Активная Тогда
РезультатВычисления = Планирование.ВычислитьПоФормуле(Форма.СтруктураНастроек.Формула, СтрокаТоваров, Форма.Периоды, Период, Форма.СтруктураНастроек.ФормулаПредставление);
Если Форма.ИспользуютсяПланируемыеОстатки Тогда
СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицит_"+Период.ИмяКолонки] = СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицит_"+Период.ИмяКолонки]
+ ЗнакКорректировки * РезультатВычисления.Результат;
Если СтрокаТоваров.Свойство("НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки) Тогда
СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки] = СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки]
+ ЗнакКорректировки * РезультатВычисления.Результат;
КонецЕсли;
КонецЕсли;
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Форма.СтруктураНастроек.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Форма.Объект, Форма, СтрокаТоваров);
КонецЕсли;
Если Период = ПоследнийПериод
И СтрокаТоваров.КоличествоУпаковок = 0 Тогда
УдаляемыеСтроки.Добавить(СтрокаТоваров);
КонецЕсли;
КонецЦикла;
ПредыдущийПериод = Период;
КонецЦикла;
Если Форма.СтруктураНастроек.ВариантЗаполненияСостава = "Формула"
Или Форма.СтруктураНастроек.ФильтроватьНезаполненныеСтроки Тогда
Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл
Форма.ТоварыПоПериодам.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДокументНаСервере(Знач ПараметрыЗадания, КэшированныеЗначения)
Если ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле") Тогда
ПодготовитьПараметрыЗаполненияДокументаПоФормуле(ПараметрыЗадания, КэшированныеЗначения);
ИначеЕсли ПараметрыЗадания.Свойство("ЗаполнятьПоПравилу") Тогда
ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения);
ИначеЕсли ПараметрыЗадания.Свойство("ЗаполнитьДляЗамещения") Тогда
ПодготовитьПараметрыЗаполненияДокументаДляЗамещения(ПараметрыЗадания, КэшированныеЗначения);
КонецЕсли;
НаименованиеЗадания = НСтр("ru = 'Заполнение документа плана:'") + " " + Строка(Объект.Ссылка);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыВыполнения.ОжидатьЗавершение = 0;
ПараметрыВыполнения.ДополнительныйРезультат = ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле");
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
Результат = ДлительныеОперации.ВыполнитьВФоне(
"Документы.ПланПродаж.ЗаполнитьДокумент",
ПараметрыЗадания,
ПараметрыВыполнения);
АдресХранилища = Результат.АдресРезультата;
Если ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле") Тогда
АдресХранилищаДополнительный = Результат.АдресДополнительногоРезультата;
Иначе
АдресХранилищаДополнительный = "";
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция ПодготовитьПараметрыЗаполненияДокументаДляЗамещения(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ТипПлана = Перечисления.ТипыПланов.ПланПродаж;
СтатусыЗаполнения = Планирование.ПолучитьСтатусыЗаполнения(Объект.Сценарий);
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Статусы", СтатусыЗаполнения);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоПериодаСмещения", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("КонецПериодаСмещения", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("ТипПлана", ТипПлана);
ПараметрыЗадания.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("Партнер", Объект.Партнер);
ПараметрыЗадания.Вставить("Соглашение", Объект.Соглашение);
ПараметрыЗадания.Вставить("Менеджер", Объект.Менеджер);
ПараметрыЗадания.Вставить("ФорматМагазина", Объект.ФорматМагазина);
ПараметрыЗадания.Вставить("ЗаполнятьНазначениеВТЧ",
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидПлана,"ЗаполнятьНазначениеВТЧ"));
ПараметрыЗадания.Вставить("Назначение", Объект.Назначение);
ПараметрыЗадания.Вставить("ЗаполнитьДляЗамещения", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланПродаж");
ПараметрыЗадания.Вставить("ИмяКолонкиРезультата", "КоличествоУпаковок");
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Настройки = Новый Структура;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецФункции
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоФормуле(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ТипПлана = Перечисления.ТипыПланов.ПланПродаж;
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоАктивныхПериодов", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("НачалоПериодаСмещения", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("КонецПериодаСмещения", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("НеПереопределено", Истина);
ПараметрыЗадания.Вставить("ТипПлана", ТипПлана);
ПараметрыЗадания.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("Партнер", Объект.Партнер);
ПараметрыЗадания.Вставить("Соглашение", Объект.Соглашение);
ПараметрыЗадания.Вставить("Менеджер", Объект.Менеджер);
ПараметрыЗадания.Вставить("ФорматМагазина", Объект.ФорматМагазина);
ПараметрыЗадания.Вставить("ЗаполнятьПоФормуле", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланПродаж");
ПараметрыЗадания.Вставить("ИмяКолонкиРезультата", "КоличествоУпаковок");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ПараметрыПартнера = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Партнер, "Поставщик, Клиент");
ПараметрыОтбора.Вставить("Поставщик", ПараметрыПартнера.Поставщик);
ПараметрыОтбора.Вставить("Клиент", ПараметрыПартнера.Клиент);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыЗадания.Вставить("Отбор", ОтборПоказатели);
МассивИменНаборов = Новый Массив();
Если ПараметрыЗадания.Свойство("ЗаполнятьОперанды") Тогда
МассивОператоров = ПолучитьОперанды(ЭтотОбъект);
Для каждого Элемент Из МассивОператоров Цикл
МассивИменНаборов.Добавить(Элемент.Имя);
КонецЦикла;
КонецЕсли;
ПараметрыЗадания.Вставить("МассивИменНаборов", МассивИменНаборов);
Если Объект.ПланироватьПоСумме
И (ПараметрыЗадания.ИспользоватьВидЦены
ИЛИ ЗначениеЗаполнено(ПараметрыЗадания.ВариантЗаполненияЦен)) Тогда
ПараметрыЗадания.Вставить("Валюта", Объект.Валюта);
ПараметрыЗадания.Вставить("ВидЦены", ДополнительныеНастройки(СтруктураНастроек).ВидЦены);
МассивИменНаборов = Новый Массив();
Если (СтруктураНастроек.ВариантЗаполненияЦен = "ЦеныНоменклатуры"
ИЛИ СтруктураНастроек.ИспользоватьВидЦены)
И ЗначениеЗаполнено(СтруктураНастроек.ВидЦены) Тогда
МассивИменНаборов.Добавить("ЦеныНоменклатуры");
ПараметрыЗадания.Вставить("МассивИменНаборовПрисоединения", МассивИменНаборов);
ПараметрыЗадания.Вставить("ОбновлятьПоказатели", Истина);
КонецЕсли;
КонецЕсли;
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Если ПараметрыЗадания.Свойство("ЗаполнятьСостав") Тогда
ЗаполняемаяТЧ.Очистить();
МассивИменНаборов = Новый Массив();
Если ПараметрыЗадания.ВариантЗаполненияСостава = "Формула" Тогда
МассивИменНаборов = ПланированиеКлиентСервер.ОперандыТекстовойФормулы(ПараметрыЗадания.Формула);
Иначе
МассивИменНаборов.Добавить(ПараметрыЗадания.ВариантЗаполненияСостава);
КонецЕсли;
ПараметрыЗадания.Вставить("МассивИменНаборовЗаполнения", МассивИменНаборов);
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецПроцедуры
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения)
Если Объект.ОбновитьДополнить <> 0 Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("ИзменитьРезультатНа", Объект.ИзменитьРезультатНа);
ПараметрыЗадания.Вставить("ТочностьОкругления", Объект.ТочностьОкругления);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("РаспределитьПоРабочимДням", Объект.РаспределитьПоРабочимДням);
ПараметрыЗадания.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("Партнер", Объект.Партнер);
ПараметрыЗадания.Вставить("Соглашение", Объект.Соглашение);
ПараметрыЗадания.Вставить("Менеджер", Объект.Менеджер);
ПараметрыЗадания.Вставить("ФорматМагазина", Объект.ФорматМагазина);
ПараметрыЗадания.Вставить("Назначение", Объект.Назначение);
ПараметрыЗадания.Вставить("ЗаполнятьПоПравилу", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланПродаж");
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Если Объект.ОбновитьДополнить = 0 Тогда
ЗаполняемаяТЧ.Очистить();
КонецЕсли;
Если НЕ ОтборУстановлен Тогда
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборЗначения = ПланированиеКлиентСервер.ОтборДляВыборки(ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыЗадания.Вставить("Отбор", ОтборЗначения);
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ПравилоЗаполнения", ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Настройки.Вставить("ПользовательскиеНастройки", ПолучитьИзВременногоХранилища(АдресПользовательскихНастроек));
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецПроцедуры
&НаСервере
Функция ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения)
Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Документ.ПланПродаж.Формы.ФормаДокумента.ПолучитьРезультатЗаполненияНаСервере");
Таблица = ПолучитьИзВременногоХранилища(АдресХранилища);
КоличествоОбработанныхСтрок = Таблица.Количество();
Объект.Товары.Загрузить(Таблица);
ИспользуютсяПланируемыеОстатки = Таблица.Колонки.Найти("ПланируемыеНачальныеОстатки") <> Неопределено;
ИспользуютсяПланируемыеОстаткиСОтбором = Таблица.Колонки.Найти("ПланируемыеНачальныеОстаткиСОтбором") <> Неопределено;
Если ИспользуютсяПланируемыеОстатки Тогда
ПериодыПлановОстатка.Очистить();
ПериодыПлановОстаткаСОтбором.Очистить();
Для Каждого Строка Из Таблица Цикл
Если Строка.ПланируемыеНачальныеОстатки<>0 Тогда
Если ПериодыПлановОстатка.НайтиПоЗначению(Строка.ДатаОтгрузки) = Неопределено Тогда
ПериодыПлановОстатка.Добавить(Строка.ДатаОтгрузки);
КонецЕсли;
КонецЕсли;
Если ИспользуютсяПланируемыеОстаткиСОтбором
И Строка.ПланируемыеНачальныеОстаткиСОтбором<>0 Тогда
Если ПериодыПлановОстаткаСОтбором.НайтиПоЗначению(Строка.ДатаОтгрузки) = Неопределено Тогда
ПериодыПлановОстаткаСОтбором.Добавить(Строка.ДатаОтгрузки);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(АдресХранилищаДополнительный)
И ПолучитьИзВременногоХранилища(АдресХранилищаДополнительный) <> Неопределено Тогда
ТаблицаПериоды = ПолучитьИзВременногоХранилища(АдресХранилищаДополнительный);
Иначе
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
КонецЕсли;
ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, Ложь);
ОценкаПроизводительности.ЗафиксироватьЗамерДлительнойОперации(Замер,
ЭтаФорма.ПолучитьРеквизиты("ТоварыПоПериодам").Количество()/10,
"ОбновитьСтруктуруКроссТаблицы");
СкопироватьВКроссТаблицу(КэшированныеЗначения);
Объект.ЗаполненоАвтоматически = Истина;
Если Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки Тогда
Товары = ТоварыПоПериодам;
Иначе
Товары = Объект.Товары;
КонецЕсли;
ОтборПоТипуНоменклатуры = НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь);
Индекс = Товары.Количество();
Пока Индекс > 0 Цикл
Индекс = Индекс -1;
СтрокаТЧ = Товары[Индекс];
Если ОтборПоТипуНоменклатуры.Найти(СтрокаТЧ.ТипНоменклатуры) = Неопределено Тогда
Товары.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
ЗначенияБылиПересчитаны = Ложь;
Если Объект.ЗаполнятьПоФормуле
И СтруктураНастроек <> Неопределено
И (ИспользуютсяПланируемыеОстатки
Или (Объект.КроссТаблица
И (СтрНайти(СтруктураНастроек.Формула,"НомерТекущейКолонки") <> 0
Или СтрНайти(СтруктураНастроек.Формула,"ЗначениеКолонки") <> 0))) Тогда
ЗначенияБылиПересчитаны = Истина;
ОбработатьРезультатЗаполненияПоФормуле(ЭтаФорма);
ИначеЕсли СтруктураНастроек.ФильтроватьНезаполненныеСтроки Тогда
УдаляемыеСтроки = Новый Массив;
Для Каждого СтрокаТоваров Из Товары Цикл
Если СтрокаТоваров.КоличествоУпаковок = 0 Тогда
УдаляемыеСтроки.Добавить(СтрокаТоваров);
КонецЕсли;
КонецЦикла;
Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл
Товары.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЕсли;
Если Не Объект.КроссТаблица Тогда
Если ИспользуютсяПланируемыеОстатки Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
Иначе
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Объект.Товары, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
КонецЕсли;
Если Не Объект.КроссТаблица Или ЗначенияБылиПересчитаны Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
ИспользуютсяПланируемыеОстатки = Ложь;
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанныхСтрок/10);
КонецФункции
&НаКлиенте
Процедура СценарийПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
СценарийПриИзмененииСервер();
КонецПроцедуры
&НаКлиенте
Процедура ВидПланаПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
ВидПланаПриИзмененииСервер(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЯчейкаОтмененаПриИзменении(Элемент)
УстановитьОтменуИКомментарийЯчейки();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеПриИзменении(Элемент)
УстановитьОтменуИКомментарийЯчейки();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Оповещение = Новый ОписаниеОповещения("КомментарийКЯчейкеНачалоВыбораЗавершение", ЭтотОбъект);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru='Комментарий ячейки плана'"));
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийПриИзменении(Элемент)
Элементы.Товары.ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(Элементы.Товары.ТекущиеДанные.Комментарий);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока", Элементы.Товары.ТекущаяСтрока);
Оповещение = Новый ОписаниеОповещения("ТоварыКомментарийНачалоВыбораЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru='Комментарий ячейки плана'"));
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
ТекущиеДанные.Комментарий = ВведенныйТекст;
ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(ВведенныйТекст);
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииОтменено(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииКомментария(Элемент)
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И Элементы.ТоварыПоПериодам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Комментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ТекущиеДанные["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(КомментарийКЯчейке);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_НачалоВыбораКомментария(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
СтандартнаяОбработка = Ложь;
Если ТекущиеДанные <> Неопределено И Элементы.ТоварыПоПериодам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Комментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока, ИмяКолонки",
Элементы.ТоварыПоПериодам.ТекущаяСтрока,
Период.ИмяКолонки);
Оповещение = Новый ОписаниеОповещения("Подключаемый_НачалоВыбораКомментарияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
КомментарийКЯчейке,
НСтр("ru='Комментарий ячейки плана'"));
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_НачалоВыбораКомментарияЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = ТоварыПоПериодам.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
ТекущиеДанные["Комментарий_"+ ДополнительныеПараметры.ИмяКолонки] = ВведенныйТекст;
ТекущиеДанные["КартинкаКомментарий_"+ ДополнительныеПараметры.ИмяКолонки] = ЗначениеЗаполнено(ТекущиеДанные["Комментарий_"+ ДополнительныеПараметры.ИмяКолонки]);
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыКомментарийПриИзменении(Элемент)
Элементы.ПланОплаты.ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(Элементы.ПланОплаты.ТекущиеДанные.Комментарий);
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыКомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока", Элементы.ПланОплаты.ТекущаяСтрока);
Оповещение = Новый ОписаниеОповещения("ПланОплатыКомментарийНачалоВыбораЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru='Комментарий'"));
КонецПроцедуры
&НаКлиенте
Процедура ПланОплатыКомментарийНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Объект.ПланОплаты.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
ТекущиеДанные.Комментарий = ВведенныйТекст;
ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(ВведенныйТекст);
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьФлагОтменыСтрокПлана(Команда)
Оповещение = Новый ОписаниеОповещения("ИзменитьФлагОтменыСтрокПланаЗавершение", ЭтотОбъект);
Если Объект.КроссТаблица Тогда
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, ТоварыПоПериодам, "ТоварыПоПериодам", Оповещение);
Иначе
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, Объект.Товары, "Товары", Оповещение);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПланаОплаты()
Если НЕ Объект.ЗаполнятьПланОплат Тогда
Возврат;
КонецЕсли;
Для каждого СтрокаТЧ Из Объект.ПланОплаты Цикл
СтрокаТЧ.КартинкаКомментарий = ЗначениеЗаполнено(СтрокаТЧ.Комментарий);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура УстановитьОтменуИКомментарийЯчейки()
ЯчейкаНайдена = Ложь;
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
Возврат;
КонецЕсли;
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Цена_"+Период.ИмяКолонки
ИЛИ Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки
ИЛИ Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Сумма_"+Период.ИмяКолонки Тогда
ТекущиеДанные["Отменено_"+ Период.ИмяКолонки] = ЯчейкаОтменена;
ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки] = КомментарийКЯчейке;
ТекущиеДанные["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(КомментарийКЯчейке);
ЯчейкаНайдена = Истина;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ ЯчейкаНайдена Тогда
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
КонецЕсли;
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
КомментарийКЯчейке = ВведенныйТекст;
Модифицированность = Истина;
КомментарийКЯчейкеПриИзменении(Элементы.КомментарийКЯчейке);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьФлагОтменыСтрокПланаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат
КонецЕсли;
Если Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.ТоварыПоПериодам.ВыделенныеСтроки;
Иначе
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
КонецЕсли;
Если ВыделенныеСтроки.Количество() > 0 Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьНаПроцентЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено
ИЛИ Результат = 0
ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ВыделеннаяСтрока);
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТЧ, КэшированныеЗначения);
КонецЦикла;
Иначе
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОкруглитьКоличествоЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено
ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ВыделеннаяСтрока);
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТЧ, КэшированныеЗначения);
КонецЦикла;
Иначе
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Функция ПроверитьЗаполнениеШапки()
ОчиститьСообщения();
ЗаполненоКорректно = Истина;
Если НЕ ЗначениеЗаполнено(Объект.Сценарий) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Сценарий"" не заполнено'"),
Объект.Ссылка,
"Объект.Сценарий");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Вид плана"" не заполнено'"),
Объект.Ссылка,
"Объект.ВидПлана");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьПодразделение И НЕ ЗначениеЗаполнено(Объект.Подразделение) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Подразделение"" не заполнено'"),
Объект.Ссылка,
"Объект.Подразделение");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьПартнера И НЕ ЗначениеЗаполнено(Объект.Партнер) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Клиент"" не заполнено'"),
Объект.Ссылка,
"Объект.Партнер");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьСоглашение И НЕ ЗначениеЗаполнено(Объект.Соглашение) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Соглашение"" не заполнено'"),
Объект.Ссылка,
"Объект.Соглашение");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьСклад И НЕ ЗначениеЗаполнено(Объект.Склад) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Склад"" не заполнено'"),
Объект.Ссылка,
"Объект.Склад");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьМенеджера И НЕ ЗначениеЗаполнено(Объект.Менеджер) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Менеджер"" не заполнено'"),
Объект.Ссылка,
"Объект.Менеджер");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьФорматМагазина И НЕ ЗначениеЗаполнено(Объект.ФорматМагазина) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Формат магазина"" не заполнено'"),
Объект.Ссылка,
"Объект.ФорматМагазина");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)).Количество() = 0 Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Параметры периода заданы неверно. Заполнение невозможно'"),
Объект.Ссылка);
ЗаполненоКорректно = Ложь;
КонецЕсли;
Возврат ЗаполненоКорректно;
КонецФункции
#КонецОбласти
&НаСервере
Процедура УдалитьПустыеСтрокиНаСервере()
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
НеобходимоПересчитыватьИтоги = Ложь;
Индекс = ТоварыПоПериодам.Количество() -1;
Пока Индекс >= 0 Цикл
СтрокаТЧ = ТоварыПоПериодам[Индекс];
Если СтрокаТЧ.КоличествоУпаковок <> 0 Тогда
Индекс = Индекс - 1;
Продолжить;
КонецЕсли;
ЭтоПустаяСтрока = Истина;
Для каждого Период Из АктивныеПериоды Цикл
Если СтрокаТЧ["Количество_"+Период.ИмяКолонки] <> 0 Тогда
ЭтоПустаяСтрока = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоПустаяСтрока Тогда
ТоварыПоПериодам.Удалить(Индекс);
НеобходимоПересчитыватьИтоги = Истина;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Если НеобходимоПересчитыватьИтоги Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамПриАктивизацииЯчейкиНаКлиенте()
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Если АктивныеПериоды.Количество() = 1 Тогда
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущиеДанные <> Неопределено Тогда
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущиеДанные, "Расшифровка_" + АктивныеПериоды[0].ИмяКолонки);
КонецЕсли;
Возврат;
КонецЕсли;
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
ЯчейкаНайдена = Ложь;
Элемент = Элементы.ТоварыПоПериодам;
Если ТекущиеДанные = Неопределено Тогда
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
Возврат;
КонецЕсли;
ИтогоПоКолонке = "";
ИтогоПоСтроке = НСтр("ru='Всего по строке: %СуммаПоСтроке% %Валюта%.'");
ИтогоПоСтроке = СтрЗаменить(ИтогоПоСтроке, "%Валюта%", Строка(Объект.Валюта));
ИтогоПоСтроке = СтрЗаменить(ИтогоПоСтроке, "%СуммаПоСтроке%", Формат(ТекущиеДанные.Сумма, "ЧДЦ=2; ЧН=0,00"));
Если Элемент.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из АктивныеПериоды Цикл
Если Элемент.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Цена_"+Период.ИмяКолонки
ИЛИ Элемент.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки
ИЛИ Элемент.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Сумма_"+Период.ИмяКолонки Тогда
Если Объект.ПланироватьПоСумме Тогда
СуммаПоКолонке = ЭтаФорма["ТоварыПоПериодам" + "Сумма_"+ Период.ИмяКолонки];
ИтогоПоКолонке = НСтр("ru='Всего за период %ПериодЗаголовок%: %СуммаПоКолонке% %Валюта%'");
ИтогоПоКолонке = СтрЗаменить(ИтогоПоКолонке, "%ПериодЗаголовок%", Период.Заголовок);
ИтогоПоКолонке = СтрЗаменить(ИтогоПоКолонке, "%СуммаПоКолонке%", Формат(СуммаПоКолонке, "ЧДЦ=2; ЧН=0,00"));
ИтогоПоКолонке = СтрЗаменить(ИтогоПоКолонке, "%Валюта%", Строка(Объект.Валюта));
КонецЕсли;
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущиеДанные["Количество_"+ Период.ИмяКолонки] <> 0 Тогда
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущиеДанные, "Расшифровка_"+ Период.ИмяКолонки);
Иначе
Расшифровка = "";
КонецЕсли;
ЯчейкаНайдена = Истина;
Прервать;
Иначе
Расшифровка = "";
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИтогоПоСтрокеКолонке = ИтогоПоСтроке + " " + ИтогоПоКолонке;
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
КонецПроцедуры
#Область ЗамещениеПланов
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыЗамещения(Знач Объект)
ПараметрыЗамещения = Новый Структура;
ПараметрыЗамещения.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗамещения.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗамещения.Вставить("Статус", Объект.Статус);
ПараметрыЗамещения.Вставить("Дата", Объект.Дата);
ПараметрыЗамещения.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыЗамещения.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ПараметрыЗамещения.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗамещения.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗамещения.Вставить("Партнер", Объект.Партнер);
ПараметрыЗамещения.Вставить("Соглашение", Объект.Соглашение);
ПараметрыЗамещения.Вставить("Склад", Объект.Склад);
ПараметрыЗамещения.Вставить("Менеджер", Объект.Менеджер);
ПараметрыЗамещения.Вставить("ФорматМагазина", Объект.ФорматМагазина);
ПараметрыЗамещения.Вставить("Назначение", Объект.Назначение);
Возврат ПараметрыЗамещения
КонецФункции
&НаСервере
Процедура ОбновитьПризнакЗамещения(ТолькоПланОплат = Ложь)
Если Не ТолькоПланОплат Тогда
Для Каждого Строка Из Объект.Товары Цикл
Строка.Замещен = Ложь;
Строка.ЗамещенКЗаказу = Ложь;
КонецЦикла;
КонецЕсли;
Если Объект.ЗаполнятьПланОплат Тогда
Для Каждого Строка Из Объект.ПланОплаты Цикл
Строка.Замещен = Ложь;
КонецЦикла;
КонецЕсли;
Если Не Объект.Замещающий Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗамещенныеПериоды.ЗамещенныйПериод КАК ЗамещенныйПериод,
| ЗамещенныеПериоды.ЗамещенКЗаказу КАК ЗамещенКЗаказу,
| ЗамещенныеПериоды.Замещен КАК Замещен
|ПОМЕСТИТЬ ЗамещенныеПериоды
|ИЗ
| &ЗамещенныеПериоды КАК ЗамещенныеПериоды
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПланПродажТовары.ДатаОтгрузки,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажТовары.ДатаОтгрузки, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажТовары.ДатаОтгрузки, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажТовары.ДатаОтгрузки, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажТовары.ДатаОтгрузки, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажТовары.ДатаОтгрузки, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажТовары.ДатаОтгрузки, ГОД)
| ИНАЧЕ ПланПродажТовары.ДатаОтгрузки
| КОНЕЦ КАК Период
|ПОМЕСТИТЬ ПланПродажТовары
|ИЗ
| &ПланПродажТовары КАК ПланПродажТовары
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПланПродажТовары.ДатаОтгрузки,
| МАКСИМУМ(ЗамещенныеПериоды.ЗамещенКЗаказу) КАК ЗамещенКЗаказу,
| МАКСИМУМ(ЗамещенныеПериоды.Замещен) КАК Замещен
|ИЗ
| ЗамещенныеПериоды КАК ЗамещенныеПериоды
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланПродажТовары КАК ПланПродажТовары
| ПО ЗамещенныеПериоды.ЗамещенныйПериод = ПланПродажТовары.Период
|
|СГРУППИРОВАТЬ ПО
| ПланПродажТовары.ДатаОтгрузки
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПланПродажПланОплаты.ДатаОтгрузки,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажПланОплаты.ДатаОтгрузки, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажПланОплаты.ДатаОтгрузки, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажПланОплаты.ДатаОтгрузки, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажПланОплаты.ДатаОтгрузки, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажПланОплаты.ДатаОтгрузки, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ПланПродажПланОплаты.ДатаОтгрузки, ГОД)
| ИНАЧЕ ПланПродажПланОплаты.ДатаОтгрузки
| КОНЕЦ КАК Период
|ПОМЕСТИТЬ ПланПродажПланОплаты
|ИЗ
| &ПланПродажПланОплаты КАК ПланПродажПланОплаты
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПланПродажПланОплаты.ДатаОтгрузки
|ИЗ
| ЗамещенныеПериоды КАК ЗамещенныеПериоды
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланПродажПланОплаты КАК ПланПродажПланОплаты
| ПО ЗамещенныеПериоды.ЗамещенныйПериод = ПланПродажПланОплаты.Период";
Запрос.УстановитьПараметр("ЗамещенныеПериоды", ЗамещенныеПериоды.Выгрузить());
Если Не ТолькоПланОплат Тогда
Запрос.УстановитьПараметр("ПланПродажТовары", Объект.Товары.Выгрузить());
Иначе
ПустаяТЗ = Новый ТаблицаЗначений;
ПустаяТЗ.Колонки.Добавить("ДатаОтгрузки",Новый ОписаниеТипов("Дата"));
Запрос.УстановитьПараметр("ПланПродажТовары", ПустаяТЗ);
КонецЕсли;
Если Объект.ЗаполнятьПланОплат Тогда
Запрос.УстановитьПараметр("ПланПродажПланОплаты", Объект.ПланОплаты.Выгрузить());
Иначе
ПустаяТЗ = Новый ТаблицаЗначений;
ПустаяТЗ.Колонки.Добавить("ДатаОтгрузки",Новый ОписаниеТипов("Дата"));
Запрос.УстановитьПараметр("ПланПродажПланОплаты", ПустаяТЗ);
КонецЕсли;
Запрос.УстановитьПараметр("Периодичность", Объект.Периодичность);
ЗапросПакет = Запрос.ВыполнитьПакет();
Выборка = ЗапросПакет[2].Выбрать();
Пока Выборка.Следующий() Цикл
Отбор = Новый Структура("ДатаОтгрузки", Выборка.ДатаОтгрузки);
ЗамещаемыеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого Строка Из ЗамещаемыеСтроки Цикл
Строка.Замещен = Выборка.Замещен;
Строка.ЗамещенКЗаказу = Выборка.ЗамещенКЗаказу;
КонецЦикла;
КонецЦикла;
Выборка = ЗапросПакет[4].Выбрать();
Пока Выборка.Следующий() Цикл
Отбор = Новый Структура("ДатаОтгрузки", Выборка.ДатаОтгрузки);
ЗамещаемыеСтроки = Объект.ПланОплаты.НайтиСтроки(Отбор);
Для Каждого Строка Из ЗамещаемыеСтроки Цикл
Строка.Замещен = Истина;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьЗамещенныеПериоды()
ПараметрыЗамещения = ПараметрыЗамещения(Объект);
Результат = Планирование.ПолучитьЗамещенныеПериоды(ПараметрыЗамещения, "ПланПродаж");
ЗамещенныеПериоды.Загрузить(Результат);
КонецФункции
&НаКлиенте
Процедура ЗамещениеФорматированнаяСтрокаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = ПараметрыЗамещения(Объект);
ПараметрыФормы.Вставить("НавигационнаяСсылкаФорматированнойСтроки", НавигационнаяСсылкаФорматированнойСтроки);
ОткрытьФорму("РегистрСведений.ЗамещениеПланов.Форма.ЗамещениеПланов", ПараметрыФормы);
КонецПроцедуры
&НаСервереБезКонтекста
Функция КонтрольЗамещенияПланаНаСервере(Ссылка)
Возврат Планирование.КонтрольЗамещенияПлана(Ссылка);
КонецФункции
&НаСервере
Функция ПроверитьСоответстивеГрафикаОплатИПериодовОтгрузкиПлана()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Сумма,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(Товары.ДатаОтгрузки, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(Товары.ДатаОтгрузки, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(Товары.ДатаОтгрузки, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(Товары.ДатаОтгрузки, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(Товары.ДатаОтгрузки, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(Товары.ДатаОтгрузки, ГОД)
| ИНАЧЕ Товары.ДатаОтгрузки
| КОНЕЦ КАК Период
|ПОМЕСТИТЬ Товары
|ИЗ
| &Товары КАК Товары
|ГДЕ НЕ Товары.Отменено
|;
|
|
|ВЫБРАТЬ
| ПланОплаты.СуммаПлатежа,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОплаты.ДатаОтгрузки, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОплаты.ДатаОтгрузки, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОплаты.ДатаОтгрузки, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОплаты.ДатаОтгрузки, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОплаты.ДатаОтгрузки, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОплаты.ДатаОтгрузки, ГОД)
| ИНАЧЕ ПланОплаты.ДатаОтгрузки
| КОНЕЦ КАК Период
|ПОМЕСТИТЬ ПланОплаты
|ИЗ
| &ПланОплаты КАК ПланОплаты
|;
|
|
|ВЫБРАТЬ
| Товары.Сумма,
| Товары.Период,
| 0 КАК СуммаПлатежа
|ПОМЕСТИТЬ ТоварыПланыОплатОбъединение
|ИЗ
| Товары КАК Товары
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 0,
| ПланОплаты.Период,
| ПланОплаты.СуммаПлатежа
|ИЗ
| ПланОплаты КАК ПланОплаты
|;
|
|
|ВЫБРАТЬ
| СУММА(ТоварыПланыОплатОбъединение.Сумма) КАК Сумма,
| ТоварыПланыОплатОбъединение.Период,
| СУММА(ТоварыПланыОплатОбъединение.СуммаПлатежа) КАК СуммаПлатежа
|ПОМЕСТИТЬ ТоварыПланыОплатГруппировка
|ИЗ
| ТоварыПланыОплатОбъединение КАК ТоварыПланыОплатОбъединение
|
|СГРУППИРОВАТЬ ПО
| ТоварыПланыОплатОбъединение.Период
|;
|
|
|ВЫБРАТЬ
| ТоварыПланыОплатГруппировка.Период КАК НачалоПериода,
| ТоварыПланыОплатГруппировка.Сумма,
| ТоварыПланыОплатГруппировка.СуммаПлатежа,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА КОНЕЦПЕРИОДА(ТоварыПланыОплатГруппировка.Период, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА КОНЕЦПЕРИОДА(ТоварыПланыОплатГруппировка.Период, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА КОНЕЦПЕРИОДА(ТоварыПланыОплатГруппировка.Период, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА КОНЕЦПЕРИОДА(ТоварыПланыОплатГруппировка.Период, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА КОНЕЦПЕРИОДА(ТоварыПланыОплатГруппировка.Период, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА КОНЕЦПЕРИОДА(ТоварыПланыОплатГруппировка.Период, ГОД)
| ИНАЧЕ ТоварыПланыОплатГруппировка.Период
| КОНЕЦ КАК КонецПериода
|ИЗ
| ТоварыПланыОплатГруппировка КАК ТоварыПланыОплатГруппировка
|ГДЕ
| ТоварыПланыОплатГруппировка.СуммаПлатежа <> ТоварыПланыОплатГруппировка.Сумма
|
|УПОРЯДОЧИТЬ ПО
| НачалоПериода";
Запрос.УстановитьПараметр("Товары", Объект.Товары.Выгрузить());
Запрос.УстановитьПараметр("ПланОплаты", Объект.ПланОплаты.Выгрузить());
Запрос.УстановитьПараметр("Периодичность", Объект.Периодичность);
Выборка = Запрос.Выполнить().Выбрать();
ТекстПериод = "";
Пока Выборка.Следующий() Цикл
Если Не ЗначениеЗаполнено(Выборка.НачалоПериода) Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(ТекстПериод) Тогда
НесколькоПериодов = Истина;
ТекстПериод = ТекстПериод + ", ";
КонецЕсли;
ТекстПериод = ТекстПериод + Формат(Выборка.НачалоПериода, "ДЛФ=Д") + "-" + Формат(Выборка.КонецПериода, "ДЛФ=Д");
КонецЦикла;
Возврат ТекстПериод
КонецФункции
#КонецОбласти
#Область ЗагрузкаДанныхИзФайла
&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайла(ДополнительныеПараметры)
ПараметрыЗагрузки = ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных();
ПараметрыЗагрузки.ПолноеИмяТабличнойЧасти = "ПланПродаж.Товары";
ПараметрыЗагрузки.Заголовок = НСтр("ru = 'Загрузка таблицы ""Товары"" из файла'");
ПараметрыЗагрузки.ДополнительныеПараметры = ДополнительныеПараметры;
ПараметрыЗагрузки.КолонкиМакета = ПланированиеКлиент.ОписаниеКолонокМакетаДляЗагрузкиНоменклатуры(ДополнительныеПараметры);
Оповещение = Новый ОписаниеОповещения("ПоказатьФормуЗагрузкиИзФайлаЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки(ПараметрыЗагрузки, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если АдресЗагруженныхДанных = Неопределено Тогда
Возврат;
КонецЕсли;
ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры)
ЗагруженныеДанные = ПолучитьИзВременногоХранилища(АдресЗагруженныхДанных);
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
Если Объект.КроссТаблица Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
ДобавитьТовары(ЗагруженныеДанные, КэшированныеЗначения, Истина);
Если Объект.КроссТаблица Тогда
ТоварыПоПериодам.Очистить();
Отказ = Ложь;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("ИмяТЧ", "Товары");
ПараметрыПроверки.Вставить("ПредставлениеТЧ", НСтр("ru='Товары'"));
ПараметрыПроверки.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПроверки.Вставить("ДатаНачала", Объект.НачалоПериода);
ПараметрыПроверки.Вставить("ДатаОкончания", Объект.ОкончаниеПериода);
ПараметрыПроверки.Вставить("ИмяПоляДатыПериода", "ДатаОтгрузки");
ПараметрыПроверки.Вставить("ПредставлениеДатыПериода", НСтр("ru='Дата отгрузки'"));
ПараметрыПроверки.Вставить("ПрефиксПутиКТЧ", "Объект.");
ПланированиеКлиентСервер.ПроверитьДатуПериодаТЧ(Объект, Отказ, ПараметрыПроверки);
Если Отказ Тогда
ОбщегоНазначения.СообщитьПользователю(НСтр("ru='В строках списка ""Товары"" указаны даты за границами планирования - строки были удалены.'"));
КонецЕсли;
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти