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