#Область ОписаниеПеременных
&НаКлиенте
Перем КэшированныеЗначения;
&НаКлиенте
Перем ПараметрыОбработчикаОжидания;
&НаКлиенте
Перем ОповещениеПослеЗаписи Экспорт;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
Планирование.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
Параметры.Свойство("ТекущаяСтрока", ТекущаяСтрокаПриОткрытии);
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
ОбновлятьПравило = Объект.ПравилоЗаполнения.Количество() = 0;
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана);
ЗаполнитьЗначенияСвойств(Объект, ПараметрыВидаПлана,"ЗаполнятьПоФормуле,Замещающий");
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Сценарий,
"Периодичность, СценарийБюджетирования, СпособРасчетаПотребностейВМатериалах");
ЗаполнитьЗначенияСвойств(Объект, ПараметрыСценария);
Если КоличествоПериодов > 0 И НЕ ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(
Объект.Периодичность,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекущаяДатаСеанса(),
КоличествоПериодов);
КонецЕсли;
ПриЧтенииСозданииНаСервере();
УстановитьВидимость();
КонецЕсли;
СохранитьНовыйПериодСервер();
Если ЗначениеЗаполнено(Объект.ПравилоЗаполнения) Тогда
Для Каждого Правило Из Объект.ПравилоЗаполнения Цикл
Если Правило.ОтборИзШапкиУстановлен Тогда
ОтборУстановлен = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
УстановитьУсловноеОформлениеКроссТаблицы();
ИмяДополнительнойКолонки = ФормированиеПечатныхФорм.ДополнительнаяКолонкаПечатныхФормДокументов().ИмяКолонки;
УстановитьДоступностьКомандБуфераОбмена();
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПриСозданииНаСервере(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
Справочники.Назначения.ФормаДокументаПриСозданииНаСервере(ЭтаФорма);
ПараметрыГиперссылки = РаботаСФайлами.ГиперссылкаФайлов();
ПараметрыГиперссылки.Размещение = "КоманднаяПанель";
РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыГиперссылки);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
Если Объект.Замещающий И КонтрольЗамещенияПланаНаСервере(Объект.Ссылка) Тогда
ЭтотОбъект.Записать();
ЭтотОбъект.Прочитать();
КонецЕсли;
ПланированиеКлиент.СпозиционироватьсяПоСтроке(ЭтаФорма, "ГруппаТовары", "Товары", "ТоварыПоПериодам");
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
РаботаСФайламиКлиент.ПриОткрытии(ЭтотОбъект, Отказ);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора.ИмяФормы = "Обработка.ПодборТоваровВДокументЗакупки.Форма.Форма" Тогда
ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
Планирование.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, Ложь, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана,, "КоличествоПериодов");
ПриЧтенииСозданииНаСервере();
СохранитьНовыйПериодСервер();
УстановитьВидимость();
ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ПланОстатков.ФормаДокумента.Событие.ПередЗаписью");
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
ПараметрыЗаписи.Вставить("КэшированныеЗначения", КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
СкопироватьИзКроссТаблицы(ПараметрыЗаписи["КэшированныеЗначения"], ТекущийОбъект);
Планирование.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
Если Объект.ЗаполнятьПоФормуле Тогда
ЗаписатьДополнительныеПараметры(ТекущийОбъект);
КонецЕсли;
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
Если Объект.ЗаполнятьПоФормуле Тогда
ПрочитатьДополнительныеПараметры(ТекущийОбъект);
КонецЕсли;
УстановитьВидимость();
МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект, ПараметрыЗаписи);
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланОстатков");
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "КопированиеСтрокВБуферОбмена" Тогда
УстановитьДоступностьКомандБуфераОбменаНаКлиенте();
ИначеЕсли ИмяСобытия = "РаботаСExcelКлиент_ЗагрузитьИзExcel"
И Параметр.УникальныйИдентификаторФормы = ЭтаФорма.УникальныйИдентификатор Тогда
ЗагрузитьИзExcelНаКлиентеПродолжение(Параметр.ДанныеЗагрузки);
КонецЕсли;
Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
РаботаСФайламиКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия);
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
Если Объект.КроссТаблица Тогда
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПредставлениеТаблицы",НСтр("ru='Товары'"));
СтруктураДействий.Вставить("ПутьКТаблице","ТоварыПоПериодам");
СтруктураДействий.Вставить("ЗаполнятьХарактеристикуВТЧ");
Если ЗаполнятьСкладВТЧ Тогда
СтруктураДействий.Вставить("ЗаполнятьСкладВТЧ");
КонецЕсли;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("Периоды", ЭтотОбъект["Периоды"].Выгрузить(Новый Структура("Активная", Истина)));
ПараметрыПроверки.Вставить("ПрефиксПоля", "Количество_");
ПараметрыПроверки.Вставить("ИмяПоля", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПроверкаКоличестваПоПериодам", ПараметрыПроверки);
Планирование.ОбработкаПроверкиЗаполненияВФорме(ТоварыПоПериодам, СтруктураДействий, Отказ, ПроверяемыеРеквизиты, Объект.КроссТаблица);
Иначе
МассивНепроверяемыхРеквизитов.Добавить("ТоварыПоПериодам");
КонецЕсли;
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты,МассивНепроверяемыхРеквизитов);
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_ПланОстатков", , Объект.Ссылка);
МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);
Если ОповещениеПослеЗаписи <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОповещениеПослеЗаписи, Истина);
ОповещениеПослеЗаписи = Неопределено;
КонецЕсли;
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
Если ЭтаФорма.Модифицированность Тогда
Если КонтрольЗамещенияПланаНаСервере(Объект.Ссылка) Тогда
ЭтотОбъект.Прочитать();
ЭтотОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура СценарийПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("СценарийПриИзмененииЗавершение", ЭтотОбъект);
ПланированиеКлиент.ПоказатьВопросПриИзмененииСценария(ЭтаФорма, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ВидПланаПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("ВидПланаПриИзмененииЗавершение", ЭтотОбъект);
ПланированиеКлиент.ПоказатьВопросПриИзмененииВидПлана(ЭтаФорма, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура НачалоПериодаПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ТоварыПоПериодам", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура НазначениеПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура СкладПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
Если Не ЗначениеЗаполнено(Объект.Статус) Тогда
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыПланов.Отменен");
КонецЕсли;
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
Если ТекущаяСтраница.Имя = "ГруппаДополнительныеРеквизиты"
И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
СвойстваВыполнитьОтложеннуюИнициализацию();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
Если Объект.Замещающий
И (Объект.КроссТаблица И ТоварыПоПериодам.Количество() = 0
ИЛИ Не Объект.КроссТаблица И Объект.Товары.Количество() = 0)
И Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаТовары Тогда
ЗаполнитьДаннымиДляЗамещения();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары
&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
Объект.ЗаполненоАвтоматически = Ложь;
ТоварыКоличествоСтрок = Объект.Товары.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если НоваяСтрока Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
ТоварыКоличествоСтрок = Объект.Товары.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПослеУдаления(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПланОстатковПрисоединенныеФайлы") Тогда
ЗагрузитьИзExcelНаКлиенте(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
Если Не Объект.ЗаполнятьПоФормуле И Элементы.Товары.ВыделенныеСтроки.Количество() > 0 Тогда
ВГраница = Элементы.Товары.ВыделенныеСтроки.ВГраница();
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ВыделенныеСтроки[ВГраница]));
Иначе
Расшифровка = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект, ТекущаяСтрока);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыХарактеристикаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ХарактеристикаПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
ТекущаяСтрока.Расшифровка = Строка(ТекущаяСтрока.КоличествоУпаковок);
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущаяСтрока);
Если ТекущаяСтрока.Свойство("Отклонение") И ЗначениеЗаполнено(ТекущаяСтрока.Формула) Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(ТекущаяСтрока.Формула, ТекущаяСтрока, Неопределено, Неопределено);
ТекущаяСтрока.Отклонение = РезультатВычисления.Результат - ТекущаяСтрока.КоличествоУпаковок;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТоварыПоПериодам
&НаКлиенте
Процедура ТоварыПоПериодамПриИзменении(Элемент)
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоПериодам");
Объект.ЗаполненоАвтоматически = Ложь;
ТоварыКоличествоСтрокДоИзменения = ТоварыКоличествоСтрок;
ТоварыКоличествоСтрок = ТоварыПоПериодам.Количество();
Если ТоварыКоличествоСтрок <> ТоварыКоличествоСтрокДоИзменения Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если НоваяСтрока Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
ТоварыКоличествоСтрок = ТоварыПоПериодам.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамПриАктивизацииЯчейки(Элемент)
ПодключитьОбработчикОжидания("ТоварыПоПериодамПриАктивизацииЯчейкиНаКлиенте", 0.5, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПланОстатковПрисоединенныеФайлы") Тогда
ЗагрузитьИзExcelНаКлиенте(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ТоварыПоПериодам.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "ТоварыПоПериодам"));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект, ТекущаяСтрока);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ТоварыПоПериодам.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииКоличества(Элемент)
СтрокаТоваров = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Если Объект.ЗаполнятьПоФормуле Тогда
ПриИзмененииКоличестваОтклонение(СтрокаТоваров);
КонецЕсли;
Если НЕ Объект.ЗаполнятьПоФормуле Тогда
ТекущееИмяКолонки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Элемент.Имя, "ТоварыПоПериодам" + "Количество_")[1];
СтрокаТоваров["Расшифровка_" + ТекущееИмяКолонки] = Строка(СтрокаТоваров["Количество_" + ТекущееИмяКолонки]);
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(СтрокаТоваров, "Расшифровка_" + ТекущееИмяКолонки);
КонецЕсли;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокаТоваров, СтруктураДействий, КэшированныеЗначения);
ТоварыПоПериодамПриАктивизацииЯчейки(Элементы.ТоварыПоПериодам);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПроверкаПеретаскивания(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПеретаскивание(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраНажатие(Элемент, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраНажатие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПодобратьТовары(Команда)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ПланОстатков.ФормаДокумента.Команда.ПодобратьТовары");
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимПодбораБезСуммовыхПараметров", Истина);
ПараметрыФормы.Вставить("СкрыватьКолонкуВидЦены", Истина);
ПараметрыФормы.Вставить("СкрыватьКомандуЦеныНоменклатуры", Истина);
Если ЗаполнятьСклад Тогда
ПараметрыФормы.Вставить("Склад", Объект.Склад);
КонецЕсли;
Если ЗаполнятьСкладВТЧ Тогда
ПараметрыФормы.Вставить("РежимПодбораИспользоватьСкладыВТабличнойЧасти", Истина);
ПараметрыФормы.Вставить("ОстаткиПоВсемСкладам", Истина);
КонецЕсли;
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Подбор товаров'"));
ПараметрыФормы.Вставить("Дата", Объект.Дата);
ПараметрыФормы.Вставить("Документ", Объект.Ссылка);
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
ПараметрыФормы.Вставить("СкрыватьРучныеСкидки", Истина);
ОткрытьФорму("Обработка.ПодборТоваровВДокументЗакупки.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтбору(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ДобавитьТоварыПоОтборуНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура НастроитьИЗаполнитьПоПравилуЗаполнения(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбновитьДополнить", Объект.ОбновитьДополнить);
ПараметрыФормы.Вставить("АдресПравилаЗаполнения", АдресПравилаЗаполнения);
ПараметрыФормы.Вставить("ИзменитьРезультатНа", Объект.ИзменитьРезультатНа);
ПараметрыФормы.Вставить("ТочностьОкругления", Объект.ТочностьОкругления);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыФормы.Вставить("АдресПользовательскихНастроек", АдресПользовательскихНастроек);
ПараметрыФормы.Вставить("ТолькоПросмотр", ЭтаФорма.ТолькоПросмотр);
ПараметрыФормы.Вставить("КоличествоПериодов", КоличествоПериодов);
ПараметрыФормы.Вставить("Отбор", ПланированиеКлиентСервер.ОтборДляВыборки(ПараметрыОтбора(ЭтотОбъект), ПараметрыВидаПлана(ЭтотОбъект)));
ПараметрыФормы.Вставить("НачалоПериода", Объект.НачалоПериода);
Оповещение = Новый ОписаниеОповещения("НастроитьИЗаполнитьПоПравилуЗаполненияЗавершение", ЭтотОбъект);
ОткрытьФорму("Справочник.ИсточникиДанныхПланирования.Форма.ФормаЗаполнения",
ПараметрыФормы,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
ОбщегоНазначенияУТКлиент.Записать(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоПравилуЗаполнения(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполнятьПоПравилу", Истина);
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьСкладПоЗначению(Команда)
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ТоварыПоПериодам.ВыделенныеСтроки,Элементы.Товары.ВыделенныеСтроки);
ТаблицаТовары = ?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары);
Если СкладыКлиент.ПроверитьВозможностьЗаполненияСкладовВТабличнойЧасти(Объект, ТаблицаТовары, НСтр("ru='Товары'"), ВыделенныеСтроки) Тогда
СтруктураОтбора = Новый Структура("ЭтоГруппа", Ложь);
СтруктураПараметров = Новый Структура("Отбор, ВыборГруппИЭлементов", СтруктураОтбора, ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму(
"Справочник.Склады.ФормаВыбора",
СтруктураПараметров,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Новый ОписаниеОповещения("ЗаполнитьПоЗначениюЗавершение",
ПланированиеКлиент,
Новый Структура("ВыделенныеСтроки, ТаблицаТовары, Колонка", ВыделенныеСтроки, ТаблицаТовары, "Склад")),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьНазначениеПоЗначению(Команда)
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ТоварыПоПериодам.ВыделенныеСтроки,Элементы.Товары.ВыделенныеСтроки);
ТаблицаТовары = ?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары);
СтруктураОтбора = Новый Структура("ЭтоГруппа", Ложь);
СтруктураПараметров = Новый Структура("Отбор, ВыборГруппИЭлементов", СтруктураОтбора, ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму(
"Справочник.Назначения.ФормаВыбора",
СтруктураПараметров,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Новый ОписаниеОповещения("ЗаполнитьПоЗначениюЗавершение",
ПланированиеКлиент,
Новый Структура("ВыделенныеСтроки, ТаблицаТовары, Колонка", ВыделенныеСтроки, ТаблицаТовары, "Назначение")),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДаннымиДляЗамещения()
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполнитьДляЗамещения");
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиДокумент(Команда)
ОбщегоНазначенияУТКлиент.Провести(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтроку(Команда)
ТаблицаФормы = Элементы.Товары;
ДанныеТаблицы = Объект.Товары;
Оповещение = Новый ОписаниеОповещения("РазбитьСтрокуЗавершение", ЭтотОбъект);
РаботаСТабличнымиЧастямиКлиент.РазбитьСтроку(ДанныеТаблицы, ТаблицаФормы, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтрокуЗавершение(НоваяСтрока, ДополнительныеПараметры) Экспорт
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если НоваяСтрока <> Неопределено Тогда
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, КэшированныеЗначения);
ТекущаяСтрока.Расшифровка = "";
НоваяСтрока.Расшифровка = "";
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВставитьСтроки(Команда)
Если Объект.КроссТаблица Тогда
ОписаниеОповещение = Новый ОписаниеОповещения("ПереключитьПериодыВСтрокиЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Копирование и вставка строк возможны в режиме ""Периоды в строках"". Переключить режим?'"),
РежимДиалогаВопрос.ДаНет);
Возврат;
Иначе
КоличествоТоваровДоВставки = Объект.Товары.Количество();
ПолучитьСтрокиИзБуфераОбмена();
КоличествоВставленных = Объект.Товары.Количество()-КоличествоТоваровДоВставки;
РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОВставкеСтрок(КоличествоВставленных);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьСтроки(Команда)
Если Объект.КроссТаблица Тогда
ОписаниеОповещение = Новый ОписаниеОповещения("ПереключитьПериодыВСтрокиЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Копирование и вставка строк возможны в режиме ""Периоды в строках"". Переключить режим?'"),
РежимДиалогаВопрос.ДаНет);
Возврат;
Иначе
ТаблицаФормы = Элементы.Товары;
КонецЕсли;
Если РаботаСТабличнымиЧастямиКлиент.ВыбранаСтрокаДляВыполненияКоманды(ТаблицаФормы) Тогда
СкопироватьСтрокиНаСервере();
РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОКопированииСтрок(ТаблицаФормы.ВыделенныеСтроки.Количество());
КонецЕсли;
КонецПроцедуры
#Область ЗагрузкаДанныхИзФайла
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
ДополнительныеПараметры = ПланированиеКлиент.ДополнительныеПараметрыЗагрузкиИзФайла();
ДополнительныеПараметры.ТипПлана = "ПланОстатков";
ДополнительныеПараметры.ИспользуютсяНазначения = ЗаполнятьНазначениеВТЧ;
ДополнительныеПараметры.ИспользуютсяСклады = ЗаполнятьСкладВТЧ;
ПоказатьФормуЗагрузкиИзФайла(ДополнительныеПараметры);
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
РаботаСExcelКлиент.ВыгрузитьВExcel(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
РаботаСExcelКлиент.ВыбратьПрисоединенныйФайлExcel(ЭтаФорма, ?(Объект.КроссТаблица, "ТоварыПоПериодам", "Товары"));
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВКолонки(Команда)
Если НЕ Объект.КроссТаблица Тогда
Отказ = Ложь;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("ИмяТЧ", "Товары");
ПараметрыПроверки.Вставить("ПредставлениеТЧ", НСтр("ru='Товары'"));
ПараметрыПроверки.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПроверки.Вставить("ДатаНачала", Объект.НачалоПериода);
ПараметрыПроверки.Вставить("ДатаОкончания", Объект.ОкончаниеПериода);
ПараметрыПроверки.Вставить("ИмяПоляДатыПериода", "ДатаОстатка");
ПараметрыПроверки.Вставить("ПредставлениеДатыПериода", НСтр("ru='Дата поступления'"));
ПараметрыПроверки.Вставить("ПрефиксПутиКТЧ", "Объект.");
ПланированиеКлиентСервер.ПроверитьДатуПериодаТЧ(Объект, Отказ, ПараметрыПроверки);
Если Отказ Тогда
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Удалить строки'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Отменить'"));
ТекстВопроса = НСтр("ru='В строках списка ""Товары"" указаны даты за границами планирования - строки будут удалены. Удалить строки?'");
Оповещение = Новый ОписаниеОповещения("ПереключитьПериодыВКолонкиЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
Возврат;
КонецЕсли;
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВСтроки(Команда)
ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения)
Если Объект.КроссТаблица Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
Объект.КроссТаблица = Ложь;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьПустыеСтроки(Команда)
УдалитьПустыеСтрокиНаСервере();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ТоварыПоПериодамНоменклатураЕдиницаИзмерения";
ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "ТоварыПоПериодам.Упаковка";
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма, ПараметрыУсловногоОформления);
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма);
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма,
"ТоварыПоПериодамХарактеристика",
"ТоварыПоПериодам.ХарактеристикиИспользуются");
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма);
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,
"ТоварыПоПериодамНазначение",
"ТоварыПоПериодам.ТипНоменклатуры",
Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,,Ложь);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Товары.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Отменено");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Товары.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Замещен");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСклад.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.Товар);
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненноеПолеТаблицы);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<для товаров>'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСклад.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.Товар);
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоПериодамСклад.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.Товар);
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненноеПолеТаблицы);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<для товаров>'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоПериодамСклад.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.Товар);
СписокЗначений.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Истина);
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформлениеКроссТаблицы()
Если НЕ Объект.КроссТаблица Тогда
Возврат;
КонецЕсли;
ТекущийШрифт = Элементы.ТоварыПоПериодам.Шрифт;
ЗачеркнутыйШрифт = Новый Шрифт(ТекущийШрифт,,,,,,Истина);
АктивныеПериоды = ЭтотОбъект["Периоды"].НайтиСтроки(Новый Структура("Активная", Истина));
ЭтоОдинПериод = АктивныеПериоды.Количество() = 1;
Для каждого Период Из АктивныеПериоды Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Отменено_"+Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ЗачеркнутыйШрифт);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоПериодам.Замещен_"+ Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура СохранитьНовыйПериодСервер()
ПланированиеКлиентСервер.СохранитьЗначенияПроверяемыхРеквизитов(Объект, ЭтаФорма, "РеквизитыДоИзменения");
НадписьПериодичностьВалюта = НСтр("ru = 'Периодичность: %Периодичность%'");
НадписьПериодичностьВалюта = СтрЗаменить(НадписьПериодичностьВалюта,"%Периодичность%",Строка(Объект.Периодичность));
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ПриИзмененииКоличестваСуммыСтроки(Объект, Форма, СтрокаТоваров)
Количество = 0;
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная ИЛИ СтрокаТоваров["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
Количество = Количество + СтрокаТоваров["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
СтрокаТоваров.КоличествоУпаковок = Количество;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоговыеПоказатели(Форма, РассчитыватьСтроки = Истина)
Объект = Форма.Объект;
Если НЕ Объект.КроссТаблица Тогда
Возврат;
КонецЕсли;
Товары = Форма.ТоварыПоПериодам;
Форма["КоличествоУпаковок"] = 0;
ПрефиксКолонкиКоличество = "ТоварыПоПериодам" + "Количество_";
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] = 0;
КонецЦикла;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
КэшированныеЗначения = Неопределено;
Для каждого СтрокаТЧ Из Товары Цикл
Если РассчитыватьСтроки Тогда
СтрокаТЧ.КоличествоУпаковок = 0;
КонецЕсли;
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ["Замещен_"+ СтрокаПериода.ИмяКолонки] = СтрокаПериода.Замещен;
СтрокаТЧ["ЗамещенКЗаказу_"+ СтрокаПериода.ИмяКолонки] = СтрокаПериода.ЗамещенКЗаказу;
Если СтрокаТЧ["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
Если РассчитыватьСтроки Тогда
СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЕсли;
Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] = Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
Форма["КоличествоУпаковок"] = Форма["КоличествоУпаковок"] + СтрокаТЧ["КоличествоУпаковок"];
Если РассчитыватьСтроки Тогда
#Если Клиент Или ТолстыйКлиентУправляемоеПриложение Тогда
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокаТЧ, СтруктураДействий, КэшированныеЗначения);
#КонецЕсли
КонецЕсли;
КонецЦикла;
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Если РассчитыватьСтроки Тогда
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Товары, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
Объект.КроссТаблица = Ложь;
Если Объект.ЗаполнятьПоФормуле Тогда
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
Иначе
ИнициализироватьСтруктуруНастроек(РеквизитФормыВЗначение("Объект"));
КонецЕсли;
ПланированиеПоНазначениям = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Сценарий,"ПланированиеПоНазначениям");
ПриИзмененииПериодовНаСервере();
СкопироватьВКроссТаблицу(Неопределено);
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции()
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются",
Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры",
Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул",
Новый Структура("Номенклатура", "Артикул"));
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(
?(Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки, ТоварыПоПериодам, Объект.Товары),
СтруктураДействий);
Если Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки Тогда
Для каждого СтрокаТЧ Из ТоварыПоПериодам Цикл
Для каждого Период Из ЭтотОбъект["Периоды"] Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(СтрокаТЧ["Комментарий_"+ Период.ИмяКолонки]);
КонецЦикла;
КонецЦикла;
Иначе
Для каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.КартинкаКомментарий = ЗначениеЗаполнено(СтрокаТЧ.Комментарий);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииПериодовНаСервере(КорректироватьНачалоОкончаниеПериода = Ложь, ИзменитьДатуОстатков = Ложь)
Если КорректироватьНачалоОкончаниеПериода Тогда
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(Объект.Периодичность, Объект.НачалоПериода, Объект.ОкончаниеПериода, ТекущаяДатаСеанса());
КонецЕсли;
Если ИзменитьДатуОстатков Тогда
ТаблицаТовары = Объект.Товары.Выгрузить();
ТаблицаТовары.ЗаполнитьЗначения(Объект.НачалоПериода, "ДатаОстатка");
Объект.Товары.Загрузить(ТаблицаТовары);
КонецЕсли;
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
Если Объект.Замещающий
И ЗначениеЗаполнено(Объект.Периодичность) Тогда
ЗаполнитьЗамещенныеПериоды();
Планирование.ОбновитьГиперссылкуЗамещение(ЭтаФорма);
Иначе
ЗамещенныеПериоды.Очистить();
ЗамещениеФорматированнаяСтрока = Новый ФорматированнаяСтрока(Новый Массив);
КонецЕсли;
Планирование.ЗаполнитьТаблицуПериодов(ТаблицаПериоды, Объект.Периодичность, Объект.НачалоПериода, Объект.ОкончаниеПериода, ОтображатьНомерПериода, ЗамещенныеПериоды);
ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, Истина);
Если Объект.КроссТаблица Тогда
СохранитьНовыйПериодСервер();
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланОстатков");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, ПересчитыватьИтоговыеПоказатели = Истина)
КоличествоПериодов = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина)).Количество();
ЭтоОдинПериод = КоличествоПериодов = 1;
Элементы.ТоварыПоПериодамКоличествоУпаковок.Видимость = НЕ ЭтоОдинПериод;
Элементы.КомментарийКЯчейке.Видимость = Объект.КроссТаблица И НЕ ЭтоОдинПериод;
Элементы.ЯчейкаОтменена.Видимость = Объект.КроссТаблица И НЕ ЭтоОдинПериод;
Если НЕ Объект.КроссТаблица
И Не ИспользуютсяПланируемыеОстатки Тогда
ЗначениеВРеквизитФормы(ТаблицаПериоды,"Периоды");
СохранитьНовыйПериодСервер();
ОбновитьПризнакЗамещения();
Возврат;
Иначе
ОбновитьПризнакЗамещения();
КонецЕсли;
ПараметрыВывода = Новый Структура;
ПараметрыВывода.Вставить("ИмяРеквизитаКроссТаблицы", "ТоварыПоПериодам");
ПараметрыВывода.Вставить("ЭлементФормыКроссТаблицы", "ТоварыПоПериодам");
ПараметрыВывода.Вставить("ТаблицаПериодов", ТаблицаПериоды);
ПараметрыВывода.Вставить("Периодичность", Объект.Периодичность);
ПараметрыВывода.Вставить("Поля", Новый Массив());
ПараметрыВывода.Вставить("СоздаватьГруппуПериода", НЕ ЭтоОдинПериод);
Если НЕ ЭтоОдинПериод Тогда
Планирование.ДобавитьПолеКроссТаблицыГруппаКомментарияСКартинкой(ПараметрыВывода);
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииКоличества");
Планирование.ДобавитьПолеКроссТаблицыКоличество(
ПараметрыВывода,
Истина,
НЕ ЭтоОдинПериод,
ЭтоОдинПериод,
СтруктураДействий);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииОтменено");
Планирование.ДобавитьПолеКроссТаблицыОтменено(ПараметрыВывода, ЭтоОдинПериод, СтруктураДействий);
СтруктураДействий = Новый Структура;
Планирование.ДобавитьПолеКроссТаблицыЗамещен(ПараметрыВывода, ЭтоОдинПериод И Объект.Замещающий, СтруктураДействий);
Планирование.ДобавитьПолеКроссТаблицыЗамещенКЗаказу(ПараметрыВывода, Ложь, СтруктураДействий);
Если ЭтоОдинПериод Тогда
Планирование.ДобавитьПолеКроссТаблицыГруппаКомментарияСКартинкой(ПараметрыВывода);
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииКомментария");
СтруктураДействий.Вставить("НачалоВыбора", "Подключаемый_НачалоВыбораКомментария");
Планирование.ДобавитьПолеКроссТаблицыКомментарий(ПараметрыВывода, ЭтоОдинПериод, СтруктураДействий);
Если Объект.ЗаполнятьПоФормуле Тогда
ДобавитьПоляИзДопПараметров(ПараметрыВывода);
Иначе
Планирование.ДобавитьПолеКроссТаблицыРасшифровка(ПараметрыВывода);
КонецЕсли;
Планирование.ОбновитьСтруктуруВыводаКроссТаблицы(ЭтаФорма, ПараметрыВывода);
ЗначениеВРеквизитФормы(ТаблицаПериоды,"Периоды");
УстановитьУсловноеОформление();
УстановитьУсловноеОформлениеКроссТаблицы();
Если ПересчитыватьИтоговыеПоказатели Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СценарийПриИзмененииСервер()
Если Объект.ВидПлана <> ЭтаФорма["РеквизитыДоИзменения"].ВидПлана
ИЛИ (Объект.Сценарий <> ЭтаФорма["РеквизитыДоИзменения"].Сценарий
И НЕ ЗначениеЗаполнено(Объект.ВидПлана)) Тогда
ОбновлятьВидПлана = Истина;
Иначе
ОбновлятьВидПлана = Ложь;
КонецЕсли;
Реквизиты = "Периодичность, ОтображатьНомерПериода, ПланированиеПоНазначениям";
Реквизиты = Реквизиты + ", СценарийБюджетирования";
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Сценарий, Реквизиты);
ЗаполнитьЗначенияСвойств(Объект, ПараметрыСценария);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыСценария);
Если ОбновлятьВидПлана Тогда
Объект.ВидПлана = Планирование.ПолучитьВидПланаПоУмолчанию(Перечисления.ТипыПланов.ПланОстатков, Объект.Сценарий);
КонецЕсли;
Если ПланированиеКлиентСервер.НеобходимоОбновитьИнтерфейс(Объект, ЭтаФорма, "РеквизитыДоИзменения") Тогда
ПриИзмененииПериодовНаСервере(Истина, Истина);
КонецЕсли;
Если ОбновлятьВидПлана Тогда
ВидПланаПриИзмененииСервер(ОбновлятьВидПлана);
Объект.ЗаполненоАвтоматически = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВидПланаПриИзмененииСервер(ОбновлятьПравило = Ложь)
ОбновлятьПравило = ОбновлятьПравило ИЛИ Объект.ВидПлана <> ЭтаФорма["РеквизитыДоИзменения"].ВидПлана;
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана,, "КоличествоПериодов");
Если ОбновлятьПравило Тогда
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана, "КоличествоПериодов");
Если КоличествоПериодов > 0 Тогда
Объект.ОкончаниеПериода = Неопределено;
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(
Объект.Периодичность,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекущаяДатаСеанса(),
ПараметрыВидаПлана.КоличествоПериодов);
КонецЕсли;
ЗаполнитьЗначенияСвойств(Объект, ПараметрыВидаПлана);
Объект.ПравилоЗаполнения.Загрузить(ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Объект.ЗаполненоАвтоматически = Ложь;
Объект.ЗаполнятьПоФормуле = ПараметрыВидаПлана.ЗаполнятьПоФормуле;
Объект.Замещающий = ПараметрыВидаПлана.Замещающий;
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланОстатков");
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
Если ПараметрыВидаПлана.Свойство("СтруктураНастроек")
И ПараметрыВидаПлана.СтруктураНастроек <> Неопределено Тогда
СтруктураНастроек = ПараметрыВидаПлана.СтруктураНастроек;
КонецЕсли;
ПриИзмененииПериодовНаСервере();
КонецЕсли;
СохранитьНовыйПериодСервер();
Если ОбновлятьПравило И ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
УстановитьВидимость();
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимость()
ИспользоватьОбособленноеОбеспечениеЗаказов = ПолучитьФункциональнуюОпцию("ИспользоватьОбособленноеОбеспечениеЗаказов");
Элементы.ВидПлана.Доступность = ЗначениеЗаполнено(Объект.Сценарий);
Элементы.Склад.Видимость = ЗаполнятьСклад ИЛИ ЗначениеЗаполнено(Объект.Склад);
Элементы.ТоварыСклад.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыПоПериодамСклад.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыПоПериодамЗаполнитьСкладПоЗначению.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыЗаполнитьСкладПоЗначению.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыЗаполнитьНазначениеПоЗначению.Видимость = ЗаполнятьНазначениеВТЧ;
Элементы.ТоварыЗаполнитьКолонки.Видимость = ЗаполнятьСкладВТЧ ИЛИ ЗаполнятьНазначениеВТЧ;
Элементы.ТоварыНастроитьИЗаполнитьПоПравилуЗаполнения.Видимость = НЕ ЗапретитьРедактированиеПравила;
Элементы.ТоварыПоПериодамНастроитьИЗаполнитьПоПравилуЗаполнения.Видимость = НЕ ЗапретитьРедактированиеПравила;
Элементы.ТоварыЗаполнить.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыРазбитьСтроку.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоПериодамЗаполнить.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыЗаполнитьТовары.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоПериодамЗаполнитьТовары.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыЗаполнитьПоказатели.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоПериодамЗаполнитьПоказатели.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыГруппаИзменитьКоличество.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыГруппаПоПериодамИзменитьКоличество.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыДополнительныеПараметрыФормула.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыДополнительныеПараметрыОтклонение.Видимость = Объект.ЗаполнятьПоФормуле;
Если Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы.Найти("ТоварыПоПериодам" + "Отклонение") <> Неопределено Тогда
Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы["ТоварыПоПериодам" + "Отклонение"].Видимость = Объект.ЗаполнятьПоФормуле;
КонецЕсли;
Если Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы.Найти("ТоварыПоПериодам" + "ФормулаВычисление") <> Неопределено Тогда
Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы["ТоварыПоПериодам" + "ФормулаВычисление"].Видимость = Объект.ЗаполнятьПоФормуле;
КонецЕсли;
Элементы.ТоварыДополнительныеПараметры.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.СтатьяБюджетов.Видимость = Объект.ОтражаетсяВБюджетировании;
Элементы.Расшифровка.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоПериодамКонтекстноеМенюГруппаПоФормуле.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыКонтекстноеМенюГруппаПоФормуле.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.Назначение.Видимость = ПланированиеПоНазначениям И Не ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыНазначение.Видимость = ПланированиеПоНазначениям И ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыПоПериодамНазначение.Видимость = ПланированиеПоНазначениям И ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыЗамещен.Видимость = Объект.Замещающий;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПараметрыВидаПлана(Знач ВидПлана, Знач ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек)
Реквизиты = "КоличествоПериодов, ЗаполнятьСклад, ЗаполнятьСкладВТЧ, ЗапретитьРедактированиеФормулы,
|ЗапретитьРедактированиеПравила, ЗаполнятьПоФормуле, Замещающий, ЗаполнятьНазначениеВТЧ";
Реквизиты = Реквизиты + ", ОтражаетсяВБюджетировании, СтатьяБюджетов";
ПараметрыВидаПлана = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидПлана, Реквизиты);
Если ОбновлятьПравило Тогда
АдресПравилаЗаполнения = Планирование.ПолучитьАдресПравилаЗаполненияПоУмолчанию(Перечисления.ТипыПланов.ПланОстатков, ВидПлана, АдресПравилаЗаполнения);
АдресПользовательскихНастроек = Планирование.ПолучитьАдресПользовательскихНастроекПоУмолчанию(Перечисления.ТипыПланов.ПланОстатков, ВидПлана, АдресПользовательскихНастроек);
СтруктураНастроек = Планирование.ПолучитьНастройкиПоУмолчанию(Перечисления.ТипыПланов.ПланОстатков, ВидПлана);
Если СтруктураНастроек.Свойство("Формула") Тогда
ПараметрыВидаПлана.Вставить("СтруктураНастроек", СтруктураНастроек);
КонецЕсли;
Для каждого Элемент Из СтруктураНастроек Цикл
ПараметрыВидаПлана.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
КонецЕсли;
Возврат ПараметрыВидаПлана;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьСвязанныеРеквизитыОбъекта(Объект, Форма)
Если Объект.КроссТаблица
Или Форма.ИспользуютсяПланируемыеОстатки Тогда
Товары = Форма.ТоварыПоПериодам;
Иначе
Товары = Объект.Товары;
КонецЕсли;
Если НЕ Форма.ЗаполнятьСклад Тогда
Объект.Склад = Неопределено;
КонецЕсли;
Если НЕ Форма.ПланированиеПоНазначениям
Или Форма.ЗаполнятьНазначениеВТЧ Тогда
Объект.Назначение = Неопределено;
КонецЕсли;
Для каждого СтрокаТЧ Из Товары Цикл
Если Форма.ЗаполнятьСклад Тогда
СтрокаТЧ.Склад = Объект.Склад;
ИначеЕсли НЕ Форма.ЗаполнятьСкладВТЧ Тогда
СтрокаТЧ.Склад = Неопределено;
КонецЕсли;
Если НЕ Форма.ПланированиеПоНазначениям
Или СтрокаТЧ.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Услуга")
Или СтрокаТЧ.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.МногооборотнаяТара") Тогда
СтрокаТЧ.Назначение = Неопределено;
ИначеЕсли НЕ Форма.ЗаполнятьНазначениеВТЧ Тогда
СтрокаТЧ.Назначение = Объект.Назначение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьПользователяОЗаполненииДанных()
ПоказатьОповещениеПользователя(
НСтр("ru = 'Заполнение данных в документ завершено'"),
,
,
БиблиотекаКартинок.Информация32);
КонецПроцедуры
&НаСервере
Функция ПолучитьАдресТаблицыПериодов()
Возврат ПоместитьВоВременноеХранилище(ЭтаФорма.Периоды.Выгрузить(), УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ДобавитьТовары(ТаблицаТоваров, КэшированныеЗначения = Неопределено)
Модифицированность = Истина;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ОбрабатываемыеСтроки = Новый Массив();
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
Объект.ЗаполненоАвтоматически = Ложь;
Если Объект.КроссТаблица Тогда
ТекущаяСтрока = ТоварыПоПериодам.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
АктуальныйПериод = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина))[0];
Если ТекущаяСтрока["Количество_" + АктуальныйПериод.ИмяКолонки] = 0
И ТекущаяСтрока.Количество <> 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='Ед. изм.'"),"ЗагружаемаяУпаковка");
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Если НЕ Период.Активная ИЛИ Период.НомерКолонки <=0 Тогда
Продолжить;
КонецЕсли;
КолонкиПоиска.Добавить(Период.Заголовок,"Период_"+Период.ИмяКолонки);
Если Объект.Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность.Год") Тогда
КолонкиПоиска.Добавить(СокрЛП(СтрЗаменить(Период.Заголовок, НСтр("ru = 'г.'"), "")),"Период_"+Период.ИмяКолонки);
КонецЕсли;
КолонкиПоиска.Добавить(
ПланированиеКлиентСервер.СформироватьЗаголовокПериода(
Объект.Периодичность, Период.ДатаНачала, Период.ДатаОкончания, НЕ ОтображатьНомерПериода),
"Период_"+Период.ИмяКолонки);
КонецЦикла;
РеквизитыПериода = Новый Массив;
РеквизитыПериода.Добавить("Количество_");
СтруктураДействийExcel.Вставить("РеквизитыПериода", РеквизитыПериода);
СтруктураДействийExcel.Вставить("Периоды", ЭтаФорма.Периоды);
Иначе
КолонкиПоиска.Добавить(НСтр("ru='Дата поступления'"),"ДатаОстатка");
КолонкиПоиска.Добавить(НСтр("ru='Количество'"),"КоличествоУпаковок");
КолонкиПоиска.Добавить(НСтр("ru='Ед. изм.'"),"ЗагружаемаяУпаковка");
КонецЕсли;
СтруктураДействийExcel.Вставить("КолонкиПоиска", КолонкиПоиска);
СтруктураПоиска = Новый Структура();
СтруктураПоиска.Вставить("ИдентификаторНоменклатура",0);
СтруктураПоиска.Вставить("ИдентификаторХарактеристика",0);
СтруктураПоиска.Вставить("ИдентификаторУпаковка",0);
СтруктураПоиска.Вставить("ИдентификаторСклад",0);
СтруктураПоиска.Вставить("ИдентификаторНазначение",0);
СтруктураДействийExcel.Вставить("СтруктураПоиска", СтруктураПоиска);
СтруктураДействийExcel.Вставить("НомерСтрокиНачалаДанных", 3);
Возврат СтруктураДействийExcel;
КонецФункции
#КонецОбласти
#Область РаботаСБуферомОбмена
&НаСервере
Процедура СкопироватьСтрокиНаСервере()
Если Объект.КроссТаблица Тогда
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(ТоварыПоПериодам, Элементы.ТоварыПоПериодам.ВыделенныеСтроки);
Иначе
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(Объект.Товары, Элементы.Товары.ВыделенныеСтроки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьСтрокиИзБуфераОбмена()
ПараметрыОтбора = Новый Соответствие;
ПараметрыОтбора.Вставить("Номенклатура.ТипНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
Колонки = "Номенклатура,Характеристика,Упаковка,КоличествоУпаковок,Количество,ДатаОстатка,Склад";
ТаблицаТоваров = РаботаСТабличнымиЧастями.СтрокиИзБуфераОбмена(ПараметрыОтбора, Колонки);
Если ЗначениеЗаполнено(ТаблицаТоваров) Тогда
ДобавитьТовары(ТаблицаТоваров);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьКомандБуфераОбмена()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("ТоварыВставитьСтроки");
МассивЭлементов.Добавить("ТоварыКонтекстноеМенюВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоПериодамВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоПериодамКонтекстноеМенюВставитьСтроки");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность",
РаботаСТабличнымиЧастями.ЕстьСтрокиВБуфереОбмена());
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКомандБуфераОбменаНаКлиенте()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("ТоварыВставитьСтроки");
МассивЭлементов.Добавить("ТоварыКонтекстноеМенюВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоПериодамВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоПериодамКонтекстноеМенюВставитьСтроки");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность", Истина);
КонецПроцедуры
#КонецОбласти
#Область ПростоеЗаполнение
&НаСервере
Процедура ИнициализироватьНастроекПриЧтенииНаСервере(ДокументОбъект)
Если НЕ ЗначениеЗаполнено(Объект.Сценарий) ИЛИ Не ЗначениеЗаполнено(Объект.ВидПлана) Тогда
Возврат;
КонецЕсли;
ПараметрыИнициализации = Новый Структура();
ПараметрыИнициализации.Вставить("Форма", ЭтотОбъект);
ПараметрыИнициализации.Вставить("ПутьКРеквизиту", "Объект.Товары");
ПараметрыИнициализации.Вставить("ЭлементФормыТаблицы", "Товары");
ПараметрыИнициализации.Вставить("ЭлементФормыТаблицыПоПериодам", "ТоварыПоПериодам");
Планирование.ИнициализироватьДопПараметры(ДополнительныеПараметрыТовары, ДополнительныеПараметрыТоварыПоПериодам, ПараметрыИнициализации);
ИнициализироватьДереваОператоров();
ИнициализироватьОперандыФормулы();
ИнициализироватьСтруктуруНастроек(ДокументОбъект);
ОбновитьСтруктуруВыводаДопПараметров();
ПрочитатьДополнительныеПараметры(ДокументОбъект);
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьСтруктуруНастроек(ДокументОбъект)
Если ЗначениеЗаполнено(ДокументОбъект.Ссылка) Тогда
СтруктураНастроек = ДокументОбъект.СтруктураНастроек.Получить();
Если СтруктураНастроек = Неопределено Тогда
УстановитьЗначениеНастройки("СтруктураНастроек", СтруктураНастроек);
КонецЕсли;
КонецЕсли;
ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначениеНастройки(ИмяНастройки, Настройка)
ЗначениеНастройкиИзХранилища = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиРаботыПользователя" + ТипПлана, "СтруктураНастроек", Настройка);
Если ЗначениеНастройкиИзХранилища <> Неопределено Тогда
Настройка = ЗначениеНастройкиИзХранилища;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьОперандыФормулы()
МассивОперандов = ПолучитьОперанды(ЭтотОбъект);
ДополнительныеПоля.Очистить();
Для каждого Элемент Из МассивОперандов Цикл
НоваяСтрока = ДополнительныеПоля.Добавить();
НоваяСтрока.Идентификатор = Элемент.Имя;
НоваяСтрока.ПометкаУдаления = ЛОЖЬ;
НоваяСтрока.Представление = Элемент.ЗаголовокОперанда;
Элемент.Свойство("ВходитВОперанд", НоваяСтрока.ВходитВОперанд);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьДереваОператоров()
Дерево = РаботаСФормулами.ПолучитьПустоеДеревоОператоров();
Планирование.ИнициализироватьДереваОператоров(Дерево);
ПредставлениеГруппы = НСтр("ru='Примеры формул'");
ГруппаОператоров = РаботаСФормулами.ДобавитьГруппуОператоров(Дерево, "ПримерыФормул", ПредставлениеГруппы);
ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров);
АдресХранилищаДереваОператоров = ПоместитьВоВременноеХранилище(Дерево, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Если ЗапретитьРедактированиеФормулы Тогда
НастроитьФормулуИЗаполнить(СтруктураНастроек, Неопределено);
Возврат;
КонецЕсли;
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланОстатков");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ТипПлана", ТипПлана);
ПараметрыФормы.Вставить("НачалоПериодаПлан", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериодаПлан", Объект.ОкончаниеПериода);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("АдресХранилищаДереваОператоров", АдресХранилищаДереваОператоров);
ПараметрыФормы.Вставить("ДополнительныеПоля", ДополнительныеПоля);
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
ПараметрыФормы.Вставить("Владелец", Объект.Ссылка);
ПараметрыФормы.Вставить("Отбор", ОтборПоказатели);
ОписаниеОповещения = Новый ОписаниеОповещения("НастроитьФормулуИЗаполнить",ЭтотОбъект);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("Справочник.ВидыПланов.Форма.ФормаНастроек", Новый Структура("СтруктураНастроек",ПараметрыФормы), ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоказатели(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("НачалоПериодаПлан", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериодаПлан", Объект.ОкончаниеПериода);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
ПараметрыФормы.Вставить("Владелец", Объект.Ссылка);
Если СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыеНачальныеОстатки")<>0
Или СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыеКонечныеОстатки")<>0
Или СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыйКонечныйДефицит")<>0 Тогда
НастроитьСмещениеИЗаполнить(ПараметрыФормы.СтруктураНастроек, Неопределено);
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("НастроитьСмещениеИЗаполнить", ЭтотОбъект);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("Справочник.ВидыПланов.Форма.ФормаНастроекСмещения", Новый Структура("СтруктураНастроек",ПараметрыФормы), ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьНаПроцент(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ИзменитьНаПроцентЗавершение", ЭтотОбъект);
ПланированиеКлиент.ИзменитьФормулуНаПроцент(
ЭтаФорма,
?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары),
?(Объект.КроссТаблица, "ТоварыПоПериодам", "Товары"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОкруглитьКоличество(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ОкруглитьКоличествоЗавершение", ЭтотОбъект);
ПланированиеКлиент.ОкруглитьФормулу(
ЭтаФорма,
?(Объект.КроссТаблица, ТоварыПоПериодам, Объект.Товары),
?(Объект.КроссТаблица, "ТоварыПоПериодам", "Товары"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьПроизвольнуюФормулу(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
Для каждого Период Из АктивныеПериоды Цикл
ДополнительныеПараметры = Новый Структура("ИмяКолонки",Период.ИмяКолонки);
Если Объект.КроссТаблица И АктивныеПериоды.Количество() > 1 Тогда
Если Элементы.ТоварыПоПериодам.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущийЭлементИмя = Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя;
Если СтрНайти(ТекущийЭлементИмя, "ТоварыПоПериодам" + "Количество_") = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Активируйте колонку с периодом'"));
Возврат;
КонецЕсли;
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки Тогда
ТекстВопроса = НСтр("ru='Установить формулу для всех периодов?'");
СписокКнопок = Новый СписокЗначений;
СписокКнопок.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Да, для всех'"));
СписокКнопок.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Только'") + " " + Период.Заголовок);
СписокКнопок.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Отмена'"));
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВопросаЗадатьПроизвольнуюФормулу", ЭтотОбъект, ДополнительныеПараметры);
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, СписокКнопок);
КонецЕсли;
Иначе
Если (Объект.КроссТаблица И Элементы.ТоварыПоПериодам.ТекущиеДанные = Неопределено)
ИЛИ (Не Объект.КроссТаблица И Элементы.Товары.ТекущиеДанные = Неопределено) Тогда
Возврат;
КонецЕсли;
ПослеВопросаЗадатьПроизвольнуюФормулу(КодВозвратаДиалога.Нет, ДополнительныеПараметры);
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросаЗадатьПроизвольнуюФормулу(РезультатВопроса, ДополнительныеПараметры) Экспорт
СтруктураДанных = Новый Структура("Формула,ФормулаПредставление,Заголовок,ВключитьЗначение,МассивСтрок,ПериодИзменения");
Если Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.ТоварыПоПериодам.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 1 Тогда
ТекущиеДанные = ТоварыПоПериодам.НайтиПоИдентификатору(ВыделенныеСтроки[0]);
Для каждого Операнд Из ДополнительныеПоля Цикл
Операнд.Значение = ЭтотОбъект[Операнд.Идентификатор];
КонецЦикла;
СтруктураДанных.Формула = ЭтотОбъект.Формула;
СтруктураДанных.ФормулаПредставление= ЭтотОбъект.ФормулаПредставление;
СтруктураДанных.Заголовок = "" + ТекущиеДанные.Номенклатура +
?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика)," (" + ТекущиеДанные.Характеристика + ")","");
СтруктураДанных.ВключитьЗначение = Истина;
Иначе
СтруктураДанных.Формула = "";
СтруктураДанных.ФормулаПредставление = "";
СтруктураДанных.Заголовок = "";
СтруктураДанных.ВключитьЗначение = Ложь;
КонецЕсли;
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
СтруктураДанных.ПериодИзменения = "ВсеПериоды";
ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда
СтруктураДанных.ПериодИзменения = ДополнительныеПараметры.ИмяКолонки;
Иначе
Возврат;
КонецЕсли;
Иначе
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 1 Тогда
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ВыделенныеСтроки[0]);
Для каждого Операнд Из ДополнительныеПоля Цикл
Если ТекущиеДанные.Свойство(Операнд.Идентификатор) Тогда
Операнд.Значение = ТекущиеДанные[Операнд.Идентификатор];
КонецЕсли;
КонецЦикла;
СтруктураДанных.Формула = ТекущиеДанные.Формула;
СтруктураДанных.ФормулаПредставление= ТекущиеДанные.ФормулаПредставление;
СтруктураДанных.Заголовок = "" + ТекущиеДанные.Номенклатура +
?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика)," (" + ТекущиеДанные.Характеристика + ")","");
СтруктураДанных.ВключитьЗначение = Истина;
Иначе
СтруктураДанных.Формула = "";
СтруктураДанных.ФормулаПредставление = "";
СтруктураДанных.Заголовок = "";
СтруктураДанных.ВключитьЗначение = Ложь;
КонецЕсли;
КонецЕсли;
СтруктураДанных.МассивСтрок = ВыделенныеСтроки;
УстановитьПараметрыРасшифровки(СтруктураДанных);
УстановитьПроизвольнуюФормулу(СтруктураДанных);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПроизвольнуюФормулу(СтруктураДанных)
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланОстатков");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Расширенный", Истина);
ПараметрыФормы.Вставить("ВключитьЗначение", СтруктураДанных.ВключитьЗначение);
ПараметрыФормы.Вставить("ЗаголовокЗначения", ""+СтруктураДанных.ПараметрыРасшифровки.Отбор.Номенклатура +
?(ЗначениеЗаполнено(СтруктураДанных.ПараметрыРасшифровки.Отбор.Характеристика)," (" + СтруктураДанных.ПараметрыРасшифровки.Отбор.Характеристика + ")",""));
ПараметрыФормы.Вставить("ПараметрыРасшифровкиОперативногоПланирования", СтруктураДанных.ПараметрыРасшифровки);
ПараметрыФормы.Вставить("Формула", ?(СтруктураДанных.Формула = ПланированиеКлиентСервер.ТекстУстановкиНовойФормулы(),"", СтруктураДанных.Формула));
ПараметрыФормы.Вставить("Представление", ?(СтруктураДанных.ФормулаПредставление = ПланированиеКлиентСервер.ТекстУстановкиНовойФормулы(), "", СтруктураДанных.ФормулаПредставление));
ПараметрыФормы.Вставить("ИспользуетсяДеревоОперандов", Истина);
ПараметрыФормы.Вставить("ВыбиратьОперандПлана", Истина);
ПараметрыФормы.Вставить("ДеревоОперандов", ПоместитьДополнительныеПоляВХранилище());
ПараметрыФормы.Вставить("Операторы", АдресХранилищаДереваОператоров);
ПараметрыФормы.Вставить("КлючОбъектаСохраняемыхНастроек", "НастройкиРаботыПользователя" + ТипПлана);
ПараметрыФормы.Вставить("Отбор", ОтборПоказатели);
ПараметрыФормы.Вставить("ТипРезультата", Новый ОписаниеТипов("Число"));
ПараметрыФормы.Вставить("ФункцииИзОбщегоМодуля", ПланированиеКлиент.ФункцииИзОбщегоМодуля());
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОткрытияКонструктораУстановитьПроизвольнуюФормулу",ЭтотОбъект, СтруктураДанных);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("ОбщаяФорма.КонструкторФормул", ПараметрыФормы, ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_УстановитьПроизвольнуюФормулу(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтруктураДанных = Новый Структура("Формула,ФормулаПредставление,ПараметрыРасшифровки,ВключитьЗначение,МассивСтрок,ПериодИзменения");
МассивСтрок = Новый Массив();
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
МассивСтрок.Добавить(ТекущиеДанные.ПолучитьИдентификатор());
Для каждого Операнд Из ДополнительныеПоля Цикл
Операнд.Значение = ЭтотОбъект[Операнд.Идентификатор];
КонецЦикла;
ТекущийЭлементИмя = Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя;
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
Если АктивныеПериоды.Количество() > 1 Тогда
Если СтрНайти(ТекущийЭлементИмя, "ТоварыПоПериодам" + "Количество_") = 0
И СтрНайти(ТекущийЭлементИмя, "ТоварыПоПериодам" + "КартинкаКомментарий_") = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Активируйте колонку с периодом'"));
Возврат;
Иначе
Для каждого Период Из АктивныеПериоды Цикл
Если ТекущийЭлементИмя = "ТоварыПоПериодам" + "Количество_" + Период.ИмяКолонки
ИЛИ ТекущийЭлементИмя = "ТоварыПоПериодам" + "КартинкаКомментарий_" + Период.ИмяКолонки Тогда
СтруктураДанных.Формула = ТекущиеДанные["Формула_" + Период.ИмяКолонки];
СтруктураДанных.ФормулаПредставление = ТекущиеДанные["ФормулаПредставление_" + Период.ИмяКолонки];
СтруктураДанных.ПериодИзменения = Период.ИмяКолонки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
Для каждого Период Из АктивныеПериоды Цикл
СтруктураДанных.Формула = ТекущиеДанные["Формула_" + Период.ИмяКолонки];
СтруктураДанных.ФормулаПредставление = ТекущиеДанные["ФормулаПредставление_" + Период.ИмяКолонки];
СтруктураДанных.ПериодИзменения = Период.ИмяКолонки;
КонецЦикла;
КонецЕсли;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
МассивСтрок.Добавить(ТекущиеДанные.ПолучитьИдентификатор());
Для каждого Операнд Из ДополнительныеПоля Цикл
Если ТекущиеДанные.Свойство(Операнд.Идентификатор) Тогда
Операнд.Значение = ТекущиеДанные[Операнд.Идентификатор];
КонецЕсли;
КонецЦикла;
СтруктураДанных.Формула = ТекущиеДанные.Формула;
СтруктураДанных.ФормулаПредставление = ТекущиеДанные.ФормулаПредставление;
СтруктураДанных.ПериодИзменения = "ВсеПериоды";
КонецЕсли;
СтруктураДанных.ВключитьЗначение = Истина;
СтруктураДанных.МассивСтрок = МассивСтрок;
УстановитьПараметрыРасшифровки(СтруктураДанных);
УстановитьПроизвольнуюФормулу(СтруктураДанных);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытияКонструктораУстановитьПроизвольнуюФормулу(Результат, СтруктураДанных) Экспорт
МассивСтрок = СтруктураДанных.МассивСтрок;
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Возврат;
КонецЕсли;
Если Объект.КроссТаблица Тогда
Если СтруктураДанных.Свойство("ПериодИзменения") Тогда
ИмяПериода = СтруктураДанных.ПериодИзменения;
Иначе
ИмяПериода = "ВсеПериоды";
КонецЕсли;
Для каждого ИДСтроки Из МассивСтрок Цикл
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ИмяПериода <> "ВсеПериоды" Тогда
СтрокаТоваров = ТоварыПоПериодам.НайтиПоИдентификатору(ИДСтроки);
Если ИмяПериода = Период.ИмяКолонки Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Результат.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
ИначеЕсли ЗначениеЗаполнено(СтрокаТоваров["Формула_" + Период.ИмяКолонки]) И СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0 Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(СтрокаТоваров["Формула_" + Период.ИмяКолонки], СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
КонецЕсли;
ИначеЕсли ИмяПериода = "ВсеПериоды" Тогда
СтрокаТоваров = ТоварыПоПериодам.НайтиПоИдентификатору(ИДСтроки);
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период,Результат.Представление);
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Результат.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
КонецЦикла;
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Иначе
Для каждого ИДСтроки Из МассивСтрок Цикл
СтрокаТоваров = Объект.Товары.НайтиПоИдентификатору(ИДСтроки);
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров,Неопределено,Неопределено,Результат.Представление);
СтрокаТоваров.Формула = Результат.Формула;
СтрокаТоваров.ФормулаПредставление = РезультатВычисления.Представление;
СтрокаТоваров.ФормулаВычисление = РезультатВычисления.Вычисление;
СтрокаТоваров.КоличествоУпаковок = РезультатВычисления.Результат;
СтрокаТоваров.Отклонение = 0;
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТоваров, КэшированныеЗначения);
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецЕсли;
Модифицированность = Истина;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьДопРеквизиты(Форма)
ДопРеквизиты = Новый Массив();
Если Форма.ДополнительныеПараметрыТоварыПоПериодам = Неопределено Тогда
Возврат ДопРеквизиты;
КонецЕсли;
Для каждого Поле Из Форма.ДополнительныеПараметрыТоварыПоПериодам Цикл
Если Поле.Значение.СоздаватьРеквизит Тогда
ДопРеквизиты.Добавить(Поле.Значение);
КонецЕсли;
КонецЦикла;
Возврат ДопРеквизиты;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьОперанды(Форма)
МассивОперандов = Новый Массив();
Если Форма.ДополнительныеПараметрыТоварыПоПериодам = Неопределено Тогда
Возврат МассивОперандов;
КонецЕсли;
Для каждого Поле Из Форма.ДополнительныеПараметрыТоварыПоПериодам Цикл
Если Поле.Значение.СоздаватьОперанд Тогда
МассивОперандов.Добавить(Поле.Значение);
КонецЕсли;
КонецЦикла;
Возврат МассивОперандов;
КонецФункции
&НаСервере
Функция ПоместитьДополнительныеПоляВХранилище()
Возврат Планирование.ПоместитьДополнительныеПоляВХранилище(ЭтаФорма, СтруктураНастроек.СмещениеПериода);
КонецФункции
&НаСервере
Процедура ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров)
Сценарий = Планирование.ПараметрыСценария(Объект.Сценарий);
ИспользоватьПланыПродаж = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПродаж")
И Сценарий.ИспользоватьВПланированииПродаж;
ИспользоватьПроизводство = ПолучитьФункциональнуюОпцию("ИспользоватьПроизводство");
ИспользоватьПланированиеПроизводства = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства")
И Сценарий.ИспользоватьВПланированииПроизводства;
ИспользоватьДляПланированияМатериалов = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства")
И Сценарий.ИспользоватьДляПланированияМатериалов;
ИспользоватьПланыЗакупок = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеЗакупок")
И Сценарий.ИспользоватьВПланированииЗакупок;
ИспользоватьСборкиРазрборки = ПолучитьФункциональнуюОпцию("ИспользоватьСборкуРазборку");
ИспользоватьПланыСборки = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеСборкиРазборки")
И Сценарий.ИспользоватьВПланированииСборкиРазборки;
ИспользоватьПланыОстатков = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеОстатков")
И Сценарий.ИспользоватьВПланированииОстатков;
ИспользоватьПланыВнутреннихПотреблений = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеВнутреннихПотреблений")
И Сценарий.ИспользоватьВПланированииВнутреннихПотреблений;
КонструкцияДляВставки = "[ПланыОстатков] * 1.15";
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'План остатков +15%'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "0")
+ ?(ИспользоватьПроизводство И ИспользоватьДляПланированияМатериалов, " + [ПланыПроизводстваМатериалы]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплектующие]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплекты]", "")
+ ?(ИспользоватьПланыВнутреннихПотреблений," + [ПланыВнутреннихПотреблений]","");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Планы потребностей'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
+ ?(ИспользоватьПроизводство И ИспользоватьПланированиеПроизводства, " + [ПланыПроизводства]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Планы обеспечения'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
+ ?(ИспользоватьПроизводство И ИспользоватьПланированиеПроизводства, " + [ПланыПроизводства]", "")
+ ?(ИспользоватьПроизводство И ИспользоватьДляПланированияМатериалов, " - [ПланыПроизводстваМатериалы]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "")
+ ?(ИспользоватьПланыПродаж, " - [ПланыПродаж]", "")
+ ?(ИспользоватьПланыСборки, " - [ПланыСборкиКомплектующие]", "")
+ ?(ИспользоватьПланыСборки, " - [ПланыРазборкиКомплекты]", "")
+ ?(ИспользоватьПланыВнутреннихПотреблений," - [ПланыВнутреннихПотреблений]","");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Отклонение планов'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьФормулуИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Если СтруктураНастроек.ВариантЗаполненияСостава = "Отбор" Тогда
ТоварыПоПериодам.Очистить();
Объект.Товары.Очистить();
ТоварыКоличествоСтрок = 0;
Оповещение = Новый ОписаниеОповещения("НастроитьФормулуИЗаполнитьЗавершение", ЭтотОбъект, Настройки);
ДобавитьТоварыПоОтборуНаКлиенте(Оповещение);
Возврат;
ИначеЕсли СтруктураНастроек.ВариантЗаполненияСостава = "НеМенять" Тогда
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
Иначе
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Настройки.Вставить("ЗаполнятьСостав", Истина);
ЗаполнитьДокумент(Настройки);
КонецЕсли;
Если Объект.КроссТаблица И Элементы.ТоварыПоПериодам.ТекущиеДанные = Неопределено Тогда
ПланированиеКлиентСервер.ОчиститьЗначениеФормулы(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьФормулуИЗаполнитьЗавершение(Результат, Настройки) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
Если Не Объект.КроссТаблица Тогда
ЗаполнитьСоставТовараПоОтбору(КэшированныеЗначения);
КонецЕсли;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецЕсли;
Если Объект.КроссТаблица И Элементы.ТоварыПоПериодам.ТекущиеДанные = Неопределено Тогда
ПланированиеКлиентСервер.ОчиститьЗначениеФормулы(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьСмещениеИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтборуНаКлиенте(ОповещениеОДобавлении = Неопределено)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Подбор товаров'"));
ПараметрыФормы.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
Если СтруктураНастроек.Свойство("ОтборНоменклатурыНастройки") Тогда
ПараметрыФормы.Вставить("ОтборНоменклатурыНастройки", СтруктураНастроек.ОтборНоменклатурыНастройки);
Иначе
ПараметрыФормы.Вставить("ОтборНоменклатурыНастройки", Неопределено)
КонецЕсли;
ДополнительныеПараметры = Новый Структура("ОповещениеОДобавлении", ОповещениеОДобавлении);
Оповещение = Новый ОписаниеОповещения("ДобавитьТоварыПоОтборуЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОткрытьФорму(
"Обработка.ПодборТоваровПоОтбору.Форма",
ПараметрыФормы,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтборуЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, Новый Структура("АдресТоваровВХранилище", Результат));
ОповеститьПользователяОЗаполненииДанных();
КонецЕсли;
Если ДополнительныеПараметры.ОповещениеОДобавлении <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОДобавлении, Результат);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСоставТовараПоОтбору(КэшированныеЗначения)
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
ТоварПоОтбору = Объект.Товары.Выгрузить();
Объект.Товары.Очистить();
Для каждого Период Из АктивныеПериоды Цикл
Для каждого СтрокаТовара Из ТоварПоОтбору Цикл
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
ТекущаяСтрока.ДатаОстатка = Период.ДатаНачала;
ТекущаяСтрока.Формула = СтруктураНастроек.Формула;
ТекущаяСтрока.ФормулаПредставление = СтруктураНастроек.ФормулаПредставление;
ТекущаяСтрока.ФормулаВычисление = СтруктураНастроек.Формула;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПараметрыРасшифровки(СтруктураДанных)
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
КонецЕсли;
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланОстатков");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ОтборПоказатели.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
ОтборПоказатели.Вставить("Характеристика", ТекущиеДанные.Характеристика);
ПараметрыЗапроса = Новый Структура();
ПараметрыЗапроса.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗапроса.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗапроса.Вставить("СмещениеПериода", ДополнительныеНастройки(СтруктураНастроек).СмещениеПериода);
ПараметрыЗапроса.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗапроса.Вставить("ИспользуетсяОтборПоСегментуНоменклатуры",Ложь);
ПараметрыЗапроса.Вставить("Поля", ДополнительныеПараметрыТоварыПоПериодам);
ПараметрыЗапроса.Вставить("Отбор", ОтборПоказатели);
УстановитьПериодЗапроса(ПараметрыЗапроса);
СтруктураДанных.Вставить("ПараметрыРасшифровки", ПараметрыЗапроса);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПериодЗапроса(ПараметрыЗапроса)
Если Объект.КроссТаблица Тогда
ТекущийЭлементИмя = Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя;
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ТекущийЭлементИмя = "ТоварыПоПериодам" + "Количество_" + Период.ИмяКолонки Тогда
ПараметрыЗапроса.Вставить("НачалоПериодаСмещения", Период.ДатаНачала);
ПараметрыЗапроса.Вставить("КонецПериодаСмещения", Период.ДатаОкончания);
КонецЕсли;
КонецЦикла;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ТаблицаПериоды = ЭтаФорма.Периоды;
МассивСтрок = ТаблицаПериоды.НайтиСтроки(Новый Структура("ДатаНачала, Активная", ТекущиеДанные.ДатаОстатка, Истина));
Если МассивСтрок.Количество() > 0 Тогда
ПараметрыЗапроса.Вставить("НачалоПериодаСмещения", МассивСтрок[0].ДатаНачала);
ПараметрыЗапроса.Вставить("КонецПериодаСмещения", МассивСтрок[0].ДатаОкончания);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля = Неопределено)
Если НЕ ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
СтруктураНастроек = Новый Структура();
СтруктураНастроек.Вставить("ВариантЗаполненияСостава", "Формула");
СтруктураНастроек.Вставить("ВариантСмещения", "Произвольное");
СтруктураНастроек.Вставить("СмещениеПериода", 0);
СтруктураНастроек.Вставить("Формула","[ПланируемыеНачальныеОстатки]");
СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru='Планируемый начальный остаток'"));
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
Иначе
ТипРезультата = Новый ОписаниеТипов("Число");
Если ДополнительныеПоля <> Неопределено Тогда
МассивОперандов = Новый Массив;
Для Каждого ТекСтрока Из ДополнительныеПоля Цикл
МассивОперандов.Добавить(ТекСтрока.Идентификатор);
КонецЦикла;
#Если Клиент Тогда
ПараметрыПроверки = РаботаСФормуламиКлиент.ПараметрыПроверкиФормулы();
ПараметрыПроверки.НеВыводитьСообщения = Истина;
РаботаСФормуламиПроверитьФормулу = РаботаСФормуламиКлиент.ПроверитьФормулу(СтруктураНастроек.Формула,
МассивОперандов, ТипРезультата, ПараметрыПроверки);
#Иначе
ПараметрыПроверки = РаботаСФормулами.ПараметрыПроверкиФормулы();
ПараметрыПроверки.НеВыводитьСообщения = Истина;
РаботаСФормуламиПроверитьФормулу = РаботаСФормулами.ПроверитьФормулу(СтруктураНастроек.Формула,
МассивОперандов, ТипРезультата, ПараметрыПроверки);
#КонецЕсли
Если Не РаботаСФормуламиПроверитьФормулу Тогда
СтруктураНастроек.Вставить("ВариантСмещения", "Произвольное");
СтруктураНастроек.Вставить("СмещениеПериода", 0);
СтруктураНастроек.Вставить("Формула","[ПланируемыеНачальныеОстатки]");
СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru='Планируемый начальный остаток'"));
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не СтруктураНастроек.Свойство("ФильтроватьНезаполненныеСтроки") Тогда
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
КонецЕсли;
Возврат СтруктураНастроек;
КонецФункции
&НаСервере
Процедура ЗаписатьДополнительныеПараметры(ДокументОбъект)
МассивДопРеквизитов = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ТекущаяСтрока Из ДокументОбъект.Товары Цикл
ЭлементКоллекции = Объект.Товары.Получить(ТекущаяСтрока.НомерСтроки-1);
Если ЭлементКоллекции = Неопределено Тогда
Продолжить;
КонецЕсли;
ДопПараметр = ТекущаяСтрока.ДополнительныеПараметры.Получить();
Если ТипЗнч(ДопПараметр) <> Тип("Структура") Тогда
ДопПараметр = Новый Структура();
КонецЕсли;
Для каждого ДопРеквизит Из МассивДопРеквизитов Цикл
Идентификатор = ДопРеквизит.Имя;
Если ЭлементКоллекции.Свойство(Идентификатор) Тогда
ДопПараметр.Вставить(Идентификатор,ЭлементКоллекции[Идентификатор]);
КонецЕсли;
КонецЦикла;
ТекущаяСтрока.ДополнительныеПараметры = Новый ХранилищеЗначения(ДопПараметр);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьДополнительныеПараметры(ДокументОбъект)
Для каждого ТекущаяСтрока Из ДокументОбъект.Товары Цикл
ЭлементКоллекции = Объект.Товары.Получить(ТекущаяСтрока.НомерСтроки-1);
Если ЭлементКоллекции = Неопределено Тогда
Продолжить;
КонецЕсли;
ДопРеквизиты = ТекущаяСтрока.ДополнительныеПараметры.Получить();
Если ТипЗнч(ДопРеквизиты) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
Идентификатор = ДопРеквизит.Ключ;
Если ЭлементКоллекции.Свойство(Идентификатор) Тогда
ЭлементКоллекции[Идентификатор] = ДопРеквизит.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ПересчитатьКоличествоУпаковокИСуммуВСтроке(ТекущаяСтрока, КэшированныеЗначения)
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
#Если Клиент Тогда
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
#Иначе
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииКоличестваОтклонение(СтрокаТоваров)
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Не ЗначениеЗаполнено(СтрокаТоваров["Формула_" + Период.ИмяКолонки]) Тогда
Продолжить;
КонецЕсли;
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(СтрокаТоваров["Формула_" + Период.ИмяКолонки], СтрокаТоваров, ЭтаФорма.Периоды, Период);
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Количество_" + Период.ИмяКолонки Тогда
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = РезультатВычисления.Результат - СтрокаТоваров["Количество_" + Период.ИмяКолонки];
ИначеЕсли СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0 Тогда
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
КонецЕсли;
КонецЦикла;
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтруктуруВыводаДопПараметров()
ПараметрыВыводаТаблицы = Новый Структура("Поля", ДополнительныеПараметрыТовары);
Планирование.ОбновитьСтруктуруВыводаТаблицы(ЭтотОбъект, ПараметрыВыводаТаблицы);
ПараметрыВыводаКроссТаблицы = Новый Структура("Поля", ДополнительныеПараметрыТоварыПоПериодам);
Планирование.ОбновитьСтруктуруВыводаТаблицы(ЭтотОбъект, ПараметрыВыводаКроссТаблицы);
КонецПроцедуры
&НаСервере
Процедура ДобавитьПоляИзДопПараметров(ПараметрыВывода)
ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
СтруктураПоля = Новый Структура;
СтруктураПоля.Вставить("ПрефиксРеквизитаКолонки", ДопРеквизит.Имя + "_");
СтруктураПоля.Вставить("УдалятьРеквизитыТаблицы", ДопРеквизит.УдалятьРеквизитыТаблицы);
СтруктураПоля.Вставить("СоздаватьЭлемент", Ложь);
СтруктураПоля.Вставить("ТипЭлемента", ДопРеквизит.Тип);
СтруктураПоля.Вставить("СоздаватьИтоговыеРеквизиты", Ложь);
ПараметрыВывода.Поля.Добавить(СтруктураПоля);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ДобавитьРеквизитыИзДопПараметров(СтруктураРеквизитов)
ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
СтруктураРеквизитов.Вставить(ДопРеквизит.Имя + "_", ДопРеквизит.Имя);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьПользователяОНачалеЗаполненииДанных()
Состояние(НСтр("ru = 'Выполняется заполнение данных в документ'"));
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура НастроитьИЗаполнитьПоПравилуЗаполненияЗавершение(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
Настройки.Вставить("ЗаполнятьПоПравилу", Истина);
ОтборУстановлен = Настройки.ОтборУстановлен;
ЗаполнитьЗначенияСвойств(Объект, Настройки, "ОбновитьДополнить, ИзменитьРезультатНа, ТочностьОкругления");
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВКолонкиЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ОчиститьСообщения();
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВСтрокиЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ПереключитьПериодыВСтроки(Неопределено);
КонецПроцедуры
&НаСервере
Процедура ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения)
Объект.КроссТаблица = Истина;
ПриИзмененииПериодовНаСервере();
СкопироватьВКроссТаблицу(КэшированныеЗначения);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПометкуКроссТаблицы(Форма)
Если Форма.Объект.КроссТаблица Тогда
Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Истина;
Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Ложь;
Форма.Элементы.ГруппаТоварыПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаТоварыКроссТаблица;
Иначе
Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Ложь;
Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Истина;
Форма.Элементы.ГруппаТоварыПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаТоварыТаблица;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьКоличествоСтрок(Форма)
Если Форма.Объект.КроссТаблица Тогда
Форма.ТоварыКоличествоСтрок = Форма.ТоварыПоПериодам.Количество();
Иначе
Форма.ТоварыКоличествоСтрок = Форма.Объект.Товары.Количество();
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыВидаПлана(Форма)
ПараметрыВидаПлана = Новый Структура("ЗаполнятьСклад, ПланированиеПоНазначениям, ЗаполнятьНазначениеВТЧ, ЗаполнятьСкладВТЧ");
ЗаполнитьЗначенияСвойств(ПараметрыВидаПлана, Форма);
Возврат ПараметрыВидаПлана;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыОтбора(Форма)
ПараметрыОтбора = Новый Структура("Склад, Назначение");
ЗаполнитьЗначенияСвойств(ПараметрыОтбора, Форма.Объект);
Возврат ПараметрыОтбора;
КонецФункции
#Область ЗаполнениеВФоне
&НаКлиенте
Процедура ЗаполнитьДокумент(Настройки)
ОповеститьПользователяОНачалеЗаполненииДанных();
Результат = ЗаполнитьДокументНаСервере(Настройки, КэшированныеЗначения);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗаполнитьДокументОповещение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДокументОповещение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
Попытка
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения);
Если Объект.ЗаполнятьПоФормуле
И Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(
ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
ОповеститьПользователяОЗаполненииДанных();
Исключение
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОбработатьРезультатЗаполненияПоФормуле(Форма)
ПоследнийПериод = Форма.Периоды[Форма.Периоды.Количество()-1];
УдаляемыеСтроки = Новый Массив;
ПредыдущийПериод = Неопределено;
ЗнакКорректировки = Планирование.ПолучитьЗнакКорректировки(Форма);
Если Форма.Объект.Замещающий Тогда
ОсновнойОперандПлана = Планирование.ОсновнойОперандПлана(Форма);
ОсновнойОперандПланаСОтбором = Планирование.ОсновнойОперандПлана(Форма, Истина);
Иначе
ОсновнойОперандПлана = "";
ОсновнойОперандПланаСОтбором = "";
КонецЕсли;
ТаблицаПериоды = Форма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Для Каждого СтрокаТоваров Из Форма.ТоварыПоПериодам Цикл
Если Форма.ИспользуютсяПланируемыеОстатки Тогда
НовыйПланОстатков = Форма.ПериодыПлановОстатка.НайтиПоЗначению(Период.ДатаНачала) <> Неопределено;
НовыйПланОстатковСОтбором = Форма.ПериодыПлановОстаткаСОтбором.НайтиПоЗначению(Период.ДатаНачала) <> Неопределено;
Планирование.ВычислитьРассчитываемыеОперанды(СтрокаТоваров, Период, ПредыдущийПериод, НовыйПланОстатков, "_", ОсновнойОперандПлана, ЗнакКорректировки);
Планирование.ВычислитьРассчитываемыеОперанды(СтрокаТоваров, Период, ПредыдущийПериод, НовыйПланОстатковСОтбором, "СОтбором_", ОсновнойОперандПланаСОтбором, ЗнакКорректировки);
КонецЕсли;
Если Период.Активная Тогда
РезультатВычисления = Планирование.ВычислитьПоФормуле(Форма.СтруктураНастроек.Формула, СтрокаТоваров, Форма.Периоды, Период, Форма.СтруктураНастроек.ФормулаПредставление);
Если Форма.ИспользуютсяПланируемыеОстатки Тогда
СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицит_"+Период.ИмяКолонки] = СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицит_"+Период.ИмяКолонки]
+ ЗнакКорректировки * РезультатВычисления.Результат;
Если СтрокаТоваров.Свойство("НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки) Тогда
СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки] = СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки]
+ ЗнакКорректировки * РезультатВычисления.Результат;
КонецЕсли;
КонецЕсли;
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Форма.СтруктураНастроек.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Форма.Объект, Форма, СтрокаТоваров);
КонецЕсли;
Если Период = ПоследнийПериод
И СтрокаТоваров.КоличествоУпаковок = 0 Тогда
УдаляемыеСтроки.Добавить(СтрокаТоваров);
КонецЕсли;
КонецЦикла;
ПредыдущийПериод = Период;
КонецЦикла;
Если Форма.СтруктураНастроек.ВариантЗаполненияСостава = "Формула"
Или Форма.СтруктураНастроек.ФильтроватьНезаполненныеСтроки Тогда
Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл
Форма.ТоварыПоПериодам.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДокументНаСервере(Знач ПараметрыЗадания, КэшированныеЗначения)
Если ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле") Тогда
ПодготовитьПараметрыЗаполненияДокументаПоФормуле(ПараметрыЗадания, КэшированныеЗначения);
ИначеЕсли ПараметрыЗадания.Свойство("ЗаполнятьПоПравилу") Тогда
ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения);
ИначеЕсли ПараметрыЗадания.Свойство("ЗаполнитьДляЗамещения") Тогда
ПодготовитьПараметрыЗаполненияДокументаДляЗамещения(ПараметрыЗадания, КэшированныеЗначения);
КонецЕсли;
НаименованиеЗадания = НСтр("ru = 'Заполнение документа плана:'") + " " + Строка(Объект.Ссылка);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыВыполнения.ОжидатьЗавершение = 0;
ПараметрыВыполнения.ДополнительныйРезультат = ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле");
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
Результат = ДлительныеОперации.ВыполнитьВФоне(
"Документы.ПланОстатков.ЗаполнитьДокумент",
ПараметрыЗадания,
ПараметрыВыполнения);
АдресХранилища = Результат.АдресРезультата;
Если ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле") Тогда
АдресХранилищаДополнительный = Результат.АдресДополнительногоРезультата;
Иначе
АдресХранилищаДополнительный = "";
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция ПодготовитьПараметрыЗаполненияДокументаДляЗамещения(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ТипПлана = Перечисления.ТипыПланов.ПланПродаж;
СтатусыЗаполнения = Планирование.ПолучитьСтатусыЗаполнения(Объект.Сценарий);
ПараметрыЗадания.Вставить("Статусы", СтатусыЗаполнения);
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоПериодаСмещения", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("КонецПериодаСмещения", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("ТипПлана", ТипПлана);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("ЗаполнятьНазначениеВТЧ",
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидПлана,"ЗаполнятьНазначениеВТЧ"));
ПараметрыЗадания.Вставить("Назначение", Объект.Назначение);
ПараметрыЗадания.Вставить("ЗаполнитьДляЗамещения", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланОстатков");
ПараметрыЗадания.Вставить("ИмяКолонкиРезультата", "КоличествоУпаковок");
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Настройки = Новый Структура;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецФункции
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоФормуле(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ТипПлана = Перечисления.ТипыПланов.ПланОстатков;
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоАктивныхПериодов", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("НачалоПериодаСмещения", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("КонецПериодаСмещения", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("НеПереопределено", Истина);
ПараметрыЗадания.Вставить("ТипПлана", ТипПлана);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("ЗаполнятьПоФормуле", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланОстатков");
ПараметрыЗадания.Вставить("ИмяКолонкиРезультата", "КоличествоУпаковок");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыЗадания.Вставить("Отбор", ОтборПоказатели);
МассивИменНаборов = Новый Массив();
Если ПараметрыЗадания.Свойство("ЗаполнятьОперанды") Тогда
МассивОператоров = ПолучитьОперанды(ЭтотОбъект);
Для каждого Элемент Из МассивОператоров Цикл
МассивИменНаборов.Добавить(Элемент.Имя);
КонецЦикла;
КонецЕсли;
ПараметрыЗадания.Вставить("МассивИменНаборов", МассивИменНаборов);
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Если ПараметрыЗадания.Свойство("ЗаполнятьСостав") Тогда
ЗаполняемаяТЧ.Очистить();
МассивИменНаборов = Новый Массив();
Если ПараметрыЗадания.ВариантЗаполненияСостава = "Формула" Тогда
МассивИменНаборов = ПланированиеКлиентСервер.ОперандыТекстовойФормулы(ПараметрыЗадания.Формула);
Иначе
МассивИменНаборов.Добавить(ПараметрыЗадания.ВариантЗаполненияСостава);
КонецЕсли;
ПараметрыЗадания.Вставить("МассивИменНаборовЗаполнения", МассивИменНаборов);
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецПроцедуры
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения)
Если Объект.ОбновитьДополнить <> 0 Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("ИзменитьРезультатНа", Объект.ИзменитьРезультатНа);
ПараметрыЗадания.Вставить("ТочностьОкругления", Объект.ТочностьОкругления);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("Назначение", Объект.Назначение);
ПараметрыЗадания.Вставить("ЗаполнятьПоПравилу", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланОстатков");
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Если Объект.ОбновитьДополнить = 0 Тогда
ЗаполняемаяТЧ.Очистить();
КонецЕсли;
Если НЕ ОтборУстановлен Тогда
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборЗначения = ПланированиеКлиентСервер.ОтборДляВыборки(ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыЗадания.Вставить("Отбор", ОтборЗначения);
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ПравилоЗаполнения", ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Настройки.Вставить("ПользовательскиеНастройки", ПолучитьИзВременногоХранилища(АдресПользовательскихНастроек));
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецПроцедуры
&НаСервере
Функция ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения)
Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Документ.ПланОстатков.Формы.ФормаДокумента.ПолучитьРезультатЗаполненияНаСервере");
Таблица = ПолучитьИзВременногоХранилища(АдресХранилища);
КоличествоОбработанныхСтрок = Таблица.Количество();
Объект.Товары.Загрузить(Таблица);
ИспользуютсяПланируемыеОстатки = Таблица.Колонки.Найти("ПланируемыеНачальныеОстатки") <> Неопределено;
ИспользуютсяПланируемыеОстаткиСОтбором = Таблица.Колонки.Найти("ПланируемыеНачальныеОстаткиСОтбором") <> Неопределено;
Если ИспользуютсяПланируемыеОстатки Тогда
ПериодыПлановОстатка.Очистить();
ПериодыПлановОстаткаСОтбором.Очистить();
Для Каждого Строка Из Таблица Цикл
Если Строка.ПланируемыеНачальныеОстатки<>0 Тогда
Если ПериодыПлановОстатка.НайтиПоЗначению(Строка.ДатаОстатка) = Неопределено Тогда
ПериодыПлановОстатка.Добавить(Строка.ДатаОстатка);
КонецЕсли;
КонецЕсли;
Если ИспользуютсяПланируемыеОстаткиСОтбором
И Строка.ПланируемыеНачальныеОстаткиСОтбором<>0 Тогда
Если ПериодыПлановОстаткаСОтбором.НайтиПоЗначению(Строка.ДатаОстатка) = Неопределено Тогда
ПериодыПлановОстаткаСОтбором.Добавить(Строка.ДатаОстатка);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(АдресХранилищаДополнительный)
И ПолучитьИзВременногоХранилища(АдресХранилищаДополнительный) <> Неопределено Тогда
ТаблицаПериоды = ПолучитьИзВременногоХранилища(АдресХранилищаДополнительный);
Иначе
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
КонецЕсли;
ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, Ложь);
ОценкаПроизводительности.ЗафиксироватьЗамерДлительнойОперации(Замер,
ЭтаФорма.ПолучитьРеквизиты("ТоварыПоПериодам").Количество()/10,
"ОбновитьСтруктуруКроссТаблицы");
СкопироватьВКроссТаблицу(КэшированныеЗначения);
Объект.ЗаполненоАвтоматически = Истина;
Если Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки Тогда
Товары = ТоварыПоПериодам;
Иначе
Товары = Объект.Товары;
КонецЕсли;
ОтборПоТипуНоменклатуры = НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь);
Индекс = Товары.Количество();
Пока Индекс > 0 Цикл
Индекс = Индекс -1;
СтрокаТЧ = Товары[Индекс];
Если ОтборПоТипуНоменклатуры.Найти(СтрокаТЧ.ТипНоменклатуры) = Неопределено Тогда
Товары.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
ЗначенияБылиПересчитаны = Ложь;
Если Объект.ЗаполнятьПоФормуле
И СтруктураНастроек <> Неопределено
И (ИспользуютсяПланируемыеОстатки
Или (Объект.КроссТаблица
И (СтрНайти(СтруктураНастроек.Формула,"НомерТекущейКолонки") <> 0
Или СтрНайти(СтруктураНастроек.Формула,"ЗначениеКолонки") <> 0))) Тогда
ЗначенияБылиПересчитаны = Истина;
ОбработатьРезультатЗаполненияПоФормуле(ЭтаФорма);
ИначеЕсли СтруктураНастроек.ФильтроватьНезаполненныеСтроки Тогда
УдаляемыеСтроки = Новый Массив;
Для Каждого СтрокаТоваров Из Товары Цикл
Если СтрокаТоваров.КоличествоУпаковок = 0 Тогда
УдаляемыеСтроки.Добавить(СтрокаТоваров);
КонецЕсли;
КонецЦикла;
Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл
Товары.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЕсли;
Если Не Объект.КроссТаблица Тогда
Если ИспользуютсяПланируемыеОстатки Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
Иначе
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Объект.Товары, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
КонецЕсли;
Если Не Объект.КроссТаблица Или ЗначенияБылиПересчитаны Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
ИспользуютсяПланируемыеОстатки = Ложь;
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанныхСтрок/10);
КонецФункции
&НаКлиенте
Процедура СценарийПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
СценарийПриИзмененииСервер();
КонецПроцедуры
&НаКлиенте
Процедура ВидПланаПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
ВидПланаПриИзмененииСервер(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЯчейкаОтмененаПриИзменении(Элемент)
УстановитьОтменуИКомментарийЯчейки();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеПриИзменении(Элемент)
УстановитьОтменуИКомментарийЯчейки();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Оповещение = Новый ОписаниеОповещения("КомментарийКЯчейкеНачалоВыбораЗавершение", ЭтотОбъект);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru='Комментарий ячейки плана'"));
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийПриИзменении(Элемент)
Элементы.Товары.ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(Элементы.Товары.ТекущиеДанные.Комментарий);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока", Элементы.Товары.ТекущаяСтрока);
Оповещение = Новый ОписаниеОповещения("ТоварыКомментарийНачалоВыбораЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru='Комментарий ячейки плана'"));
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
ТекущиеДанные.Комментарий = ВведенныйТекст;
ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(ВведенныйТекст);
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыОтмененоПриИзменении(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииОтменено(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииКомментария(Элемент)
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И Элементы.ТоварыПоПериодам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Комментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ТекущиеДанные["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(КомментарийКЯчейке);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_НачалоВыбораКомментария(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
СтандартнаяОбработка = Ложь;
Если ТекущиеДанные <> Неопределено И Элементы.ТоварыПоПериодам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Комментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока, ИмяКолонки",
Элементы.ТоварыПоПериодам.ТекущаяСтрока,
Период.ИмяКолонки);
Оповещение = Новый ОписаниеОповещения("Подключаемый_НачалоВыбораКомментарияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
КомментарийКЯчейке,
НСтр("ru='Комментарий ячейки плана'"));
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_НачалоВыбораКомментарияЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = ТоварыПоПериодам.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
ТекущиеДанные["Комментарий_"+ ДополнительныеПараметры.ИмяКолонки] = ВведенныйТекст;
ТекущиеДанные["КартинкаКомментарий_"+ ДополнительныеПараметры.ИмяКолонки] = ЗначениеЗаполнено(ТекущиеДанные["Комментарий_"+ ДополнительныеПараметры.ИмяКолонки]);
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьФлагОтменыСтрокПлана(Команда)
Оповещение = Новый ОписаниеОповещения("ИзменитьФлагОтменыСтрокПланаЗавершение", ЭтотОбъект);
Если Объект.КроссТаблица Тогда
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, ТоварыПоПериодам, "ТоварыПоПериодам", Оповещение);
Иначе
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, Объект.Товары, "Товары", Оповещение);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура УстановитьОтменуИКомментарийЯчейки()
ЯчейкаНайдена = Ложь;
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
Возврат;
КонецЕсли;
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоПериодам.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки Тогда
ТекущиеДанные["Отменено_"+ Период.ИмяКолонки] = ЯчейкаОтменена;
ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки] = КомментарийКЯчейке;
ТекущиеДанные["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(КомментарийКЯчейке);
ЯчейкаНайдена = Истина;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ ЯчейкаНайдена Тогда
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
КонецЕсли;
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
КомментарийКЯчейке = ВведенныйТекст;
Модифицированность = Истина;
КомментарийКЯчейкеПриИзменении(Элементы.КомментарийКЯчейке);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьФлагОтменыСтрокПланаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат
КонецЕсли;
Если Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.ТоварыПоПериодам.ВыделенныеСтроки;
Иначе
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
КонецЕсли;
Если ВыделенныеСтроки.Количество() > 0 Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьНаПроцентЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено
ИЛИ Результат = 0
ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ВыделеннаяСтрока);
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТЧ, КэшированныеЗначения);
КонецЦикла;
Иначе
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОкруглитьКоличествоЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено
ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ВыделеннаяСтрока);
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТЧ, КэшированныеЗначения);
КонецЦикла;
Иначе
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Функция ПроверитьЗаполнениеШапки()
ОчиститьСообщения();
ЗаполненоКорректно = Истина;
Если НЕ ЗначениеЗаполнено(Объект.Сценарий) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Сценарий"" не заполнено'"),
Объект.Ссылка,
"Объект.Сценарий");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Вид плана"" не заполнено'"),
Объект.Ссылка,
"Объект.ВидПлана");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьСклад И НЕ ЗначениеЗаполнено(Объект.Склад) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Склад"" не заполнено'"),
Объект.Ссылка,
"Объект.Склад");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)).Количество() = 0 Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Параметры периода заданы неверно. Заполнение невозможно'"),
Объект.Ссылка);
ЗаполненоКорректно = Ложь;
КонецЕсли;
Возврат ЗаполненоКорректно;
КонецФункции
#КонецОбласти
&НаСервере
Процедура УдалитьПустыеСтрокиНаСервере()
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
НеобходимоПересчитыватьИтоги = Ложь;
Индекс = ТоварыПоПериодам.Количество() -1;
Пока Индекс >= 0 Цикл
СтрокаТЧ = ТоварыПоПериодам[Индекс];
Если СтрокаТЧ.КоличествоУпаковок <> 0 Тогда
Индекс = Индекс - 1;
Продолжить;
КонецЕсли;
ЭтоПустаяСтрока = Истина;
Для каждого Период Из АктивныеПериоды Цикл
Если СтрокаТЧ["Количество_"+Период.ИмяКолонки] <> 0 Тогда
ЭтоПустаяСтрока = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоПустаяСтрока Тогда
ТоварыПоПериодам.Удалить(Индекс);
НеобходимоПересчитыватьИтоги = Истина;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Если НеобходимоПересчитыватьИтоги Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоПериодамПриАктивизацииЯчейкиНаКлиенте()
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоПериодам");
КонецЕсли;
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
Если АктивныеПериоды.Количество() = 1 Тогда
Возврат;
КонецЕсли;
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
ЯчейкаНайдена = Ложь;
Элемент = Элементы.ТоварыПоПериодам;
ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
Возврат;
КонецЕсли;
ИтогоПоКолонке = "";
Если Элемент.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из АктивныеПериоды Цикл
Если Элемент.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "Количество_"+Период.ИмяКолонки
ИЛИ Элемент.ТекущийЭлемент.Имя = "ТоварыПоПериодам" + "КартинкаКомментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ЯчейкаНайдена = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
КонецПроцедуры
#Область ЗамещениеПланов
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыЗамещения(Знач Объект)
ПараметрыЗамещения = Новый Структура;
ПараметрыЗамещения.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗамещения.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗамещения.Вставить("Статус", Объект.Статус);
ПараметрыЗамещения.Вставить("Дата", Объект.Дата);
ПараметрыЗамещения.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыЗамещения.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ПараметрыЗамещения.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗамещения.Вставить("Склад", Объект.Склад);
ПараметрыЗамещения.Вставить("Назначение", Объект.Назначение);
Возврат ПараметрыЗамещения
КонецФункции
&НаСервере
Процедура ОбновитьПризнакЗамещения()
Для Каждого Строка Из Объект.Товары Цикл
Строка.Замещен = Ложь;
Строка.ЗамещенКЗаказу = Ложь;
КонецЦикла;
Если Не Объект.Замещающий Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗамещенныеПериоды.ЗамещенныйПериод КАК ЗамещенныйПериод,
| ЗамещенныеПериоды.ЗамещенКЗаказу КАК ЗамещенКЗаказу,
| ЗамещенныеПериоды.Замещен КАК Замещен
|ПОМЕСТИТЬ ЗамещенныеПериоды
|ИЗ
| &ЗамещенныеПериоды КАК ЗамещенныеПериоды
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПланОстатковТовары.ДатаОстатка,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОстатковТовары.ДатаОстатка, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОстатковТовары.ДатаОстатка, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОстатковТовары.ДатаОстатка, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОстатковТовары.ДатаОстатка, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОстатковТовары.ДатаОстатка, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ПланОстатковТовары.ДатаОстатка, ГОД)
| ИНАЧЕ ПланОстатковТовары.ДатаОстатка
| КОНЕЦ КАК Период
|ПОМЕСТИТЬ ПланОстатковТовары
|ИЗ
| &ПланОстатковТовары КАК ПланОстатковТовары
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПланОстатковТовары.ДатаОстатка,
| МАКСИМУМ(ЗамещенныеПериоды.ЗамещенКЗаказу) КАК ЗамещенКЗаказу,
| МАКСИМУМ(ЗамещенныеПериоды.Замещен) КАК Замещен
|ИЗ
| ЗамещенныеПериоды КАК ЗамещенныеПериоды
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланОстатковТовары КАК ПланОстатковТовары
| ПО ЗамещенныеПериоды.ЗамещенныйПериод = ПланОстатковТовары.Период
|
|СГРУППИРОВАТЬ ПО
| ПланОстатковТовары.ДатаОстатка";
Запрос.УстановитьПараметр("ЗамещенныеПериоды", ЗамещенныеПериоды.Выгрузить());
Запрос.УстановитьПараметр("ПланОстатковТовары", Объект.Товары.Выгрузить());
Запрос.УстановитьПараметр("Периодичность", Объект.Периодичность);
ЗапросПакет = Запрос.ВыполнитьПакет();
Выборка = ЗапросПакет[2].Выбрать();
Пока Выборка.Следующий() Цикл
Отбор = Новый Структура("ДатаОстатка", Выборка.ДатаОстатка);
ЗамещаемыеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого Строка Из ЗамещаемыеСтроки Цикл
Строка.Замещен = Выборка.Замещен;
Строка.ЗамещенКЗаказу = Выборка.ЗамещенКЗаказу;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьЗамещенныеПериоды()
ПараметрыЗамещения = ПараметрыЗамещения(Объект);
Результат = Планирование.ПолучитьЗамещенныеПериоды(ПараметрыЗамещения, "ПланОстатков");
ЗамещенныеПериоды.Загрузить(Результат);
КонецФункции
&НаКлиенте
Процедура ЗамещениеФорматированнаяСтрокаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = ПараметрыЗамещения(Объект);
ПараметрыФормы.Вставить("НавигационнаяСсылкаФорматированнойСтроки", НавигационнаяСсылкаФорматированнойСтроки);
ОткрытьФорму("РегистрСведений.ЗамещениеПланов.Форма.ЗамещениеПланов", ПараметрыФормы);
КонецПроцедуры
&НаСервереБезКонтекста
Функция КонтрольЗамещенияПланаНаСервере(Ссылка)
Возврат Планирование.КонтрольЗамещенияПлана(Ссылка);
КонецФункции
#КонецОбласти
#Область ЗагрузкаДанныхИзФайла
&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайла(ДополнительныеПараметры)
ПараметрыЗагрузки = ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных();
ПараметрыЗагрузки.ПолноеИмяТабличнойЧасти = "ПланОстатков.Товары";
ПараметрыЗагрузки.Заголовок = НСтр("ru = 'Загрузка таблицы ""Товары"" из файла'");
ПараметрыЗагрузки.ДополнительныеПараметры = ДополнительныеПараметры;
ПараметрыЗагрузки.КолонкиМакета = ПланированиеКлиент.ОписаниеКолонокМакетаДляЗагрузкиНоменклатуры(ДополнительныеПараметры);
Оповещение = Новый ОписаниеОповещения("ПоказатьФормуЗагрузкиИзФайлаЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки(ПараметрыЗагрузки, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если АдресЗагруженныхДанных = Неопределено Тогда
Возврат;
КонецЕсли;
ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры)
ЗагруженныеДанные = ПолучитьИзВременногоХранилища(АдресЗагруженныхДанных);
ДобавитьТовары(ЗагруженныеДанные, Неопределено);
КонецПроцедуры
#КонецОбласти
#КонецОбласти