#Область ОписаниеПеременных
&НаКлиенте
Перем КэшированныеЗначения;
&НаКлиенте
Перем ПараметрыОбработчикаОжидания;
&НаКлиенте
Перем ОповещениеПослеЗаписи Экспорт;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
Планирование.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
Параметры.Свойство("ТекущаяСтрока", ТекущаяСтрокаПриОткрытии);
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
ОбновлятьПравило = Объект.ПравилоЗаполнения.Количество() = 0;
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана);
ЗаполнитьЗначенияСвойств(Объект, ПараметрыВидаПлана,"ЗаполнятьПоФормуле,Замещающий,ЗаполнятьПоДефициту,ХозяйственнаяОперация");
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Сценарий,
"Периодичность, СценарийБюджетирования, СпособРасчетаПотребностейВМатериалах");
ЗаполнитьЗначенияСвойств(Объект, ПараметрыСценария);
Если КоличествоПериодов > 0 И НЕ ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(
Объект.Периодичность,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекущаяДатаСеанса(),
КоличествоПериодов);
КонецЕсли;
ПриЧтенииСозданииНаСервере();
Если ПараметрыВидаПлана.ЗаполнятьПоДефициту = Истина Тогда
Объект.КроссТаблица = Ложь;
ПереключитьПериодыВСтрокиНаСервере(Неопределено);
КонецЕсли;
УстановитьВидимость();
КонецЕсли;
СохранитьНовыйПериодСервер();
Если ЗначениеЗаполнено(Объект.ПравилоЗаполнения) Тогда
Для Каждого Правило Из Объект.ПравилоЗаполнения Цикл
Если Правило.ОтборИзШапкиУстановлен Тогда
ОтборУстановлен = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
УстановитьУсловноеОформлениеКроссТаблицы();
ИмяДополнительнойКолонки = ФормированиеПечатныхФорм.ДополнительнаяКолонкаПечатныхФормДокументов().ИмяКолонки;
УстановитьДоступностьКомандБуфераОбмена();
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПриСозданииНаСервере(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
Справочники.Назначения.ФормаДокументаПриСозданииНаСервере(ЭтаФорма);
СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
ПараметрыГиперссылки = РаботаСФайлами.ГиперссылкаФайлов();
ПараметрыГиперссылки.Размещение = "КоманднаяПанель";
РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыГиперссылки);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
Если Объект.Замещающий И КонтрольЗамещенияПланаНаСервере(Объект.Ссылка) Тогда
ПропуститьПроверкуЗапретаИзменения = Истина;
ЭтотОбъект.Записать();
ЭтотОбъект.Прочитать();
ПропуститьПроверкуЗапретаИзменения = Ложь;
КонецЕсли;
ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте();
ПланированиеКлиент.СпозиционироватьсяПоСтроке(ЭтаФорма, "ГруппаТовары", "Товары", "ТоварыПоДатам");
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
РаботаСФайламиКлиент.ПриОткрытии(ЭтотОбъект, Отказ);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора.ИмяФормы = "Обработка.ПодборТоваровВДокументЗакупки.Форма.Форма" Тогда
ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
Планирование.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, Ложь, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана,, "КоличествоПериодов");
ПриЧтенииСозданииНаСервере();
Если ПараметрыВидаПлана.ЗаполнятьПоДефициту Тогда
Объект.КроссТаблица = Ложь;
ПереключитьПериодыВСтрокиНаСервере(Неопределено);
КонецЕсли;
СохранитьНовыйПериодСервер();
УстановитьВидимость();
ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ПланСборкиРазборки.ФормаДокумента.Событие.ПередЗаписью");
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
ПараметрыЗаписи.Вставить("КэшированныеЗначения", КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
СкопироватьИзКроссТаблицы(ПараметрыЗаписи["КэшированныеЗначения"], ТекущийОбъект);
Планирование.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
Если Объект.ЗаполнятьПоФормуле Тогда
ЗаписатьДополнительныеПараметры(ТекущийОбъект);
КонецЕсли;
Если ПропуститьПроверкуЗапретаИзменения Тогда
ТекущийОбъект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
КонецЕсли;
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
Если Объект.ЗаполнятьПоФормуле Тогда
ПрочитатьДополнительныеПараметры(ТекущийОбъект);
КонецЕсли;
УстановитьВидимость();
МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект, ПараметрыЗаписи);
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланСборкиРазборки");
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "КопированиеСтрокВБуферОбмена" Тогда
УстановитьДоступностьКомандБуфераОбменаНаКлиенте();
ИначеЕсли ИмяСобытия = "РаботаСExcelКлиент_ЗагрузитьИзExcel"
И Параметр.УникальныйИдентификаторФормы = ЭтаФорма.УникальныйИдентификатор Тогда
ЗагрузитьИзExcelНаКлиентеПродолжение(Параметр.ДанныеЗагрузки);
ИначеЕсли ИмяСобытия = "Запись_КорректировкаПлановыхПотребностей" Тогда
Если Параметр.Свойство("План")
И Параметр.План = Объект.Ссылка Тогда
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Перезаполнить'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Отменить'"));
ТекстВопроса = НСтр("ru='Потребность в товарах изменилась, перезаполнить табличную часть?'");
Оповещение = Новый ОписаниеОповещения("СкорректироватьПотребностьЗавершение", ЭтотОбъект, Параметр);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
КонецЕсли;
КонецЕсли;
Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
РаботаСФайламиКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия);
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
Если Объект.КроссТаблица Тогда
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПредставлениеТаблицы",НСтр("ru='Товары'"));
СтруктураДействий.Вставить("ПутьКТаблице","ТоварыПоДатам");
СтруктураДействий.Вставить("ЗаполнятьНоменклатуру");
СтруктураДействий.Вставить("ЗаполнятьВариантКомплектации");
СтруктураДействий.Вставить("ЗаполнятьХарактеристикуВТЧ");
Если ЗаполнятьСкладВТЧ Тогда
СтруктураДействий.Вставить("ЗаполнятьСкладВТЧ");
КонецЕсли;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("Периоды", ЭтотОбъект["Периоды"].Выгрузить(Новый Структура("Активная", Истина)));
ПараметрыПроверки.Вставить("ПрефиксПоля", "Количество_");
ПараметрыПроверки.Вставить("ИмяПоля", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПроверкаКоличестваПоПериодам", ПараметрыПроверки);
СтруктураДействий.Вставить("ПоляГруппировки", "Номенклатура,Характеристика,Назначение,Упаковка,Склад,ВариантКомплектации,КодСтрокиТовары");
Планирование.ОбработкаПроверкиЗаполненияВФорме(ТоварыПоДатам, СтруктураДействий, Отказ, ПроверяемыеРеквизиты, Объект.КроссТаблица);
Иначе
МассивНепроверяемыхРеквизитов.Добавить("ТоварыПоДатам");
КонецЕсли;
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты,МассивНепроверяемыхРеквизитов);
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_ПланСборкиРазборки", , Объект.Ссылка);
ТаймерКонтроляПересчетаДефецитов = 1;
ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте();
МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);
Если ОповещениеПослеЗаписи <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОповещениеПослеЗаписи, Истина);
ОповещениеПослеЗаписи = Неопределено;
КонецЕсли;
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
Если ЭтаФорма.Модифицированность Тогда
Если КонтрольЗамещенияПланаНаСервере(Объект.Ссылка) Тогда
ЭтотОбъект.Прочитать();
ЭтотОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
Если ТекущаяСтраница.Имя = "ГруппаДополнительныеРеквизиты"
И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
СвойстваВыполнитьОтложеннуюИнициализацию();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
Если Объект.Замещающий
И (Объект.КроссТаблица И ТоварыПоДатам.Количество() = 0
ИЛИ Не Объект.КроссТаблица И Объект.Товары.Количество() = 0)
И Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаТовары Тогда
ЗаполнитьДаннымиДляЗамещения();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СценарийПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("СценарийПриИзмененииЗавершение", ЭтотОбъект);
ПланированиеКлиент.ПоказатьВопросПриИзмененииСценария(ЭтаФорма, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура СценарийПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
СценарийПриИзмененииСервер();
КонецПроцедуры
&НаКлиенте
Процедура ВидПланаПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("ВидПланаПриИзмененииЗавершение", ЭтотОбъект);
ПланированиеКлиент.ПоказатьВопросПриИзмененииВидПлана(ЭтаФорма, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ВидПланаПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
ВидПланаПриИзмененииСервер(Истина);
КонецПроцедуры
&НаКлиенте
Процедура НачалоПериодаПриИзменении(Элемент)
Если Объект.ЗаполнятьПоДефициту Тогда
Объект.ОкончаниеПериода = Объект.НачалоПериода;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ТоварыПоДатам", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОкончаниеПериодаПриИзменении(Элемент)
Если Объект.ЗаполнятьПоДефициту Тогда
Объект.НачалоПериода = Объект.ОкончаниеПериода;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ТоварыПоДатам", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура СкладПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
СкладПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ОперацияПриИзменении(Элемент)
ОперацияПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура НазначениеПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
Если Не ЗначениеЗаполнено(Объект.Статус) Тогда
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыПланов.Отменен");
КонецЕсли;
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЯчейкаОтмененаПриИзменении(Элемент)
УстановитьОтменуИКомментарийЯчейки();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеПриИзменении(Элемент)
УстановитьОтменуИКомментарийЯчейки();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Оповещение = Новый ОписаниеОповещения("КомментарийКЯчейкеНачалоВыбораЗавершение", ЭтотОбъект);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru='Комментарий ячейки плана'"));
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары
&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если НоваяСтрока Тогда
КодСтрокиИсточник = ТекущиеДанные.КодСтроки;
ТекущиеДанные.КодСтроки = НовыйКодСтрокиТовары(Объект);
ТекущиеДанные.Подсборка = Ложь;
ТекущиеДанные.КодСтрокиТовары = 0;
ТекущиеДанные.НоменклатураКомплект = Неопределено;
ТекущиеДанные.ХарактеристикаКомплект = Неопределено;
Если ТекущиеДанные.ПланированиеПодсборки = ПредопределенноеЗначение("Перечисление.СтатусыПланированияПодсборки.Выполнено") Тогда
ТекущиеДанные.ПланированиеПодсборки = ПредопределенноеЗначение("Перечисление.СтатусыПланированияПодсборки.Запланировать");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
Объект.ЗаполненоАвтоматически = Ложь;
ТоварыКоличествоСтрок = Объект.Товары.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если НоваяСтрока Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
ТоварыКоличествоСтрок = Объект.Товары.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПередУдалением(Элемент, Отказ)
МассивКлючей = Новый Массив;
Для каждого ВыделеннаяСтрока Из Элементы.Товары.ВыделенныеСтроки Цикл
ДанныеСтроки = Элементы.Товары.ДанныеСтроки(ВыделеннаяСтрока);
МассивКлючей.Добавить(ДанныеСтроки.КодСтроки);
КонецЦикла;
ТоварыУдаляемыеСтрокиМассивКлючей = Новый ФиксированныйМассив(МассивКлючей);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПослеУдаления(Элемент)
ТоварыПослеУдаленияНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект,ТекущаяСтрока);
ПриИзмененииНоменклатурыНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыХарактеристикаПриИзменении(Элемент)
ПриИзмененииХарактеристикиНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
РассчитатьКоличествоДляПодсборокПриИзмененииТовара();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
РассчитатьКоличествоДляПодсборок(
ТекущаяСтрока.КодСтроки,
ТекущаяСтрока.ВариантКомплектации,
ТекущаяСтрока.ДатаСборкиРазборки,
ТекущаяСтрока.Количество,
ТекущаяСтрока.Отменено);
ТекущаяСтрока.Расшифровка = Строка(ТекущаяСтрока.КоличествоУпаковок);
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущаяСтрока);
Если ТекущаяСтрока.Свойство("Отклонение") И ЗначениеЗаполнено(ТекущаяСтрока.Формула) Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(ТекущаяСтрока.Формула, ТекущаяСтрока, Неопределено, Неопределено);
ТекущаяСтрока.Отклонение = РезультатВычисления.Результат - ТекущаяСтрока.КоличествоУпаковок;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыВариантКомплектацииПриИзменении(Элемент)
ВариантКомплектацииПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСкладПриИзменении(Элемент)
ТоварыСкладПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если Поле.Имя = "ТоварыНоменклатураКомплект"
ИЛИ Поле.Имя = "ТоварыХарактеристикаКомплект" Тогда
ПерейтиККомплекту(СтандартнаяОбработка);
ИначеЕсли Поле.Имя = "ТоварыПланированиеПодсборки" Тогда
ЗапланироватьПодсборку(СтандартнаяОбработка);
ИначеЕсли Поле.Имя = "ТоварыПоДатамНоменклатура" И ТекущиеДанные <> Неопределено И ТекущиеДанные.Подсборка Тогда
ПоказатьЗначение(, ТекущиеДанные.Номенклатура);
ИначеЕсли Поле.Имя = "ТоварыПоДатамХарактеристика" И ТекущиеДанные <> Неопределено И ТекущиеДанные.Подсборка Тогда
ПоказатьЗначение(, ТекущиеДанные.Характеристика);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПланСборкиРазборкиПрисоединенныеФайлы") Тогда
ЗагрузитьИзExcelНаКлиенте(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийПриИзменении(Элемент)
Элементы.Товары.ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(Элементы.Товары.ТекущиеДанные.Комментарий);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
Если Не Объект.ЗаполнятьПоФормуле И Элементы.Товары.ВыделенныеСтроки.Количество() > 0 Тогда
ВГраница = Элементы.Товары.ВыделенныеСтроки.ВГраница();
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ВыделенныеСтроки[ВГраница]));
Иначе
Расшифровка = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока", Элементы.Товары.ТекущаяСтрока);
Оповещение = Новый ОписаниеОповещения("ТоварыКомментарийНачалоВыбораЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru='Комментарий ячейки плана'"));
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКомментарийНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
ТекущиеДанные.Комментарий = ВведенныйТекст;
ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(ВведенныйТекст);
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыОтмененоПриИзменении(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыДатаСборкиРазборкиПриИзменении(Элемент)
Если Объект.Замещающий
И Объект.Проведен
И ЗамещенныеПериоды.Количество() > 0 Тогда
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ДатаПоступленияНачалоПериода = ПланированиеКлиентСерверПовтИсп.РассчитатьДатуНачалаПериода(ТекущиеДанные.ДатаСборкиРазборки, Объект.Периодичность);
Отбор = Новый Структура("ЗамещенныйПериод", ДатаПоступленияНачалоПериода);
ЗамещенныйПериодСтроки = ЗамещенныеПериоды.НайтиСтроки(Отбор);
Если ЗамещенныйПериодСтроки.Количество() > 0 Тогда
ТекущиеДанные.Замещен = ЗамещенныйПериодСтроки[0].Замещен;
ТекущиеДанные.ЗамещенКЗаказу = ЗамещенныйПериодСтроки[0].ЗамещенКЗаказу;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТоварыПоДатам
&НаКлиенте
Процедура ТоварыПоДатамПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
Если НоваяСтрока Тогда
КодСтрокиИсточник = ТекущиеДанные.КодСтроки;
ТекущиеДанные.КодСтроки = НовыйКодСтрокиТовары(Объект);
ТекущиеДанные.Подсборка = Ложь;
ТекущиеДанные.КодСтрокиТовары = 0;
ТекущиеДанные.НоменклатураКомплект = Неопределено;
ТекущиеДанные.ХарактеристикаКомплект = Неопределено;
Если ТекущиеДанные.ПланированиеПодсборки = ПредопределенноеЗначение("Перечисление.СтатусыПланированияПодсборки.Выполнено") Тогда
ТекущиеДанные.ПланированиеПодсборки = ПредопределенноеЗначение("Перечисление.СтатусыПланированияПодсборки.Запланировать");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамПриИзменении(Элемент)
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоДатам");
Объект.ЗаполненоАвтоматически = Ложь;
ТоварыКоличествоСтрок = ТоварыПоДатам.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если НоваяСтрока Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
ТоварыКоличествоСтрок = ТоварыПоДатам.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамПередУдалением(Элемент, Отказ)
Если Объект.ЗаполнятьПоДефициту Тогда
Отказ = Истина;
ОписаниеОповещение = Новый ОписаниеОповещения("ТоварыПередУдалениемЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Количество к обеспечению будет скорректировано. Продолжить?'"),
РежимДиалогаВопрос.ДаНет,
,
КодВозвратаДиалога.Да);
Возврат;
КонецЕсли;
МассивКлючей = Новый Массив;
Для каждого ВыделеннаяСтрока Из Элементы.ТоварыПоДатам.ВыделенныеСтроки Цикл
ДанныеСтроки = Элементы.ТоварыПоДатам.ДанныеСтроки(ВыделеннаяСтрока);
МассивКлючей.Добавить(ДанныеСтроки.КодСтроки);
КонецЦикла;
ТоварыУдаляемыеСтрокиМассивКлючей = Новый ФиксированныйМассив(МассивКлючей);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПередУдалениемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
ВыделеннаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторСтроки);
ВыделеннаяСтрока.Количество = 0;
ВыделеннаяСтрока.КоличествоУпаковок = 0;
ВыделеннаяСтрока.ЗаданИнтервалПотребности = Истина;
ВыделеннаяСтрока.ИнтервалПотребностиОт = 0;
ВыделеннаяСтрока.ИнтервалПотребностиДо = 0;
КонецЦикла
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамПослеУдаления(Элемент)
ТоварыПослеУдаленияНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ТоварыПоДатам.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "ТоварыПоДатам"));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект,ТекущаяСтрока);
ПриИзмененииНоменклатурыНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамХарактеристикаПриИзменении(Элемент)
ПриИзмененииХарактеристикиНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамУпаковкаПриИзменении(Элемент)
РассчитатьКоличествоДляПодсборокПриИзмененииТовара();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамВариантКомплектацииПриИзменении(Элемент)
ВариантКомплектацииПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамСкладПриИзменении(Элемент)
ТоварыСкладПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииКоличества(Элемент)
СтрокаТоваров = Элементы.ТоварыПоДатам.ТекущиеДанные;
ПриИзмененииКоличестваСуммыСтроки(ЭтаФорма, СтрокаТоваров);
ИмяКолонки = Сред(Элемент.Имя, СтрДлина("ТоварыПоДатам" + "Количество_") + 1);
ИмяКолонкиКоличество = "Количество_" + ИмяКолонки;
ИмяКолонкиОтменено = "Отменено_" + ИмяКолонки;
РассчитатьКоличествоДляПодсборок(
СтрокаТоваров.КодСтроки,
СтрокаТоваров.ВариантКомплектации,
ИмяКолонки,
СтрокаТоваров[ИмяКолонкиКоличество],
СтрокаТоваров[ИмяКолонкиОтменено],
СтрокаТоваров.Упаковка,
СтрокаТоваров.Номенклатура);
Если НЕ Объект.ЗаполнятьПоФормуле Тогда
СтрокаТоваров["Расшифровка_" + ИмяКолонки] = Строка(СтрокаТоваров["Количество_" + ИмяКолонки]);
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(СтрокаТоваров, "Расшифровка_" + ИмяКолонки);
КонецЕсли;
Если Объект.ЗаполнятьПоФормуле Тогда
ПриИзмененииКоличестваОтклонение(СтрокаТоваров);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
Если Поле.Имя = "ТоварыПоДатамНоменклатураКомплект"
ИЛИ Поле.Имя = "ТоварыПоДатамХарактеристикаКомплект" Тогда
ПерейтиККомплекту(СтандартнаяОбработка);
ИначеЕсли Поле.Имя = "ТоварыПоДатамПланированиеПодсборки" Тогда
ЗапланироватьПодсборку(СтандартнаяОбработка);
ИначеЕсли Поле.Имя = "ТоварыПоДатамНоменклатура" И ТекущиеДанные <> Неопределено И ТекущиеДанные.Подсборка Тогда
ПоказатьЗначение(, ТекущиеДанные.Номенклатура);
ИначеЕсли Поле.Имя = "ТоварыПоДатамХарактеристика" И ТекущиеДанные <> Неопределено И ТекущиеДанные.Подсборка Тогда
ПоказатьЗначение(, ТекущиеДанные.Характеристика);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПланСборкиРазборкиПрисоединенныеФайлы") Тогда
ЗагрузитьИзExcelНаКлиенте(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииОтменено(Элемент)
СтрокаТоваров = Элементы.ТоварыПоДатам.ТекущиеДанные;
ПриИзмененииКоличестваСуммыСтроки(ЭтаФорма, СтрокаТоваров);
ИмяКолонки = Сред(Элемент.Имя, СтрДлина("ТоварыПоДатам" + "Отменено_") + 1);
ИмяКолонкиКоличество = "Количество_" + ИмяКолонки;
ИмяКолонкиОтменено = "Отменено_" + ИмяКолонки;
РассчитатьКоличествоДляПодсборок(
СтрокаТоваров.КодСтроки,
СтрокаТоваров.ВариантКомплектации,
ИмяКолонки,
СтрокаТоваров[ИмяКолонкиКоличество],
СтрокаТоваров[ИмяКолонкиОтменено],
СтрокаТоваров.Упаковка,
СтрокаТоваров.Номенклатура);
Если Объект.ЗаполнятьПоФормуле Тогда
ПриИзмененииКоличестваОтклонение(СтрокаТоваров);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииКомментария(Элемент)
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И Элементы.ТоварыПоДатам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоДатам.ТекущийЭлемент.Имя = "ТоварыПоДатам" + "Комментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ТекущиеДанные["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(КомментарийКЯчейке);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_НачалоВыбораКомментария(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
СтандартнаяОбработка = Ложь;
Если ТекущиеДанные <> Неопределено И Элементы.ТоварыПоДатам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоДатам.ТекущийЭлемент.Имя = "ТоварыПоДатам" + "Комментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока, ИмяКолонки",
Элементы.ТоварыПоДатам.ТекущаяСтрока,
Период.ИмяКолонки);
Оповещение = Новый ОписаниеОповещения("Подключаемый_НачалоВыбораКомментарияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
КомментарийКЯчейке,
НСтр("ru='Комментарий ячейки плана'"));
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_НачалоВыбораКомментарияЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = ТоварыПоДатам.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
ТекущиеДанные["Комментарий_"+ ДополнительныеПараметры.ИмяКолонки] = ВведенныйТекст;
ТекущиеДанные["КартинкаКомментарий_"+ ДополнительныеПараметры.ИмяКолонки] = ЗначениеЗаполнено(ТекущиеДанные["Комментарий_"+ ДополнительныеПараметры.ИмяКолонки]);
Модифицированность = Истина;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПроверкаПеретаскивания(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПеретаскивание(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраНажатие(Элемент, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраНажатие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПодобратьТовары(Команда)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ПланСборкиРазборки.ФормаДокумента.Команда.ПодобратьТовары");
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимПодбораБезСуммовыхПараметров", Истина);
ПараметрыФормы.Вставить("СкрыватьКолонкуВидЦены", Истина);
ПараметрыФормы.Вставить("СкрыватьКомандуЦеныНоменклатуры", Истина);
Если ЗаполнятьСклад Тогда
ПараметрыФормы.Вставить("Склад", Объект.Склад);
КонецЕсли;
Если ЗаполнятьСкладВТЧ Тогда
ПараметрыФормы.Вставить("РежимПодбораИспользоватьСкладыВТабличнойЧасти", Истина);
ПараметрыФормы.Вставить("ОстаткиПоВсемСкладам", Истина);
КонецЕсли;
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Подбор товаров'"));
ПараметрыФормы.Вставить("Дата", Объект.Дата);
ПараметрыФормы.Вставить("Документ", Объект.Ссылка);
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
ПараметрыФормы.Вставить("СкрыватьРучныеСкидки", Истина);
ОткрытьФорму("Обработка.ПодборТоваровВДокументЗакупки.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтбору(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ДобавитьТоварыПоОтборуНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура НастроитьИЗаполнитьПоПравилуЗаполнения(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбновитьДополнить", Объект.ОбновитьДополнить);
ПараметрыФормы.Вставить("АдресПравилаЗаполнения", АдресПравилаЗаполнения);
ПараметрыФормы.Вставить("ИзменитьРезультатНа", Объект.ИзменитьРезультатНа);
ПараметрыФормы.Вставить("ТочностьОкругления", Объект.ТочностьОкругления);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыФормы.Вставить("АдресПользовательскихНастроек", АдресПользовательскихНастроек);
ПараметрыФормы.Вставить("ТолькоПросмотр", ЭтаФорма.ТолькоПросмотр);
ПараметрыФормы.Вставить("КоличествоПериодов", КоличествоПериодов);
ПараметрыФормы.Вставить("Отбор", ПланированиеКлиентСервер.ОтборДляВыборки(ПараметрыОтбора(ЭтотОбъект), ПараметрыВидаПлана(ЭтотОбъект)));
ПараметрыФормы.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
Оповещение = Новый ОписаниеОповещения("НастроитьИЗаполнитьПоПравилуЗаполненияЗавершение", ЭтотОбъект);
ОткрытьФорму("Справочник.ИсточникиДанныхПланирования.Форма.ФормаЗаполнения",
ПараметрыФормы,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоПравилуЗаполнения(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполнятьПоПравилу", Истина);
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиДокумент(Команда)
ОбщегоНазначенияУТКлиент.Провести(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтроку(Команда)
ТаблицаФормы = Элементы.Товары;
ДанныеТаблицы = Объект.Товары;
Оповещение = Новый ОписаниеОповещения("РазбитьСтрокуЗавершение", ЭтотОбъект);
РаботаСТабличнымиЧастямиКлиент.РазбитьСтроку(ДанныеТаблицы, ТаблицаФормы, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтрокуЗавершение(НоваяСтрока, ДополнительныеПараметры) Экспорт
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если НоваяСтрока <> Неопределено Тогда
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, КэшированныеЗначения);
ТекущаяСтрока.Расшифровка = "";
НоваяСтрока.Расшифровка = "";
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВставитьСтроки(Команда)
Если Объект.КроссТаблица Тогда
ОписаниеОповещение = Новый ОписаниеОповещения("ПереключитьПериодыВСтрокиЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Копирование и вставка строк возможны в режиме ""Периоды в строках"". Переключить режим?'"),
РежимДиалогаВопрос.ДаНет);
Возврат;
Иначе
КоличествоТоваровДоВставки = Объект.Товары.Количество();
ПолучитьСтрокиИзБуфераОбмена();
КоличествоВставленных = Объект.Товары.Количество() - КоличествоТоваровДоВставки;
РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОВставкеСтрок(КоличествоВставленных);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьСтроки(Команда)
Если Объект.КроссТаблица Тогда
ОписаниеОповещение = Новый ОписаниеОповещения("ПереключитьПериодыВСтрокиЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Копирование и вставка строк возможны в режиме ""Периоды в строках"". Переключить режим?'"),
РежимДиалогаВопрос.ДаНет);
Возврат;
Иначе
ТаблицаФормы = Элементы.Товары;
КонецЕсли;
Если РаботаСТабличнымиЧастямиКлиент.ВыбранаСтрокаДляВыполненияКоманды(ТаблицаФормы) Тогда
СкопироватьСтрокиНаСервере();
РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОКопированииСтрок(ТаблицаФормы.ВыделенныеСтроки.Количество());
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИнтервал(Команда)
Оповещение = Новый ОписаниеОповещения(
"УстановитьИнтервалЗавершение",
ЭтотОбъект);
ОбщегоНазначенияУТКлиент.РедактироватьПериод(
Объект,
Новый Структура("ДатаНачала, ДатаОкончания", "НачалоПериода", "ОкончаниеПериода"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
ОбщегоНазначенияУТКлиент.Записать(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура КомандаЗапланироватьПодсборки(Команда)
Если НЕ ЗапланироватьПодсборкиНаСервере(КэшированныеЗначения) Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Планирование подсборки не требуется.'"));
КонецЕсли;
КонецПроцедуры
#Область ЗагрузкаДанныхИзФайла
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
ДополнительныеПараметры = ПланированиеКлиент.ДополнительныеПараметрыЗагрузкиИзФайла();
ДополнительныеПараметры.ТипПлана = "ПланСборкиРазборки";
ДополнительныеПараметры.ИспользуютсяНазначения = ЗаполнятьНазначениеВТЧ;
ДополнительныеПараметры.ИспользуютсяСклады = ЗаполнятьСкладВТЧ;
Если Объект.КроссТаблица Тогда
ДополнительныеПараметры.КроссТаблица = Истина;
ДополнительныеПараметры.Периоды = ЭтотОбъект["Периоды"];
КонецЕсли;
ПоказатьФормуЗагрузкиИзФайла(ДополнительныеПараметры);
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
РаботаСExcelКлиент.ВыгрузитьВExcel(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
РаботаСExcelКлиент.ВыбратьПрисоединенныйФайлExcel(ЭтаФорма, ?(Объект.КроссТаблица, "ТоварыПоДатам", "Товары"));
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВКолонки(Команда)
Если НЕ Объект.КроссТаблица Тогда
ОшибкаПроверкиДатыПериодаТЧ = Ложь;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("ИмяТЧ", "Товары");
ПараметрыПроверки.Вставить("ПредставлениеТЧ", НСтр("ru='Комплекты'"));
ПараметрыПроверки.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПроверки.Вставить("ДатаНачала", Объект.НачалоПериода);
ПараметрыПроверки.Вставить("ДатаОкончания", Объект.ОкончаниеПериода);
ПараметрыПроверки.Вставить("ИмяПоляДатыПериода", "ДатаСборкиРазборки");
ПараметрыПроверки.Вставить("ПредставлениеДатыПериода", НСтр("ru='Дата сборки (разборки)'"));
ПараметрыПроверки.Вставить("ПрефиксПутиКТЧ", "Объект.");
ПланированиеКлиентСервер.ПроверитьДатуПериодаТЧ(Объект, ОшибкаПроверкиДатыПериодаТЧ, ПараметрыПроверки);
СтруктураПоиска = Новый Структура("Подсборка", Истина);
СписокПодсборок = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Если ОшибкаПроверкиДатыПериодаТЧ ИЛИ СписокПодсборок.Количество() <> 0 Тогда
ТекстВопроса = НСтр("ru = 'При переключении будут удалены следующие данные:'");
Если ОшибкаПроверкиДатыПериодаТЧ Тогда
ТекстВопроса = ТекстВопроса + Символы.ПС + НСтр("ru = '- комплекты, для которых дата сборки (разборки) за границами планирования.'");
КонецЕсли;
Если СписокПодсборок.Количество() <> 0 Тогда
ТекстВопроса = ТекстВопроса + Символы.ПС + НСтр("ru = '- все запланированные подсборки.'");
КонецЕсли;
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Продолжить'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Отменить'"));
Оповещение = Новый ОписаниеОповещения("ПереключитьПериодыВКолонкиЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
Возврат;
КонецЕсли;
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВСтроки(Команда)
ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения)
Если Объект.КроссТаблица Тогда
ПереключитьИзКроссТаблицы(КэшированныеЗначения);
Объект.КроссТаблица = Ложь;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Если ЗапретитьРедактированиеФормулы Тогда
НастроитьФормулуИЗаполнить(СтруктураНастроек, Неопределено);
Возврат;
КонецЕсли;
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланСборкиРазборки");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ТипПлана", ТипПлана);
ПараметрыФормы.Вставить("НачалоПериодаПлан", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериодаПлан", Объект.ОкончаниеПериода);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("АдресХранилищаДереваОператоров", АдресХранилищаДереваОператоров);
ПараметрыФормы.Вставить("ДополнительныеПоля", ДополнительныеПоля);
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
ПараметрыФормы.Вставить("Владелец", Объект.Ссылка);
ПараметрыФормы.Вставить("Отбор", ОтборПоказатели);
ПараметрыФормы.Вставить("ПланироватьПоСумме", Ложь);
ОписаниеОповещения = Новый ОписаниеОповещения("НастроитьФормулуИЗаполнить",ЭтотОбъект);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("Справочник.ВидыПланов.Форма.ФормаНастроек", Новый Структура("СтруктураНастроек",ПараметрыФормы), ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоДефицитам(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ЗаполнитьПланыПоДефицитуНаСервере(КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура НадписьПерепланироватьПоДефицитуОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Модифицированность = Истина;
ЗаполнитьПоДефицитам(Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоказатели(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Если ЗаполнятьПоДефициту Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("НачалоПериодаПлан", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериодаПлан", Объект.ОкончаниеПериода);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
ПараметрыФормы.Вставить("Владелец", Объект.Ссылка);
Если СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыеНачальныеОстатки")<>0
Или СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыеКонечныеОстатки")<>0
Или СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыйКонечныйДефицит")<>0 Тогда
НастроитьСмещениеИЗаполнить(ПараметрыФормы.СтруктураНастроек, Неопределено);
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("НастроитьСмещениеИЗаполнить", ЭтотОбъект);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("Справочник.ВидыПланов.Форма.ФормаНастроекСмещения", Новый Структура("СтруктураНастроек",ПараметрыФормы), ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьНаПроцент(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ИзменитьНаПроцентЗавершение", ЭтотОбъект);
ПланированиеКлиент.ИзменитьФормулуНаПроцент(
ЭтаФорма,
?(Объект.КроссТаблица, ТоварыПоДатам, Объект.Товары),
?(Объект.КроссТаблица, "ТоварыПоДатам", "Товары"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОкруглитьКоличество(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ОкруглитьКоличествоЗавершение", ЭтотОбъект);
ПланированиеКлиент.ОкруглитьФормулу(
ЭтаФорма,
?(Объект.КроссТаблица, ТоварыПоДатам, Объект.Товары),
?(Объект.КроссТаблица, "ТоварыПоДатам", "Товары"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьПроизвольнуюФормулу(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
Для каждого Период Из АктивныеПериоды Цикл
ДополнительныеПараметры = Новый Структура("ИмяКолонки",Период.ИмяКолонки);
Если Объект.КроссТаблица И АктивныеПериоды.Количество() > 1 Тогда
Если Элементы.ТоварыПоДатам.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущийЭлементИмя = Элементы.ТоварыПоДатам.ТекущийЭлемент.Имя;
Если СтрНайти(ТекущийЭлементИмя, "ТоварыПоДатам" + "Количество_") = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Активируйте колонку с периодом'"));
Возврат;
КонецЕсли;
Если ТекущийЭлементИмя = "ТоварыПоДатам" + "Количество_" + Период.ИмяКолонки Тогда
ТекстВопроса = НСтр("ru='Установить формулу для всех периодов?'");
СписокКнопок = Новый СписокЗначений;
СписокКнопок.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Да, для всех'"));
СписокКнопок.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Только'") + " " + Период.Заголовок);
СписокКнопок.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Отмена'"));
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВопросаЗадатьПроизвольнуюФормулу", ЭтотОбъект, ДополнительныеПараметры);
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, СписокКнопок);
КонецЕсли;
Иначе
Если (Объект.КроссТаблица И Элементы.ТоварыПоДатам.ТекущиеДанные = Неопределено)
ИЛИ (Не Объект.КроссТаблица И Элементы.Товары.ТекущиеДанные = Неопределено) Тогда
Возврат;
КонецЕсли;
ПослеВопросаЗадатьПроизвольнуюФормулу(КодВозвратаДиалога.Нет, ДополнительныеПараметры);
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьФлагОтменыСтрокПлана(Команда)
Оповещение = Новый ОписаниеОповещения("ИзменитьФлагОтменыСтрокПланаЗавершение", ЭтотОбъект);
Если Объект.КроссТаблица Тогда
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, ТоварыПоДатам, "ТоварыПоДатам", Оповещение);
Иначе
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, Объект.Товары, "Товары", Оповещение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьСкладПоЗначению(Команда)
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ТоварыПоДатам.ВыделенныеСтроки,Элементы.Товары.ВыделенныеСтроки);
ТаблицаТовары = ?(Объект.КроссТаблица, ТоварыПоДатам, Объект.Товары);
Если СкладыКлиент.ПроверитьВозможностьЗаполненияСкладовВТабличнойЧасти(Объект, ТаблицаТовары, НСтр("ru='Товары'"), ВыделенныеСтроки) Тогда
СтруктураОтбора = Новый Структура("ЭтоГруппа", Ложь);
СтруктураПараметров = Новый Структура("Отбор, ВыборГруппИЭлементов", СтруктураОтбора, ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму(
"Справочник.Склады.ФормаВыбора",
СтруктураПараметров,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Новый ОписаниеОповещения("ЗаполнитьПоЗначениюЗавершение",
ПланированиеКлиент,
Новый Структура("ВыделенныеСтроки, ТаблицаТовары, Колонка", ВыделенныеСтроки, ТаблицаТовары, "Склад")),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьНазначениеПоЗначению(Команда)
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ТоварыПоДатам.ВыделенныеСтроки,Элементы.Товары.ВыделенныеСтроки);
ТаблицаТовары = ?(Объект.КроссТаблица, ТоварыПоДатам, Объект.Товары);
СтруктураОтбора = Новый Структура("ЭтоГруппа", Ложь);
СтруктураПараметров = Новый Структура("Отбор, ВыборГруппИЭлементов", СтруктураОтбора, ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму(
"Справочник.Назначения.ФормаВыбора",
СтруктураПараметров,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Новый ОписаниеОповещения("ЗаполнитьПоЗначениюЗавершение",
ПланированиеКлиент,
Новый Структура("ВыделенныеСтроки, ТаблицаТовары, Колонка", ВыделенныеСтроки, ТаблицаТовары, "Назначение")),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ТоварыПоДатамНоменклатураЕдиницаИзмерения";
ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "ТоварыПоДатам.Упаковка";
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма, ПараметрыУсловногоОформления);
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма);
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма,
"ТоварыПоДатамХарактеристика",
"ТоварыПоДатам.ХарактеристикиИспользуются");
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма);
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,
"ТоварыПоДатамНазначение",
"ТоварыПоДатам.ТипНоменклатуры",
Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,,Ложь);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Товары.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Отменено");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Товары.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Замещен");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Товары.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Подсборка");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстПредопределенногоЗначения);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоДатам.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоДатам.Подсборка");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстПредопределенногоЗначения);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыДатаСборкиРазборки.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Подсборка");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоДатамНоменклатура.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоДатамХарактеристика.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоДатам.Подсборка");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПланированиеПодсборки.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ПланированиеПодсборки");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланированияПодсборки.НеТребуется;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПланированиеПодсборки.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ПланированиеПодсборки");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланированияПодсборки.Выполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОтметкаПоложительногоВыполненияЗадачи);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПланированиеПодсборки.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ПланированиеПодсборки");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланированияПодсборки.Запланировать;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОтметкаОтрицательногоВыполненияЗадачи);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоДатамПланированиеПодсборки.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоДатам.ПланированиеПодсборки");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланированияПодсборки.НеТребуется;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Лево);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Не требуется'"));
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоДатамПланированиеПодсборки.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоДатам.ПланированиеПодсборки");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланированияПодсборки.Выполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОтметкаПоложительногоВыполненияЗадачи);
Элемент.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Лево);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Выполнено'"));
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоДатамПланированиеПодсборки.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоДатам.ПланированиеПодсборки");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланированияПодсборки.Запланировать;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОтметкаОтрицательногоВыполненияЗадачи);
Элемент.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Лево);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Запланировать'"));
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформлениеКроссТаблицы()
Если НЕ Объект.КроссТаблица Тогда
Возврат;
КонецЕсли;
ТекущийШрифт = Элементы.ТоварыПоДатам.Шрифт;
ЗачеркнутыйШрифт = Новый Шрифт(ТекущийШрифт,,,,,,Истина);
АктивныеПериоды = ЭтотОбъект["Периоды"].НайтиСтроки(Новый Структура("Активная", Истина));
ЭтоОдинПериод = АктивныеПериоды.Количество() = 1;
Для каждого Период Из АктивныеПериоды Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоДатам" + "Количество_" + Период.ИмяКолонки);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоДатам.Отменено_"+Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ЗачеркнутыйШрифт);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыПоДатам" + "Количество_" + Период.ИмяКолонки);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыПоДатам.Замещен_"+ Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИнтервалЗавершение(Период, ДополнительныеПараметры) Экспорт
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ТоварыПоДатам", Оповещение);
КонецПроцедуры
&НаСервере
Процедура ПереключитьИзКроссТаблицы(КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ОбработатьТоварыПослеПереключенияИзКроссТаблицы();
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииПериодовНаКлиенте(Результат, ДополнительныеПараметры) Экспорт
ПриИзмененииПериодовНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции()
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются",
Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры",
Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул",
Новый Структура("Номенклатура", "Артикул"));
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(
?(Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки, ТоварыПоДатам, Объект.Товары),
СтруктураДействий);
Если Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки Тогда
Для каждого СтрокаТЧ Из ТоварыПоДатам Цикл
Для каждого Период Из ЭтотОбъект["Периоды"] Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(СтрокаТЧ["Комментарий_"+ Период.ИмяКолонки]);
КонецЦикла;
КонецЦикла;
Иначе
Для каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.КартинкаКомментарий = ЗначениеЗаполнено(СтрокаТЧ.Комментарий);
КонецЦикла;
КонецЕсли;
ЗаполнитьВходитВКомплект();
ОпределитьПланированиеПодсборки();
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииПериодовНаСервере(КорректироватьНачалоОкончаниеПериода = Ложь)
Если КорректироватьНачалоОкончаниеПериода Тогда
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(Объект.Периодичность, Объект.НачалоПериода, Объект.ОкончаниеПериода, ТекущаяДатаСеанса());
КонецЕсли;
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
Если Объект.Замещающий
И ЗначениеЗаполнено(Объект.Периодичность) Тогда
ЗаполнитьЗамещенныеПериоды();
Планирование.ОбновитьГиперссылкуЗамещение(ЭтаФорма);
Иначе
ЗамещенныеПериоды.Очистить();
ЗамещениеФорматированнаяСтрока = Новый ФорматированнаяСтрока(Новый Массив);
КонецЕсли;
Планирование.ЗаполнитьТаблицуПериодов(ТаблицаПериоды, Объект.Периодичность, Объект.НачалоПериода, Объект.ОкончаниеПериода, ОтображатьНомерПериода, ЗамещенныеПериоды);
ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, Истина);
Если Объект.КроссТаблица Тогда
СохранитьНовыйПериодСервер();
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланСборкиРазборки");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, ПересчитыватьИтоговыеПоказатели = Истина)
КоличествоПериодов = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина)).Количество();
ЭтоОдинПериод = КоличествоПериодов = 1;
Элементы.ТоварыДатаСборкиРазборки.СписокВыбора.Очистить();
Для каждого Период Из ТаблицаПериоды Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
Элементы.ТоварыДатаСборкиРазборки.СписокВыбора.Добавить(НачалоДня(Период.ДатаНачала), Период.Заголовок);
КонецЦикла;
Элементы.ТоварыПоДатамКоличествоУпаковок.Видимость = НЕ ЭтоОдинПериод;
Элементы.КомментарийКЯчейке.Видимость = Объект.КроссТаблица И НЕ ЭтоОдинПериод;
Элементы.ЯчейкаОтменена.Видимость = Объект.КроссТаблица И НЕ ЭтоОдинПериод;
Если НЕ Объект.КроссТаблица
И Не ИспользуютсяПланируемыеОстатки Тогда
ЗначениеВРеквизитФормы(ТаблицаПериоды,"Периоды");
СохранитьНовыйПериодСервер();
ОбновитьПризнакЗамещения();
Возврат;
КонецЕсли;
ПараметрыВывода = Новый Структура;
ПараметрыВывода.Вставить("ИмяРеквизитаКроссТаблицы", "ТоварыПоДатам");
ПараметрыВывода.Вставить("ЭлементФормыКроссТаблицы", "ТоварыПоДатам");
ПараметрыВывода.Вставить("ТаблицаПериодов", ТаблицаПериоды);
ПараметрыВывода.Вставить("Периодичность", Объект.Периодичность);
ПараметрыВывода.Вставить("Поля", Новый Массив());
Если НЕ ЭтоОдинПериод Тогда
Планирование.ДобавитьПолеКроссТаблицыГруппаКомментарияСКартинкой(ПараметрыВывода);
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииКоличества");
Планирование.ДобавитьПолеКроссТаблицыКоличество(
ПараметрыВывода,
Истина,
НЕ ЭтоОдинПериод,
ЭтоОдинПериод,
СтруктураДействий);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииОтменено");
Планирование.ДобавитьПолеКроссТаблицыОтменено(ПараметрыВывода, ЭтоОдинПериод, СтруктураДействий);
СтруктураДействий = Новый Структура;
Планирование.ДобавитьПолеКроссТаблицыЗамещен(ПараметрыВывода, ЭтоОдинПериод И Объект.Замещающий, СтруктураДействий);
Планирование.ДобавитьПолеКроссТаблицыЗамещенКЗаказу(ПараметрыВывода, Ложь, СтруктураДействий);
Если ЭтоОдинПериод Тогда
Планирование.ДобавитьПолеКроссТаблицыГруппаКомментарияСКартинкой(ПараметрыВывода);
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииКомментария");
СтруктураДействий.Вставить("НачалоВыбора", "Подключаемый_НачалоВыбораКомментария");
Планирование.ДобавитьПолеКроссТаблицыКомментарий(ПараметрыВывода, ЭтоОдинПериод, СтруктураДействий);
Если Объект.ЗаполнятьПоФормуле Тогда
ДобавитьПоляИзДопПараметров(ПараметрыВывода);
Иначе
Планирование.ДобавитьПолеКроссТаблицыРасшифровка(ПараметрыВывода);
КонецЕсли;
Планирование.ОбновитьСтруктуруВыводаКроссТаблицы(ЭтаФорма, ПараметрыВывода);
ЗначениеВРеквизитФормы(ТаблицаПериоды,"Периоды");
УстановитьУсловноеОформление();
УстановитьУсловноеОформлениеКроссТаблицы();
Если ПересчитыватьИтоговыеПоказатели Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьТоварыПослеПереключенияИзКроссТаблицы()
Для каждого СтрокаТоварПоДатам Из ТоварыПоДатам Цикл
СтруктураПоиска = Новый Структура("КодСтроки", СтрокаТоварПоДатам.КодСтроки);
СписокСтрокТовары = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Для Сч = 1 По СписокСтрокТовары.Количество() - 1 Цикл
СтрокаТовары = СписокСтрокТовары[Сч];
СтрокаТовары.КодСтроки = НовыйКодСтрокиТовары(Объект);
СтруктураПоиска = Новый Структура("КодСтрокиТовары,ДатаСборкиРазборки",
СписокСтрокТовары[0].КодСтроки, СтрокаТовары.ДатаСборкиРазборки);
СписокСтрокПодсборки = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаПодсборка Из СписокСтрокПодсборки Цикл
СтрокаПодсборка.КодСтрокиТовары = СтрокаТовары.КодСтроки;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОбработатьТоварыПередПереключениемВКроссТаблицу()
СтруктураПоиска = Новый Структура("Подсборка", Истина);
СписокПодсборок = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаПодсборка Из СписокПодсборок Цикл
Объект.Товары.Удалить(СтрокаПодсборка);
КонецЦикла;
ПоляГруппировки = "Номенклатура,Характеристика,Упаковка,Склад,ВариантКомплектации";
ТаблицаТовары = Объект.Товары.Выгрузить(, ПоляГруппировки);
ТаблицаТовары.Свернуть(ПоляГруппировки);
Для каждого СтрокаТовары Из ТаблицаТовары Цикл
СтруктураПоиска = Новый Структура(ПоляГруппировки);
ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТовары);
СписокСтрокТовары = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Для Сч = 1 По СписокСтрокТовары.Количество() - 1 Цикл
СтрокаТоварыТекущая = СписокСтрокТовары[Сч];
СтрокаТоварыТекущая.КодСтроки = СписокСтрокТовары[0].КодСтроки;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьОтменуИКомментарийЯчейки()
ЯчейкаНайдена = Ложь;
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
Возврат;
КонецЕсли;
Если Элементы.ТоварыПоДатам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ТоварыПоДатам.ТекущийЭлемент.Имя = "ТоварыПоДатам" + "Количество_" + Период.ИмяКолонки Тогда
ТекущиеДанные["Отменено_"+ Период.ИмяКолонки] = ЯчейкаОтменена;
ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки] = КомментарийКЯчейке;
ТекущиеДанные["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(КомментарийКЯчейке);
ЯчейкаНайдена = Истина;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ ЯчейкаНайдена Тогда
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
КонецЕсли;
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
КомментарийКЯчейке = ВведенныйТекст;
Модифицированность = Истина;
КомментарийКЯчейкеПриИзменении(Элементы.КомментарийКЯчейке);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьФлагОтменыСтрокПланаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат
КонецЕсли;
Если Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.ТоварыПоДатам.ВыделенныеСтроки;
Иначе
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
КонецЕсли;
Если ВыделенныеСтроки.Количество() > 0 Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
#Область РаботаСБуферомОбмена
&НаСервере
Процедура СкопироватьСтрокиНаСервере()
Если Объект.КроссТаблица Тогда
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(ТоварыПоДатам, Элементы.ТоварыПоДатам.ВыделенныеСтроки);
Иначе
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(Объект.Товары, Элементы.Товары.ВыделенныеСтроки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьСтрокиИзБуфераОбмена()
ПараметрыОтбора = Новый Соответствие;
ПараметрыОтбора.Вставить("Номенклатура.ТипНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь));
Колонки = "Номенклатура,Характеристика,Упаковка,КоличествоУпаковок,Количество,
|ДатаСборкиРазборки,ВариантКомплектации,Склад";
ТаблицаТоваров = РаботаСТабличнымиЧастями.СтрокиИзБуфераОбмена(ПараметрыОтбора, Колонки);
Если Не ЗначениеЗаполнено(ТаблицаТоваров) Тогда
Возврат;
КонецЕсли;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
ОбрабатываемыеСтроки = Новый Массив();
Для каждого СтрокаТоваров Из ТаблицаТоваров Цикл
Если Объект.КроссТаблица Тогда
ТекущаяСтрока = ТоварыПоДатам.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТоваров);
ТекущаяСтрока.КодСтроки = НовыйКодСтрокиТовары(Объект);
Иначе
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТоваров);
ТекущаяСтрока.КодСтроки = НовыйКодСтрокиТовары(Объект);
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЕсли;
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
Если Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоДатам");
ТоварыКоличествоСтрок = ТоварыПоДатам.Количество();
Иначе
ТоварыКоличествоСтрок = Объект.Товары.Количество();
КонецЕсли;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
Если Объект.КроссТаблица Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьКомандБуфераОбмена()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("ТоварыВставитьСтроки");
МассивЭлементов.Добавить("ТоварыКонтекстноеМенюВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоДатамВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоДатамКонтекстноеМенюВставитьСтроки");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность",
РаботаСТабличнымиЧастями.ЕстьСтрокиВБуфереОбмена());
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКомандБуфераОбменаНаКлиенте()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("ТоварыВставитьСтроки");
МассивЭлементов.Добавить("ТоварыКонтекстноеМенюВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоДатамВставитьСтроки");
МассивЭлементов.Добавить("ТоварыПоДатамКонтекстноеМенюВставитьСтроки");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность", Истина);
КонецПроцедуры
#КонецОбласти
#Область РаботаСExcel
&НаСервере
Функция ЗагрузитьИзExcelНаСервере(МассивСтруктурТовары)
Объект.МаксимальныйКодСтрокиТовары = 0;
Если Объект.КроссТаблица Тогда
ТоварыПоДатам.Очистить();
Иначе
Объект.Товары.Очистить();
КонецЕсли;
Объект.ЗаполненоАвтоматически = Ложь;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
ОбрабатываемыеСтроки = Новый Массив();
Для Каждого СтруктураТовар Из МассивСтруктурТовары Цикл
Если НЕ ЗначениеЗаполнено(СтруктураТовар.ИдентификаторНоменклатура) Тогда
Продолжить;
КонецЕсли;
СтруктураТовар.Вставить("Номенклатура", Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторНоменклатура)));
Если Не ЗначениеЗаполнено(СтруктураТовар.Номенклатура) Тогда
Продолжить;
КонецЕсли;
СтруктураТовар.Вставить("Характеристика", Справочники.ХарактеристикиНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторХарактеристика)));
СтруктураТовар.Вставить("Упаковка", Справочники.УпаковкиЕдиницыИзмерения.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторУпаковка)));
СтруктураТовар.Вставить("Склад", Справочники.Склады.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторСклад)));
СтруктураТовар.Вставить("ВариантКомплектации", Справочники.ВариантыКомплектацииНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторВариантКомплектации)));
СтруктураТовар.Вставить("Назначение", Справочники.Назначения.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторНазначение)));
Если Объект.КроссТаблица Тогда
ТекущаяСтрока = ТоварыПоДатам.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтруктураТовар);
Иначе
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтруктураТовар);
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЕсли;
ТекущаяСтрока.КодСтроки = НовыйКодСтрокиТовары(Объект);
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
Если Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоДатам");
ТоварыКоличествоСтрок = ТоварыПоДатам.Количество();
Иначе
ТоварыКоличествоСтрок = Объект.Товары.Количество();
КонецЕсли;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
Если НЕ Объект.КроссТаблица Тогда
ОбновитьПризнакЗамещения();
КонецЕсли;
КонецФункции
&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиенте(ПрисоединенныйФайл)
СтруктураДействийExcel = СтруктураДействийПриЗагрузкеИзExcel();
РаботаСExcelКлиент.ЗагрузитьИзExcel(ЭтаФорма, ПрисоединенныйФайл, СтруктураДействийExcel);
КонецФункции
&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиентеПродолжение(ДанныеЗагрузки)
ЕстьДобавленныеСтроки = Ложь;
Для каждого СтрокаЗагрузки Из ДанныеЗагрузки Цикл
Если НЕ ЗначениеЗаполнено(СтрокаЗагрузки.ИдентификаторНоменклатура) Тогда
ЕстьДобавленныеСтроки = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьДобавленныеСтроки Тогда
ПараметрыЗагрузки = РаботаСТабличнымиЧастямиКлиент.ПараметрыЗагрузкиНоменклатурыДляПланов();
ПараметрыЗагрузки.ВидПлана = Объект.ВидПлана;
ПараметрыЗагрузки.КроссТаблица = Объект.КроссТаблица;
ПараметрыЗагрузки.АдресТаблицыПериодов = ПолучитьАдресТаблицыПериодов();
ПараметрыЗагрузки.АдресТаблицыТоваров = ПоместитьВоВременноеХранилище(ДанныеЗагрузки, УникальныйИдентификатор);
ПараметрыЗагрузки.ПараметрыОтбора.Вставить("ТипНоменклатуры",
НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь));
ДопПараметры = Новый Структура("ОбновитьДополнить", 0);
Оповещение = Новый ОписаниеОповещения("ЗагрузитьИзВнешнегоФайлаЗавершение", ЭтотОбъект, ДопПараметры);
РаботаСТабличнымиЧастямиКлиент.ПоказатьФормуЗагрузкиНоменклатурыДляПланов(ПараметрыЗагрузки, Оповещение);
Иначе
ЗагрузитьИзExcelНаСервере(ДанныеЗагрузки);
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ЗагрузитьИзВнешнегоФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(АдресЗагруженныхДанных) Тогда
Если ДополнительныеПараметры.ОбновитьДополнить = 0 Тогда
Объект.МаксимальныйКодСтрокиТовары = 0;
ТоварыПоДатам.Очистить();
Объект.Товары.Очистить();
КонецЕсли;
ПолучитьЗагруженныеТоварыИзХранилища(АдресЗагруженныхДанных);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция СтруктураДействийПриЗагрузкеИзExcel()
СтруктураДействийExcel = Новый Структура;
КолонкиПоиска = Новый СписокЗначений;
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Номенклатура)'"),"ИдентификаторНоменклатура");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Характеристика)'"),"ИдентификаторХарактеристика");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Упаковка)'"),"ИдентификаторУпаковка");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Комплектация)'"),"ИдентификаторВариантКомплектации");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Склад)'"),"ИдентификаторСклад");
КолонкиПоиска.Добавить(НСтр("ru='Уникальный идентификатор (Назначение)'"),"ИдентификаторНазначение");
Если ЗначениеЗаполнено(ИмяДополнительнойКолонки) Тогда
КолонкиПоиска.Добавить(ИмяДополнительнойКолонки,"ЗагружаемыйАртикул");
КонецЕсли;
КолонкиПоиска.Добавить(НСтр("ru='Номенклатура'"),"ЗагружаемаяНоменклатура");
КолонкиПоиска.Добавить(НСтр("ru='Характеристика'"),"ЗагружаемаяХарактеристика");
КолонкиПоиска.Добавить(НСтр("ru='Комплектация'"),"ЗагружаемыйВариантКомплектации");
Если ЗаполнятьСкладВТЧ Тогда
КолонкиПоиска.Добавить(НСтр("ru='Склад'"),"ЗагружаемыйСклад");
КонецЕсли;
Если ЗаполнятьНазначениеВТЧ Тогда
КолонкиПоиска.Добавить(НСтр("ru='Назначение'"),"ЗагружаемоеНазначение");
КонецЕсли;
Если Объект.КроссТаблица Тогда
КолонкиПоиска.Добавить(НСтр("ru='Ед. изм.'"),"ЗагружаемаяУпаковка");
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Если НЕ Период.Активная ИЛИ Период.НомерКолонки <=0 Тогда
Продолжить;
КонецЕсли;
КолонкиПоиска.Добавить(Период.Заголовок,"Период_"+Период.ИмяКолонки);
Если Объект.Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность.Год") Тогда
КолонкиПоиска.Добавить(СокрЛП(СтрЗаменить(Период.Заголовок, НСтр("ru = 'г.'"), "")),"Период_"+Период.ИмяКолонки);
КонецЕсли;
КолонкиПоиска.Добавить(
ПланированиеКлиентСервер.СформироватьЗаголовокПериода(
Объект.Периодичность, Период.ДатаНачала, Период.ДатаОкончания, НЕ ОтображатьНомерПериода),
"Период_"+Период.ИмяКолонки);
КонецЦикла;
РеквизитыПериода = Новый Массив;
РеквизитыПериода.Добавить("Количество_");
СтруктураДействийExcel.Вставить("РеквизитыПериода", РеквизитыПериода);
СтруктураДействийExcel.Вставить("Периоды", ЭтаФорма.Периоды);
Иначе
КолонкиПоиска.Добавить(НСтр("ru='Дата сборки (разборки)'"),"ДатаСборкиРазборки");
КолонкиПоиска.Добавить(НСтр("ru='Количество'"),"КоличествоУпаковок");
КолонкиПоиска.Добавить(НСтр("ru='Ед. изм.'"),"ЗагружаемаяУпаковка");
КонецЕсли;
СтруктураДействийExcel.Вставить("КолонкиПоиска", КолонкиПоиска);
СтруктураПоиска = Новый Структура();
СтруктураПоиска.Вставить("ИдентификаторНоменклатура",0);
СтруктураПоиска.Вставить("ИдентификаторХарактеристика",0);
СтруктураПоиска.Вставить("ИдентификаторУпаковка",0);
СтруктураПоиска.Вставить("ИдентификаторВариантКомплектации",0);
СтруктураПоиска.Вставить("ИдентификаторСклад",0);
СтруктураПоиска.Вставить("ИдентификаторНазначение",0);
СтруктураДействийExcel.Вставить("СтруктураПоиска", СтруктураПоиска);
СтруктураДействийExcel.Вставить("НомерСтрокиНачалаДанных", 3);
Возврат СтруктураДействийExcel;
КонецФункции
#КонецОбласти
#Область РаботаСКомплектацией
&НаСервере
Процедура ВариантКомплектацииПриИзмененииНаСервере()
Если Объект.КроссТаблица Тогда
ТекущаяСтрока = Элементы.ТоварыПоДатам.ТекущаяСтрока;
ТекущиеДанные = ТоварыПоДатам.НайтиПоИдентификатору(ТекущаяСтрока);
Иначе
ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
МассивКлючей = Новый Массив;
МассивКлючей.Добавить(ТекущиеДанные.КодСтроки);
УдалитьПодсборки(МассивКлючей);
Если ЗначениеЗаполнено(ТекущиеДанные.ВариантКомплектации) Тогда
ОпределитьПланированиеПодсборки(ТекущиеДанные.КодСтроки);
Иначе
ТекущиеДанные.ПланированиеПодсборки = Перечисления.СтатусыПланированияПодсборки.НеТребуется;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОпределитьВариантКомплектации(СписокСтрокТовары = Неопределено)
Если Объект.КроссТаблица Тогда
ТаблицаТовары = ТоварыПоДатам.Выгрузить(СписокСтрокТовары, "Номенклатура,Характеристика, ВариантКомплектации");
Иначе
ТаблицаТовары = Объект.Товары.Выгрузить(СписокСтрокТовары, "Номенклатура,Характеристика, ВариантКомплектации");
КонецЕсли;
Если СписокСтрокТовары <> Неопределено Тогда
СписокСтрокТоварыКОбработке = СписокСтрокТовары;
Иначе
Если Объект.КроссТаблица Тогда
СписокСтрокТоварыКОбработке = ТоварыПоДатам;
Иначе
СписокСтрокТоварыКОбработке = Объект.Товары;
КонецЕсли;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ВЫРАЗИТЬ(ТаблицаТовары.ВариантКомплектации КАК Справочник.ВариантыКомплектацииНоменклатуры) КАК ВариантКомплектации
|ПОМЕСТИТЬ ТаблицаТовары
|ИЗ
| &ТаблицаТовары КАК ТаблицаТовары
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ВариантыКомплектацииНоменклатуры.Ссылка КАК ВариантКомплектации,
| ВариантыКомплектацииНоменклатуры.Основной КАК Основной
|ИЗ
| ТаблицаТовары КАК ТаблицаТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВариантыКомплектацииНоменклатуры КАК ВариантыКомплектацииНоменклатуры
| ПО ТаблицаТовары.Номенклатура = ВариантыКомплектацииНоменклатуры.Владелец
| И ТаблицаТовары.Характеристика = ВариантыКомплектацииНоменклатуры.Характеристика
| И (ТаблицаТовары.ВариантКомплектации = ВариантыКомплектацииНоменклатуры.Ссылка
| ИЛИ ТаблицаТовары.ВариантКомплектации = ЗНАЧЕНИЕ(Справочник.ВариантыКомплектацииНоменклатуры.ПустаяСсылка)
| ИЛИ ТаблицаТовары.ВариантКомплектации.Владелец <> ТаблицаТовары.Номенклатура)
| И (НЕ ВариантыКомплектацииНоменклатуры.ПометкаУдаления)";
Запрос.УстановитьПараметр("ТаблицаТовары", ТаблицаТовары);
ТаблицаВариантыКомплектации = Запрос.Выполнить().Выгрузить();
ТаблицаВариантыКомплектации.Индексы.Добавить("Номенклатура,Характеристика");
ЗаполняемыеРеквизиты = "ВариантКомплектации,УпаковкаКомплектация,КоличествоКомплектация,КоличествоУпаковокКомплектация";
Для каждого СтрокаТовар Из СписокСтрокТоварыКОбработке Цикл
СтруктураПоиска = Новый Структура("Номенклатура,Характеристика", СтрокаТовар.Номенклатура, СтрокаТовар.Характеристика);
СписокВариантовКомплектации = ТаблицаВариантыКомплектации.НайтиСтроки(СтруктураПоиска);
ВариантыКомплектации = Новый Массив;
Для каждого СтрокаВариантКомплектации Из СписокВариантовКомплектации Цикл
Если СтрокаВариантКомплектации.Основной Тогда
ВариантыКомплектации.Очистить();
ВариантыКомплектации.Добавить(СтрокаВариантКомплектации);
Прервать;
Иначе
ВариантыКомплектации.Добавить(СтрокаВариантКомплектации);
КонецЕсли;
КонецЦикла;
Если ВариантыКомплектации.Количество() = 1 Тогда
СтрокаТовар.ВариантКомплектации = ВариантыКомплектации[0].ВариантКомплектации;
Иначе
СтрокаТовар.ВариантКомплектации = Справочники.ВариантыКомплектацииНоменклатуры.ПустаяСсылка();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЗапланироватьПодсборкиНаСервере(КэшированныеЗначения, ОбработатьКодСтроки = 0)
ЕстьПодсборки = Ложь;
Если Объект.КроссТаблица Тогда
ТекущийКодСтроки = Неопределено;
ТекущаяСтрока = Элементы.ТоварыПоДатам.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено Тогда
СтрокаТекущийТовар = ТоварыПоДатам.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
Если СтрокаТекущийТовар <> Неопределено Тогда
ТекущийКодСтроки = СтрокаТекущийТовар.КодСтроки;
КонецЕсли;
КонецЕсли;
НачальноеКоличество = Объект.Товары.Количество();
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
СоответствиеКод = Новый Соответствие();
Для Каждого Строка Из Объект.Товары Цикл
СоответствиеНоменклатура = Новый Соответствие();
СоответствиеНоменклатура.Вставить(Строка.Номенклатура, Строка.Характеристика);
СоответствиеКод.Вставить(Строка.КодСтроки, СоответствиеНоменклатура);
КонецЦикла;
ТаблицаИсходныеКомплектующие = КомплектующиеНезапланированныхПодсборок(ОбработатьКодСтроки);
Пока ТаблицаИсходныеКомплектующие.Количество() <> 0 Цикл
ПодсобркиИКомплектующие = ПодсобркиИКомплектующие(ТаблицаИсходныеКомплектующие);
ТаблицаИсходныеКомплектующие.Очистить();
ТаблицаВариантыКомплектации = ПодсобркиИКомплектующие.ТаблицаВариантыКомплектации;
ТаблицаВариантыКомплектации.Индексы.Добавить("Номенклатура,Характеристика");
ТаблицаКомплектующие = ПодсобркиИКомплектующие.ТаблицаКомплектующие;
ТаблицаКомплектующие.Индексы.Добавить("ВариантКомплектации");
ТаблицаПодсборки = ПодсобркиИКомплектующие.ТаблицаПодсборки;
ПредыдущаяСтрока = Неопределено;
Для каждого СтрокаПодсборка Из ТаблицаПодсборки Цикл
СтрокаТовары = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТовары, СтрокаПодсборка);
СтрокаТовары.КодСтрокиТовары = СтрокаПодсборка.КодСтрокиТовары;
СтрокаТовары.Подсборка = Истина;
ОпределитьКодСтрокиИЗаполнитьКомплектующие = Истина;
Если Объект.КроссТаблица Тогда
СтруктураПоиска = Новый Структура();
СтруктураПоиска.Вставить("КодСтрокиТовары",СтрокаПодсборка.КодСтрокиТовары);
СтруктураПоиска.Вставить("Номенклатура",СтрокаПодсборка.Номенклатура);
СтруктураПоиска.Вставить("Характеристика",СтрокаПодсборка.Характеристика);
СтруктураПоиска.Вставить("Назначение",СтрокаПодсборка.Назначение);
СписокСтрок = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаТоварыИсходная Из СписокСтрок Цикл
Если СтрокаТоварыИсходная.КодСтроки <> 0 Тогда
СтрокаТовары.КодСтроки = СтрокаТоварыИсходная.КодСтроки;
СтрокаТовары.ВариантКомплектации = СтрокаТоварыИсходная.ВариантКомплектации;
ОпределитьКодСтрокиИЗаполнитьКомплектующие = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ОпределитьКодСтрокиИЗаполнитьКомплектующие Тогда
СтрокаТовары.КодСтроки = НовыйКодСтрокиТовары(Объект);
СтруктураПоиска = Новый Структура("Номенклатура,Характеристика",
СтрокаПодсборка.Номенклатура, СтрокаПодсборка.Характеристика);
СписокВариантыКомплектации = ТаблицаВариантыКомплектации.НайтиСтроки(СтруктураПоиска);
ВариантыКомплектации = Новый Массив;
Для каждого СтрокаВариантКомплектации Из СписокВариантыКомплектации Цикл
Если СтрокаВариантКомплектации.Основной Тогда
ВариантыКомплектации.Очистить();
ВариантыКомплектации.Добавить(СтрокаВариантКомплектации);
Прервать;
Иначе
ВариантыКомплектации.Добавить(СтрокаВариантКомплектации);
КонецЕсли;
КонецЦикла;
Если ВариантыКомплектации.Количество() = 1 Тогда
СтрокаВариантКомплектации = ВариантыКомплектации[0];
СтрокаТовары.ВариантКомплектации = СтрокаВариантКомплектации.ВариантКомплектации;
КонецЕсли;
КонецЕсли;
СоответствиеНоменклатура = СоответствиеКод.Получить(СтрокаТовары.КодСтрокиТовары);
Если СтрокаТовары.Характеристика = СоответствиеНоменклатура.Получить(СтрокаТовары.Номенклатура)
И НЕ (ПредыдущаяСтрока <> Неопределено И ПредыдущаяСтрока.Номенклатура = СтрокаТовары.Номенклатура
И ПредыдущаяСтрока.Характеристика = СтрокаТовары.Характеристика
И ПредыдущаяСтрока.ДатаСборкиРазборки <> СтрокаТовары.ДатаСборкиРазборки) Тогда
ТекстОшибки = Нстр("ru = 'В процессе планирования подсборок обнаружено зацикливание варианта комплектации номенклатуры ""%1, %2"". Ошибка в составе комплекта ""%3"".
|Выполнение прервано.'");
РезультатПоиска = Объект.Товары.НайтиСтроки(Новый Структура("КодСтроки", СтрокаТовары.КодСтрокиТовары));
КомплектРодитель = "";
Если РезультатПоиска.Количество() <> 0 Тогда
КомплектРодитель = РезультатПоиска[0].ВариантКомплектации;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
УдалитьРезультатЗаполнения(Объект.Товары, НачальноеКоличество);
КонецЕсли;
ВызватьИсключение СтрШаблон(ТекстОшибки, СтрокаТовары.Номенклатура, СтрокаТовары.Характеристика, КомплектРодитель);
КонецЕсли;
Если ЗначениеЗаполнено(СоответствиеНоменклатура) Тогда
НовоеСоответствиеНоменклатура = ОбщегоНазначения.СкопироватьРекурсивно(СоответствиеНоменклатура)
Иначе
НовоеСоответствиеНоменклатура = Новый Соответствие();
КонецЕсли;
НовоеСоответствиеНоменклатура.Вставить(СтрокаТовары.Номенклатура, СтрокаТовары.Характеристика);
СоответствиеКод.Вставить(СтрокаТовары.КодСтроки, НовоеСоответствиеНоменклатура);
СтруктураПоиска = Новый Структура("ВариантКомплектации", СтрокаТовары.ВариантКомплектации);
СписокКомплектующихПодсборки = ТаблицаКомплектующие.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаКомплектующие Из СписокКомплектующихПодсборки Цикл
СтрокаНоваяИсходнаяКомплектующая = ТаблицаИсходныеКомплектующие.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаНоваяИсходнаяКомплектующая, СтрокаКомплектующие);
СтрокаНоваяИсходнаяКомплектующая.ДатаСборкиРазборки = СтрокаТовары.ДатаСборкиРазборки;
СтрокаНоваяИсходнаяКомплектующая.КодСтрокиТовары = СтрокаТовары.КодСтроки;
Если ЗаполнятьСклад И НЕ ЗаполнятьСкладВТЧ Тогда
СтрокаНоваяИсходнаяКомплектующая.Склад = Объект.Склад;
Иначе
СтрокаНоваяИсходнаяКомплектующая.Склад = СтрокаТовары.Склад;
КонецЕсли;
Если ЗаполнятьНазначениеВТЧ Тогда
СтрокаНоваяИсходнаяКомплектующая.Назначение = СтрокаТовары.Назначение;
Иначе
СтрокаНоваяИсходнаяКомплектующая.Назначение = Объект.Назначение;
КонецЕсли;
СтрокаНоваяИсходнаяКомплектующая.Количество = СтрокаНоваяИсходнаяКомплектующая.Количество
* СтрокаТовары.Количество
/ СтрокаВариантКомплектации.КоличествоКомплектация;
СтрокаНоваяИсходнаяКомплектующая.КоличествоУпаковок = СтрокаНоваяИсходнаяКомплектующая.КоличествоУпаковок
* СтрокаТовары.Количество
/ СтрокаВариантКомплектации.КоличествоКомплектация;
КонецЦикла;
ЕстьПодсборки = Истина;
ПредыдущаяСтрока = СтрокаТовары;
КонецЦикла;
КонецЦикла;
СкопироватьВКроссТаблицу(Неопределено);
Если Объект.КроссТаблица И ТекущийКодСтроки <> Неопределено Тогда
СтруктураПоиска = Новый Структура("КодСтроки", ТекущийКодСтроки);
СписокСтрок = ТоварыПоДатам.НайтиСтроки(СтруктураПоиска);
Если СписокСтрок.Количество() <> 0 Тогда
Элементы.ТоварыПоДатам.ТекущаяСтрока = СписокСтрок[0].ПолучитьИдентификатор();
КонецЕсли;
КонецЕсли;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
Элементы.ГруппаТребуетсяЗаполнитьКомплектами.Видимость = Ложь;
Возврат ЕстьПодсборки;
КонецФункции
&НаСервере
Функция ПодсобркиИКомплектующие(ТаблицаКомплектующие)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаКомплектующие.Номенклатура КАК Номенклатура,
| ТаблицаКомплектующие.Характеристика КАК Характеристика,
| ТаблицаКомплектующие.Назначение КАК Назначение,
| ТаблицаКомплектующие.Упаковка КАК Упаковка,
| ТаблицаКомплектующие.Количество КАК Количество,
| ТаблицаКомплектующие.КоличествоУпаковок КАК КоличествоУпаковок,
| ТаблицаКомплектующие.КодСтрокиТовары КАК КодСтрокиТовары,
| ТаблицаКомплектующие.Склад КАК Склад,
| ТаблицаКомплектующие.ДатаСборкиРазборки КАК ДатаСборкиРазборки
|ПОМЕСТИТЬ ТаблицаКомплектующие
|ИЗ
| &ТаблицаКомплектующие КАК ТаблицаКомплектующие
|;
|
|
|" + СтрЗаменить(
РегистрыСведений.СхемыОбеспечения.ВременнаяТаблицаСпособыОбеспечения("ВЫЧИСЛЯТЬ"),
"ВтТовары",
"ТаблицаКомплектующие") + "
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТаблицаКомплектующие.Номенклатура КАК Номенклатура,
| ТаблицаКомплектующие.Характеристика КАК Характеристика,
| ТаблицаКомплектующие.Назначение КАК Назначение,
| ТаблицаКомплектующие.Упаковка КАК Упаковка,
| ТаблицаКомплектующие.Количество КАК Количество,
| ТаблицаКомплектующие.КоличествоУпаковок КАК КоличествоУпаковок,
| ТаблицаКомплектующие.КодСтрокиТовары КАК КодСтрокиТовары,
| ТаблицаКомплектующие.Склад КАК Склад,
| ТаблицаКомплектующие.ДатаСборкиРазборки КАК ДатаСборкиРазборки
|ПОМЕСТИТЬ Подсборки
|ИЗ
| ТаблицаКомплектующие КАК ТаблицаКомплектующие
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтСпособыОбеспечения КАК ТаблицаСпособыОбеспечения
| ПО ТаблицаКомплектующие.Склад = ТаблицаСпособыОбеспечения.Склад
| И ТаблицаКомплектующие.Номенклатура = ТаблицаСпособыОбеспечения.Номенклатура
| И ТаблицаКомплектующие.Характеристика = ТаблицаСпособыОбеспечения.Характеристика
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособОбеспечения
| ПО СпрСпособОбеспечения.Ссылка = ТаблицаСпособыОбеспечения.СпособОбеспеченияПотребностей
|
|ГДЕ
| ЕСТЬNULL(СпрСпособОбеспечения.ТипОбеспечения,
| ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.ПустаяСсылка)) = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.СборкаРазборка)
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВариантыКомплектацииНоменклатуры.Владелец КАК Номенклатура,
| ВариантыКомплектацииНоменклатуры.Характеристика КАК Характеристика,
| ВариантыКомплектацииНоменклатуры.Ссылка КАК ВариантКомплектации,
| ВариантыКомплектацииНоменклатуры.Основной КАК Основной,
| ВариантыКомплектацииНоменклатуры.Упаковка КАК Упаковка,
| ВариантыКомплектацииНоменклатуры.КоличествоУпаковок КАК КоличествоУпаковок,
| ВариантыКомплектацииНоменклатуры.Количество КАК Количество
|ПОМЕСТИТЬ ВариантыКомплектацииНоменклатуры
|ИЗ
| Справочник.ВариантыКомплектацииНоменклатуры КАК ВариантыКомплектацииНоменклатуры
|ГДЕ
| НЕ ВариантыКомплектацииНоменклатуры.ПометкаУдаления
| И (ВариантыКомплектацииНоменклатуры.Владелец, ВариантыКомплектацииНоменклатуры.Характеристика) В
| (ВЫБРАТЬ
| Подсборки.Номенклатура,
| Подсборки.Характеристика
| ИЗ
| Подсборки КАК Подсборки)
|ИНДЕКСИРОВАТЬ ПО
| ВариантКомплектации
|;
|
|
|ВЫБРАТЬ
| Подсборки.Номенклатура КАК Номенклатура,
| Подсборки.Характеристика КАК Характеристика,
| Подсборки.Назначение КАК Назначение,
| Подсборки.Склад КАК Склад,
| Подсборки.Упаковка КАК Упаковка,
| Подсборки.Количество КАК Количество,
| Подсборки.КоличествоУпаковок КАК КоличествоУпаковок,
| Подсборки.КодСтрокиТовары КАК КодСтрокиТовары,
| Подсборки.ДатаСборкиРазборки КАК ДатаСборкиРазборки
|ИЗ
| Подсборки КАК Подсборки
|;
|
|
|ВЫБРАТЬ
| ВариантыКомплектацииНоменклатуры.Номенклатура КАК Номенклатура,
| ВариантыКомплектацииНоменклатуры.Характеристика КАК Характеристика,
| ВариантыКомплектацииНоменклатуры.ВариантКомплектации КАК ВариантКомплектации,
| ВариантыКомплектацииНоменклатуры.Основной КАК Основной,
| ВариантыКомплектацииНоменклатуры.Упаковка КАК УпаковкаКомплектация,
| ВариантыКомплектацииНоменклатуры.КоличествоУпаковок КАК КоличествоУпаковокКомплектация,
| ВариантыКомплектацииНоменклатуры.Количество КАК КоличествоКомплектация
|ИЗ
| ВариантыКомплектацииНоменклатуры КАК ВариантыКомплектацииНоменклатуры
|;
|
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТаблицаКомплектующие.Ссылка КАК ВариантКомплектации,
| ТаблицаКомплектующие.Номенклатура КАК Номенклатура,
| ТаблицаКомплектующие.Характеристика КАК Характеристика,
| ТаблицаКомплектующие.Упаковка КАК Упаковка,
| ТаблицаКомплектующие.Количество КАК Количество,
| ТаблицаКомплектующие.КоличествоУпаковок КАК КоличествоУпаковок
|ИЗ
| ВариантыКомплектацииНоменклатуры КАК ВариантыКомплектацииНоменклатуры
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК ТаблицаКомплектующие
| ПО (ТаблицаКомплектующие.Ссылка = ВариантыКомплектацииНоменклатуры.ВариантКомплектации)";
Запрос.УстановитьПараметр("ТаблицаКомплектующие", ТаблицаКомплектующие);
УстановитьПривилегированныйРежим(Истина);
Результат = Запрос.ВыполнитьПакет();
УстановитьПривилегированныйРежим(Ложь);
Возврат Новый Структура("ТаблицаПодсборки, ТаблицаВариантыКомплектации, ТаблицаКомплектующие",
Результат[5].Выгрузить(), Результат[6].Выгрузить(), Результат[7].Выгрузить());
КонецФункции
&НаСервере
Функция КомплектующиеНезапланированныхПодсборок(ОбработатьКодСтроки = 0)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаТовары.КодСтроки КАК КодСтроки,
| ТаблицаТовары.КодСтрокиТовары КАК КодСтрокиТовары,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ТаблицаТовары.Назначение КАК Назначение,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.ДатаСборкиРазборки КАК ДатаСборкиРазборки,
| ТаблицаТовары.ВариантКомплектации КАК ВариантКомплектации,
| ТаблицаТовары.Количество КАК Количество
|ПОМЕСТИТЬ ТаблицаТовары
|ИЗ
| &ТаблицаТовары КАК ТаблицаТовары
|
|ИНДЕКСИРОВАТЬ ПО
| КодСтрокиТовары
|;
|
|
|ВЫБРАТЬ
| ТаблицаКомплектующие.Ссылка КАК ВариантКомплектации,
| ТаблицаКомплектующие.Номенклатура КАК Номенклатура,
| ТаблицаКомплектующие.Характеристика КАК Характеристика,
| СУММА(ТаблицаКомплектующие.Количество) КАК Количество
|ПОМЕСТИТЬ ТаблицаКомплектующие
|ИЗ
| Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК ТаблицаКомплектующие
|
|ГДЕ
| ТаблицаКомплектующие.Ссылка В
| (ВЫБРАТЬ
| ТаблицаТовары.ВариантКомплектации
| ИЗ
| ТаблицаТовары)
| И НЕ ТаблицаКомплектующие.Ссылка.ПометкаУдаления
|
|СГРУППИРОВАТЬ ПО
| ТаблицаКомплектующие.Ссылка,
| ТаблицаКомплектующие.Номенклатура,
| ТаблицаКомплектующие.Характеристика
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаКомплектующие.Номенклатура КАК Номенклатура,
| ТаблицаКомплектующие.Характеристика КАК Характеристика,
| ТаблицаТовары.Назначение КАК Назначение,
| ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) КАК Упаковка,
| ТаблицаКомплектующие.Количество
| * ТаблицаТовары.Количество КАК Количество,
| ТаблицаКомплектующие.Количество
| * ТаблицаТовары.Количество КАК КоличествоУпаковок,
| ТаблицаТовары.КодСтроки КАК КодСтрокиТовары,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.ДатаСборкиРазборки КАК ДатаСборкиРазборки
|ИЗ
| ТаблицаТовары КАК ТаблицаТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКомплектующие КАК ТаблицаКомплектующие
| ПО (ТаблицаКомплектующие.ВариантКомплектации = ТаблицаТовары.ВариантКомплектации)
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаТовары КАК ТаблицаТоварыПодСборка
| ПО (ТаблицаТоварыПодСборка.КодСтрокиТовары = ТаблицаТовары.КодСтроки)
| И (ТаблицаТоварыПодСборка.Номенклатура = ТаблицаКомплектующие.Номенклатура)
| И (ТаблицаТоварыПодСборка.Характеристика = ТаблицаКомплектующие.Характеристика)
|ГДЕ
| ТаблицаТоварыПодСборка.КодСтрокиТовары ЕСТЬ NULL";
СтруктураПоиска = Неопределено;
Если ОбработатьКодСтроки <> 0 Тогда
СтруктураПоиска = Новый Структура("ПланированиеПодсборки", Перечисления.СтатусыПланированияПодсборки.Запланировать);
СтруктураПоиска.Вставить("КодСтроки", ОбработатьКодСтроки);
КонецЕсли;
ВыгружаемыеКолонки = "КодСтроки,КодСтрокиТовары,Номенклатура,Характеристика,Назначение,Склад,ВариантКомплектации,ДатаСборкиРазборки,Количество";
ТаблицаТоварыКопия = Объект.Товары.Выгрузить(СтруктураПоиска, ВыгружаемыеКолонки);
Если ЗаполнятьСклад И Не ЗаполнятьСкладВТЧ Тогда
ТаблицаТоварыКопия.ЗаполнитьЗначения(Объект.Склад, "Склад");
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Назначение) И Не ЗаполнятьНазначениеВТЧ Тогда
ТаблицаТоварыКопия.ЗаполнитьЗначения(Объект.Назначение, "Назначение");
КонецЕсли;
Запрос.УстановитьПараметр("ТаблицаТовары", ТаблицаТоварыКопия);
ТаблицаПодсборки = Запрос.Выполнить().Выгрузить();
Возврат ТаблицаПодсборки;
КонецФункции
&НаСервере
Процедура ОпределитьПланированиеПодсборки(ОбработатьКодСтроки = 0)
Если Не (Объект.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.СборкаТоваров
И (ЗаполнятьСклад Или ЗаполнятьСкладВТЧ)) Тогда
Элементы.ГруппаТребуетсяЗаполнитьКомплектами.Видимость = Ложь;
Возврат;
КонецЕсли;
Если Объект.КроссТаблица Тогда
ТаблицаТовары = ТоварыПоДатам;
Иначе
ТаблицаТовары = Объект.Товары;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
Справочники.ФорматыМагазинов.ТекстЗапросаВтФорматыСкладов(Ложь)
+"ВЫБРАТЬ
| ТаблицаТовары.КодСтроки КАК КодСтроки,
| ТаблицаТовары.КодСтрокиТовары КАК КодСтрокиТовары,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.ВариантКомплектации КАК ВариантКомплектации
|ПОМЕСТИТЬ ТаблицаТовары
|ИЗ
| &ТаблицаТовары КАК ТаблицаТовары
|
|ИНДЕКСИРОВАТЬ ПО
| КодСтрокиТовары
|;
|
|
|ВЫБРАТЬ
| ТаблицаКомплектующие.Ссылка КАК ВариантКомплектации,
| ТаблицаКомплектующие.Номенклатура КАК Номенклатура,
| ТаблицаКомплектующие.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ТаблицаКомплектующие
|ИЗ
| Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК ТаблицаКомплектующие
|
|ГДЕ
| ТаблицаКомплектующие.Ссылка В
| (ВЫБРАТЬ
| ТаблицаТовары.ВариантКомплектации
| ИЗ
| ТаблицаТовары)
| И НЕ ТаблицаКомплектующие.Ссылка.ПометкаУдаления
|
|СГРУППИРОВАТЬ ПО
| ТаблицаКомплектующие.Ссылка,
| ТаблицаКомплектующие.Номенклатура,
| ТаблицаКомплектующие.Характеристика
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаТовары.КодСтроки КАК КодСтроки,
| МАКСИМУМ(ВЫБОР
| КОГДА ТаблицаТоварыПодСборка.КодСтроки ЕСТЬ NULL
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ) КАК Запланировать
|ИЗ
| ТаблицаТовары КАК ТаблицаТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКомплектующие КАК ТаблицаКомплектующие
| ПО (ТаблицаКомплектующие.ВариантКомплектации = ТаблицаТовары.ВариантКомплектации)
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаТовары КАК ТаблицаТоварыПодСборка
| ПО (ТаблицаТоварыПодСборка.КодСтрокиТовары = ТаблицаТовары.КодСтроки)
| И (ТаблицаТоварыПодСборка.Номенклатура = ТаблицаКомплектующие.Номенклатура)
| И (ТаблицаТоварыПодСборка.Характеристика = ТаблицаКомплектующие.Характеристика)
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОбеспеченияПотребностей КАК СпрСпособОбеспечения
| ПО &ПодстановкаОсновногоСпособаОбеспечения
|
|ГДЕ
| ЕСТЬNULL(СпрСпособОбеспечения.ТипОбеспечения, ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.ПустаяСсылка)) = ЗНАЧЕНИЕ(Перечисление.ТипыОбеспечения.СборкаРазборка)
| И (&ОбработатьКодСтроки = 0
| ИЛИ ТаблицаТовары.КодСтроки = &ОбработатьКодСтроки)
|
|
|СГРУППИРОВАТЬ ПО
| ТаблицаТовары.КодСтроки";
Запрос.Текст = РегистрыСведений.СхемыОбеспечения.ПодставитьСоединениеДляПолученияСпособаОбеспечения(
Запрос.Текст,
"ПодстановкаОсновногоСпособаОбеспечения",
"ТаблицаКомплектующие.Номенклатура,ТаблицаКомплектующие.Характеристика,ТаблицаТовары.Склад");
ВыгружаемыеКолонки = "КодСтроки,КодСтрокиТовары,Номенклатура,Характеристика,Склад,ВариантКомплектации";
ТаблицаТоварыКопия = ТаблицаТовары.Выгрузить(, ВыгружаемыеКолонки);
Если ЗаполнятьСклад И НЕ ЗаполнятьСкладВТЧ Тогда
ТаблицаТоварыКопия.ЗаполнитьЗначения(Объект.Склад, "Склад");
КонецЕсли;
Запрос.УстановитьПараметр("ТаблицаТовары", ТаблицаТоварыКопия);
Запрос.УстановитьПараметр("ОбработатьКодСтроки", ОбработатьКодСтроки);
УстановитьПривилегированныйРежим(Истина);
РезультатПланированиеПодсборки = Запрос.Выполнить().Выгрузить();
УстановитьПривилегированныйРежим(Ложь);
ТребуетсяЗаполнитьКомплектами = Ложь;
Если ОбработатьКодСтроки <> 0 Тогда
СтруктураПоиска = Новый Структура("КодСтроки", ОбработатьКодСтроки);
ОбрабатываемыеДанные = ТаблицаТовары.НайтиСтроки(СтруктураПоиска);
Иначе
ОбрабатываемыеДанные = ТаблицаТовары;
КонецЕсли;
Для каждого СтрокаТовар Из ОбрабатываемыеДанные Цикл
СтруктураПоиска = Новый Структура("КодСтроки", СтрокаТовар.КодСтроки);
СписокСтрок = РезультатПланированиеПодсборки.НайтиСтроки(СтруктураПоиска);
Если СписокСтрок.Количество() <> 0 Тогда
Если СписокСтрок[0].Запланировать Тогда
ТребуетсяЗаполнитьКомплектами = Истина;
СтрокаТовар.ПланированиеПодсборки = Перечисления.СтатусыПланированияПодсборки.Запланировать;
Иначе
СтрокаТовар.ПланированиеПодсборки = Перечисления.СтатусыПланированияПодсборки.Выполнено;
КонецЕсли;
Иначе
СтрокаТовар.ПланированиеПодсборки = Перечисления.СтатусыПланированияПодсборки.НеТребуется;
КонецЕсли;
КонецЦикла;
Элементы.ГруппаТребуетсяЗаполнитьКомплектами.Видимость = ТребуетсяЗаполнитьКомплектами;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция НовыйКодСтрокиТовары(Объект)
Объект.МаксимальныйКодСтрокиТовары = Объект.МаксимальныйКодСтрокиТовары + 1;
Возврат Объект.МаксимальныйКодСтрокиТовары;
КонецФункции
&НаСервере
Процедура УдалитьРезультатЗаполнения(ТаблицаТовары, НачальноеКоличество)
Для индекс = -ТаблицаТовары.Количество() + 1 По -НачальноеКоличество Цикл
ТаблицаТовары.Удалить(ТаблицаТовары[-индекс]);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьВходитВКомплект()
Если Объект.КроссТаблица Тогда
ТаблицаТовары = ТоварыПоДатам;
Иначе
ТаблицаТовары = Объект.Товары;
КонецЕсли;
СтруктураПоиска = Новый Структура("Подсборка", Истина);
СписокСтрокПодсборка = ТаблицаТовары.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаПодсборка Из СписокСтрокПодсборка Цикл
СтруктураПоиска = Новый Структура("КодСтроки", СтрокаПодсборка.КодСтрокиТовары);
СписокСтрок = ТаблицаТовары.НайтиСтроки(СтруктураПоиска);
Если СписокСтрок.Количество() <> 0 Тогда
СтрокаТовар = СписокСтрок[0];
СтрокаПодсборка.НоменклатураКомплект = СтрокаТовар.Номенклатура;
СтрокаПодсборка.ХарактеристикаКомплект = СтрокаТовар.Характеристика;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиККомплекту(СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Объект.КроссТаблица Тогда
ТаблицаТовары = ТоварыПоДатам;
ЭлементТовары = Элементы.ТоварыПоДатам;
Иначе
ТаблицаТовары = Объект.Товары;
ЭлементТовары = Элементы.Товары;
КонецЕсли;
ТекущиеДанные = ЭлементТовары.ТекущиеДанные;
СтруктураПоиска = Новый Структура("КодСтроки", ТекущиеДанные.КодСтрокиТовары);
СписокСтрок = ТаблицаТовары.НайтиСтроки(СтруктураПоиска);
Если СписокСтрок.Количество() <> 0 Тогда
ЭлементТовары.ТекущаяСтрока = СписокСтрок[0].ПолучитьИдентификатор();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗапланироватьПодсборку(СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
КонецЕсли;
Если ТекущиеДанные.ПланированиеПодсборки = ПредопределенноеЗначение("Перечисление.СтатусыПланированияПодсборки.Выполнено") Тогда
СписокПодсборок = ПолучитьПодсборкиКомплекта(ТекущиеДанные.КодСтроки);
Если СписокПодсборок.Количество() <> 0 Тогда
Оповещение = Новый ОписаниеОповещения("ЗапланироватьПодсборкуЗавершение", ЭтотОбъект);
СписокПодсборок.ПоказатьВыборЭлемента(Оповещение, НСтр("ru = 'Выберите подсборку, чтобы перейти к ней'"));
КонецЕсли;
ИначеЕсли ТекущиеДанные.ПланированиеПодсборки = ПредопределенноеЗначение("Перечисление.СтатусыПланированияПодсборки.Запланировать") Тогда
ЗапланироватьПодсборкиНаСервере(КэшированныеЗначения, ТекущиеДанные.КодСтроки);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗапланироватьПодсборкуЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент <> Неопределено Тогда
Если Объект.КроссТаблица Тогда
Элементы.ТоварыПоДатам.ТекущаяСтрока = ВыбранныйЭлемент.Значение;
Иначе
Элементы.Товары.ТекущаяСтрока = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьПодсборкиКомплекта(КодСтрокиТовары)
Если Объект.КроссТаблица Тогда
ТаблицаТовары = ТоварыПоДатам;
Иначе
ТаблицаТовары = Объект.Товары;
КонецЕсли;
СтруктураПоиска = Новый Структура("КодСтрокиТовары,Подсборка", КодСтрокиТовары, Истина);
СписокСтрок = ТаблицаТовары.НайтиСтроки(СтруктураПоиска);
СписокПодсборок = Новый СписокЗначений;
Для каждого ЭлементКоллекции Из СписокСтрок Цикл
ТоварСтрока = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(ЭлементКоллекции.Номенклатура, ЭлементКоллекции.Характеристика);
СписокПодсборок.Добавить(ЭлементКоллекции.ПолучитьИдентификатор(), ТоварСтрока);
КонецЦикла;
Возврат СписокПодсборок;
КонецФункции
&НаСервере
Процедура РассчитатьКоличествоДляПодсборок(Знач КодСтрокиТовары, Знач ВариантКомплектации, Знач ДатаСборкиРазборки, Знач КоличествоТовара, Знач Отменено, Знач Упаковка = Неопределено, Номенклатура = Неопределено)
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
КоэффициентУпаковки = 1;
Если ЗначениеЗаполнено(Упаковка) Тогда
КоэффициентУпаковки = Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(Упаковка, Номенклатура);
КонецЕсли;
СписокИсходныеТовары = Новый Массив;
СтруктураТовара = Новый Структура();
СтруктураТовара.Вставить("КодСтрокиТовары", КодСтрокиТовары);
СтруктураТовара.Вставить("ВариантКомплектации", ВариантКомплектации);
СтруктураТовара.Вставить("КоличествоТовара", КоличествоТовара * КоэффициентУпаковки);
СтруктураТовара.Вставить("Отменено", Отменено);
СписокИсходныеТовары.Добавить(СтруктураТовара);
Пока СписокИсходныеТовары.Количество() <> 0 Цикл
СписокКодСтрокиТоварыКОбработке = Новый ФиксированныйМассив(СписокИсходныеТовары);
СписокИсходныеТовары.Очистить();
СписокПодсборок = Новый Массив;
СписокВариантовКомплектаций = Новый Массив;
Для каждого ДанныеИсходногоТовара Из СписокКодСтрокиТоварыКОбработке Цикл
ТекущийКодСтрокиТовары = ДанныеИсходногоТовара.КодСтрокиТовары;
Если Объект.КроссТаблица Тогда
СтруктураПоиска = Новый Структура("КодСтрокиТовары", ТекущийКодСтрокиТовары);
СписокСтрок = ТоварыПоДатам.НайтиСтроки(СтруктураПоиска);
Иначе
СтруктураПоиска = Новый Структура("КодСтрокиТовары,ДатаСборкиРазборки", ТекущийКодСтрокиТовары, ДатаСборкиРазборки);
СписокСтрок = Объект.Товары.НайтиСтроки(СтруктураПоиска);
КонецЕсли;
Для каждого ЭлементКоллекции Из СписокСтрок Цикл
ДанныеПодсборки = Новый Структура("СтрокаПодсборка,ВариантКомплектации",
ЭлементКоллекции, ДанныеИсходногоТовара.ВариантКомплектации);
СписокПодсборок.Добавить(ДанныеПодсборки);
КонецЦикла;
СписокВариантовКомплектаций.Добавить(ДанныеИсходногоТовара.ВариантКомплектации);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаКомплектующие.Ссылка КАК ВариантКомплектации,
| ТаблицаКомплектующие.Номенклатура КАК Номенклатура,
| ТаблицаКомплектующие.Характеристика КАК Характеристика,
| ТаблицаКомплектующие.Ссылка.Количество КАК КоличествоКомплектация,
| СУММА(ТаблицаКомплектующие.Количество) КАК Количество
|ИЗ
| Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК ТаблицаКомплектующие
|
|ГДЕ
| ТаблицаКомплектующие.Ссылка В (&СписокВариантовКомплектаций)
| И НЕ ТаблицаКомплектующие.Ссылка.ПометкаУдаления
|
|СГРУППИРОВАТЬ ПО
| ТаблицаКомплектующие.Ссылка,
| ТаблицаКомплектующие.Номенклатура,
| ТаблицаКомплектующие.Характеристика";
Запрос.УстановитьПараметр("СписокВариантовКомплектаций", СписокВариантовКомплектаций);
ТаблицаКомплектующие = Запрос.Выполнить().Выгрузить();
ТаблицаКомплектующие.Индексы.Добавить("Номенклатура,Характеристика,ВариантКомплектации");
ОбрабатываемыеСтроки = Новый Массив();
Для каждого ДанныеПодсборки Из СписокПодсборок Цикл
СтрокаПодсборка = ДанныеПодсборки.СтрокаПодсборка;
СтруктураПоиска = Новый Структура("Номенклатура,Характеристика,ВариантКомплектации",
СтрокаПодсборка.Номенклатура, СтрокаПодсборка.Характеристика, ДанныеПодсборки.ВариантКомплектации);
СписокКомплектующих = ТаблицаКомплектующие.НайтиСтроки(СтруктураПоиска);
Если СписокКомплектующих.Количество() <> 0 Тогда
КоличествоКомплектация = СписокКомплектующих[0].КоличествоКомплектация;
КоличествоКомплектующей = СписокКомплектующих[0].Количество;
Иначе
КоличествоКомплектация = 1;
КоличествоКомплектующей = 0;
КонецЕсли;
Если Объект.КроссТаблица Тогда
КоэффициентУпаковки = 1;
Если ЗначениеЗаполнено(СтрокаПодсборка.Упаковка) Тогда
КоэффициентУпаковки = Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(СтрокаПодсборка.Упаковка, СтрокаПодсборка.Номенклатура);
КонецЕсли;
КоличествоПодсборка = ДанныеИсходногоТовара.КоличествоТовара
* КоличествоКомплектующей
/ КоличествоКомплектация
/ КоэффициентУпаковки;
СтрокаПодсборка["Количество_"+ДатаСборкиРазборки] = КоличествоПодсборка;
СтрокаПодсборка["Отменено_"+ДатаСборкиРазборки] = Отменено;
ПриИзмененииКоличестваСуммыСтроки(ЭтаФорма, СтрокаПодсборка);
СтруктураТовара = Новый Структура();
СтруктураТовара.Вставить("КодСтрокиТовары", СтрокаПодсборка.КодСтроки);
СтруктураТовара.Вставить("ВариантКомплектации", СтрокаПодсборка.ВариантКомплектации);
СтруктураТовара.Вставить("КоличествоТовара", КоличествоПодсборка * КоэффициентУпаковки);
СтруктураТовара.Вставить("Отменено", Отменено);
СписокИсходныеТовары.Добавить(СтруктураТовара);
Иначе
КоличествоПодсборка = ДанныеИсходногоТовара.КоличествоТовара
* КоличествоКомплектующей
/ КоличествоКомплектация;
СтрокаПодсборка.Количество = КоличествоПодсборка;
СтрокаПодсборка.Отменено = Отменено;
ОбрабатываемыеСтроки.Добавить(СтрокаПодсборка);
СтруктураТовара = Новый Структура();
СтруктураТовара.Вставить("КодСтрокиТовары", СтрокаПодсборка.КодСтроки);
СтруктураТовара.Вставить("ВариантКомплектации", СтрокаПодсборка.ВариантКомплектации);
СтруктураТовара.Вставить("КоличествоТовара", КоличествоПодсборка);
СтруктураТовара.Вставить("Отменено", Отменено);
СписокИсходныеТовары.Добавить(СтруктураТовара);
КонецЕсли;
КонецЦикла;
Если НЕ Объект.КроссТаблица Тогда
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
КонецЕсли;
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаСервере
Процедура УдалитьПодсборки(МассивКодовУдаляемыхСтрок = Неопределено)
Если Объект.КроссТаблица Тогда
ТаблицаТовары = ТоварыПоДатам;
Иначе
ТаблицаТовары = Объект.Товары;
КонецЕсли;
Если МассивКодовУдаляемыхСтрок = Неопределено Тогда
МассивКодовУдаляемыхСтрок = Новый Массив(ТоварыУдаляемыеСтрокиМассивКлючей);
КонецЕсли;
Пока МассивКодовУдаляемыхСтрок.Количество() <> 0 Цикл
МассивКодовКУдалению = Новый ФиксированныйМассив(МассивКодовУдаляемыхСтрок);
МассивКодовУдаляемыхСтрок.Очистить();
Для каждого КодСтрокиТовары Из МассивКодовКУдалению Цикл
СтруктураПоиска = Новый Структура("КодСтрокиТовары", КодСтрокиТовары);
СписокСтрок = ТаблицаТовары.НайтиСтроки(СтруктураПоиска);
Для каждого УдаляемаяСтрока Из СписокСтрок Цикл
МассивКодовУдаляемыхСтрок.Добавить(УдаляемаяСтрока.КодСтроки);
ТаблицаТовары.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область Прочее
&НаСервере
Процедура СохранитьНовыйПериодСервер()
ПланированиеКлиентСервер.СохранитьЗначенияПроверяемыхРеквизитов(Объект, ЭтаФорма, "РеквизитыДоИзменения");
НадписьПериодичностьВалюта = НСтр("ru = 'Периодичность: %Периодичность%'");
НадписьПериодичностьВалюта = СтрЗаменить(НадписьПериодичностьВалюта,"%Периодичность%",Строка(Объект.Периодичность));
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
Если Объект.ЗаполнятьПоФормуле Тогда
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
Иначе
ИнициализироватьСтруктуруНастроек(РеквизитФормыВЗначение("Объект"));
КонецЕсли;
ПланированиеПоНазначениям = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Сценарий,"ПланированиеПоНазначениям");
ПриИзмененииПериодовНаСервере();
СкопироватьВКроссТаблицу(Неопределено);
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура СценарийПриИзмененииСервер()
Если Объект.ВидПлана <> ЭтаФорма["РеквизитыДоИзменения"].ВидПлана
ИЛИ (Объект.Сценарий <> ЭтаФорма["РеквизитыДоИзменения"].Сценарий
И НЕ ЗначениеЗаполнено(Объект.ВидПлана)) Тогда
ОбновлятьВидПлана = Истина;
Иначе
ОбновлятьВидПлана = Ложь;
КонецЕсли;
ПараметрыСценария = ПараметрыСценария(Объект.Сценарий);
ЗаполнитьЗначенияСвойств(Объект, ПараметрыСценария);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыСценария);
Если ОбновлятьВидПлана Тогда
Объект.ВидПлана = Планирование.ПолучитьВидПланаПоУмолчанию(Перечисления.ТипыПланов.ПланСборкиРазборки, Объект.Сценарий);
КонецЕсли;
Если ПланированиеКлиентСервер.НеобходимоОбновитьИнтерфейс(Объект, ЭтаФорма, "РеквизитыДоИзменения") Тогда
ПриИзмененииПериодовНаСервере(Истина);
КонецЕсли;
Если ОбновлятьВидПлана Тогда
ВидПланаПриИзмененииСервер(ОбновлятьВидПлана);
Объект.ЗаполненоАвтоматически = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВидПланаПриИзмененииСервер(ОбновлятьПравило = Ложь)
ОбновлятьПравило = (ОбновлятьПравило ИЛИ Объект.ВидПлана <> ЭтаФорма["РеквизитыДоИзменения"].ВидПлана);
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(
Объект.ВидПлана,
ОбновлятьПравило,
АдресПравилаЗаполнения,
АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана,, "КоличествоПериодов");
Если ПараметрыВидаПлана.ЗаполнятьПоДефициту = Истина Тогда
Объект.КроссТаблица = Ложь;
ПереключитьПериодыВСтрокиНаСервере(Неопределено);
КонецЕсли;
Если ОбновлятьПравило Тогда
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана, "КоличествоПериодов");
Если КоличествоПериодов > 0 Тогда
Объект.ОкончаниеПериода = Неопределено;
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(
Объект.Периодичность,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекущаяДатаСеанса(),
ПараметрыВидаПлана.КоличествоПериодов);
КонецЕсли;
ЗаполнитьЗначенияСвойств(Объект, ПараметрыВидаПлана);
Объект.ПравилоЗаполнения.Загрузить(ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Объект.ЗаполненоАвтоматически = Ложь;
ОпределитьВариантКомплектации();
ОпределитьПланированиеПодсборки();
Объект.ЗаполнятьПоФормуле = ПараметрыВидаПлана.ЗаполнятьПоФормуле;
Объект.Замещающий = ПараметрыВидаПлана.Замещающий;
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланСборкиРазборки");
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
Если ПараметрыВидаПлана.Свойство("СтруктураНастроек")
И ПараметрыВидаПлана.СтруктураНастроек <> Неопределено Тогда
СтруктураНастроек = ПараметрыВидаПлана.СтруктураНастроек;
КонецЕсли;
ПриИзмененииПериодовНаСервере();
КонецЕсли;
СохранитьНовыйПериодСервер();
Если ОбновлятьПравило И ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
УстановитьВидимость();
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимость()
ИспользоватьОбособленноеОбеспечениеЗаказов = ПолучитьФункциональнуюОпцию("ИспользоватьОбособленноеОбеспечениеЗаказов");
Элементы.ВидПлана.Доступность = ЗначениеЗаполнено(Объект.Сценарий);
ИспользоватьПодсборки = (Объект.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.СборкаТоваров)
И (ЗаполнятьСклад Или ЗаполнятьСкладВТЧ);
Элементы.ТоварыНастроитьИЗаполнитьПоПравилуЗаполнения.Видимость = НЕ ЗапретитьРедактированиеПравила;
Элементы.ТоварыПоДатамНастроитьИЗаполнитьПоПравилуЗаполнения.Видимость = НЕ ЗапретитьРедактированиеПравила;
Элементы.Склад.Видимость = ЗаполнятьСклад ИЛИ ЗначениеЗаполнено(Объект.Склад);
Элементы.ТоварыСклад.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыПоДатамСклад.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыЗаполнитьСкладПоЗначению.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыПоДатамЗаполнитьСкладПоЗначению.Видимость = ЗаполнятьСкладВТЧ;
Элементы.ТоварыЗаполнитьНазначениеПоЗначению.Видимость = ЗаполнятьНазначениеВТЧ;
Элементы.ТоварыПоДатамЗаполнитьНазначениеПоЗначению.Видимость = ЗаполнятьНазначениеВТЧ;
Элементы.ТоварыЗаполнитьКолонки.Видимость = ЗаполнятьСкладВТЧ ИЛИ ЗаполнятьНазначениеВТЧ;
Элементы.ТоварыПоДатамЗаполнитьКолонки.Видимость = ЗаполнятьСкладВТЧ ИЛИ ЗаполнятьНазначениеВТЧ;
Элементы.ТоварыЗапланироватьПодсборки.Видимость = ИспользоватьПодсборки;
Элементы.ТоварыПоДатамЗапланироватьПодсборки.Видимость = ИспользоватьПодсборки;
Элементы.ТоварыПланированиеПодсборки.Видимость = ИспользоватьПодсборки;
Элементы.ТоварыПоДатамПланированиеПодсборки.Видимость = ИспользоватьПодсборки;
Элементы.ТоварыНоменклатураКомплект.Видимость = ИспользоватьПодсборки;
Элементы.ТоварыХарактеристикаКомплект.Видимость = ИспользоватьПодсборки;
Элементы.ТоварыПоДатамНоменклатураКомплект.Видимость = ИспользоватьПодсборки;
Элементы.ТоварыПоДатамХарактеристикаКомплект.Видимость = ИспользоватьПодсборки;
Элементы.ТоварыЗаполнить.Видимость = Не Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыРазбитьСтроку.Видимость = Не Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыПоДатамЗаполнить.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыЗаполнитьТовары.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыПоДатамЗаполнитьТовары.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыЗаполнитьПоказатели.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыПоДатамЗаполнитьПоказатели.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыГруппаИзменитьКоличество.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыПоДатамГруппаИзменитьКоличество.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыДополнительныеПараметрыФормула.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыДополнительныеПараметрыОтклонение.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Если Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы.Найти("ТоварыПоДатам" + "Отклонение") <> Неопределено Тогда
Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы["ТоварыПоДатам" + "Отклонение"].Видимость = Объект.ЗаполнятьПоФормуле;
КонецЕсли;
Если Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы.Найти("ТоварыПоДатам" + "ФормулаВычисление") <> Неопределено Тогда
Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы["ТоварыПоДатам" + "ФормулаВычисление"].Видимость = Объект.ЗаполнятьПоФормуле;
КонецЕсли;
Элементы.ТоварыДополнительныеПараметры.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
ПравоПросмотраСтатейБюджетов = ПравоДоступа("Просмотр", Метаданные.Справочники.СтатьиБюджетов);
Элементы.СтатьяБюджетов.Видимость = Объект.ОтражаетсяВБюджетировании И ПравоПросмотраСтатейБюджетов;
Элементы.Расшифровка.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыПоДатамКонтекстноеМенюГруппаПоФормуле.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыКонтекстноеМенюГруппаПоФормуле.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.Назначение.Видимость = ПланированиеПоНазначениям И Не ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыНазначение.Видимость = ПланированиеПоНазначениям И ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыПоДатамНазначение.Видимость = ПланированиеПоНазначениям И ЗаполнятьНазначениеВТЧ И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.ТоварыЗамещен.Видимость = Объект.Замещающий;
Если Не Объект.ЗаполнятьПоДефициту Тогда
Элементы.НадписьЕстьОтмененныеКорректировкиОбеспечения.Видимость = Ложь;
КонецЕсли;
Элементы.ТоварыЗаполнитьПоДефицитам.Видимость = Объект.ЗаполнятьПоДефициту;
Элементы.ЗаполнятьАвтоматически.Видимость = Объект.ЗаполнятьПоДефициту;
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Элементы.НачалоОкончаниеПериода.Доступность = Не Объект.ЗаполнятьПоДефициту;
КонецЕсли;
Элементы.ТоварыКорректировкаОбеспечения.Видимость = Объект.ЗаполнятьПоДефициту;
Элементы.ФормаГруппаПериоды.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыВставитьСтроки.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыКонтекстноеМенюРазбитьСтроку.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыПодобратьТовары.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыЗагрузитьИзExcel.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыExcel.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыИзменитьФлагОтменыСтрокПлана.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыКонтекстноеМенюИзменитьФлагОтменыСтрокПлана.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыОтменено.Видимость = Не Объект.ЗаполнятьПоДефициту;
ОбновитьОтображенияКорректировок();
ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефициту();
ПрочитатьЕстьОтмененныеКорректировкиОбеспечения();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте()
Если Не Объект.ЗаполнятьПоДефициту Тогда
Элементы.ГруппаОповещенияЗаполнениеПоДефициту.Видимость = Ложь;
ОтключитьОбработчикОжидания("ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте");
Иначе
ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефициту();
Если ТаймерКонтроляПересчетаДефецитов = 0 Тогда
ТаймерКонтроляПересчетаДефецитов = 2;
Иначе
ТаймерКонтроляПересчетаДефецитов = Мин(ТаймерКонтроляПересчетаДефецитов*1.5, 60);
КонецЕсли;
ПодключитьОбработчикОжидания("ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте", ТаймерКонтроляПересчетаДефецитов, Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефициту()
Если Не Объект.ЗаполнятьПоДефициту Тогда
Элементы.ГруппаОповещенияЗаполнениеПоДефициту.Видимость = Ложь;
Иначе
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РасчетДефицитовПлановПоЭтапам.Сценарий КАК Сценарий
|ИЗ
| РегистрСведений.РасчетДефицитовПлановПоЭтапам КАК РасчетДефицитовПлановПоЭтапам
|ГДЕ
| РасчетДефицитовПлановПоЭтапам.Пересчитать
| И РасчетДефицитовПлановПоЭтапам.Сценарий = &Сценарий
| И РасчетДефицитовПлановПоЭтапам.ВидПлана = &ВидПлана
| И РасчетДефицитовПлановПоЭтапам.ПериодПланирования = &ПериодПланирования";
Запрос.УстановитьПараметр("Сценарий", Объект.Сценарий);
Запрос.УстановитьПараметр("ВидПлана", Объект.ВидПлана);
Запрос.УстановитьПараметр("ПериодПланирования", Объект.НачалоПериода);
Выборка = Запрос.Выполнить().Выбрать();
Видимость = Выборка.Следующий();
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,"ГруппаОповещенияЗаполнениеПоДефициту","Видимость", Видимость);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьОтображенияКорректировок()
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| КорректировкаПлановыхПотребностей.Ссылка КАК Ссылка,
| СУММА(ВЫБОР
| КОГДА КорректировкаПлановыхПотребностей.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПлановыхКорректировок.КПроверке)
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ) КАК КоличествоКПроверке
|ИЗ
| Документ.КорректировкаПлановыхПотребностей КАК КорректировкаПлановыхПотребностей
|ГДЕ
| КорректировкаПлановыхПотребностей.План = &План
| И КорректировкаПлановыхПотребностей.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыПлановыхКорректировок.КПроверке), ЗНАЧЕНИЕ(Перечисление.СтатусыПлановыхКорректировок.Утверждена))
|
|СГРУППИРОВАТЬ ПО
| КорректировкаПлановыхПотребностей.Ссылка";
Запрос.УстановитьПараметр("План", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Элементы.НадписьЕстьОтмененныеКорректировкиПотребности.Видимость = Истина;
Если Выборка.КоличествоКПроверке = 0 Тогда
Элементы.НадписьКорректировкиПлановыхПотребностей.Заголовок = НСтр("ru='Имеются корректировки потребностей'");
Элементы.ДекорацияОтмененныеКорректировкиПотребностейКПроверке.Видимость = Ложь;
Элементы.ДекорацияОтмененныеКорректировкиПотребностей.Видимость = Истина;
Иначе
Элементы.НадписьКорректировкиПлановыхПотребностей.Заголовок = НСтр("ru='Имеются отмененные корректировки потребностей к проверке'");
Элементы.ДекорацияОтмененныеКорректировкиПотребностейКПроверке.Видимость = Истина;
Элементы.ДекорацияОтмененныеКорректировкиПотребностей.Видимость = Ложь;
КонецЕсли;
Иначе
Элементы.НадписьЕстьОтмененныеКорректировкиПотребности.Видимость = Ложь;
КонецЕсли;
Элементы.НадписьЕстьОтмененныеКорректировкиПотребности.Видимость = Не Запрос.Выполнить().Пустой();
Элементы.ЗаполнятьАвтоматически.Видимость = Объект.ЗаполнятьПоДефициту;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПараметрыВидаПлана(Знач ВидПлана, Знач ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек)
Реквизиты = "КоличествоПериодов, ЗаполнятьСклад, ЗаполнятьСкладВТЧ, ЗапретитьРедактированиеПравила,
|Замещающий, ЗаполнятьПоФормуле, ЗаполнятьНазначениеВТЧ, ХозяйственнаяОперация,
|ЗаполнятьПоДефициту, Родитель, ЗаполнятьАвтоматически, ЗапретитьРедактированиеФормулы";
Реквизиты = Реквизиты + ", ОтражаетсяВБюджетировании, СтатьяБюджетов";
ПараметрыВидаПлана = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидПлана, Реквизиты);
Если ОбновлятьПравило Тогда
АдресПравилаЗаполнения = Планирование.ПолучитьАдресПравилаЗаполненияПоУмолчанию(
Перечисления.ТипыПланов.ПланСборкиРазборки,
ВидПлана,
АдресПравилаЗаполнения);
АдресПользовательскихНастроек = Планирование.ПолучитьАдресПользовательскихНастроекПоУмолчанию(
Перечисления.ТипыПланов.ПланСборкиРазборки,
ВидПлана,
АдресПользовательскихНастроек);
СтруктураНастроек = Планирование.ПолучитьНастройкиПоУмолчанию(Перечисления.ТипыПланов.ПланСборкиРазборки, ВидПлана);
Если СтруктураНастроек.Свойство("Формула") Тогда
ПараметрыВидаПлана.Вставить("СтруктураНастроек", СтруктураНастроек);
КонецЕсли;
Для каждого Элемент Из СтруктураНастроек Цикл
ПараметрыВидаПлана.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
КонецЕсли;
Возврат ПараметрыВидаПлана;
КонецФункции
&НаКлиенте
Процедура ОповеститьПользователяОЗаполненииДанных()
ПоказатьОповещениеПользователя(
НСтр("ru = 'Заполнение данных в документ завершено'"),
,
,
БиблиотекаКартинок.Информация32);
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьПользователяОНачалеЗаполненииДанных()
Состояние(НСтр("ru = 'Выполняется заполнение данных в документ'"));
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий)
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц", Новый Структура("НужноОкруглять", Ложь));
КонецПроцедуры
#Область ПодборыИОбработкаПроверкиКоличества
&НаСервере
Процедура ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, ВыбранноеЗначение)
Если НЕ ЭтоАдресВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище) Тогда
Возврат;
КонецЕсли;
ТаблицаТоваров = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище);
ДобавитьТовары(ТаблицаТоваров, КэшированныеЗначения)
КонецПроцедуры
#КонецОбласти
&НаСервере
Процедура ДобавитьТовары(ТаблицаТоваров, КэшированныеЗначения = Неопределено, ЗагрузкаИзФайла = Ложь)
Модифицированность = Истина;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
Если КэшированныеЗначения = Неопределено Тогда
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
КонецЕсли;
ОбрабатываемыеСтроки = Новый Массив;
Для каждого СтрокаТоваров Из ТаблицаТоваров Цикл
Если Объект.КроссТаблица И НЕ ЗагрузкаИзФайла Тогда
ТекущаяСтрока = ТоварыПоДатам.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТоваров);
ТекущаяСтрока.КодСтроки = НовыйКодСтрокиТовары(Объект);
Иначе
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТоваров);
ТекущаяСтрока.КодСтроки = НовыйКодСтрокиТовары(Объект);
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЕсли;
МассивКлючей = Новый Массив;
МассивКлючей.Добавить(ТекущаяСтрока.КодСтроки);
УдалитьПодсборки(МассивКлючей);
Если ЗначениеЗаполнено(ТекущаяСтрока.ВариантКомплектации) Тогда
ОпределитьПланированиеПодсборки(ТекущаяСтрока.КодСтроки);
Иначе
ТекущаяСтрока.ПланированиеПодсборки = Перечисления.СтатусыПланированияПодсборки.НеТребуется;
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
Если Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоДатам");
КонецЕсли;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьСвязанныеРеквизитыОбъекта(Объект, Форма)
Если Объект.КроссТаблица
Или Форма.ИспользуютсяПланируемыеОстатки Тогда
Товары = Форма.ТоварыПоДатам;
Иначе
Товары = Объект.Товары;
КонецЕсли;
Если НЕ Форма.ЗаполнятьСклад Тогда
Объект.Склад = Неопределено;
КонецЕсли;
Если НЕ Форма.ПланированиеПоНазначениям Тогда
Объект.Назначение = Неопределено;
КонецЕсли;
Для каждого СтрокаТЧ Из Товары Цикл
Если Форма.ЗаполнятьСклад Тогда
СтрокаТЧ.Склад = Объект.Склад;
ИначеЕсли НЕ Форма.ЗаполнятьСкладВТЧ Тогда
СтрокаТЧ.Склад = Неопределено;
КонецЕсли;
Если НЕ Форма.ПланированиеПоНазначениям
Или СтрокаТЧ.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Услуга")
Или СтрокаТЧ.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.МногооборотнаяТара") Тогда
СтрокаТЧ.Назначение = Неопределено;
ИначеЕсли НЕ Форма.ЗаполнятьНазначениеВТЧ Тогда
СтрокаТЧ.Назначение = Объект.Назначение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ПриИзмененииКоличестваСуммыСтроки(ЭтаФорма, СтрокаТоваров)
Количество = 0;
Для каждого СтрокаПериода Из ЭтаФорма.Периоды Цикл
Если НЕ СтрокаПериода.Активная ИЛИ СтрокаТоваров["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
Количество = Количество + СтрокаТоваров["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
СтрокаТоваров.КоличествоУпаковок = Количество;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоговыеПоказатели(Форма, РассчитыватьСтроки = Истина)
Объект = Форма.Объект;
Если НЕ Объект.КроссТаблица Тогда
Возврат;
КонецЕсли;
Товары = Форма.ТоварыПоДатам;
Форма["КоличествоУпаковок"] = 0;
ПрефиксКолонкиКоличество = "ТоварыПоДатам" + "Количество_";
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] = 0;
КонецЦикла;
Для каждого СтрокаТЧ Из Товары Цикл
Если РассчитыватьСтроки Тогда
СтрокаТЧ.КоличествоУпаковок = 0;
КонецЕсли;
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ["Замещен_"+ СтрокаПериода.ИмяКолонки] = СтрокаПериода.Замещен;
СтрокаТЧ["ЗамещенКЗаказу_"+ СтрокаПериода.ИмяКолонки] = СтрокаПериода.ЗамещенКЗаказу;
Если СтрокаТЧ["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
Если РассчитыватьСтроки Тогда
СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЕсли;
Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] = Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
Форма["КоличествоУпаковок"] = Форма["КоличествоУпаковок"] + СтрокаТЧ["КоличествоУпаковок"];
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(Форма, СтрокаТЧ);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ТоварыПослеУдаленияНаСервере()
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Если Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоДатам");
КонецЕсли;
УдалитьПодсборки();
ОпределитьПланированиеПодсборки();
КонецПроцедуры
&НаСервере
Процедура ТоварыСкладПриИзмененииНаСервере()
Если Объект.КроссТаблица Тогда
ТекущаяСтрока = Элементы.ТоварыПоДатам.ТекущаяСтрока;
ТекущиеДанные = ТоварыПоДатам.НайтиПоИдентификатору(ТекущаяСтрока);
Иначе
ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
ОпределитьПланированиеПодсборки(ТекущиеДанные.КодСтроки);
Если ТекущиеДанные.ПланированиеПодсборки = Перечисления.СтатусыПланированияПодсборки.НеТребуется Тогда
МассивКлючей = Новый Массив;
МассивКлючей.Добавить(ТекущиеДанные.КодСтроки);
УдалитьПодсборки(МассивКлючей);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СкладПриИзмененииНаСервере()
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
ОпределитьПланированиеПодсборки();
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииНоменклатурыНаСервере()
Если Объект.КроссТаблица Тогда
ТекущаяСтрока = Элементы.ТоварыПоДатам.ТекущаяСтрока;
ТекущиеДанные = ТоварыПоДатам.НайтиПоИдентификатору(ТекущаяСтрока);
Иначе
ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
СписокСтрокТовары = Новый Массив;
СписокСтрокТовары.Добавить(ТекущиеДанные);
ОпределитьВариантКомплектации(СписокСтрокТовары);
ОпределитьПланированиеПодсборки(ТекущиеДанные.КодСтроки);
Если ТекущиеДанные.ПланированиеПодсборки = Перечисления.СтатусыПланированияПодсборки.НеТребуется Тогда
МассивКлючей = Новый Массив;
МассивКлючей.Добавить(ТекущиеДанные.КодСтроки);
УдалитьПодсборки(МассивКлючей);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииХарактеристикиНаСервере()
Если Объект.КроссТаблица Тогда
ТекущаяСтрока = Элементы.ТоварыПоДатам.ТекущаяСтрока;
ТекущиеДанные = ТоварыПоДатам.НайтиПоИдентификатору(ТекущаяСтрока);
Иначе
ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
СписокСтрокТовары = Новый Массив;
СписокСтрокТовары.Добавить(ТекущиеДанные);
ОпределитьВариантКомплектации(СписокСтрокТовары);
ОпределитьПланированиеПодсборки(ТекущиеДанные.КодСтроки);
Если ТекущиеДанные.ПланированиеПодсборки = Перечисления.СтатусыПланированияПодсборки.НеТребуется Тогда
МассивКлючей = Новый Массив;
МассивКлючей.Добавить(ТекущиеДанные.КодСтроки);
УдалитьПодсборки(МассивКлючей);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОперацияПриИзмененииНаСервере()
Если Объект.ЗаполнятьПоФормуле Тогда
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
КонецЕсли;
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
УстановитьВидимость();
КонецПроцедуры
&НаСервере
Процедура РассчитатьКоличествоДляПодсборокПриИзмененииТовара()
Если Объект.КроссТаблица Тогда
СтрокаТоваров = Элементы.ТоварыПоДатам.ТекущаяСтрока;
ТекущиеДанные = ТоварыПоДатам.НайтиПоИдентификатору(СтрокаТоваров);
Для каждого ДанныеПериода Из ЭтаФорма.Периоды Цикл
Если НЕ ДанныеПериода.Активная Тогда
Продолжить;
КонецЕсли;
ИмяКолонкиКоличество = "Количество_" + ДанныеПериода.ИмяКолонки;
ИмяКолонкиОтменено = "Отменено_" + ДанныеПериода.ИмяКолонки;
РассчитатьКоличествоДляПодсборок(
ТекущиеДанные.КодСтроки,
ТекущиеДанные.ВариантКомплектации,
ДанныеПериода.ИмяКолонки,
ТекущиеДанные[ИмяКолонкиКоличество],
ТекущиеДанные[ИмяКолонкиОтменено],
ТекущиеДанные.Упаковка,
ТекущиеДанные.Номенклатура);
КонецЦикла;
Иначе
СтрокаТоваров = Элементы.Товары.ТекущиеДанные;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(СтрокаТоваров);
РассчитатьКоличествоДляПодсборок(
ТекущиеДанные.КодСтроки,
ТекущиеДанные.ВариантКомплектации,
ТекущиеДанные.ДатаСборкиРазборки,
ТекущиеДанные.Количество,
ТекущиеДанные.Отменено);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьАдресТаблицыПериодов()
Возврат ПоместитьВоВременноеХранилище(ЭтаФорма.Периоды.Выгрузить(), УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ПолучитьЗагруженныеТоварыИзХранилища(АдресТоваровВХранилище)
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
ОбрабатываемыеСтроки = Новый Массив();
ТоварыИзХранилища = ПолучитьИзВременногоХранилища(АдресТоваровВХранилище);
Для Каждого СтрокаТовара Из ТоварыИзХранилища Цикл
Объект.ЗаполненоАвтоматически = Ложь;
Если Объект.КроссТаблица Тогда
ТекущаяСтрока = ТоварыПоДатам.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
АктуальныйПериод = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина))[0];
Если ТекущаяСтрока["Количество_" + АктуальныйПериод.ИмяКолонки] = 0
И ТекущаяСтрока.Количество <> 0 Тогда
ТекущаяСтрока["Количество_" + АктуальныйПериод.ИмяКолонки] = ТекущаяСтрока.КоличествоУпаковок;
КонецЕсли;
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущаяСтрока["Расшифровка_" + АктуальныйПериод.ИмяКолонки] = ""
И ТекущаяСтрока.Расшифровка <> "" Тогда
ТекущаяСтрока["Расшифровка_" + АктуальныйПериод.ИмяКолонки] = ТекущаяСтрока.Расшифровка;
КонецЕсли;
Иначе
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
Если Не ЗначениеЗаполнено(ТекущаяСтрока.ДатаСборкиРазборки) Тогда
ТекущаяСтрока.ДатаСборкиРазборки = Объект.НачалоПериода;
КонецЕсли;
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЕсли;
ТекущаяСтрока.КодСтроки = НовыйКодСтрокиТовары(Объект);
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
Если Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоДатам");
ТоварыКоличествоСтрок = ТоварыПоДатам.Количество();
Иначе
ТоварыКоличествоСтрок = Объект.Товары.Количество();
КонецЕсли;
ОпределитьВариантКомплектации();
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура НастроитьИЗаполнитьПоПравилуЗаполненияЗавершение(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
ОтборУстановлен = Настройки.ОтборУстановлен;
Настройки.Вставить("ЗаполнятьПоПравилу", Истина);
ЗаполнитьЗначенияСвойств(Объект, Настройки, "ОбновитьДополнить, ИзменитьРезультатНа, ТочностьОкругления");
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
#Область ПростоеЗаполнение
&НаСервере
Процедура ИнициализироватьНастроекПриЧтенииНаСервере(ДокументОбъект)
Если НЕ ЗначениеЗаполнено(Объект.Сценарий) ИЛИ Не ЗначениеЗаполнено(Объект.ВидПлана) Тогда
Возврат;
КонецЕсли;
ПараметрыИнициализации = Новый Структура();
ПараметрыИнициализации.Вставить("Форма", ЭтотОбъект);
ПараметрыИнициализации.Вставить("ПутьКРеквизиту", "Объект.Товары");
ПараметрыИнициализации.Вставить("ЭлементФормыТаблицы", "Товары");
ПараметрыИнициализации.Вставить("ЭлементФормыТаблицыПоПериодам", "ТоварыПоДатам");
ПараметрыИнициализации.Вставить("ХозяйственнаяОперация", Объект.ХозяйственнаяОперация);
Планирование.ИнициализироватьДопПараметры(ДополнительныеПараметрыТовары, ДополнительныеПараметрыТоварыПоПериодам, ПараметрыИнициализации);
ИнициализироватьДереваОператоров();
ИнициализироватьОперандыФормулы();
ИнициализироватьСтруктуруНастроек(ДокументОбъект);
ОбновитьСтруктуруВыводаДопПараметров();
ПрочитатьДополнительныеПараметры(ДокументОбъект);
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьСтруктуруНастроек(ДокументОбъект)
Если ЗначениеЗаполнено(ДокументОбъект.Ссылка) Тогда
СтруктураНастроек = ДокументОбъект.СтруктураНастроек.Получить();
Если СтруктураНастроек = Неопределено Тогда
УстановитьЗначениеНастройки("СтруктураНастроек", СтруктураНастроек);
КонецЕсли;
КонецЕсли;
ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначениеНастройки(ИмяНастройки, Настройка)
ЗначениеНастройкиИзХранилища = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиРаботыПользователя" + ТипПлана, "СтруктураНастроек", Настройка);
Если ЗначениеНастройкиИзХранилища <> Неопределено Тогда
Настройка = ЗначениеНастройкиИзХранилища;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьОперандыФормулы()
МассивОперандов = ПолучитьОперанды(ЭтотОбъект);
ДополнительныеПоля.Очистить();
Для каждого Элемент Из МассивОперандов Цикл
НоваяСтрока = ДополнительныеПоля.Добавить();
НоваяСтрока.Идентификатор = Элемент.Имя;
НоваяСтрока.ПометкаУдаления = ЛОЖЬ;
НоваяСтрока.Представление = Элемент.ЗаголовокОперанда;
Элемент.Свойство("ВходитВОперанд", НоваяСтрока.ВходитВОперанд);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьДереваОператоров()
Дерево = РаботаСФормулами.ПолучитьПустоеДеревоОператоров();
Планирование.ИнициализироватьДереваОператоров(Дерево);
ПредставлениеГруппы = НСтр("ru='Примеры формул'");
ГруппаОператоров = РаботаСФормулами.ДобавитьГруппуОператоров(Дерево, "ПримерыФормул", ПредставлениеГруппы);
ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров);
АдресХранилищаДереваОператоров = ПоместитьВоВременноеХранилище(Дерево, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьНаПроцентЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено
ИЛИ Результат = 0
ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ВыделеннаяСтрока);
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТЧ, КэшированныеЗначения);
КонецЦикла;
Иначе
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоДатам");
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОкруглитьКоличествоЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено
ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ВыделеннаяСтрока);
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТЧ, КэшированныеЗначения);
КонецЦикла;
Иначе
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоДатам");
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросаЗадатьПроизвольнуюФормулу(РезультатВопроса, ДополнительныеПараметры) Экспорт
СтруктураДанных = Новый Структура("Формула,ФормулаПредставление,Заголовок,ВключитьЗначение,МассивСтрок,ПериодИзменения");
Если Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.ТоварыПоДатам.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 1 Тогда
ТекущиеДанные = ТоварыПоДатам.НайтиПоИдентификатору(ВыделенныеСтроки[0]);
Для каждого Операнд Из ДополнительныеПоля Цикл
Операнд.Значение = ЭтотОбъект[Операнд.Идентификатор];
КонецЦикла;
СтруктураДанных.Формула = ЭтотОбъект.Формула;
СтруктураДанных.ФормулаПредставление= ЭтотОбъект.ФормулаПредставление;
СтруктураДанных.Заголовок = "" + ТекущиеДанные.Номенклатура +
?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика)," (" + ТекущиеДанные.Характеристика + ")","");
СтруктураДанных.ВключитьЗначение = Истина;
Иначе
СтруктураДанных.Формула = "";
СтруктураДанных.ФормулаПредставление = "";
СтруктураДанных.Заголовок = "";
СтруктураДанных.ВключитьЗначение = Ложь;
КонецЕсли;
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
СтруктураДанных.ПериодИзменения = "ВсеПериоды";
ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда
СтруктураДанных.ПериодИзменения = ДополнительныеПараметры.ИмяКолонки;
Иначе
Возврат;
КонецЕсли;
Иначе
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 1 Тогда
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ВыделенныеСтроки[0]);
Для каждого Операнд Из ДополнительныеПоля Цикл
Если ТекущиеДанные.Свойство(Операнд.Идентификатор) Тогда
Операнд.Значение = ТекущиеДанные[Операнд.Идентификатор];
КонецЕсли;
КонецЦикла;
СтруктураДанных.Формула = ТекущиеДанные.Формула;
СтруктураДанных.ФормулаПредставление= ТекущиеДанные.ФормулаПредставление;
СтруктураДанных.Заголовок = "" + ТекущиеДанные.Номенклатура +
?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика)," (" + ТекущиеДанные.Характеристика + ")","");
СтруктураДанных.ВключитьЗначение = Истина;
Иначе
СтруктураДанных.Формула = "";
СтруктураДанных.ФормулаПредставление = "";
СтруктураДанных.Заголовок = "";
СтруктураДанных.ВключитьЗначение = Ложь;
КонецЕсли;
КонецЕсли;
СтруктураДанных.МассивСтрок = ВыделенныеСтроки;
УстановитьПараметрыРасшифровки(СтруктураДанных);
УстановитьПроизвольнуюФормулу(СтруктураДанных);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПроизвольнуюФормулу(СтруктураДанных)
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланСборкиРазборки");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Расширенный", Истина);
ПараметрыФормы.Вставить("ВключитьЗначение", СтруктураДанных.ВключитьЗначение);
ПараметрыФормы.Вставить("ЗаголовокЗначения", ""+СтруктураДанных.ПараметрыРасшифровки.Отбор.Номенклатура +
?(ЗначениеЗаполнено(СтруктураДанных.ПараметрыРасшифровки.Отбор.Характеристика)," (" + СтруктураДанных.ПараметрыРасшифровки.Отбор.Характеристика + ")",""));
ПараметрыФормы.Вставить("ПараметрыРасшифровкиОперативногоПланирования", СтруктураДанных.ПараметрыРасшифровки);
ПараметрыФормы.Вставить("Формула", ?(СтруктураДанных.Формула = ПланированиеКлиентСервер.ТекстУстановкиНовойФормулы(),"", СтруктураДанных.Формула));
ПараметрыФормы.Вставить("Представление", ?(СтруктураДанных.ФормулаПредставление = ПланированиеКлиентСервер.ТекстУстановкиНовойФормулы(), "", СтруктураДанных.ФормулаПредставление));
ПараметрыФормы.Вставить("ИспользуетсяДеревоОперандов", Истина);
ПараметрыФормы.Вставить("ВыбиратьОперандПлана", Истина);
ПараметрыФормы.Вставить("ДеревоОперандов", ПоместитьДополнительныеПоляВХранилище());
ПараметрыФормы.Вставить("Операторы", АдресХранилищаДереваОператоров);
ПараметрыФормы.Вставить("КлючОбъектаСохраняемыхНастроек", "НастройкиРаботыПользователя" + ТипПлана);
ПараметрыФормы.Вставить("Отбор", ОтборПоказатели);
ПараметрыФормы.Вставить("ТипРезультата", Новый ОписаниеТипов("Число"));
ПараметрыФормы.Вставить("ФункцииИзОбщегоМодуля", ПланированиеКлиент.ФункцииИзОбщегоМодуля());
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОткрытияКонструктораУстановитьПроизвольнуюФормулу",ЭтотОбъект, СтруктураДанных);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("ОбщаяФорма.КонструкторФормул", ПараметрыФормы, ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_УстановитьПроизвольнуюФормулу(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтруктураДанных = Новый Структура("Формула,ФормулаПредставление,ПараметрыРасшифровки,ВключитьЗначение,МассивСтрок,ПериодИзменения");
МассивСтрок = Новый Массив();
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
МассивСтрок.Добавить(ТекущиеДанные.ПолучитьИдентификатор());
Для каждого Операнд Из ДополнительныеПоля Цикл
Операнд.Значение = ЭтотОбъект[Операнд.Идентификатор];
КонецЦикла;
ТекущийЭлементИмя = Элементы.ТоварыПоДатам.ТекущийЭлемент.Имя;
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
Если АктивныеПериоды.Количество() > 1 Тогда
Если СтрНайти(ТекущийЭлементИмя, "ТоварыПоДатам" + "Количество_") = 0
И СтрНайти(ТекущийЭлементИмя, "ТоварыПоДатам" + "КартинкаКомментарий_") = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Активируйте колонку с периодом'"));
Возврат;
Иначе
Для каждого Период Из АктивныеПериоды Цикл
Если ТекущийЭлементИмя = "ТоварыПоДатам" + "Количество_" + Период.ИмяКолонки
ИЛИ ТекущийЭлементИмя = "ТоварыПоДатам" + "КартинкаКомментарий_" + Период.ИмяКолонки Тогда
СтруктураДанных.Формула = ТекущиеДанные["Формула_" + Период.ИмяКолонки];
СтруктураДанных.ФормулаПредставление = ТекущиеДанные["ФормулаПредставление_" + Период.ИмяКолонки];
СтруктураДанных.ПериодИзменения = Период.ИмяКолонки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
Для каждого Период Из АктивныеПериоды Цикл
СтруктураДанных.Формула = ТекущиеДанные["Формула_" + Период.ИмяКолонки];
СтруктураДанных.ФормулаПредставление = ТекущиеДанные["ФормулаПредставление_" + Период.ИмяКолонки];
СтруктураДанных.ПериодИзменения = Период.ИмяКолонки;
КонецЦикла;
КонецЕсли;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
МассивСтрок.Добавить(ТекущиеДанные.ПолучитьИдентификатор());
Для каждого Операнд Из ДополнительныеПоля Цикл
Если ТекущиеДанные.Свойство(Операнд.Идентификатор) Тогда
Операнд.Значение = ТекущиеДанные[Операнд.Идентификатор];
КонецЕсли;
КонецЦикла;
СтруктураДанных.Формула = ТекущиеДанные.Формула;
СтруктураДанных.ФормулаПредставление = ТекущиеДанные.ФормулаПредставление;
СтруктураДанных.ПериодИзменения = "ВсеПериоды";
КонецЕсли;
СтруктураДанных.ВключитьЗначение = Истина;
СтруктураДанных.МассивСтрок = МассивСтрок;
УстановитьПараметрыРасшифровки(СтруктураДанных);
УстановитьПроизвольнуюФормулу(СтруктураДанных);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытияКонструктораУстановитьПроизвольнуюФормулу(Результат, СтруктураДанных) Экспорт
МассивСтрок = СтруктураДанных.МассивСтрок;
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Возврат;
КонецЕсли;
Если Объект.КроссТаблица Тогда
Если СтруктураДанных.Свойство("ПериодИзменения") Тогда
ИмяПериода = СтруктураДанных.ПериодИзменения;
Иначе
ИмяПериода = "ВсеПериоды";
КонецЕсли;
Для каждого ИДСтроки Из МассивСтрок Цикл
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ИмяПериода <> "ВсеПериоды" Тогда
СтрокаТоваров = ТоварыПоДатам.НайтиПоИдентификатору(ИДСтроки);
Если ИмяПериода = Период.ИмяКолонки Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Результат.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(ЭтотОбъект, СтрокаТоваров);
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоДатам");
ИначеЕсли ЗначениеЗаполнено(СтрокаТоваров["Формула_" + Период.ИмяКолонки]) И СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0 Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
ПриИзмененииКоличестваСуммыСтроки(ЭтотОбъект, СтрокаТоваров);
КонецЕсли;
ИначеЕсли ИмяПериода = "ВсеПериоды" Тогда
СтрокаТоваров = ТоварыПоДатам.НайтиПоИдентификатору(ИДСтроки);
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Результат.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(ЭтотОбъект, СтрокаТоваров);
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоДатам");
КонецЕсли;
КонецЦикла;
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Иначе
Для каждого ИДСтроки Из МассивСтрок Цикл
СтрокаТоваров = Объект.Товары.НайтиПоИдентификатору(ИДСтроки);
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, Неопределено, Неопределено, Результат.Представление);
СтрокаТоваров.Формула = Результат.Формула;
СтрокаТоваров.ФормулаПредставление = РезультатВычисления.Представление;
СтрокаТоваров.ФормулаВычисление = РезультатВычисления.Вычисление;
СтрокаТоваров.КоличествоУпаковок = РезультатВычисления.Результат;
СтрокаТоваров.Отклонение = 0;
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТоваров, КэшированныеЗначения);
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецЕсли;
Модифицированность = Истина;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьДопРеквизиты(Форма)
ДопРеквизиты = Новый Массив();
Если Форма.ДополнительныеПараметрыТоварыПоПериодам = Неопределено Тогда
Возврат ДопРеквизиты;
КонецЕсли;
Для каждого Поле Из Форма.ДополнительныеПараметрыТоварыПоПериодам Цикл
Если Поле.Значение.СоздаватьРеквизит Тогда
ДопРеквизиты.Добавить(Поле.Значение);
КонецЕсли;
КонецЦикла;
Возврат ДопРеквизиты;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьОперанды(Форма)
МассивОперандов = Новый Массив();
Если Форма.ДополнительныеПараметрыТоварыПоПериодам = Неопределено Тогда
Возврат МассивОперандов;
КонецЕсли;
Для каждого Поле Из Форма.ДополнительныеПараметрыТоварыПоПериодам Цикл
Если Поле.Значение.СоздаватьОперанд Тогда
МассивОперандов.Добавить(Поле.Значение);
КонецЕсли;
КонецЦикла;
Возврат МассивОперандов;
КонецФункции
&НаСервере
Функция ПоместитьДополнительныеПоляВХранилище()
Возврат Планирование.ПоместитьДополнительныеПоляВХранилище(ЭтаФорма, СтруктураНастроек.СмещениеПериода);
КонецФункции
&НаСервере
Процедура ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров)
Сценарий = Планирование.ПараметрыСценария(Объект.Сценарий);
ИспользоватьПланыПродаж = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПродаж")
И Сценарий.ИспользоватьВПланированииПродаж;
ИспользоватьПроизводство = ПолучитьФункциональнуюОпцию("ИспользоватьПроизводство");
ИспользоватьПланированиеПроизводства = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства")
И Сценарий.ИспользоватьВПланированииПроизводства;
ИспользоватьДляПланированияМатериалов = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства")
И Сценарий.ИспользоватьДляПланированияМатериалов;
ИспользоватьПланыЗакупок = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеЗакупок")
И Сценарий.ИспользоватьВПланированииЗакупок;
ИспользоватьПланыСборки = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеСборкиРазборки")
И Сценарий.ИспользоватьВПланированииСборкиРазборки;
ИспользоватьПланыОстатков = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеОстатков")
И Сценарий.ИспользоватьВПланированииОстатков;
ИспользоватьПланыВнутреннихПотреблений = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеВнутреннихПотреблений")
И Сценарий.ИспользоватьВПланированииВнутреннихПотреблений;
КонструкцияДляВставки = "[ПланыСборкиКомплекты] * 1.15";
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'План сборки +15%'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]")
+ ?(ИспользоватьПланыОстатков, " - [ПланОстатков]",
?(ПланированиеПоНазначениям, " - [ФактическиеНачальныеОстатки]", " - [СвободныеОстатки]"));
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Минимальное обеспечение продаж'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = "Макс("
+ ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]")
+ ", Макс([ПланыСборкиКомплекты], [ФактыСборкиКомплекты]))";
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Максимальные сборки'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "0")
+ ?(ИспользоватьПроизводство И ИспользоватьДляПланированияМатериалов, " + [ПланыПроизводстваМатериалы]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплектующие]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплекты]", "")
+ ?(ИспользоватьПланыВнутреннихПотреблений," + [ПланыВнутреннихПотреблений]","");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Планы потребностей'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
+ ?(ИспользоватьПроизводство И ИспользоватьПланированиеПроизводства, " + [ПланыПроизводства]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Планы обеспечения'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "")
+ ?(ИспользоватьПроизводство И ИспользоватьПланированиеПроизводства, " + [ПланыПроизводства]", "")
+ ?(ИспользоватьПроизводство И ИспользоватьДляПланированияМатериалов, " - [ПланыПроизводстваМатериалы]", "")
+ ?(ИспользоватьПланыПродаж, " - [ПланыПродаж]", "")
+ ?(ИспользоватьПланыСборки, " - [ПланыСборкиКомплектующие]", "")
+ ?(ИспользоватьПланыСборки, " - [ПланыРазборкиКомплекты]", "")
+ ?(ИспользоватьПланыВнутреннихПотреблений," - [ПланыВнутреннихПотреблений]","");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Отклонение планов'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = "ЗначениеКолонки(НомерТекущейКолонки() - 1)";
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Значение предыдущей колонки'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьФормулуИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Если СтруктураНастроек.ВариантЗаполненияСостава = "Отбор" Тогда
ТоварыПоДатам.Очистить();
Объект.Товары.Очистить();
ТоварыКоличествоСтрок = 0;
Оповещение = Новый ОписаниеОповещения("НастроитьФормулуИЗаполнитьЗавершение", ЭтотОбъект, Настройки);
ДобавитьТоварыПоОтборуНаКлиенте(Оповещение);
Возврат;
ИначеЕсли СтруктураНастроек.ВариантЗаполненияСостава = "НеМенять" Тогда
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
Иначе
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Настройки.Вставить("ЗаполнятьСостав", Истина);
ЗаполнитьДокумент(Настройки);
КонецЕсли;
Если Объект.КроссТаблица И Элементы.ТоварыПоДатам.ТекущиеДанные = Неопределено Тогда
ПланированиеКлиентСервер.ОчиститьЗначениеФормулы(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьФормулуИЗаполнитьЗавершение(Результат, Настройки) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
Если Не Объект.КроссТаблица Тогда
ЗаполнитьСоставТовараПоОтбору(КэшированныеЗначения);
КонецЕсли;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецЕсли;
Если Объект.КроссТаблица И Элементы.ТоварыПоДатам.ТекущиеДанные = Неопределено Тогда
ПланированиеКлиентСервер.ОчиститьЗначениеФормулы(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьСмещениеИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтборуНаКлиенте(ОповещениеОДобавлении = Неопределено)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Подбор товаров'"));
ПараметрыФормы.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь));
Если СтруктураНастроек.Свойство("ОтборНоменклатурыНастройки") Тогда
ПараметрыФормы.Вставить("ОтборНоменклатурыНастройки", СтруктураНастроек.ОтборНоменклатурыНастройки);
Иначе
ПараметрыФормы.Вставить("ОтборНоменклатурыНастройки", Неопределено)
КонецЕсли;
ДополнительныеПараметры = Новый Структура("ОповещениеОДобавлении", ОповещениеОДобавлении);
Оповещение = Новый ОписаниеОповещения("ДобавитьТоварыПоОтборуЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОткрытьФорму(
"Обработка.ПодборТоваровПоОтбору.Форма",
ПараметрыФормы,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтборуЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, Новый Структура("АдресТоваровВХранилище", Результат));
ОповеститьПользователяОЗаполненииДанных();
КонецЕсли;
Если ДополнительныеПараметры.ОповещениеОДобавлении <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОДобавлении, Результат);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСоставТовараПоОтбору(КэшированныеЗначения)
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
ТоварПоОтбору = Объект.Товары.Выгрузить();
Объект.Товары.Очистить();
Для каждого Период Из АктивныеПериоды Цикл
Для каждого СтрокаТовара Из ТоварПоОтбору Цикл
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
ТекущаяСтрока.ДатаСборкиРазборки = Период.ДатаНачала;
ТекущаяСтрока.Формула = СтруктураНастроек.Формула;
ТекущаяСтрока.ФормулаПредставление = СтруктураНастроек.ФормулаПредставление;
ТекущаяСтрока.ФормулаВычисление = СтруктураНастроек.Формула;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПараметрыРасшифровки(СтруктураДанных)
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
КонецЕсли;
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланСборкиРазборки");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ОтборПоказатели.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
ОтборПоказатели.Вставить("Характеристика", ТекущиеДанные.Характеристика);
ПараметрыЗапроса = Новый Структура();
ПараметрыЗапроса.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗапроса.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗапроса.Вставить("СмещениеПериода", ДополнительныеНастройки(СтруктураНастроек).СмещениеПериода);
ПараметрыЗапроса.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗапроса.Вставить("ИспользуетсяОтборПоСегментуНоменклатуры",Ложь);
ПараметрыЗапроса.Вставить("Поля", ДополнительныеПараметрыТоварыПоПериодам);
ПараметрыЗапроса.Вставить("Отбор", ОтборПоказатели);
УстановитьПериодЗапроса(ПараметрыЗапроса);
СтруктураДанных.Вставить("ПараметрыРасшифровки", ПараметрыЗапроса);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПериодЗапроса(ПараметрыЗапроса)
Если Объект.КроссТаблица Тогда
ТекущийЭлементИмя = Элементы.ТоварыПоДатам.ТекущийЭлемент.Имя;
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ТекущийЭлементИмя = "ТоварыПоДатам" + "Количество_" + Период.ИмяКолонки Тогда
ПараметрыЗапроса.Вставить("НачалоПериодаСмещения", Период.ДатаНачала);
ПараметрыЗапроса.Вставить("КонецПериодаСмещения", Период.ДатаОкончания);
КонецЕсли;
КонецЦикла;
Иначе
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ТаблицаПериоды = ЭтаФорма.Периоды;
МассивСтрок = ТаблицаПериоды.НайтиСтроки(Новый Структура("ДатаНачала, Активная", ТекущиеДанные.ДатаСборкиРазборки, Истина));
Если МассивСтрок.Количество() > 0 Тогда
ПараметрыЗапроса.Вставить("НачалоПериодаСмещения", МассивСтрок[0].ДатаНачала);
ПараметрыЗапроса.Вставить("КонецПериодаСмещения", МассивСтрок[0].ДатаОкончания);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля = Неопределено)
Если НЕ ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
СтруктураНастроек = Новый Структура();
СтруктураНастроек.Вставить("ВариантЗаполненияСостава", "Отбор");
СтруктураНастроек.Вставить("ВариантСмещения", "ПредыдущийПериод");
СтруктураНастроек.Вставить("СмещениеПериода", -1);
СтруктураНастроек.Вставить("Формула","[ПланыСборкиКомплекты] * 1.15");
СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru='Увеличение планов сборки прошлых периодов на 15%'"));
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
Иначе
Если СтруктураНастроек.Свойство("Смещение") Тогда
СтруктураНастроек.Вставить("СмещениеПериода", -1 * СтруктураНастроек.Смещение);
СтруктураНастроек.Удалить("Смещение");
КонецЕсли;
ДополнительныеПараметры = Новый Структура("НеВыводитьСообщения", Истина);
Если ДополнительныеПоля <> Неопределено Тогда
МассивОперандов = Новый Массив;
Для Каждого ТекСтрока Из ДополнительныеПоля Цикл
МассивОперандов.Добавить(ТекСтрока.Идентификатор);
КонецЦикла;
ТипРезультата = Новый ОписаниеТипов("Число");
#Если Клиент Тогда
ПараметрыПроверки = РаботаСФормуламиКлиент.ПараметрыПроверкиФормулы();
ПараметрыПроверки.НеВыводитьСообщения = Истина;
РаботаСФормуламиПроверитьФормулу = РаботаСФормуламиКлиент.ПроверитьФормулу(СтруктураНастроек.Формула,
МассивОперандов, ТипРезультата, ПараметрыПроверки);
#Иначе
ПараметрыПроверки = РаботаСФормулами.ПараметрыПроверкиФормулы();
ПараметрыПроверки.НеВыводитьСообщения = Истина;
РаботаСФормуламиПроверитьФормулу = РаботаСФормулами.ПроверитьФормулу(СтруктураНастроек.Формула,
МассивОперандов, ТипРезультата, ПараметрыПроверки);
#КонецЕсли
Если Не РаботаСФормуламиПроверитьФормулу Тогда
СтруктураНастроек.Вставить("Формула","[ПланыСборкиКомплекты] * 1.15");
СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru='Увеличение планов сборки прошлых периодов на 15%'"));
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не СтруктураНастроек.Свойство("ФильтроватьНезаполненныеСтроки") Тогда
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
КонецЕсли;
Возврат СтруктураНастроек;
КонецФункции
&НаСервере
Процедура ЗаписатьДополнительныеПараметры(ДокументОбъект)
МассивДопРеквизитов = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ТекущаяСтрока Из ДокументОбъект.Товары Цикл
ЭлементКоллекции = Объект.Товары.Получить(ТекущаяСтрока.НомерСтроки-1);
Если ЭлементКоллекции = Неопределено Тогда
Продолжить;
КонецЕсли;
ДопПараметр = ТекущаяСтрока.ДополнительныеПараметры.Получить();
Если ТипЗнч(ДопПараметр) <> Тип("Структура") Тогда
ДопПараметр = Новый Структура();
КонецЕсли;
Для каждого ДопРеквизит Из МассивДопРеквизитов Цикл
Идентификатор = ДопРеквизит.Имя;
Если ЭлементКоллекции.Свойство(Идентификатор) Тогда
ДопПараметр.Вставить(Идентификатор,ЭлементКоллекции[Идентификатор]);
КонецЕсли;
КонецЦикла;
ТекущаяСтрока.ДополнительныеПараметры = Новый ХранилищеЗначения(ДопПараметр);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьДополнительныеПараметры(ДокументОбъект)
Для каждого ТекущаяСтрока Из ДокументОбъект.Товары Цикл
ЭлементКоллекции = Объект.Товары.Получить(ТекущаяСтрока.НомерСтроки-1);
Если ЭлементКоллекции = Неопределено Тогда
Продолжить;
КонецЕсли;
ДопРеквизиты = ТекущаяСтрока.ДополнительныеПараметры.Получить();
Если ТипЗнч(ДопРеквизиты) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
Идентификатор = ДопРеквизит.Ключ;
Если ЭлементКоллекции.Свойство(Идентификатор) Тогда
ЭлементКоллекции[Идентификатор] = ДопРеквизит.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
&НаКлиентеНаСервереБезКонтекста
Процедура ПересчитатьКоличествоУпаковокИСуммуВСтроке(ТекущаяСтрока, КэшированныеЗначения)
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
#Если Клиент Тогда
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
#Иначе
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииКоличестваОтклонение(СтрокаТоваров)
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТоваров["Формула_" + Период.ИмяКолонки]) Тогда
Продолжить;
КонецЕсли;
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(СтрокаТоваров["Формула_" + Период.ИмяКолонки], СтрокаТоваров, ЭтаФорма.Периоды, Период);
Если Элементы.ТоварыПоДатам.ТекущийЭлемент.Имя = "ТоварыПоДатам" + "Количество_" + Период.ИмяКолонки Тогда
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = РезультатВычисления.Результат - СтрокаТоваров["Количество_" + Период.ИмяКолонки];
ИначеЕсли СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0 Тогда
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
КонецЕсли;
КонецЦикла;
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоДатам");
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтруктуруВыводаДопПараметров()
ПараметрыВыводаТаблицы = Новый Структура("Поля", ДополнительныеПараметрыТовары);
Планирование.ОбновитьСтруктуруВыводаТаблицы(ЭтотОбъект, ПараметрыВыводаТаблицы);
ПараметрыВыводаКроссТаблицы = Новый Структура("Поля", ДополнительныеПараметрыТоварыПоПериодам);
Планирование.ОбновитьСтруктуруВыводаТаблицы(ЭтотОбъект, ПараметрыВыводаКроссТаблицы);
КонецПроцедуры
&НаСервере
Процедура ДобавитьПоляИзДопПараметров(ПараметрыВывода)
ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
СтруктураПоля = Новый Структура;
СтруктураПоля.Вставить("ПрефиксРеквизитаКолонки", ДопРеквизит.Имя + "_");
СтруктураПоля.Вставить("УдалятьРеквизитыТаблицы", ДопРеквизит.УдалятьРеквизитыТаблицы);
СтруктураПоля.Вставить("СоздаватьЭлемент", Ложь);
СтруктураПоля.Вставить("ТипЭлемента", ДопРеквизит.Тип);
СтруктураПоля.Вставить("СоздаватьИтоговыеРеквизиты", Ложь);
ПараметрыВывода.Поля.Добавить(СтруктураПоля);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ДобавитьРеквизитыИзДопПараметров(СтруктураРеквизитов)
ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
СтруктураРеквизитов.Вставить(ДопРеквизит.Имя + "_", ДопРеквизит.Имя);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамПриАктивизацииЯчейки(Элемент)
ПодключитьОбработчикОжидания("ТоварыПоДатамПриАктивизацииЯчейкиНаКлиенте", 0.5, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВКолонкиЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ОчиститьСообщения();
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВСтрокиЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ПереключитьПериодыВСтроки(Неопределено);
КонецПроцедуры
&НаСервере
Процедура ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения)
ОбработатьТоварыПередПереключениемВКроссТаблицу();
Объект.КроссТаблица = Истина;
ПриИзмененииПериодовНаСервере();
СкопироватьВКроссТаблицу(КэшированныеЗначения);
ОпределитьПланированиеПодсборки();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПометкуКроссТаблицы(Форма)
Если Форма.Объект.КроссТаблица Тогда
Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Истина;
Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Ложь;
Форма.Элементы.ГруппаТоварыПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаТоварыКроссТаблица;
Иначе
Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Ложь;
Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Истина;
Форма.Элементы.ГруппаТоварыПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаТоварыТаблица;
КонецЕсли;
КонецПроцедуры
#Область Процедуры_динамического_формирования_структуры_формы
&НаСервере
Процедура СкопироватьИзКроссТаблицы(КэшированныеЗначения, ЭтотОбъект)
Если ЭтотОбъект.КроссТаблица
Или ИспользуютсяПланируемыеОстатки Тогда
ПараметрыПреобразования = ПараметрыПреобразованияКроссТаблицы();
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
Планирование.ЗаполнитьТаблицуИзКроссТаблицы(ЭтотОбъект.Товары, Объект.Товары, ТоварыПоДатам, ПараметрыПреобразования,
СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура СкопироватьВКроссТаблицу(КэшированныеЗначения)
Если Объект.КроссТаблица
Или ИспользуютсяПланируемыеОстатки Тогда
ПараметрыПреобразования = ПараметрыПреобразованияКроссТаблицы();
Для каждого СтрокаТЧ Из Объект.Товары Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТЧ.ДатаСборкиРазборки) Тогда
СтрокаТЧ.ДатаСборкиРазборки = Объект.НачалоПериода;
КонецЕсли;
КонецЦикла;
ПланированиеКлиентСервер.ЗаполнитьКроссТаблицуИзТаблицы(ТоварыПоДатам, Объект.Товары, ПараметрыПреобразования);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ТоварыПоДатам");
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
КонецПроцедуры
&НаСервере
Функция ПараметрыПреобразованияКроссТаблицы()
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
СтруктураРеквизитовПериода = Новый Структура("ДатаНачала","ДатаСборкиРазборки");
СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить("Количество_","КоличествоУпаковок");
СтруктураРеквизитов.Вставить("Отменено_","Отменено");
СтруктураРеквизитов.Вставить("Замещен_","Замещен");
СтруктураРеквизитов.Вставить("ЗамещенКЗаказу_","ЗамещенКЗаказу");
СтруктураРеквизитов.Вставить("Комментарий_","Комментарий");
Если Объект.ЗаполнятьПоФормуле Тогда
ДобавитьРеквизитыИзДопПараметров(СтруктураРеквизитов);
Иначе
СтруктураРеквизитов.Вставить("Расшифровка_","Расшифровка");
КонецЕсли;
ПоляГруппировки = "Номенклатура,Характеристика,Упаковка,ВариантКомплектации,
|КодСтроки,Подсборка,КодСтрокиТовары";
Если ЗаполнятьСкладВТЧ Тогда
ПоляГруппировки = ПоляГруппировки + ", Склад";
КонецЕсли;
Если ЗаполнятьНазначениеВТЧ Тогда
ПоляГруппировки = ПоляГруппировки + ", Назначение";
КонецЕсли;
СтруктураИтоговыхРеквизитов = Новый Структура;
СтруктураИтоговыхРеквизитов.Вставить("КоличествоУпаковок", "КоличествоУпаковок");
ПараметрыПреобразования = Новый Структура;
ПараметрыПреобразования.Вставить("ТаблицаПериоды", ТаблицаПериоды);
ПараметрыПреобразования.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПреобразования.Вставить("СтруктураРеквизитовПериода", СтруктураРеквизитовПериода);
ПараметрыПреобразования.Вставить("СтруктураРеквизитов", СтруктураРеквизитов);
ПараметрыПреобразования.Вставить("ПоляГруппировки", ПоляГруппировки);
ПараметрыПреобразования.Вставить("СтруктураИтоговыхРеквизитов", СтруктураИтоговыхРеквизитов);
Возврат ПараметрыПреобразования;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьКоличествоСтрок(Форма)
Если Форма.Объект.КроссТаблица Тогда
Форма.ТоварыКоличествоСтрок = Форма.ТоварыПоДатам.Количество();
Иначе
Форма.ТоварыКоличествоСтрок = Форма.Объект.Товары.Количество();
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыВидаПлана(Форма)
ПараметрыВидаПлана = Новый Структура("ЗаполнятьСклад, ПланированиеПоНазначениям, ЗаполнятьНазначениеВТЧ, ЗаполнятьСкладВТЧ");
ЗаполнитьЗначенияСвойств(ПараметрыВидаПлана, Форма);
Возврат ПараметрыВидаПлана;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыОтбора(Форма)
ПараметрыОтбора = Новый Структура("Склад, Назначение");
ЗаполнитьЗначенияСвойств(ПараметрыОтбора, Форма.Объект);
Возврат ПараметрыОтбора;
КонецФункции
&НаКлиенте
Функция ПроверитьЗаполнениеШапки()
ОчиститьСообщения();
ЗаполненоКорректно = Истина;
Если НЕ ЗначениеЗаполнено(Объект.Сценарий) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Сценарий"" не заполнено'"),
Объект.Ссылка,
"Объект.Сценарий");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Вид плана"" не заполнено'"),
Объект.Ссылка,
"Объект.ВидПлана");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьСклад И НЕ ЗначениеЗаполнено(Объект.Склад) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Склад"" не заполнено'"),
Объект.Ссылка,
"Объект.Склад");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)).Количество() = 0 Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Параметры периода заданы неверно. Заполнение невозможно'"),
Объект.Ссылка);
ЗаполненоКорректно = Ложь;
КонецЕсли;
Возврат ЗаполненоКорректно;
КонецФункции
#КонецОбласти
#Область ЗаполнениеВФоне
&НаКлиенте
Процедура ЗаполнитьДокумент(Настройки)
ОповеститьПользователяОНачалеЗаполненииДанных();
Результат = ЗаполнитьДокументНаСервере(Настройки, КэшированныеЗначения);
Если НЕ Результат.Статус = "Выполнено" Тогда
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗаполнитьДокументОповещение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания);
Иначе
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения);
Если Объект.ЗаполнятьПоФормуле
И Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(
ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоДатам");
КонецЕсли;
ОповеститьПользователяОЗаполненииДанных();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДокументОповещение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
Попытка
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения);
Если Объект.ЗаполнятьПоФормуле
И Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(
ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоДатам");
КонецЕсли;
ОповеститьПользователяОЗаполненииДанных();
Исключение
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОбработатьРезультатЗаполненияПоФормуле(Форма)
ПоследнийПериод = Форма.Периоды[Форма.Периоды.Количество()-1];
УдаляемыеСтроки = Новый Массив;
ПредыдущийПериод = Неопределено;
ЗнакКорректировки = Планирование.ПолучитьЗнакКорректировки(Форма);
Если Форма.Объект.Замещающий Тогда
ОсновнойОперандПлана = Планирование.ОсновнойОперандПлана(Форма);
ОсновнойОперандПланаСОтбором = Планирование.ОсновнойОперандПлана(Форма, Истина);
Иначе
ОсновнойОперандПлана = "";
ОсновнойОперандПланаСОтбором = "";
КонецЕсли;
ТаблицаПериоды = Форма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Для Каждого СтрокаТоваров Из Форма.ТоварыПоДатам Цикл
Если Форма.ИспользуютсяПланируемыеОстатки Тогда
НовыйПланОстатков = Форма.ПериодыПлановОстатка.НайтиПоЗначению(Период.ДатаНачала) <> Неопределено;
НовыйПланОстатковСОтбором = Форма.ПериодыПлановОстаткаСОтбором.НайтиПоЗначению(Период.ДатаНачала) <> Неопределено;
Планирование.ВычислитьРассчитываемыеОперанды(СтрокаТоваров, Период, ПредыдущийПериод, НовыйПланОстатков, "_", ОсновнойОперандПлана, ЗнакКорректировки);
Планирование.ВычислитьРассчитываемыеОперанды(СтрокаТоваров, Период, ПредыдущийПериод, НовыйПланОстатковСОтбором, "СОтбором_", ОсновнойОперандПланаСОтбором, ЗнакКорректировки);
КонецЕсли;
Если Период.Активная Тогда
РезультатВычисления = Планирование.ВычислитьПоФормуле(Форма.СтруктураНастроек.Формула, СтрокаТоваров, Форма.Периоды, Период, Форма.СтруктураНастроек.ФормулаПредставление);
Если Форма.ИспользуютсяПланируемыеОстатки Тогда
СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицит_"+Период.ИмяКолонки] = СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицит_"+Период.ИмяКолонки]
+ ЗнакКорректировки * РезультатВычисления.Результат;
Если СтрокаТоваров.Свойство("НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки) Тогда
СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки] = СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки]
+ ЗнакКорректировки * РезультатВычисления.Результат;
КонецЕсли;
КонецЕсли;
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Форма.СтруктураНастроек.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Форма, СтрокаТоваров);
КонецЕсли;
Если Период = ПоследнийПериод
И СтрокаТоваров.КоличествоУпаковок = 0 Тогда
УдаляемыеСтроки.Добавить(СтрокаТоваров);
КонецЕсли;
КонецЦикла;
ПредыдущийПериод = Период;
КонецЦикла;
Если Форма.СтруктураНастроек.ВариантЗаполненияСостава = "Формула"
Или Форма.СтруктураНастроек.ФильтроватьНезаполненныеСтроки Тогда
Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл
Форма.ТоварыПоДатам.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДокументНаСервере(Знач ПараметрыЗадания, КэшированныеЗначения)
Если ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле") Тогда
ПодготовитьПараметрыЗаполненияДокументаПоФормуле(ПараметрыЗадания, КэшированныеЗначения);
ИначеЕсли ПараметрыЗадания.Свойство("ЗаполнятьПоПравилу") Тогда
ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения);
ИначеЕсли ПараметрыЗадания.Свойство("ЗаполнитьДляЗамещения") Тогда
ПодготовитьПараметрыЗаполненияДокументаДляЗамещения(ПараметрыЗадания, КэшированныеЗначения);
КонецЕсли;
НаименованиеЗадания = НСтр("ru = 'Заполнение документа плана:'") + " " + Строка(Объект.Ссылка);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыВыполнения.ОжидатьЗавершение = 0;
ПараметрыВыполнения.ДополнительныйРезультат = ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле");
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
Результат = ДлительныеОперации.ВыполнитьВФоне(
"Документы.ПланСборкиРазборки.ЗаполнитьДокумент",
ПараметрыЗадания,
ПараметрыВыполнения);
АдресХранилища = Результат.АдресРезультата;
Если ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле") Тогда
АдресХранилищаДополнительный = Результат.АдресДополнительногоРезультата;
Иначе
АдресХранилищаДополнительный = "";
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоФормуле(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ТипПлана = Перечисления.ТипыПланов.ПланСборкиРазборки;
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоАктивныхПериодов", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("НачалоПериодаСмещения", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("КонецПериодаСмещения", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("НеПереопределено", Истина);
ПараметрыЗадания.Вставить("ТипПлана", ТипПлана);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("ЗаполнятьПоФормуле", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланСборкиРазборки");
ПараметрыЗадания.Вставить("ИмяКолонкиРезультата", "КоличествоУпаковок");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ОтборПоказатели.Вставить("ОтборХозяйственнаяОперация", Объект.ХозяйственнаяОперация);
ПараметрыЗадания.Вставить("Отбор", ОтборПоказатели);
МассивИменНаборов = Новый Массив();
Если ПараметрыЗадания.Свойство("ЗаполнятьОперанды") Тогда
МассивОператоров = ПолучитьОперанды(ЭтотОбъект);
Для каждого Элемент Из МассивОператоров Цикл
МассивИменНаборов.Добавить(Элемент.Имя);
КонецЦикла;
КонецЕсли;
ПараметрыЗадания.Вставить("МассивИменНаборов", МассивИменНаборов);
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Если ПараметрыЗадания.Свойство("ЗаполнятьСостав") Тогда
ЗаполняемаяТЧ.Очистить();
МассивИменНаборов = Новый Массив();
Если ПараметрыЗадания.ВариантЗаполненияСостава = "Формула" Тогда
МассивИменНаборов = ПланированиеКлиентСервер.ОперандыТекстовойФормулы(ПараметрыЗадания.Формула);
Иначе
МассивИменНаборов.Добавить(ПараметрыЗадания.ВариантЗаполненияСостава);
КонецЕсли;
ПараметрыЗадания.Вставить("МассивИменНаборовЗаполнения", МассивИменНаборов);
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецПроцедуры
&НаСервере
Функция ПодготовитьПараметрыЗаполненияДокументаДляЗамещения(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ТипПлана = Перечисления.ТипыПланов.ПланПродаж;
СтатусыЗаполнения = Планирование.ПолучитьСтатусыЗаполнения(Объект.Сценарий);
ПараметрыЗадания.Вставить("Статусы", СтатусыЗаполнения);
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоПериодаСмещения", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("КонецПериодаСмещения", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("ТипПлана", ТипПлана);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("ХозяйственнаяОперация", Объект.ХозяйственнаяОперация);
ПараметрыЗадания.Вставить("ЗаполнятьНазначениеВТЧ",
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидПлана,"ЗаполнятьНазначениеВТЧ"));
ПараметрыЗадания.Вставить("Назначение", Объект.Назначение);
ПараметрыЗадания.Вставить("ЗаполнитьДляЗамещения", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланСборкиРазборки");
ПараметрыЗадания.Вставить("ИмяКолонкиРезультата", "КоличествоУпаковок");
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Настройки = Новый Структура;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецФункции
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения)
Если Объект.ОбновитьДополнить <> 0 Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("ИзменитьРезультатНа", Объект.ИзменитьРезультатНа);
ПараметрыЗадания.Вставить("ТочностьОкругления", Объект.ТочностьОкругления);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("Склад", Объект.Склад);
ПараметрыЗадания.Вставить("Назначение", Объект.Назначение);
ПараметрыЗадания.Вставить("ЗаполнятьПоПравилу", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланСборкиРазборки");
ЗаполняемаяТЧ = Объект.Товары.Выгрузить();
Если Объект.ОбновитьДополнить = 0 Тогда
ЗаполняемаяТЧ.Очистить();
Объект.МаксимальныйКодСтрокиТовары = 0;
КонецЕсли;
ПараметрыЗадания.Вставить("МаксимальныйКодСтрокиТовары", Объект.МаксимальныйКодСтрокиТовары);
Если НЕ ОтборУстановлен Тогда
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборЗначения = ПланированиеКлиентСервер.ОтборДляВыборки(ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыЗадания.Вставить("Отбор", ОтборЗначения);
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ПравилоЗаполнения", ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Настройки.Вставить("ПользовательскиеНастройки", ПолучитьИзВременногоХранилища(АдресПользовательскихНастроек));
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецПроцедуры
&НаСервере
Функция ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения)
Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Документ.ПланСборкиРазборки.Формы.ФормаДокумента.ПолучитьРезультатЗаполненияНаСервере");
Таблица = ПолучитьИзВременногоХранилища(АдресХранилища);
КоличествоОбработанныхСтрок = Таблица.Количество();
Объект.Товары.Загрузить(Таблица);
ИспользуютсяПланируемыеОстатки = Таблица.Колонки.Найти("ПланируемыеНачальныеОстатки") <> Неопределено;
ИспользуютсяПланируемыеОстаткиСОтбором = Таблица.Колонки.Найти("ПланируемыеНачальныеОстаткиСОтбором") <> Неопределено;
Если ИспользуютсяПланируемыеОстатки Тогда
ПериодыПлановОстатка.Очистить();
ПериодыПлановОстаткаСОтбором.Очистить();
Для Каждого Строка Из Таблица Цикл
Если Строка.ПланируемыеНачальныеОстатки<>0 Тогда
Если ПериодыПлановОстатка.НайтиПоЗначению(Строка.ДатаСборкиРазборки) = Неопределено Тогда
ПериодыПлановОстатка.Добавить(Строка.ДатаСборкиРазборки);
КонецЕсли;
КонецЕсли;
Если ИспользуютсяПланируемыеОстаткиСОтбором
И Строка.ПланируемыеНачальныеОстаткиСОтбором<>0 Тогда
Если ПериодыПлановОстаткаСОтбором.НайтиПоЗначению(Строка.ДатаСборкиРазборки) = Неопределено Тогда
ПериодыПлановОстаткаСОтбором.Добавить(Строка.ДатаСборкиРазборки);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(АдресХранилищаДополнительный)
И ПолучитьИзВременногоХранилища(АдресХранилищаДополнительный) <> Неопределено Тогда
ТаблицаПериоды = ПолучитьИзВременногоХранилища(АдресХранилищаДополнительный);
Иначе
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
КонецЕсли;
ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, Ложь);
ОценкаПроизводительности.ЗафиксироватьЗамерДлительнойОперации(Замер,
ЭтаФорма.ПолучитьРеквизиты("ТоварыПоДатам").Количество()/10,
"ОбновитьСтруктуруКроссТаблицы");
Для каждого СтрокаТовары Из Объект.Товары Цикл
СтрокаТовары.КодСтроки = НовыйКодСтрокиТовары(Объект);
КонецЦикла;
Если Объект.КроссТаблица Тогда
Объект.КроссТаблица = Ложь;
ОпределитьВариантКомплектации();
Объект.КроссТаблица = Истина;
Иначе
ОпределитьВариантКомплектации();
КонецЕсли;
ОбработатьТоварыПередПереключениемВКроссТаблицу();
СкопироватьВКроссТаблицу(КэшированныеЗначения);
Объект.ЗаполненоАвтоматически = Истина;
ОтборПоТипуНоменклатуры = НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь);
Если Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки Тогда
Товары = ТоварыПоДатам;
Иначе
Товары = Объект.Товары;
КонецЕсли;
Индекс = Товары.Количество();
Пока Индекс > 0 Цикл
Индекс = Индекс -1;
СтрокаТЧ = Товары[Индекс];
Если ОтборПоТипуНоменклатуры.Найти(СтрокаТЧ.ТипНоменклатуры) = Неопределено Тогда
Товары.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
ЗначенияБылиПересчитаны = Ложь;
Если Объект.ЗаполнятьПоФормуле
И СтруктураНастроек <> Неопределено
И (ИспользуютсяПланируемыеОстатки
Или (Объект.КроссТаблица
И (СтрНайти(СтруктураНастроек.Формула,"НомерТекущейКолонки") <> 0
Или СтрНайти(СтруктураНастроек.Формула,"ЗначениеКолонки") <> 0))) Тогда
ЗначенияБылиПересчитаны = Истина;
ОбработатьРезультатЗаполненияПоФормуле(ЭтаФорма);
ИначеЕсли СтруктураНастроек.ФильтроватьНезаполненныеСтроки Тогда
УдаляемыеСтроки = Новый Массив;
Для Каждого СтрокаТоваров Из Товары Цикл
Если СтрокаТоваров.КоличествоУпаковок = 0 Тогда
УдаляемыеСтроки.Добавить(СтрокаТоваров);
КонецЕсли;
КонецЦикла;
Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл
Товары.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЕсли;
Если Не Объект.КроссТаблица И ИспользуютсяПланируемыеОстатки Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
Если Не Объект.КроссТаблица Или ЗначенияБылиПересчитаны Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
ИспользуютсяПланируемыеОстатки = Ложь;
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанныхСтрок/10);
КонецФункции
&НаКлиенте
Процедура ЗаполнитьДаннымиДляЗамещения()
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполнитьДляЗамещения");
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПланыПоДефицитуНаСервере(КэшированныеЗначения)
ТекушийОбъект = РеквизитФормыВЗначение("Объект");
Планирование.ЗаполнитьПланыПоДефициту(Объект.Сценарий,
Объект.ВидПлана,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекушийОбъект);
ЗначениеВДанныеФормы(ТекушийОбъект, Объект);
Для каждого СтрокаТовары Из Объект.Товары Цикл
СтрокаТовары.КодСтроки = НовыйКодСтрокиТовары(Объект);
КонецЦикла;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
ОтборПоТипуНоменклатуры = НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь);
ОтборПоТипуНоменклатуры.Добавить(Перечисления.ТипыНоменклатуры.Работа);
Товары = Объект.Товары;
Индекс = Товары.Количество();
Пока Индекс > 0 Цикл
Индекс = Индекс -1;
СтрокаТЧ = Товары[Индекс];
Если ОтборПоТипуНоменклатуры.Найти(СтрокаТЧ.ТипНоменклатуры) = Неопределено Тогда
Товары.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
#КонецОбласти
&НаСервереБезКонтекста
Функция ПараметрыСценария(Сценарий)
Реквизиты = "Периодичность, ОтображатьНомерПериода, ПланированиеПоНазначениям";
Реквизиты = Реквизиты + ", СценарийБюджетирования";
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Сценарий, Реквизиты);
Возврат ПараметрыСценария;
КонецФункции
&НаКлиенте
Процедура УдалитьПустыеСтроки(Команда)
УдалитьПустыеСтрокиНаСервере();
КонецПроцедуры
&НаСервере
Процедура УдалитьПустыеСтрокиНаСервере()
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
НеобходимоПересчитыватьИтоги = Ложь;
Индекс = ТоварыПоДатам.Количество() -1;
Пока Индекс >= 0 Цикл
СтрокаТЧ = ТоварыПоДатам[Индекс];
Если СтрокаТЧ.КоличествоУпаковок <> 0 Тогда
Индекс = Индекс - 1;
Продолжить;
КонецЕсли;
ЭтоПустаяСтрока = Истина;
Для каждого Период Из АктивныеПериоды Цикл
Если СтрокаТЧ["Количество_"+Период.ИмяКолонки] <> 0 Тогда
ЭтоПустаяСтрока = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоПустаяСтрока Тогда
ТоварыПоДатам.Удалить(Индекс);
НеобходимоПересчитыватьИтоги = Истина;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Если НеобходимоПересчитыватьИтоги Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПоДатамПриАктивизацииЯчейкиНаКлиенте()
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ТоварыПоДатам");
КонецЕсли;
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
Если АктивныеПериоды.Количество() = 1 Тогда
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущиеДанные <> Неопределено Тогда
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущиеДанные, "Расшифровка_" + АктивныеПериоды[0].ИмяКолонки);
КонецЕсли;
Возврат;
КонецЕсли;
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
ЯчейкаНайдена = Ложь;
Элемент = Элементы.ТоварыПоДатам;
ТекущиеДанные = Элементы.ТоварыПоДатам.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
Возврат;
КонецЕсли;
Если Элемент.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из АктивныеПериоды Цикл
Если Элемент.ТекущийЭлемент.Имя = "ТоварыПоДатам" + "Количество_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущиеДанные["Количество_"+ Период.ИмяКолонки] <> 0 Тогда
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущиеДанные, "Расшифровка_"+ Период.ИмяКолонки);
Иначе
Расшифровка = "";
КонецЕсли;
ЯчейкаНайдена = Истина;
Прервать;
Иначе
Расшифровка = "";
КонецЕсли;
КонецЦикла;
КонецЕсли;
Элементы.ЯчейкаОтменена.Доступность = ЯчейкаНайдена;
Элементы.КомментарийКЯчейке.Доступность = ЯчейкаНайдена;
КонецПроцедуры
#Область ЗамещениеПланов
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыЗамещения(Знач Объект)
ПараметрыЗамещения = Новый Структура;
ПараметрыЗамещения.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗамещения.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗамещения.Вставить("Статус", Объект.Статус);
ПараметрыЗамещения.Вставить("Дата", Объект.Дата);
ПараметрыЗамещения.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыЗамещения.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ПараметрыЗамещения.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗамещения.Вставить("Склад", Объект.Склад);
ПараметрыЗамещения.Вставить("ХозяйственнаяОперация", Объект.ХозяйственнаяОперация);
ПараметрыЗамещения.Вставить("Назначение", Объект.Назначение);
Возврат ПараметрыЗамещения
КонецФункции
&НаСервере
Процедура ОбновитьПризнакЗамещения()
Для Каждого Строка Из Объект.Товары Цикл
Строка.Замещен = Ложь;
Строка.ЗамещенКЗаказу = Ложь;
КонецЦикла;
Если Не Объект.Замещающий Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗамещенныеПериоды.ЗамещенныйПериод КАК ЗамещенныйПериод,
| ЗамещенныеПериоды.ЗамещенКЗаказу КАК ЗамещенКЗаказу,
| ЗамещенныеПериоды.Замещен КАК Замещен
|ПОМЕСТИТЬ ЗамещенныеПериоды
|ИЗ
| &ЗамещенныеПериоды КАК ЗамещенныеПериоды
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПланСборкиРазборкиТовары.ДатаСборкиРазборки,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(ПланСборкиРазборкиТовары.ДатаСборкиРазборки, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(ПланСборкиРазборкиТовары.ДатаСборкиРазборки, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(ПланСборкиРазборкиТовары.ДатаСборкиРазборки, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(ПланСборкиРазборкиТовары.ДатаСборкиРазборки, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(ПланСборкиРазборкиТовары.ДатаСборкиРазборки, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(ПланСборкиРазборкиТовары.ДатаСборкиРазборки, ГОД)
| ИНАЧЕ ПланСборкиРазборкиТовары.ДатаСборкиРазборки
| КОНЕЦ КАК Период
|ПОМЕСТИТЬ ПланСборкиРазборкиТовары
|ИЗ
| &ПланСборкиРазборкиТовары КАК ПланСборкиРазборкиТовары
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПланСборкиРазборкиТовары.ДатаСборкиРазборки
|ИЗ
| ЗамещенныеПериоды КАК ЗамещенныеПериоды
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланСборкиРазборкиТовары КАК ПланСборкиРазборкиТовары
| ПО ЗамещенныеПериоды.ЗамещенныйПериод = ПланСборкиРазборкиТовары.Период";
Запрос.УстановитьПараметр("ЗамещенныеПериоды", ЗамещенныеПериоды.Выгрузить());
Запрос.УстановитьПараметр("ПланСборкиРазборкиТовары", Объект.Товары.Выгрузить());
Запрос.УстановитьПараметр("Периодичность", Объект.Периодичность);
ЗапросПакет = Запрос.ВыполнитьПакет();
Выборка = ЗапросПакет[2].Выбрать();
Пока Выборка.Следующий() Цикл
Отбор = Новый Структура("ДатаСборкиРазборки", Выборка.ДатаСборкиРазборки);
ЗамещаемыеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого Строка Из ЗамещаемыеСтроки Цикл
Строка.Замещен = Выборка.Замещен;
Строка.ЗамещенКЗаказу = Выборка.ЗамещенКЗаказу;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьЗамещенныеПериоды()
ПараметрыЗамещения = ПараметрыЗамещения(Объект);
Результат = Планирование.ПолучитьЗамещенныеПериоды(ПараметрыЗамещения, "ПланСборкиРазборки");
ЗамещенныеПериоды.Загрузить(Результат);
КонецФункции
&НаКлиенте
Процедура ЗамещениеФорматированнаяСтрокаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = ПараметрыЗамещения(Объект);
ПараметрыФормы.Вставить("НавигационнаяСсылкаФорматированнойСтроки", НавигационнаяСсылкаФорматированнойСтроки);
ОткрытьФорму("РегистрСведений.ЗамещениеПланов.Форма.ЗамещениеПланов", ПараметрыФормы);
КонецПроцедуры
&НаСервереБезКонтекста
Функция КонтрольЗамещенияПланаНаСервере(Ссылка)
Возврат Планирование.КонтрольЗамещенияПлана(Ссылка);
КонецФункции
#КонецОбласти
#Область КорректировкиПлановыхПотребностей
&НаКлиенте
Процедура ДекорацияОтмененныеКорректировкиПотребностейНажатие(Элемент)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("План", Объект.Ссылка);
ПараметрыФормы.Вставить("ПоказыватьНазначение", Элементы.ТоварыНазначение.Видимость);
ПараметрыФормы.Вставить("Отбор", Новый Структура("План", Объект.Ссылка));
ОткрытьФорму(
"Документ.КорректировкаПлановыхПотребностей.Форма.ФормаСписка",
ПараметрыФормы,
ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ДекорацияОтмененныеКорректировкиПотребностейКПроверкеНажатие(Элемент)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("План", Объект.Ссылка);
ПараметрыФормы.Вставить("ПоказыватьНазначение", Элементы.ТоварыНазначение.Видимость);
ПараметрыФормы.Вставить("Отбор", Новый Структура("План", Объект.Ссылка));
ПараметрыФормы.Вставить("Статус", ПредопределенноеЗначение("Перечисление.СтатусыПлановыхКорректировок.КПроверке"));
ОткрытьФорму(
"Документ.КорректировкаПлановыхПотребностей.Форма.ФормаСписка",
ПараметрыФормы,
ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура СкорректироватьПотребность(Команда)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("План", Объект.Ссылка);
ДанныеЗаполнения.Вставить("Сценарий", Объект.Сценарий);
ДанныеЗаполнения.Вставить("ВидПлана", Объект.ВидПлана);
ДанныеЗаполнения.Вставить("Период", Объект.НачалоПериода);
ДанныеЗаполнения.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
ДанныеЗаполнения.Вставить("Характеристика", ТекущаяСтрока.Характеристика);
ДанныеЗаполнения.Вставить("Назначение", ТекущаяСтрока.Назначение);
ДанныеЗаполнения.Вставить("Количество", ТекущаяСтрока.Количество);
ПараметрыФормы = Новый Структура("ДанныеЗаполнения", ДанныеЗаполнения);
ОткрытьФорму("Документ.КорректировкаПлановыхПотребностей.Форма.ФормаДокумента", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура СкорректироватьПотребностьЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
ТекущаяСтрока.Количество = ДополнительныеПараметры.КОбеспечению;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, Новый Структура("ПересчитатьКоличествоУпаковок"), КэшированныеЗначения);
Элементы.Товары.РежимВводаСтрок = РежимВводаСтрокТаблицы.ПослеТекущейСтроки;
Если ЗначениеЗаполнено(ДополнительныеПараметры.НоменклатураКорректировка)
И ДополнительныеПараметры.КОбеспечениюКорректировка > 0 Тогда
ПараметрыОтбора = Новый Структура();
ПараметрыОтбора.Вставить("Номенклатура", ДополнительныеПараметры.НоменклатураКорректировка);
ПараметрыОтбора.Вставить("Характеристика", ДополнительныеПараметры.ХарактеристикаКорректировка);
ПараметрыОтбора.Вставить("Назначение", ДополнительныеПараметры.НазначениеКорректировка);
СтрокиКорректировки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);
Если СтрокиКорректировки.Количество()>0 Тогда
СтрокиКорректировки[0].Количество = ДополнительныеПараметры.ККорректировкеКорректировка;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокиКорректировки[0], Новый Структура("ПересчитатьКоличествоУпаковок"), КэшированныеЗначения);
Иначе
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = ДополнительныеПараметры.НоменклатураКорректировка;
НоваяСтрока.Характеристика = ДополнительныеПараметры.ХарактеристикаКорректировка;
НоваяСтрока.Назначение = ДополнительныеПараметры.НазначениеКорректировка;
НоваяСтрока.Количество = НоваяСтрока.Количество - ДополнительныеПараметры.ККорректировкеКорректировка;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока.ДатаСборкиРазборки = ДополнительныеПараметры.Период;
ТоварыНоменклатураПриИзменении(Неопределено);
КонецЕсли;
КонецЕсли;
Элементы.Товары.РежимВводаСтрок = РежимВводаСтрокТаблицы.ВКонецСписка;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
#КонецОбласти
#Область КорректировкиОбеспечения
&НаСервере
Процедура ПрочитатьЕстьОтмененныеКорректировкиОбеспечения()
Если ЗаполнятьПоДефициту И ЗначениеЗаполнено(Объект.Ссылка) Тогда
Видимость = РегистрыСведений.ОтменаКорректировокПлановОбеспечения.ЕстьОтмененныеКорректировки(Объект.Ссылка);
Иначе
Видимость = Ложь;
КонецЕсли;
Элементы.НадписьЕстьОтмененныеКорректировкиОбеспечения.Видимость = Видимость;
КонецПроцедуры
&НаКлиенте
Процедура СкорректироватьОбеспечения()
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("План", Объект.Ссылка);
ПараметрыФормы.Вставить("Сценарий", Объект.Сценарий);
ПараметрыФормы.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыФормы.Вставить("Период", Объект.НачалоПериода);
ПараметрыФормы.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
ПараметрыФормы.Вставить("Характеристика", ТекущаяСтрока.Характеристика);
ПараметрыФормы.Вставить("Назначение", ТекущаяСтрока.Назначение);
ПараметрыФормы.Вставить("Обеспечить", ТекущаяСтрока.Количество);
ПараметрыФормы.Вставить("ИнтервалПотребностиОт", ТекущаяСтрока.ИнтервалПотребностиОт);
ПараметрыФормы.Вставить("ИнтервалПотребностиДо", ТекущаяСтрока.ИнтервалПотребностиДо);
ПараметрыФормы.Вставить("ЗаданИнтервалПотребности", ТекущаяСтрока.ЗаданИнтервалПотребности);
ПараметрыФормы.Вставить("Комментарий", ТекущаяСтрока.Комментарий);
ОписаниеОповещения = Новый ОписаниеОповещения("СкорректироватьОбеспечениеЗавершение",ЭтотОбъект);
ОткрытьФорму("РегистрСведений.ОтменаКорректировокПлановОбеспечения.Форма.ФормаРедактированияОбеспечения", ПараметрыФормы, ЭтаФорма,,,,ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура СкорректироватьОбеспечениеЗавершение(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
Если Настройки.УстановитьКорректировку Тогда
УстановитьКорректировкуОбеспечения(Настройки)
Иначе
ОтменитьКорректировкуОбеспеченияНаКлиенте(Элементы.Товары.ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПередНачаломИзменения(Элемент, Отказ)
Если ЗаполнятьПоДефициту
И Элемент.ТекущийЭлемент.Имя = "ТоварыКоличествоУпаковок" Тогда
СкорректироватьОбеспечения();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если ЗаполнятьПоДефициту Тогда
СтандартнаяОбработка = Ложь;
СкорректироватьОбеспечения();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьКорректировку(Команда)
СкорректироватьОбеспечения();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьКорректировкуОбеспечения(Настройки)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
ТекущаяСтрока.Количество = Настройки.Обеспечить;
ТекущаяСтрока.ИнтервалПотребностиОт = Настройки.ИнтервалПотребностиОт;
ТекущаяСтрока.ИнтервалПотребностиДо = Настройки.ИнтервалПотребностиДо;
ТекущаяСтрока.ЗаданИнтервалПотребности = Истина;
ТекущаяСтрока.Комментарий = Настройки.Комментарий;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, Новый Структура("ПересчитатьКоличествоУпаковок"), КэшированныеЗначения);
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьКорректировкуОбеспечения(Команда)
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
ВыделеннаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторСтроки);
Если ВыделеннаяСтрока.ЗаданИнтервалПотребности Тогда
ОтменитьКорректировкуОбеспеченияНаКлиенте(ВыделеннаяСтрока);
КонецЕсли;
КонецЦикла
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьВсеКорректировки(Команда)
Для Каждого Строка Из Объект.Товары Цикл
Если Строка.ЗаданИнтервалПотребности Тогда
ОтменитьКорректировкуОбеспеченияНаКлиенте(Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьКорректировкуОбеспеченияНаКлиенте(ТекущаяСтрока)
СтруктураЗаписи = Новый Структура();
СтруктураЗаписи.Вставить("План",Объект.Ссылка);
СтруктураЗаписи.Вставить("Номенклатура",ТекущаяСтрока.Номенклатура);
СтруктураЗаписи.Вставить("Характеристика",ТекущаяСтрока.Характеристика);
СтруктураЗаписи.Вставить("Назначение",ТекущаяСтрока.Назначение);
СтруктураЗаписи.Вставить("ПериодПланирования",Объект.НачалоПериода);
СтруктураЗаписи.Вставить("Обеспечить",ТекущаяСтрока.Количество);
СтруктураЗаписи.Вставить("ИнтервалПотребностиОт",ТекущаяСтрока.ИнтервалПотребностиОт);
СтруктураЗаписи.Вставить("ИнтервалПотребностиДо",ТекущаяСтрока.ИнтервалПотребностиДо);
ОтменитьКорректировкуОбеспеченияНаСервере(СтруктураЗаписи);
ТекущаяСтрока.ИнтервалПотребностиОт = 0;
ТекущаяСтрока.ИнтервалПотребностиДо = 0;
ТекущаяСтрока.ЗаданИнтервалПотребности = Ложь;
КонецПроцедуры
&НаСервере
Процедура ОтменитьКорректировкуОбеспеченияНаСервере(СтруктураЗаписи)
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
Возврат;
КонецЕсли;
СтруктураЗаписи.Вставить("ДатаКорректировки", ТекущаяДатаСеанса());
НаборЗаписей = РегистрыСведений.ОтменаКорректировокПлановОбеспечения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.План.Установить(СтруктураЗаписи.План);
НоваяЗапись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, СтруктураЗаписи);
НаборЗаписей.Записать();
Элементы.НадписьЕстьОтмененныеКорректировкиОбеспечения.Видимость = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСтрокиКорректировок(Команда)
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("ЗаданИнтервалПотребности", Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьВсе(Команда)
Элементы.Товары.ОтборСтрок = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ДекорацияОтмененныеКорректировкиОбеспеченияНажатие(Элемент)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("План", Объект.Ссылка);
ПараметрыФормы.Вставить("ПоказыватьНазначение", Элементы.ТоварыНазначение.Видимость);
ПараметрыФормы.Вставить("Отбор", Новый Структура("План", Объект.Ссылка));
ОткрытьФорму(
"РегистрСведений.ОтменаКорректировокПлановОбеспечения.Форма.ФормаСпискаПоПлану",
ПараметрыФормы,
ЭтотОбъект);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузкаДанныхИзФайла
&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайла(ДополнительныеПараметры)
ПараметрыЗагрузки = ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных();
ПараметрыЗагрузки.ПолноеИмяТабличнойЧасти = "ПланСборкиРазборки.Товары";
ПараметрыЗагрузки.Заголовок = НСтр("ru = 'Загрузка таблицы ""Комплекты"" из файла'");
ПараметрыЗагрузки.ДополнительныеПараметры = ДополнительныеПараметры;
ПараметрыЗагрузки.КолонкиМакета = ПланированиеКлиент.ОписаниеКолонокМакетаДляЗагрузкиНоменклатуры(ДополнительныеПараметры);
Оповещение = Новый ОписаниеОповещения("ПоказатьФормуЗагрузкиИзФайлаЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки(ПараметрыЗагрузки, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если АдресЗагруженныхДанных = Неопределено Тогда
Возврат;
КонецЕсли;
ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры)
ЗагруженныеДанные = ПолучитьИзВременногоХранилища(АдресЗагруженныхДанных);
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
Если Объект.КроссТаблица Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
ДобавитьТовары(ЗагруженныеДанные, КэшированныеЗначения, Истина);
Если Объект.КроссТаблица Тогда
ТоварыПоДатам.Очистить();
Отказ = Ложь;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("ИмяТЧ", "Товары");
ПараметрыПроверки.Вставить("ПредставлениеТЧ", НСтр("ru='Комплекты'"));
ПараметрыПроверки.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПроверки.Вставить("ДатаНачала", Объект.НачалоПериода);
ПараметрыПроверки.Вставить("ДатаОкончания", Объект.ОкончаниеПериода);
ПараметрыПроверки.Вставить("ИмяПоляДатыПериода", "ДатаСборкиРазборки");
ПараметрыПроверки.Вставить("ПредставлениеДатыПериода", НСтр("ru='Дата сборки (разборки)'"));
ПараметрыПроверки.Вставить("ПрефиксПутиКТЧ", "Объект.");
ПланированиеКлиентСервер.ПроверитьДатуПериодаТЧ(Объект, Отказ, ПараметрыПроверки);
СтруктураПоиска = Новый Структура("Подсборка", Истина);
СписокПодсборок = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Если Отказ ИЛИ СписокПодсборок.Количество() <> 0 Тогда
Если Отказ Тогда
ОбщегоНазначения.СообщитьПользователю(НСтр("ru='В строках списка ""Комплекты"" указаны даты за границами планирования - строки были удалены.'"));
КонецЕсли;
Если СписокПодсборок.Количество() <> 0 Тогда
ОбщегоНазначения.СообщитьПользователю(НСтр("ru='В списке ""Комплекты"" были удалены все запланированные подсборки.'"));
КонецЕсли;
КонецЕсли;
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти