• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Помогите С Отчетом

  • Автор темы Ivanushka
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

Ivanushka

имеется отчет остатки тмц, в нем реализовано вывод информации по заказам по каждому наименованию товара (количество заказанного товара, дата документа заказ поставщику и статус документа заказ поставщику (заказан, в пути, получен). сейчас по каждому наименованию количество суммируется, а дата заказа ставиться последняя на дату формирования отчета. а нужно, чтобы если наименование встречается несколько раз в разных документах "заказ поставщику" и у них разные статусы, чтобы в отчет выводилось наименование столько раз, сколько разных статусов
 
V

vbs

Уж сколько раз твердили миру...
Ведь НИЧЕГО не понять из этих трех строк. Специально постараться - и то так не сформулируешь :crash:
Вспоминается анекдот про дантиста :
- Доктор, помогите !
- У меня прием до 6. Сейчас полседьмого !
- Ну, сделайте что-нибудь.
Разворачивается, бьет посетителя в глаз.
- Иди к окулисту. Он до семи принимает.
Простите за баян...
 
Д

Дайнеко

Не ворчите, сударь! Тишина в зале! Я дам умный совет:
Найдите фрагмент текста, отвечающий за вывод отчета.
 
V

Vladal

... а нужно, чтобы если наименование встречается несколько раз в разных документах "заказ поставщику" и у них разные статусы, чтобы в отчет выводилось наименование столько раз, сколько разных статусов
Ну вот в ячейке таблицы, где выводится строка с документом надо вставить (копипастить?) ячейку с наименованием товара из другой ячейки, где этот товар выводится в группировке.
И проследите, чтобы в ячейке тип значения был отличным от "Текст".
И да, какая версия платформы, конфигурации?
 
I

Ivanushka

Типовая конфигурация Торговля+Склад, редакция 9.2
 
I

Ivanushka

Уж сколько раз твердили миру...
Ведь НИЧЕГО не понять из этих трех строк. Специально постараться - и то так не сформулируешь :crash:
Вспоминается анекдот про дантиста :
- Доктор, помогите !
- У меня прием до 6. Сейчас полседьмого !
- Ну, сделайте что-нибудь.
Разворачивается, бьет посетителя в глаз.
- Иди к окулисту. Он до семи принимает.
Простите за баян...

////////////////////////////////////////////////////////////////////////////////
// ОПИСАНИЕ МОДУЛЬНЫХ ПЕРЕМЕННЫХ
//
Перем ТекСтрокаВТаблице; // текущая строка в таблице значений МФ

// используются для стандартного механизма кнопок "Обновить" и "Настройка"
Перем Таб;
Перем Обновить;
Перем Расшифровка;

// Итоги по регистру партий для расчета цен
Перем ТЗИтогов, ТЗИтогов2;

// Представление текущего элемента из списка "ЦенаТовара".
Перем ПредставлениеЦены;

Перем ТЗВДокумент;
Перем ВызовИзДокумента;
Перем ДокументИнвентаризация;
Перем ВалютаДокумента;
Перем КурсДокумента, КратностьДокумента;

// Таблица значений для формирования отчета
Перем ТЗ;
Перем МаксимальныйУровень;

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
//******************************************************************************
// ВыбратьПоФильтру()
//
// Параметры:
// Нет
//
// Описание:
// Открывает обработку отбора элементов по произвольному фильтру
//
Процедура ВыбратьПоФильтру()

Перем ВидЗначенияПодбора;

ВидЗначенияПодбора=СокрЛП(ТаблицаМФ.Вид);

Если ПустоеЗначение(ВидЗначенияПодбора)=1 Тогда
Возврат;
КонецЕсли;

СписокПараметров=СоздатьОбъект("СписокЗначений");
СписокПараметров.ДобавитьЗначение("", "ИмяВызвавшейФормы");
СписокПараметров.ДобавитьЗначение(ТаблицаМФ.Тип, "Тип");
СписокПараметров.ДобавитьЗначение(ВидЗначенияПодбора,"Вид");
СписокПараметров.ДобавитьЗначение(СписокЭлементовМФ, "Объекты");
ТаблицаМФ.ФлВкл=2;
ОткрытьФорму("Обработка.ПодборОбъектов#",СписокПараметров);

КонецПроцедуры // ВыбратьПоФильтру

//******************************************************************************
// ПерерисовкаНазванийЗакладок
//
// Параметры:
// Нет
//
// Описание:
// Добавляет "(!)" в заголовок закладки с множественным фильтром, когда этот фильтр задан
//
Функция ПерерисовкаНазванийЗакладок()

Форма.Закладки.УстановитьЗначение(2,?(глМножественныйФильтрЗадан(ТаблицаМФ)=1,"(!) ","")+"Множественный фильтр");

КонецФункции // ПерерисовкаНазванийЗакладок

//******************************************************************************
// УправлениеДиалогом()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Управление доступностью элементов диалога.
//
Процедура УправлениеДиалогом()

Если Форма.Закладки.ТекущаяСтрока() = 1 Тогда
Форма.ИспользоватьСлой("Шапка,Подвал,Основной1,Основной2,Разделитель1");

Иначе
Форма.ИспользоватьСлой("Шапка,МФ,Подвал");
КонецЕсли;

КонецПроцедуры //УправлениеДиалогом()

//******************************************************************************
// РасшифровкаОбновить(Обновить)
//
// Параметры:
// Обновить = 1 - нажата кнопка "Обновить"
// 2 - нажата кнопка "Настройка"
//
// Возвращаемое значение:
// Расшифровка (список значений)
//
// Вызывается из формул элементов диалога:
// из таблицы, кнопки "Обновить" и "Настройка"
//
// Описание:
// функция для стандартного механизма кнопок ""Обновить" и "Настройка""
// помещает значение параметра в список Расшифровка и возвращает этот список
//
Функция РасшифровкаОбновить(Обновить)

Расшифровка.Установить("Обновить", Обновить);
Возврат Расшифровка;

КонецФункции //РасшифровкаОбновить()

//******************************************************************************
// ДобавитьСклады(Запрос, ФлагВозврата, СписокСкладов)
//
// Параметры:
// Запрос, ФлагВозврата, СписокСкладов
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Добавление складов в список обходом группировки запроса.
//
Процедура ДобавитьСклады(Запрос, ФлагВозврата, СписокСкладов)

ПервыйРаз = 1;
Пока Запрос.Группировка("Склад") = 1 Цикл

Если ПустоеЗначение(Запрос.Склад) = 1 Тогда
Продолжить;
КонецЕсли;

Если СписокСкладов.НайтиЗначение(Запрос.Склад)=0 Тогда
СписокСкладов.ДобавитьЗначение(Запрос.Склад);
КонецЕсли;

КонецЦикла;

СписокСкладов.Сортировать();
ФлагВозврата = 1;

Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
ТекСклад = СписокСкладов.ПолучитьЗначение(Сч);
ТЗ.НоваяКолонка("Количество" + Сч, "Число");
Если ТекСклад.Вид() = "Склады" Тогда
Если (ПредставлениеЦены <> "не показывать") и ((ПредставлениеЦены <> "отпускная цена (только розница)") или (ТекСклад.РозничныйСклад = 1)) Тогда
ТЗ.НоваяКолонка("Сумма" + Сч, "Число");
КонецЕсли;
Иначе
Если (ПредставлениеЦены <> "не показывать") и (ПредставлениеЦены <> "отпускная цена (только розница)") Тогда
ТЗ.НоваяКолонка("Сумма" + Сч, "Число");
КонецЕсли;
КонецЕсли;
КонецЦикла;

КонецПроцедуры // ДобавитьСклады()


//******************************************************************************
// ТекстЗапросаБезКомиссии()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Текст запроса
//
// Описание:
// Формирует текст запроса, для остатков без комиссионеров.
//
Функция ТекстЗапросаБезКомиссии()

СтрПериод = ?(ДатаКонца>= ПолучитьДатуТА(),"",
"Период с ДатаКонца по ДатаКонца;");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|" + СтрПериод +
"
|Фирма = Регистр.ОстаткиТМЦ.Фирма,
| Регистр.РезервыТМЦ.Фирма;
|УпрАналитика = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика,
| Регистр.РезервыТМЦ.Фирма.УпрАналитика;
|ЮрЛицо = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо,
| Регистр.РезервыТМЦ.Фирма.ЮрЛицо;
|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура,
| Регистр.Заказы.Номенклатура,
| Регистр.РезервыТМЦ.Номенклатура;
|Склад = Регистр.ОстаткиТМЦ.Склад,
| Регистр.РезервыТМЦ.Склад;
|РозничныйСклад = Регистр.ОстаткиТМЦ.Склад.РозничныйСклад,
| Регистр.РезервыТМЦ.Склад.РозничныйСклад;";

Если ВыводитьЗаказанный = 1 Тогда
ТекстЗапроса = ТекстЗапроса +
"Заказано = Регистр.Заказы.КоличествоПриход;
|ДатаЗаказа = Регистр.Заказы.ЗаказПоставщику.ДатаДок;
|СтатДок = Регистр.Заказы.ЗаказПоставщику.СтатусДокумента1;
|Функция ЗаказаноКонОст = КонОст(Заказано);";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса +
"Количество = Регистр.ОстаткиТМЦ.Количество;
|Резерв = Регистр.РезервыТМЦ.Количество;
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура"+?(ПоказатьОстатки.ТекущаяСтрока()>=2," Все","")+";";

Возврат ТекстЗапроса;

КонецФункции // ТекстЗапросаБезКомиссии()

//******************************************************************************
// ЗаполнитьСтроку(ТЗ, Запрос)
//
// Параметры:
// ТЗ - таблица значений отчета спозиционированная на заполняемой строке
// Запрос - запрос, спозиционированный на соответствующем ТМЦ и, если необходимо розничной цене
// СписокСкладов - список значений, содержащий все склады, попавшие в запрос
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Заполняет строку таблицы.
//
Процедура ЗаполнитьСтроку(ТЗ, Запрос, СписокСкладов, ВДокумент)


ВалютаЦены = 0;

ПервыйРаз = 1;
Пока Запрос.Группировка("Склад")=1 Цикл

ПечКол = Запрос.КоличествоКонОст;
Если Показатель.ТекущаяСтрока() = 2 Тогда
ПечКол = ПечКол - Запрос.РезервКонОст;
КонецЕсли;

Попытка
ПечКол = ПечКол / ТЗ.ПечЕд.Коэффициент;
Исключение
КонецПопытки;

Поз = СписокСкладов.НайтиЗначение(Запрос.Склад);
Если Поз > 0 Тогда
ТЗ.УстановитьЗначение(ТЗ.НомерСтроки, "Количество" + Поз, ПечКол);
КонецЕсли;


КонецЦикла; // по складам

КонецПроцедуры // ЗаполнитьСтроку()

//******************************************************************************
// РассчитатьИтогиПоГруппам(ТЗ, Запрос)
//
// Параметры:
// СписокСкладов - список значений, содержащий все склады, попавшие в запрос
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Рассчитывает итоги по группам и общие итоги по отчету.
//
Процедура РассчитатьИтогиПоГруппам(СписокСкладов)

Уровень = 1;
Для Уровень = 1 По 12 Цикл
КопияТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(КопияТЗ);
КопияТЗ.Сортировать("Уровень");
ТЗ.ВыбратьСтроки();
СтрокаНайдена = 0;
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
Если ТЗ.Уровень = Уровень Тогда
Если Уровень <> 12 Тогда
МаксимальныйУровень = Уровень;
КонецЕсли;
СтрокаНайдена = 1;
КопияТЗ.ВыбратьСтроки();
Пока КопияТЗ.ПолучитьСтроку() = 1 Цикл
Если КопияТЗ.Родитель = ТЗ.ТекРасшифровка Тогда
Если (ТЗ.Уровень <> 12) И (ТЗ.Уровень <= КопияТЗ.Уровень) Тогда
ТЗ.Уровень = КопияТЗ.Уровень + 1;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
ТекСклад = СписокСкладов.ПолучитьЗначение(Сч);
Если ИтогиПоКоличеству = 1 Тогда
ТекКол = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч);
ТЗ.УстановитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч, 0);
КонецЕсли;
//Если ТекСклад.Вид() = "Склады" Тогда
// ТекСумма = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Сумма" + Сч);
// ТЗ.УстановитьЗначение(ТЗ.НомерСтроки, "Сумма" + Сч, 0);
//Иначе
// ТекСумма = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Сумма" + Сч);
// ТЗ.УстановитьЗначение(ТЗ.НомерСтроки, "Сумма" + Сч, 0);
//КонецЕсли;
КонецЦикла;
Продолжить;
КонецЕсли;
Сч = 0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
ТекСклад = СписокСкладов.ПолучитьЗначение(Сч);
Если ИтогиПоКоличеству = 1 Тогда
ТекКол = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч);
ТЗ.УстановитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч, ТекКол + КопияТЗ.ПолучитьЗначение(КопияТЗ.НомерСтроки, "Количество" + Сч));
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры // РассчитатьИтогиПоГруппам()


//******************************************************************************
// Сформировать(ЗакрытьДиалог=0, ВДокумент=0)
//
// Параметры:
// ЗакрытьДиалог - флаг того, что после формирования отчета надо закрыть диалог
// ВДокумент - 1 - режим переноса информации отчета в документ "Инвентаризайия ТМЦ"
// 0 - вывод отчета
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
// кнопки "Сформировать" и "ОК"
//
// Описание:
// Запускает отчет.
//
Процедура Сформировать(ЗакрытьДиалог=0, ВДокумент=0)

Перем Запрос, ТекстЗапроса;
Перем СписокИтогов;
Перем Эл;

ВалютаЦены = глРубли;

Если глПроверкаДаты(ДатаКонца,ДатаКонца)=0 Тогда
Возврат;
КонецЕсли;

Если (ТипЗначенияСтр(Таб) <> "Таблица") ИЛИ (Обновить = 0) Тогда
Таб = СоздатьОбъект("Таблица");
Иначе
Таб.Очистить();
КонецЕсли;

Таб.ИсходнаяТаблица( "ОстаткиТМЦ" );

Расшифровка = СоздатьОбъект("СписокЗначений");
Путь = "";
ИмяФайла = "";
РасположениеФайла(Путь,ИмяФайла);
ФайлОтчета = Путь + ИмяФайла;
Расшифровка.Установить("Отчет", ?(ПустоеЗначение(ФайлОтчета) = 1,"ОстаткиТМЦ", ФайлОтчета));

// все настройки помещаем в список
Расшифровка.Установить("ДатаКонца", ДатаКонца);
Расшифровка.Установить("ВыбТМЦ", ВыбТМЦ);

Расшифровка.Установить("ИтогиПоКоличеству", ИтогиПоКоличеству);
Расшифровка.Установить("ВыводитьЗаказанный",ВыводитьЗаказанный);
Расшифровка.Установить("ПоказатьОстатки", ПоказатьОстатки.ТекущаяСтрока());

глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст); // записываем изменения если они были
// запомним МФ только если он задан
Если глМножественныйФильтрЗадан(ТаблицаМФ) = 1 Тогда
Расшифровка.Установить("ТаблицаМФ", ТаблицаМФ);
КонецЕсли;

//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = ТекстЗапросаБезКомиссии();

Если Показатель.ТекущаяСтрока() = 2 Тогда
ТекстЗапроса = ТекстЗапроса +
"Функция РезервКонОст = КонОст(Резерв);";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса +
"Группировка Склад Все ВошедшиеВЗапрос;";



Загол="";

НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура", ВыбТМЦ, "ВыбТМЦ", ТекстЗапроса,Загол,"СвойстваНоменклатуры");

Если НетОш = 0 Тогда
Возврат;
КонецЕсли;

Если Показатель.ТекущаяСтрока()=1 Тогда
ПечЗаголовок = "Остатки ТМЦ на складах";
Иначе
ПечЗаголовок = "Свободные остатки ТМЦ на складах";
КонецЕсли;
ПечЗаголовокСтолбца = "";

// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

ТЗИтогов=СоздатьОбъект("ТаблицаЗначений");
ТЗИтоговКомиссия=СоздатьОбъект("ТаблицаЗначений");
ТЗИтогов2=СоздатьОбъект("ТаблицаЗначений");
ТЗИтоговКомиссия2=СоздатьОбъект("ТаблицаЗначений");

//
Если
(СебестоимостьНеИзменялась=1)
Тогда
// если считаем себестоимость из регистра партии товаров
ВремРегистры=СоздатьОбъект("Регистры");
РегПартии=ВремРегистры.ПартииНаличие;
РегОтданные = ВремРегистры.ПартииОтданные;
//Если ВидРазделителя = 1 Тогда // Фильтруем по фирме
// Если ВыбРазделитель1.Выбран() = 1 Тогда
// РегПартии.УстановитьЗначениеФильтра("Фирма", ВыбРазделитель1);
// РегОтданные.УстановитьЗначениеФильтра("Фирма", ВыбРазделитель1);
// КонецЕсли;
//ИначеЕсли ВидРазделителя = 2 Тогда // Фильтруем по юр. лицу
// Если ВыбРазделитель2.Выбран() = 1 Тогда
// СписокФирм = СоздатьОбъект("СписокЗначений");
// СпрФирм = СоздатьОбъект("Справочник.Фирмы");
// СпрФирм.ВыбратьЭлементы();
// Пока СпрФирм.ПолучитьЭлемент() = 1 Цикл
// Если СпрФирм.ЮрЛицо = ВыбРазделитель2 Тогда
// СписокФирм.ДобавитьЗначение(СпрФирм.ТекущийЭлемент());
// КонецЕсли;
// РегПартии.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
// РегОтданные.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
// КонецЦикла;
// КонецЕсли;
//ИначеЕсли ВидРазделителя = 3 Тогда // Фильтруем по упр. аналитике
// Если ВыбРазделитель3.Выбран() = 1 Тогда
// СписокФирм = СоздатьОбъект("СписокЗначений");
// СпрФирм = СоздатьОбъект("Справочник.Фирмы");
// СпрФирм.ВыбратьЭлементы();
// Пока СпрФирм.ПолучитьЭлемент() = 1 Цикл
// Если СпрФирм.УпрАналитика = ВыбРазделитель3 Тогда
// СписокФирм.ДобавитьЗначение(СпрФирм.ТекущийЭлемент());
// КонецЕсли;
// КонецЦикла;
// РегПартии.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
// РегОтданные.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
// КонецЕсли;
//КонецЕсли;
Если (ДатаКонца<ПолучитьДатуТА()) Тогда
РегПартии.ВременныйРасчет();
РегОтданные.ВременныйРасчет();
ВремРегистры.РассчитатьРегистрыПО(ДатаКонца);
КонецЕсли;

РегПартии.ВыгрузитьИтоги(ТЗИтогов,0,1);

ТЗИтогов.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");
РегОтданные.ВыгрузитьИтоги(ТЗИтоговКомиссия,0,0);
ТЗИтоговКомиссия.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");
ТЗИтоговКомиссия.ВыбратьСтроки();
Пока ТЗИтоговКомиссия.ПолучитьСтроку() = 1 Цикл
ТЗИтогов.НоваяСтрока();
ТЗИтогов.Номенклатура = ТЗИтоговКомиссия.Номенклатура;
ТЗИтогов.Количество = ТЗИтоговКомиссия.Количество;
ТЗИтогов.СуммаРуб = ТЗИтоговКомиссия.СуммаРуб;
ТЗИтогов.СуммаБезНДС = ТЗИтоговКомиссия.СуммаБезНДС;
КонецЦикла;

ТЗИтогов.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");

Если СебестоимостьНеИзменялась=1 Тогда
РегПартии.ВременныйРасчет();
РегОтданные.ВременныйРасчет();
ВремРегистры.РассчитатьРегистрыПО(ДатаCCНеИзменялась);
РегПартии.ВыгрузитьИтоги(ТЗИтогов2,0,1);
ТЗИтогов2.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");
РегОтданные.ВыгрузитьИтоги(ТЗИтоговКомиссия2,0,0);
ТЗИтоговКомиссия2.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");
ТЗИтоговКомиссия2.ВыбратьСтроки();
Пока ТЗИтоговКомиссия2.ПолучитьСтроку() = 1 Цикл
ТЗИтогов2.НоваяСтрока();
ТЗИтогов2.Номенклатура = ТЗИтоговКомиссия2.Номенклатура;
ТЗИтогов2.Количество = ТЗИтоговКомиссия2.Количество;
ТЗИтогов2.СуммаРуб = ТЗИтоговКомиссия2.СуммаРуб;
ТЗИтогов2.СуммаБезНДС = ТЗИтоговКомиссия2.СуммаБезНДС;
КонецЦикла;

ТЗИтогов2.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");

КонецЕсли;
КонецЕсли;



ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("ПечТекстСтроки", "Строка");
ТЗ.НоваяКолонка("ПечЕд", "Справочник.Единицы");
ТЗ.НоваяКолонка("Уровень", "Число");
ТЗ.НоваяКолонка("ТекРасшифровка", "Справочник.Номенклатура");
ТЗ.НоваяКолонка("Родитель", "Справочник.Номенклатура");

Если ВыводитьЗаказанный = 1 Тогда
ТЗ.НоваяКолонка("Заказано", "Число");
ТЗ.НоваяКолонка("ДатаЗаказа", "Дата");
ТЗ.НоваяКолонка("СтатДок", "Значение");
КонецЕсли;

// сформируем список складов.
ФлагВозврата = 0;
СписокСкладов = СоздатьОбъект("СписокЗначений");
ЕЕ=1;
Для ИИ=1 По ВыбранныеСклады.РазмерСписка() Цикл
Если ВыбранныеСклады.Пометка(ИИ)=1 Тогда
СписокСкладов.ДобавитьЗначение(ВыбранныеСклады.ПолучитьЗначение(ИИ,Эл));
ТЗ.НоваяКолонка("Количество"+ЕЕ, "Число");
ЕЕ=ЕЕ+1;
КонецЕсли;
КонецЦикла;

//Пока (Запрос.Группировка("Номенклатура") = 1) и (ФлагВозврата <> 1) Цикл
// Если Запрос.ЭтоГруппа("Номенклатура")=1 Тогда
// Продолжить;
// КонецЕсли;
// ДобавитьСклады(Запрос, ФлагВозврата, СписокСкладов);
//КонецЦикла;

глЧислоСтрок = 0;

Таб.ВывестиСекцию("Кнопки");
Таб.ВывестиСекцию("Шапка");
Таб.ВывестиСекцию("ШапкаТаблицы|ТМЦ");


// выводим шапку на каждой странице
НачПовт = Таб.ВысотаСекции("Кнопки") + Таб.ВысотаСекции("Шапка");
КонПовт = НачПовт + Таб.ВысотаСекции("ШапкаТаблицы");
Таб.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);

Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
СтрокаЦены=""+ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл)+"("+ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл).Валюта+")";
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Цена");
КонецЕсли;
КонецЦикла;

Если СкладыВОтдельныхКолонках=1 Тогда
Для Сч =1 По СписокСкладов.РазмерСписка() Цикл
ПечСклад = СписокСкладов.ПолучитьЗначение(Сч);
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Склад");
КонецЦикла;
Иначе
ПечСклад = "Остаток";
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Склад");
КонецЕсли;

Если ВыводитьЗаказанный = 1 Тогда
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Заказано");
КонецЕсли;

глОживить(1);

Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 3, "ОстаткиТМЦ", "ОстаткиТМЦ");

СписокГрупп = СоздатьОбъект("СписокЗначений");
Запрос.ВНачалоВыборки();
Пока (Запрос.Группировка("Номенклатура") = 1) Цикл
ТМЦ = Запрос.Номенклатура;

Если Показатель.ТекущаяСтрока()=1 Тогда
ПоказательАнализа = Запрос.КоличествоКонОст;
Иначе
ПоказательАнализа = Запрос.КоличествоКонОст - Запрос.РезервКонОст;
КонецЕсли;


// проверим условие
Если ПоказатьОстатки.ТекущаяСтрока()=1 Тогда // все ненулевые
// выводим все
Если ПоказательАнализа = 0 Тогда
Продолжить;
КонецЕсли;

ИначеЕсли ПоказатьОстатки.ТекущаяСтрока()=2 Тогда // все
// выводим все

ИначеЕсли ПоказатьОстатки.ТекущаяСтрока()=3 Тогда // все отрицательные
Если ПоказательАнализа >= 0 Тогда // проверим
Продолжить;
КонецЕсли;

ИначеЕсли ПоказатьОстатки.ТекущаяСтрока()=4 Тогда // меньше мин. остатка
Если ПоказательАнализа >= ТМЦ.МинОстаток Тогда
Продолжить;
КонецЕсли;

ИначеЕсли ПоказатьОстатки.ТекущаяСтрока()=5 Тогда // все, имеющиеся в наличи
Если ПоказательАнализа <= 0 Тогда
Продолжить;
КонецЕсли;

КонецЕсли;

Если Запрос.ЭтоГруппа("Номенклатура")=1 Тогда
СписокГрупп.ДобавитьЗначение(ТМЦ);
Продолжить;
КонецЕсли;

// выводим группы ТМЦ
Пока СписокГрупп.РазмерСписка()>0 Цикл
Группа = СписокГрупп.ПолучитьЗначение(1);
Если ТМЦ.ПринадлежитГруппе(Группа)=1 Тогда
ТЗ.НоваяСтрока();
ТЗ.Уровень = СписокГрупп.РазмерСписка();
ТЗ.ПечТекстСтроки = Группа.Наименование;
ТЗ.Родитель = Группа.Родитель;
ТЗ.ТекРасшифровка = Группа;
КонецЕсли;
СписокГрупп.УдалитьЗначение(1);
КонецЦикла;

ТМЦСтрока = "" + ТМЦ +?(ПечататьКомментарий=1," "+ТМЦ.Комментарий,"");//+ ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТМЦ.Артикул), "");

ТЗ.НоваяСтрока();
ТЗ.Уровень = 0;
ТЗ.ТекРасшифровка = ТМЦ;
ТЗ.Родитель = ТМЦ.Родитель;
ТЗ.ПечЕд = ТМЦ.БазоваяЕдиница;
ТЗ.ПечТекстСтроки = ТМЦСтрока;// + ?(ТМЦ.МинОстаток=0,"",", мин. остаток = "+СокрЛП(глФРМКоличество(ТМЦ.МинОстаток,ТЗ.ПечЕд)));
Если ВыводитьЗаказанный = 1 Тогда
ТЗ.Заказано = Запрос.ЗаказаноКонОст;
ТЗ.ДатаЗаказа = Запрос.ДатаЗаказа;
ТЗ.СтатДок = Запрос.СтатДок;
КонецЕсли;
ЗаполнитьСтроку(ТЗ, Запрос, СписокСкладов, 0);
глОживить(1);

КонецЦикла;

// Последняя строка для общих итогов
ТЗ.НоваяСтрока();
ТЗ.Уровень = 12;
ТЗ1=СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ТЗ1);
ТЗ1.УдалитьСтроки();
РассчитатьИтогиПоГруппам(СписокСкладов);

ТЗ.ВыбратьСтроки();
СЗ=СоздатьОбъект("СписокЗначений");
ПредУровень=12;
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
Если ТЗ.Родитель.Выбран()=0 Тогда
ТЗ1.УдалитьСтроки();
КонецЕсли;
Если (ПредУровень=0) И (ТЗ.Уровень>0) Тогда
Для ИИ=1 По ТЗ.Уровень Цикл
Если (ТЗ1.КоличествоСтрок()>0) Тогда
ТЗ1.УдалитьСтроку(ТЗ1.КоличествоСтрок());
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПредУровень=ТЗ.Уровень;
//Проверка на изменение себестоимости
Если (СебестоимостьНеИзменялась=1) И (ТЗ.ТекРасшифровка.ЭтоГруппа()=0) Тогда
ЦЦ1=0;
ЦЦ2=0;
НомСтр="";
Если ТЗИтогов.НайтиЗначение(ТЗ.ТекРасшифровка,НомСтр,"Номенклатура")=1 Тогда
ТЗИтогов.ПолучитьСтрокуПоНомеру(НомСтр);
КолТовара = ТЗИтогов.Количество;
ЦЦ1 = ?(КолТовара=0,0,ТЗИтогов.СуммаБезНДС/КолТовара);
КонецЕсли;
НомСтр="";
Если ТЗИтогов2.НайтиЗначение(ТЗ.ТекРасшифровка,НомСтр,"Номенклатура")=1 Тогда
ТЗИтогов2.ПолучитьСтрокуПоНомеру(НомСтр);
КолТовара = ТЗИтогов2.Количество;
ЦЦ2 = ?(КолТовара=0,0,ТЗИтогов2.СуммаБезНДС/КолТовара);
КонецЕсли;

Если Окр(ЦЦ1,2)=Окр(ЦЦ2,2) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
//Проверка на изменение любого типа цен
Если (ЦенаНеИзменялась=1) И (ТЗ.ТекРасшифровка.ЭтоГруппа()=0) Тогда
ФлагВыхода=0;
Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
ОЦ1 = 0;
ЦЦ1 = 0;
ОЦ2 = 0;
ЦЦ2 = 0;
ВалЦены = 0;
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ДатаЦенаНеИзменялась, ЦЦ1,,ВалЦены,, ОЦ1);
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ДатаКонца, ЦЦ2,,ВалЦены,, ОЦ2);
Если ЦЦ1=ЦЦ2 Тогда
ФлагВыхода=1;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ФлагВыхода=1 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;

ПечТекстСтроки = ТЗ.ПечТекстСтроки;
ПечЕд = ТЗ.ПечЕд;
ТекРасшифровка = ТЗ.ТекРасшифровка;
Если (ТЗ.Уровень > 0) И (ТЗ.Уровень < 12) Тогда
ТЗ1.НоваяСтрока();
ТЗ1.ПечЕд=ТЗ.ПечЕд;
ТЗ1.ТекРасшифровка=ТЗ.ТекРасшифровка;
ТЗ1.ПечТекстСтроки=ТЗ.ПечТекстСтроки;
ТЗ1.Родитель=ТЗ.Родитель;
ТЗ1.Уровень=ТЗ.Уровень;
Продолжить;
ИмяСекции = "СтрокаГ";
ИначеЕсли ТЗ.Уровень = 12 Тогда
ИмяСекции = "ПодвалИтого";
Иначе
ИмяСекции = "Строка";
Если ПоказатьОстатки.ТекущаяСтрока()=1 Тогда
КолОбщ= 0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
КолОбщ = КолОбщ+(ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч));
КонецЦикла;
Если КолОбщ=0 Тогда
Продолжить;
КонецЕсли;

КонецЕсли;
Если (УсловиеКраснойСтроки=1) И (ТЗ.ТекРасшифровка.ЭтоГруппа()=0) Тогда
Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
ОЦ1 = 0;
ЦЦ1 = 0;
ОЦ2 = 0;
ЦЦ2 = 0;
ВалЦены = 0;
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ДатаКраснойСтроки, ЦЦ1,,ВалЦены,, ОЦ1);
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ДатаКонца, ЦЦ2,,ВалЦены,, ОЦ2);
Если ЦЦ1<>ЦЦ2 Тогда
ИмяСекции = "КраснаяСтрока";
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если (УсловиеСинейСтроки=1) И (ТЗ.ТекРасшифровка.ЭтоГруппа()=0) Тогда
Запрос1=СоздатьОбъект("Запрос");
Ном=ТЗ.ТекРасшифровка;
ТекстЗапроса=
"Период С ДатаСинейСтроки ПО ДатаКонца;
| ОбрабатыватьДокументы Проведенные;
| Док=ДОкумент.ПоступлениеТМЦ.ТекущийДокумент;
| Номенклатура=ДОкумент.ПоступлениеТМЦ.Номенклатура;
| Условие (Номенклатура=Ном);";
Если Запрос.Выполнить(ТекстЗапроса)=1 Тогда
ТЗПоступления=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗПоступления,1,0);
Если ТЗПоступления.КоличествоСтрок()>0 Тогда
ТЗПоступления.ВыбратьСтроки();
Если ТЗПоступления.ПолучитьСтроку()=1 Тогда
Если ПустоеЗначение(ТЗПоступления.Док)=0 Тогда
ИмяСекции = "СиняяСтрока";
КонецЕсли;
КонецЕсли;

КонецЕсли;

КонецЕсли;
КонецЕсли;

ТЗ1.ВыбратьСтроки();
ПОка ТЗ1.ПолучитьСТроку()=1 Цикл
ПечТекстСтроки = ТЗ1.ПечТекстСтроки;
ПечЕд = ТЗ1.ПечЕд;
ТекРасшифровка = ТЗ1.ТекРасшифровка;
Таб.ВывестиСекцию("СтрокаГ|ТМЦ");
Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
Таб.ПрисоединитьСекцию("СтрокаГ|Цена");
КонецЕсли;
КонецЦикла;
Если СкладыВОтдельныхКолонках=1 Тогда
Сч = 0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
Если (ФлагЗвездочки=1) Тогда
ПКол=ТЗ1.ПолучитьЗначение(ТЗ1.НомерСтроки, "Количество" + Сч);
Если (ПКол=0) Тогда
ПечКол="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечКол="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечКол="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечКол="***";
ИначеЕсли (ПКол>=100) Тогда
ПечКол="****";
КонецЕсли;
Иначе
ПечКол = глФРМКоличество(ТЗ1.ПолучитьЗначение(ТЗ1.НомерСтроки, "Количество" + Сч));
КонецЕсли;

Таб.ПрисоединитьСекцию("СтрокаГ|Склад");
КонецЦикла;
Иначе
КолОбщ= 0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
КолОбщ = КолОбщ+(ТЗ1.ПолучитьЗначение(ТЗ1.НомерСтроки, "Количество" + Сч));
КонецЦикла;
Если (ФлагЗвездочки=1) Тогда
ПКол=КолОбщ;
Если (ПКол=0) Тогда
ПечКол="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечКол="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечКол="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечКол="***";
ИначеЕсли (ПКол>=100) Тогда
ПечКол="****";
КонецЕсли;
Иначе
ПечКол = глФРМКоличество(КолОбщ);
КонецЕсли;
Таб.ПрисоединитьСекцию("СтрокаГ|Склад");
КонецЕсли;
Если ВыводитьЗаказанный = 1 Тогда
Если (ФлагЗвездочки=1) Тогда
ПКол=ТЗ1.Заказано;
Попытка
Если (ПКол=0) Тогда
ПечЗаказано="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечЗаказано="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечЗаказано="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечЗаказано="***";
ИначеЕсли (ПКол>=100) Тогда
ПечЗаказано="****";
КонецЕсли;
Исключение
ПечЗаказано="";
КонецПопытки;
Иначе
ПечЗаказано = глФРМКоличество(ТЗ1.Заказано);
КонецЕсли;
Таб.ПрисоединитьСекцию("СтрокаГ|Заказано");
КонецЕсли;

КонецЦикла;
ТЗ1.УдалитьСтроки();
ПечТекстСтроки = ТЗ.ПечТекстСтроки;
ПечЕд = ТЗ.ПечЕд;
ТекРасшифровка = ТЗ.ТекРасшифровка;
КонецЕсли;
Таб.ВывестиСекцию(ИмяСекции+"|ТМЦ");


Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
ОЦ1 = 0;
ЦЦ1 = 0;
ВалЦены = 0;
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ТекущаяДата(), ЦЦ1,,ВалЦены,, ОЦ1);
ПечЦена=ЦЦ1;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Цена");
КонецЕсли;
КонецЦикла;

Сч = 0;
СтрСкл=0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
Если СкладыВОтдельныхКолонках=1 Тогда
Если (ФлагЗвездочки=1) Тогда
ПКол=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч);
Если (ПКол=0) Тогда
ПечКол="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечКол="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечКол="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечКол="***";
ИначеЕсли (ПКол>=100) Тогда
ПечКол="****";
КонецЕсли;
Иначе
ПечКол = глФРМКоличество(ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч));
КонецЕсли;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Склад");
Иначе
СтрСкл = СтрСкл+ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч);
КонецЕсли;
КонецЦикла;
Если СкладыВОтдельныхКолонках=0 Тогда
Если (ФлагЗвездочки=1) Тогда
ПКол=СтрСкл;
Если (ПКол=0) Тогда
ПечКол="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечКол="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечКол="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечКол="***";
ИначеЕсли (ПКол>=100) Тогда
ПечКол="****";
КонецЕсли;
Иначе
ПечКол = глФРМКоличество(СтрСкл);
КонецЕсли;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Склад");
КонецЕсли;
Если ВыводитьЗаказанный = 1 Тогда
Если (ФлагЗвездочки=1) Тогда
Попытка
ПКол=ТЗ.Заказано;
Если (ПКол=0) Тогда
ПечЗаказано="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечЗаказано="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечЗаказано="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечЗаказано="***";
ИначеЕсли (ПКол>=100) Тогда
ПечЗаказано="****";
КонецЕсли;
Исключение
ПечЗаказано="";
КонецПопытки;
Иначе
ПечЗаказано = глФРМКоличество(ТЗ.Заказано);
КонецЕсли;
ДатаЗаказа=ТЗ.ДатаЗаказа;
СтатДок=ТЗ.СтатДок;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Заказано");
КонецЕсли;

КонецЦикла;

Таб.ОбластьПечати(3);

// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Если глПолучитьПолномочие("РазрешитьРедактированиеТаблиц") = 0 Тогда
Таб.Защита(1);
КонецЕсли;
Таб.Показать("Остатки ТМЦ", "");

Если (Обновить = 2) Тогда
СтрокаДействийФормы = "#Закрыть";
КонецЕсли;

КонецПроцедуры



Процедура ПечатьБланка(ЗакрытьДиалог=0, ВДокумент=0)

Перем Запрос, ТекстЗапроса;
Перем СписокИтогов;
Перем Эл;

ВалютаЦены = глРубли;

Если глПроверкаДаты(ДатаКонца,ДатаКонца)=0 Тогда
Возврат;
КонецЕсли;

Если (ТипЗначенияСтр(Таб) <> "Таблица") ИЛИ (Обновить = 0) Тогда
Таб = СоздатьОбъект("Таблица");
Иначе
Таб.Очистить();
КонецЕсли;

Таб.ИсходнаяТаблица( "БланкЗаказа" );

Расшифровка = СоздатьОбъект("СписокЗначений");
Путь = "";
ИмяФайла = "";
РасположениеФайла(Путь,ИмяФайла);
ФайлОтчета = Путь + ИмяФайла;
Расшифровка.Установить("Отчет", ?(ПустоеЗначение(ФайлОтчета) = 1,"ОстаткиТМЦ", ФайлОтчета));

// все настройки помещаем в список
Расшифровка.Установить("ДатаКонца", ДатаКонца);
Расшифровка.Установить("ВыбТМЦ", ВыбТМЦ);

Расшифровка.Установить("ИтогиПоКоличеству", ИтогиПоКоличеству);
Расшифровка.Установить("ВыводитьЗаказанный",ВыводитьЗаказанный);
Расшифровка.Установить("ПоказатьОстатки", ПоказатьОстатки.ТекущаяСтрока());

глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст); // записываем изменения если они были
// запомним МФ только если он задан
Если глМножественныйФильтрЗадан(ТаблицаМФ) = 1 Тогда
Расшифровка.Установить("ТаблицаМФ", ТаблицаМФ);
КонецЕсли;

//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = ТекстЗапросаБезКомиссии();

Если Показатель.ТекущаяСтрока() = 2 Тогда
ТекстЗапроса = ТекстЗапроса +
"Функция РезервКонОст = КонОст(Резерв);";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса +
"Группировка Склад Все ВошедшиеВЗапрос;";



Загол="";

НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура", ВыбТМЦ, "ВыбТМЦ", ТекстЗапроса,Загол,"СвойстваНоменклатуры");

Если НетОш = 0 Тогда
Возврат;
КонецЕсли;

Если Показатель.ТекущаяСтрока()=1 Тогда
ПечЗаголовок = "Остатки ТМЦ на складах";
Иначе
ПечЗаголовок = "Свободные остатки ТМЦ на складах";
КонецЕсли;
ПечЗаголовокСтолбца = "";

// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

ТЗИтогов=СоздатьОбъект("ТаблицаЗначений");
ТЗИтоговКомиссия=СоздатьОбъект("ТаблицаЗначений");
ТЗИтогов2=СоздатьОбъект("ТаблицаЗначений");
ТЗИтоговКомиссия2=СоздатьОбъект("ТаблицаЗначений");

//
Если
(СебестоимостьНеИзменялась=1)
Тогда
// если считаем себестоимость из регистра партии товаров
ВремРегистры=СоздатьОбъект("Регистры");
РегПартии=ВремРегистры.ПартииНаличие;
РегОтданные = ВремРегистры.ПартииОтданные;
//Если ВидРазделителя = 1 Тогда // Фильтруем по фирме
// Если ВыбРазделитель1.Выбран() = 1 Тогда
// РегПартии.УстановитьЗначениеФильтра("Фирма", ВыбРазделитель1);
// РегОтданные.УстановитьЗначениеФильтра("Фирма", ВыбРазделитель1);
// КонецЕсли;
//ИначеЕсли ВидРазделителя = 2 Тогда // Фильтруем по юр. лицу
// Если ВыбРазделитель2.Выбран() = 1 Тогда
// СписокФирм = СоздатьОбъект("СписокЗначений");
// СпрФирм = СоздатьОбъект("Справочник.Фирмы");
// СпрФирм.ВыбратьЭлементы();
// Пока СпрФирм.ПолучитьЭлемент() = 1 Цикл
// Если СпрФирм.ЮрЛицо = ВыбРазделитель2 Тогда
// СписокФирм.ДобавитьЗначение(СпрФирм.ТекущийЭлемент());
// КонецЕсли;
// РегПартии.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
// РегОтданные.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
// КонецЦикла;
// КонецЕсли;
//ИначеЕсли ВидРазделителя = 3 Тогда // Фильтруем по упр. аналитике
// Если ВыбРазделитель3.Выбран() = 1 Тогда
// СписокФирм = СоздатьОбъект("СписокЗначений");
// СпрФирм = СоздатьОбъект("Справочник.Фирмы");
// СпрФирм.ВыбратьЭлементы();
// Пока СпрФирм.ПолучитьЭлемент() = 1 Цикл
// Если СпрФирм.УпрАналитика = ВыбРазделитель3 Тогда
// СписокФирм.ДобавитьЗначение(СпрФирм.ТекущийЭлемент());
// КонецЕсли;
// КонецЦикла;
// РегПартии.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
// РегОтданные.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
// КонецЕсли;
//КонецЕсли;
Если (ДатаКонца<ПолучитьДатуТА()) Тогда
РегПартии.ВременныйРасчет();
РегОтданные.ВременныйРасчет();
ВремРегистры.РассчитатьРегистрыПО(ДатаКонца);
КонецЕсли;

РегПартии.ВыгрузитьИтоги(ТЗИтогов,0,1);

ТЗИтогов.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");
РегОтданные.ВыгрузитьИтоги(ТЗИтоговКомиссия,0,0);
ТЗИтоговКомиссия.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");
ТЗИтоговКомиссия.ВыбратьСтроки();
Пока ТЗИтоговКомиссия.ПолучитьСтроку() = 1 Цикл
ТЗИтогов.НоваяСтрока();
ТЗИтогов.Номенклатура = ТЗИтоговКомиссия.Номенклатура;
ТЗИтогов.Количество = ТЗИтоговКомиссия.Количество;
ТЗИтогов.СуммаРуб = ТЗИтоговКомиссия.СуммаРуб;
ТЗИтогов.СуммаБезНДС = ТЗИтоговКомиссия.СуммаБезНДС;
КонецЦикла;

ТЗИтогов.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");

Если СебестоимостьНеИзменялась=1 Тогда
РегПартии.ВременныйРасчет();
РегОтданные.ВременныйРасчет();
ВремРегистры.РассчитатьРегистрыПО(ДатаCCНеИзменялась);
РегПартии.ВыгрузитьИтоги(ТЗИтогов2,0,1);
ТЗИтогов2.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");
РегОтданные.ВыгрузитьИтоги(ТЗИтоговКомиссия2,0,0);
ТЗИтоговКомиссия2.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");
ТЗИтоговКомиссия2.ВыбратьСтроки();
Пока ТЗИтоговКомиссия2.ПолучитьСтроку() = 1 Цикл
ТЗИтогов2.НоваяСтрока();
ТЗИтогов2.Номенклатура = ТЗИтоговКомиссия2.Номенклатура;
ТЗИтогов2.Количество = ТЗИтоговКомиссия2.Количество;
ТЗИтогов2.СуммаРуб = ТЗИтоговКомиссия2.СуммаРуб;
ТЗИтогов2.СуммаБезНДС = ТЗИтоговКомиссия2.СуммаБезНДС;
КонецЦикла;

ТЗИтогов2.Свернуть("Номенклатура","СуммаРуб, СуммаБезНДС, Количество");

КонецЕсли;
КонецЕсли;



ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("ПечТекстСтроки", "Строка");
ТЗ.НоваяКолонка("ПечЕд", "Справочник.Единицы");
ТЗ.НоваяКолонка("Уровень", "Число");
ТЗ.НоваяКолонка("ТекРасшифровка", "Справочник.Номенклатура");
ТЗ.НоваяКолонка("Родитель", "Справочник.Номенклатура");

Если ВыводитьЗаказанный = 1 Тогда
ТЗ.НоваяКолонка("Заказано", "Число");
ТЗ.НоваяКолонка("ДатаЗаказа", "Дата");
ТЗ.НоваяКолонка("СтатДок", "Строка");
КонецЕсли;

// сформируем список складов.
ФлагВозврата = 0;
СписокСкладов = СоздатьОбъект("СписокЗначений");
ЕЕ=1;
Для ИИ=1 По ВыбранныеСклады.РазмерСписка() Цикл
Если ВыбранныеСклады.Пометка(ИИ)=1 Тогда
СписокСкладов.ДобавитьЗначение(ВыбранныеСклады.ПолучитьЗначение(ИИ,Эл));
ТЗ.НоваяКолонка("Количество"+ЕЕ, "Число");
ЕЕ=ЕЕ+1;
КонецЕсли;
КонецЦикла;

//Пока (Запрос.Группировка("Номенклатура") = 1) и (ФлагВозврата <> 1) Цикл
// Если Запрос.ЭтоГруппа("Номенклатура")=1 Тогда
// Продолжить;
// КонецЕсли;
// ДобавитьСклады(Запрос, ФлагВозврата, СписокСкладов);
//КонецЦикла;

глЧислоСтрок = 0;

Таб.ВывестиСекцию("Шапка");
Таб.ВывестиСекцию("ШапкаТаблицы|ТМЦ");


// выводим шапку на каждой странице
НачПовт = Таб.ВысотаСекции("Кнопки") + Таб.ВысотаСекции("Шапка");
КонПовт = НачПовт + Таб.ВысотаСекции("ШапкаТаблицы");
Таб.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);

Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
СтрокаЦены=""+ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл)+"("+ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл).Валюта+")";
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Цена");
КонецЕсли;
КонецЦикла;

Если СкладыВОтдельныхКолонках=1 Тогда
Для Сч =1 По СписокСкладов.РазмерСписка() Цикл
ПечСклад = СписокСкладов.ПолучитьЗначение(Сч);
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Склад");
КонецЦикла;
Иначе
ПечСклад = "Остаток";
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Склад");
КонецЕсли;

Если ВыводитьЗаказанный = 1 Тогда
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Заказано");
КонецЕсли;
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Заказ");
глОживить(1);

Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 3, "ОстаткиТМЦ", "ОстаткиТМЦ");

СписокГрупп = СоздатьОбъект("СписокЗначений");
Запрос.ВНачалоВыборки();
Пока (Запрос.Группировка("Номенклатура") = 1) Цикл
ТМЦ = Запрос.Номенклатура;

Если Показатель.ТекущаяСтрока()=1 Тогда
ПоказательАнализа = Запрос.КоличествоКонОст;
Иначе
ПоказательАнализа = Запрос.КоличествоКонОст - Запрос.РезервКонОст;
КонецЕсли;


// проверим условие
Если ПоказатьОстатки.ТекущаяСтрока()=1 Тогда // все ненулевые
// выводим все
Если ПоказательАнализа = 0 Тогда
Продолжить;
КонецЕсли;

ИначеЕсли ПоказатьОстатки.ТекущаяСтрока()=2 Тогда // все
// выводим все

ИначеЕсли ПоказатьОстатки.ТекущаяСтрока()=3 Тогда // все отрицательные
Если ПоказательАнализа >= 0 Тогда // проверим
Продолжить;
КонецЕсли;

ИначеЕсли ПоказатьОстатки.ТекущаяСтрока()=4 Тогда // меньше мин. остатка
Если ПоказательАнализа >= ТМЦ.МинОстаток Тогда
Продолжить;
КонецЕсли;

ИначеЕсли ПоказатьОстатки.ТекущаяСтрока()=5 Тогда // все, имеющиеся в наличи
Если ПоказательАнализа <= 0 Тогда
Продолжить;
КонецЕсли;

КонецЕсли;

Если Запрос.ЭтоГруппа("Номенклатура")=1 Тогда
СписокГрупп.ДобавитьЗначение(ТМЦ);
Продолжить;
КонецЕсли;

// выводим группы ТМЦ
Пока СписокГрупп.РазмерСписка()>0 Цикл
Группа = СписокГрупп.ПолучитьЗначение(1);
Если ТМЦ.ПринадлежитГруппе(Группа)=1 Тогда
ТЗ.НоваяСтрока();
ТЗ.Уровень = СписокГрупп.РазмерСписка();
ТЗ.ПечТекстСтроки = Группа.Наименование;
ТЗ.Родитель = Группа.Родитель;
ТЗ.ТекРасшифровка = Группа;
КонецЕсли;
СписокГрупп.УдалитьЗначение(1);
КонецЦикла;

ТМЦСтрока = "" + ТМЦ +?(ПечататьКомментарий=1," "+ТМЦ.Комментарий,"");//+ ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТМЦ.Артикул), "");

ТЗ.НоваяСтрока();
ТЗ.Уровень = 0;
ТЗ.ТекРасшифровка = ТМЦ;
ТЗ.Родитель = ТМЦ.Родитель;
ТЗ.ПечЕд = ТМЦ.БазоваяЕдиница;
ТЗ.ПечТекстСтроки = ТМЦСтрока;// + ?(ТМЦ.МинОстаток=0,"",", мин. остаток = "+СокрЛП(глФРМКоличество(ТМЦ.МинОстаток,ТЗ.ПечЕд)));
Если ВыводитьЗаказанный = 1 Тогда
ТЗ.Заказано = Запрос.ЗаказаноКонОст;
ТЗ.ДатаЗаказа = Запрос.ДатаЗаказа;
ТЗ.СтатДок = Запрос.СтатДок;
КонецЕсли;
ЗаполнитьСтроку(ТЗ, Запрос, СписокСкладов, 0);
глОживить(1);

КонецЦикла;

// Последняя строка для общих итогов
ТЗ.НоваяСтрока();
ТЗ.Уровень = 12;
ТЗ1=СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ТЗ1);
ТЗ1.УдалитьСтроки();
РассчитатьИтогиПоГруппам(СписокСкладов);

ТЗ.ВыбратьСтроки();
СЗ=СоздатьОбъект("СписокЗначений");
ПредУровень=12;
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
Если ТЗ.Родитель.Выбран()=0 Тогда
ТЗ1.УдалитьСтроки();
КонецЕсли;
Если (ПредУровень=0) И (ТЗ.Уровень>0) Тогда
Для ИИ=1 По ТЗ.Уровень Цикл
Если (ТЗ1.КоличествоСтрок()>0) Тогда
ТЗ1.УдалитьСтроку(ТЗ1.КоличествоСтрок());
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПредУровень=ТЗ.Уровень;
//Проверка на изменение себестоимости
Если (СебестоимостьНеИзменялась=1) И (ТЗ.ТекРасшифровка.ЭтоГруппа()=0) Тогда
ЦЦ1=0;
ЦЦ2=0;
НомСтр="";
Если ТЗИтогов.НайтиЗначение(ТЗ.ТекРасшифровка,НомСтр,"Номенклатура")=1 Тогда
ТЗИтогов.ПолучитьСтрокуПоНомеру(НомСтр);
КолТовара = ТЗИтогов.Количество;
ЦЦ1 = ?(КолТовара=0,0,ТЗИтогов.СуммаБезНДС/КолТовара);
КонецЕсли;
НомСтр="";
Если ТЗИтогов2.НайтиЗначение(ТЗ.ТекРасшифровка,НомСтр,"Номенклатура")=1 Тогда
ТЗИтогов2.ПолучитьСтрокуПоНомеру(НомСтр);
КолТовара = ТЗИтогов2.Количество;
ЦЦ2 = ?(КолТовара=0,0,ТЗИтогов2.СуммаБезНДС/КолТовара);
КонецЕсли;

Если Окр(ЦЦ1,2)=Окр(ЦЦ2,2) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
//Проверка на изменение любого типа цен
Если (ЦенаНеИзменялась=1) И (ТЗ.ТекРасшифровка.ЭтоГруппа()=0) Тогда
ФлагВыхода=0;
Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
ОЦ1 = 0;
ЦЦ1 = 0;
ОЦ2 = 0;
ЦЦ2 = 0;
ВалЦены = 0;
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ДатаЦенаНеИзменялась, ЦЦ1,,ВалЦены,, ОЦ1);
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ДатаКонца, ЦЦ2,,ВалЦены,, ОЦ2);
Если ЦЦ1=ЦЦ2 Тогда
ФлагВыхода=1;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ФлагВыхода=1 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;

ПечТекстСтроки = ТЗ.ПечТекстСтроки;
ПечКод = ТЗ.ТекРасшифровка.Код;
ПечЕд = ТЗ.ПечЕд;
ТекРасшифровка = ТЗ.ТекРасшифровка;
Если (ТЗ.Уровень > 0) И (ТЗ.Уровень < 12) Тогда
ТЗ1.НоваяСтрока();
ТЗ1.ПечЕд=ТЗ.ПечЕд;
ТЗ1.ТекРасшифровка=ТЗ.ТекРасшифровка;
ТЗ1.ПечТекстСтроки=ТЗ.ПечТекстСтроки;
ТЗ1.Родитель=ТЗ.Родитель;
ТЗ1.Уровень=ТЗ.Уровень;
Продолжить;
ИмяСекции = "СтрокаГ";
ИначеЕсли ТЗ.Уровень = 12 Тогда
ИмяСекции = "ПодвалИтого";
Иначе
ИмяСекции = "Строка";
Если ПоказатьОстатки.ТекущаяСтрока()=1 Тогда
КолОбщ= 0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
КолОбщ = КолОбщ+(ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч));
КонецЦикла;
Если КолОбщ=0 Тогда
Продолжить;
КонецЕсли;

КонецЕсли;
Если (УсловиеКраснойСтроки=1) И (ТЗ.ТекРасшифровка.ЭтоГруппа()=0) Тогда
Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
ОЦ1 = 0;
ЦЦ1 = 0;
ОЦ2 = 0;
ЦЦ2 = 0;
ВалЦены = 0;
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ДатаКраснойСтроки, ЦЦ1,,ВалЦены,, ОЦ1);
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ДатаКонца, ЦЦ2,,ВалЦены,, ОЦ2);
Если ЦЦ1<>ЦЦ2 Тогда
ИмяСекции = "КраснаяСтрока";
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если (УсловиеСинейСтроки=1) И (ТЗ.ТекРасшифровка.ЭтоГруппа()=0) Тогда
Запрос1=СоздатьОбъект("Запрос");
Ном=ТЗ.ТекРасшифровка;
ТекстЗапроса=
"Период С ДатаСинейСтроки ПО ДатаКонца;
| ОбрабатыватьДокументы Проведенные;
| Док=ДОкумент.ПоступлениеТМЦ.ТекущийДокумент;
| Номенклатура=ДОкумент.ПоступлениеТМЦ.Номенклатура;
| Условие (Номенклатура=Ном);";
Если Запрос.Выполнить(ТекстЗапроса)=1 Тогда
ТЗПоступления=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗПоступления,1,0);
Если ТЗПоступления.КоличествоСтрок()>0 Тогда
ТЗПоступления.ВыбратьСтроки();
Если ТЗПоступления.ПолучитьСтроку()=1 Тогда
Если ПустоеЗначение(ТЗПоступления.Док)=0 Тогда
ИмяСекции = "СиняяСтрока";
КонецЕсли;
КонецЕсли;

КонецЕсли;

КонецЕсли;
КонецЕсли;

ТЗ1.ВыбратьСтроки();
ПОка ТЗ1.ПолучитьСТроку()=1 Цикл
ПечТекстСтроки = ТЗ1.ПечТекстСтроки;
ПечЕд = ТЗ1.ПечЕд;
ТекРасшифровка = ТЗ1.ТекРасшифровка;
Таб.ВывестиСекцию("СтрокаГ|ТМЦ");
Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
Таб.ПрисоединитьСекцию("СтрокаГ|Цена");
КонецЕсли;
КонецЦикла;

Если СкладыВОтдельныхКолонках=1 Тогда
Сч = 0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
Если (ФлагЗвездочки=1) Тогда
ПКол=ТЗ1.ПолучитьЗначение(ТЗ1.НомерСтроки, "Количество" + Сч);
Если (ПКол=0) Тогда
ПечКол="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечКол="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечКол="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечКол="***";
ИначеЕсли (ПКол>=100) Тогда
ПечКол="****";
КонецЕсли;
Иначе
ПечКол = глФРМКоличество(ТЗ1.ПолучитьЗначение(ТЗ1.НомерСтроки, "Количество" + Сч));
КонецЕсли;
Таб.ПрисоединитьСекцию("СтрокаГ|Склад");
КонецЦикла;
Иначе
КолОбщ= 0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
КолОбщ = КолОбщ+(ТЗ1.ПолучитьЗначение(ТЗ1.НомерСтроки, "Количество" + Сч));
КонецЦикла;
Если (ФлагЗвездочки=1) Тогда
ПКол=КолОбщ;
Если (ПКол=0) Тогда
ПечКол="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечКол="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечКол="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечКол="***";
ИначеЕсли (ПКол>=100) Тогда
ПечКол="****";
КонецЕсли;
Иначе
ПечКол = глФРМКоличество(КолОбщ);
КонецЕсли;
Таб.ПрисоединитьСекцию("СтрокаГ|Склад");
КонецЕсли;
Если ВыводитьЗаказанный = 1 Тогда
Если (ФлагЗвездочки=1) Тогда
ПКол=ТЗ1.Заказано;
Попытка
Если (ПКол=0) Тогда
ПечЗаказано="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечЗаказано="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечЗаказано="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечЗаказано="***";
ИначеЕсли (ПКол>=100) Тогда
ПечЗаказано="****";
КонецЕсли;
Исключение
ПечЗаказано="";
КонецПопытки;
Иначе
ПечЗаказано = глФРМКоличество(ТЗ1.Заказано);
КонецЕсли;
Таб.ПрисоединитьСекцию("СтрокаГ|Заказано");
КонецЕсли;
Таб.ПрисоединитьСекцию("СтрокаГ|Заказ");
КонецЦикла;
ТЗ1.УдалитьСтроки();
ПечТекстСтроки = ТЗ.ПечТекстСтроки;
ПечЕд = ТЗ.ПечЕд;
ТекРасшифровка = ТЗ.ТекРасшифровка;
КонецЕсли;
Таб.ВывестиСекцию(ИмяСекции+"|ТМЦ");


Для ИИ=1 По ВыбранныеЦены.РазмерСписка() Цикл
Если ВыбранныеЦены.Пометка(ИИ)=1 Тогда
ОЦ1 = 0;
ЦЦ1 = 0;
ВалЦены = 0;
глВернутьЦену(ТЗ.ТекРасшифровка, ВыбранныеЦены.ПолучитьЗначение(ИИ,Эл), ТекущаяДата(), ЦЦ1,,ВалЦены,, ОЦ1);
ПечЦена=ЦЦ1;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Цена");
КонецЕсли;
КонецЦикла;

Сч = 0;
СтрСкл=0;
Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
Если СкладыВОтдельныхКолонках=1 Тогда
Если (ФлагЗвездочки=1) Тогда
ПКол=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч);
Если (ПКол=0) Тогда
ПечКол="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечКол="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечКол="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечКол="***";
ИначеЕсли (ПКол>=100) Тогда
ПечКол="****";
КонецЕсли;
Иначе
ПечКол = глФРМКоличество(ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч));
КонецЕсли;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Склад");
Иначе
СтрСкл = СтрСкл+ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, "Количество" + Сч);
КонецЕсли;
КонецЦикла;
Если СкладыВОтдельныхКолонках=0 Тогда
Если (ФлагЗвездочки=1) Тогда
ПКол=СтрСкл;
Если (ПКол=0) Тогда
ПечКол="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечКол="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечКол="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечКол="***";
ИначеЕсли (ПКол>=100) Тогда
ПечКол="****";
КонецЕсли;
Иначе
ПечКол = глФРМКоличество(СтрСкл);
КонецЕсли;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Склад");
КонецЕсли;
Если ВыводитьЗаказанный = 1 Тогда
Если (ФлагЗвездочки=1) Тогда
Попытка
ПКол=ТЗ.Заказано;
Если (ПКол=0) Тогда
ПечЗаказано="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечЗаказано="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечЗаказано="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечЗаказано="***";
ИначеЕсли (ПКол>=100) Тогда
ПечЗаказано="****";
КонецЕсли;
Исключение
ПечЗаказано="";
КонецПопытки;
Иначе
ПечЗаказано = глФРМКоличество(ТЗ.Заказано);
КонецЕсли;
ДатаЗаказа=ТЗ.ДатаЗаказа;
СтатДок=ТЗ.СтатДок;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Заказано");
КонецЕсли;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Заказ");
КонецЦикла;

Таб.ОбластьПечати(3);

// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Если глПолучитьПолномочие("РазрешитьРедактированиеТаблиц") = 0 Тогда
Таб.Защита(1);
КонецЕсли;
Таб.Показать("Остатки ТМЦ", "");

Если (Обновить = 2) Тогда
СтрокаДействийФормы = "#Закрыть";
КонецЕсли;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ
//
//******************************************************************************
// Предопределенная процедура
Процедура ПриОткрытии(ФлагВосстановленияНастройки)

// тип вид переменная название
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Номенклатура", "Номенклатура", "По номенклатуре");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Склады", "Склад", "По складам");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","ЗначенияСвойств", "Номенклатура", "По свойствам номенклатуры");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Фирмы", "Фирма", "По фирмам");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","СвоиЮрЛица", "ЮрЛицо", "По юр. лицам");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","УпрАналитика", "УпрАналитика", "По упр. аналитике");

Если ФлагВосстановленияНастройки = 0 Тогда

ВидЕдиницы = 1;
ВидРазделителя = 1;

КонецЕсли;

Если (ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений") и (глОбновить = 0) Тогда
глРасшифровка = Форма.Параметр;
ВызовИзДокумента = 1;
Форма.кнОк. Доступность(0);
Форма.кнСформировать. Заголовок("Просмотр");
КонецЕсли;

Если (глФлагРасшифровки = 1) или (ВызовИзДокумента = 1) Тогда
Обновить = глОбновить;

// восстанавливаем настройки из списка
ДатаКонца = глРасшифровка.Получить("ДатаКонца");
ВыбТМЦ = глРасшифровка.Получить("ВыбТМЦ");

ВалютаДокумента = глРасшифровка.Получить("ВалютаДокумента");
КурсДокумента = глРасшифровка.Получить("КурсДокумента");
КратностьДокумента = глРасшифровка.Получить("КратностьДокумента");

ВидЕдиницы = глРасшифровка.Получить("ВидЕдиницы");
ИтогиПоКоличеству = глРасшифровка.Получить("ИтогиПоКоличеству");

ПоказатьОстатки.ТекущаяСтрока(глРасшифровка.Получить("ПоказатьОстатки"));
Показатель. ТекущаяСтрока(глРасшифровка.Получить("Показатель"));
Если ТипЗначенияСтр(глРасшифровка.Получить("ТаблицаМФ"))="ТаблицаЗначений" Тогда
ТаблицаМФ.Загрузить(глРасшифровка.Получить("ТаблицаМФ"));
КонецЕсли;

Если Обновить <> 0 Тогда
Таб = глТаблица;
КонецЕсли;

Если (Обновить <> 2) и (ВызовИзДокумента <> 1) Тогда
Сформировать();
СтатусВозврата(0);
Возврат;
КонецЕсли;
Иначе
Обновить = 0;
КонецЕсли;

ПерерисовкаНазванийЗакладок();

ТаблицаМФ.ВидимостьКолонки("Тип",0);
ТаблицаМФ.ВидимостьКолонки("Вид",0);
ТаблицаМФ.ВидимостьКолонки("СписокЭлементов",0);
ТаблицаМФ.ВидимостьКолонки("ТипМФ",0);
ТаблицаМФ.ВидимостьКолонки("ИмяПеременной",0);

ТаблицаМФ.ВыводитьПиктограммы("ФлВкл");

УправлениеДиалогом();
СпрСклады=СоздатьОбъект("Справочник.Склады");
СпрСклады.НайтиПоНаименованию("Основной");
ВыбранныеСклады.ДобавитьЗначение(СпрСклады.ТекущийЭлемент());
ВыбранныеСклады.Пометка(1,1);
СпрСклады.ВыбратьЭлементы();
Пока СпрСклады.ПолучитьЭлемент()=1 Цикл
Если ВыбранныеСклады.НайтиЗначение(СпрСклады.ТекущийЭлемент())=0 Тогда
ВыбранныеСклады.ДобавитьЗначение(СпрСклады.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
ВыводитьЗаказанный=0;
СпрСклады=СоздатьОбъект("Справочник.ТипыЦен");
СпрСклады.ВыбратьЭлементы();
Пока СпрСклады.ПолучитьЭлемент()=1 Цикл
Если ВыбранныеЦены.НайтиЗначение(СпрСклады.ТекущийЭлемент())=0 Тогда
ВыбранныеЦены.ДобавитьЗначение(СпрСклады.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;

КонецПроцедуры // ПриОткрытии()

//******************************************************************************
// Предопределенная процедура.
//
Процедура ПриЗакрытии()

// записываем изменения если они были
глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст);

КонецПроцедуры // ПриЗакрытии()

//******************************************************************************
// Предопределенная процедура.
Процедура ВводНового()

// эта предопределенная процедура выполняется при восстановлении настройки
ПерерисовкаНазванийЗакладок();
УправлениеДиалогом();
ТаблицаМФ.ВыводитьПиктограммы("ФлВкл");

КонецПроцедуры // ВводНового()

//******************************************************************************
// Предопределенная процедура
//
Процедура ПриВыбореЗакладки(Номер,Значение)
// закладки
Если Номер=1 Тогда
глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст); // записываем изменения если они были
КонецЕсли;
УправлениеДиалогом();
ПерерисовкаНазванийЗакладок();

КонецПроцедуры // ПриВыбореЗакладки

//******************************************************************************
// Предопределенная процедура
//
Процедура ОбработкаПодбора(Значение)

Если (СписокЭлементовМФ.НайтиЗначение(Значение)=0) Тогда
Представление=""+Значение;
Если ТипЗначенияСтр(Значение)="Справочник" Тогда
Если СокрЛП(Метаданные.Справочник(Значение.Вид()).Владелец) <> "Метаданные" Тогда
Представление=Представление+" ("+Значение.Владелец+")";
КонецЕсли;
КонецЕсли;
СписокЭлементовМФ.ДобавитьЗначение(Значение,Представление);
ТаблицаМФ.ФлВкл=2;
КонецЕсли;

СписокЭлементовМФ.Выгрузить(ТаблицаМФ.СписокЭлементов);

КонецПроцедуры // ОбработкаПодбора


Процедура Установить(Режим = "")

Для а = 1 По ВыбранныеСклады.РазмерСписка() Цикл
Если Режим="Все" Тогда
ВыбранныеСклады.Пометка(а, 1);

ИначеЕсли Режим="Сброс" Тогда
ВыбранныеСклады.Пометка(а,0);

Иначе
ВыбранныеСклады.Пометка(а,?(ВыбранныеСклады.Пометка(а) = 1, 0, 1));
КонецЕсли;
КонецЦикла;

КонецПроцедуры // Установить()

Процедура Установить1(Режим = "")

Для а = 1 По ВыбранныеЦены.РазмерСписка() Цикл
Если Режим="Все" Тогда
ВыбранныеЦены.Пометка(а, 1);

ИначеЕсли Режим="Сброс" Тогда
ВыбранныеЦены.Пометка(а,0);

Иначе
ВыбранныеЦены.Пометка(а,?(ВыбранныеЦены.Пометка(а) = 1, 0, 1));
КонецЕсли;
КонецЦикла;

КонецПроцедуры // Установить()



////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
//
ДатаКонца=ПолучитьДатуТА();

ПоказатьОстатки.УдалитьВсе();
ПоказатьОстатки.ДобавитьЗначение("все ненулевые");
ПоказатьОстатки.ДобавитьЗначение("все");
ПоказатьОстатки.ДобавитьЗначение("все отрицательные");
ПоказатьОстатки.ДобавитьЗначение("меньше мин. остатка");
ПоказатьОстатки.ДобавитьЗначение("все, имеющиеся в наличии");
ПоказатьОстатки.ТекущаяСтрока(1);

Показатель.УдалитьВсе();
Показатель.ДобавитьЗначение("включая резерв");
Показатель.ДобавитьЗначение("за минусом резервов");
Показатель.ТекущаяСтрока(1);

// инициализация переменных множественного фильтра
ТипМФ.УдалитьВсе();
ТипМФ.ДобавитьЗначение("одно из");
ТипМФ.ДобавитьЗначение("все кроме");

ТаблицаМФ.УдалитьСтроки();
Пока ТаблицаМФ.КоличествоКолонок()>0 Цикл
ТаблицаМФ.УдалитьКолонку(1);
КонецЦикла;

ТаблицаМФ.НоваяКолонка("Тип");
ТаблицаМФ.НоваяКолонка("Вид");
ТаблицаМФ.НоваяКолонка("ИмяПеременной");
ТаблицаМФ.НоваяКолонка("СписокЭлементов"); // список элементов, по которым производим фильтрацию
ТаблицаМФ.НоваяКолонка("ТипМФ"); // текущая строка списка ТипМФ
ТаблицаМФ.НоваяКолонка("ФлВкл","Число",1,,"Вкл",5,,); // фильтр включен ("1" или "0")
ТаблицаМФ.НоваяКолонка("Представление",,,,"Вид фильтра:");
ТаблицаМФ.ВыводитьПиктограммы("ФлВкл");

ТекСтрокаВТаблице="";

// Инициализируем закладки
Форма.ИспользоватьЗакладки(1);
Форма.Закладки.ДобавитьЗначение(1,"Основная");
Форма.Закладки.ДобавитьЗначение(2,"Множественный фильтр");
Форма.Закладки.ТекущаяСтрока(1);


МаксимальныйУровень = 1;
 
V

Vladal

маленький совет - картинки лучше слать в PNG, ну или JPEG
 
V

vbs

1. Дайнеко, как всегда прав
2. Сравнимый по объему текст я читал лет 30 назад. Но то хоть была "Сага о Форсайтах", а это из принципа просмотрел по диагонали
3. Типовой конфигурацию счесть никак не могу. Смущает СтатусДокумента, в этом направлении и предлагаю пошаманить
 
U

unknown181538

А я не читал Сагу о Форсайтах, поэтому не собираюсь читать модуль этого отчета, пока не прочту!
 
I

Ivanushka

Функция ТекстЗапросаБезКомиссии()

СтрПериод = ?(ДатаКонца>= ПолучитьДатуТА(),"",
"Период с ДатаКонца по ДатаКонца;");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|" + СтрПериод +
"
|Фирма = Регистр.ОстаткиТМЦ.Фирма,
| Регистр.РезервыТМЦ.Фирма;
|УпрАналитика = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика,
| Регистр.РезервыТМЦ.Фирма.УпрАналитика;
|ЮрЛицо = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо,
| Регистр.РезервыТМЦ.Фирма.ЮрЛицо;
|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура,
| Регистр.Заказы.Номенклатура,
| Регистр.РезервыТМЦ.Номенклатура;
|Склад = Регистр.ОстаткиТМЦ.Склад,
| Регистр.РезервыТМЦ.Склад;
|РозничныйСклад = Регистр.ОстаткиТМЦ.Склад.РозничныйСклад,
| Регистр.РезервыТМЦ.Склад.РозничныйСклад;";

Если ВыводитьЗаказанный = 1 Тогда
ТекстЗапроса = ТекстЗапроса +
"Заказано = Регистр.Заказы.КоличествоПриход;
|ДатаЗаказа = Регистр.Заказы.ЗаказПоставщику.ДатаДок;
|СтатДок = Регистр.Заказы.ЗаказПоставщику.СтатусДокумента1;
|Функция ЗаказаноКонОст = КонОст(Заказано);";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса +
"Количество = Регистр.ОстаткиТМЦ.Количество;
|Резерв = Регистр.РезервыТМЦ.Количество;
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура"+?(ПоказатьОстатки.ТекущаяСтрока()>=2," Все","")+";";

Возврат ТекстЗапроса;

КонецФункции // ТекстЗапросаБезКомиссии()

....

Если ВыводитьЗаказанный = 1 Тогда
ТЗ.НоваяКолонка("Заказано", "Число");
ТЗ.НоваяКолонка("ДатаЗаказа", "Дата");
ТЗ.НоваяКолонка("СтатДок", "Значение");
КонецЕсли;


...

Если ВыводитьЗаказанный = 1 Тогда
Таб.ПрисоединитьСекцию("ШапкаТаблицы|Заказано");
КонецЕсли;
...
Если ВыводитьЗаказанный = 1 Тогда
ТЗ.Заказано = Запрос.ЗаказаноКонОст;
ТЗ.ДатаЗаказа = Запрос.ДатаЗаказа;
ТЗ.СтатДок = Запрос.СтатДок;
КонецЕсли;
...

Если ВыводитьЗаказанный = 1 Тогда
Если (ФлагЗвездочки=1) Тогда
ПКол=ТЗ1.Заказано;
Попытка
Если (ПКол=0) Тогда
ПечЗаказано="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечЗаказано="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечЗаказано="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечЗаказано="***";
ИначеЕсли (ПКол>=100) Тогда
ПечЗаказано="****";
КонецЕсли;
Исключение
ПечЗаказано="";
КонецПопытки;
Иначе
ПечЗаказано = глФРМКоличество(ТЗ1.Заказано);
КонецЕсли;
Таб.ПрисоединитьСекцию("СтрокаГ|Заказано");
КонецЕсли;
....


Если ВыводитьЗаказанный = 1 Тогда
Если (ФлагЗвездочки=1) Тогда
Попытка
ПКол=ТЗ.Заказано;
Если (ПКол=0) Тогда
ПечЗаказано="";
ИначеЕсли (ПКол>0) И (ПКол<10) Тогда
ПечЗаказано="*";
ИначеЕсли (ПКол>=10) И (ПКол<50) Тогда
ПечЗаказано="**";
ИначеЕсли (ПКол>=50) И (ПКол<100) Тогда
ПечЗаказано="***";
ИначеЕсли (ПКол>=100) Тогда
ПечЗаказано="****";
КонецЕсли;
Исключение
ПечЗаказано="";
КонецПопытки;
Иначе
ПечЗаказано = глФРМКоличество(ТЗ.Заказано);
КонецЕсли;
ДатаЗаказа=ТЗ.ДатаЗаказа;
СтатДок=ТЗ.СтатДок;
Таб.ПрисоединитьСекцию(ИмяСекции + "|Заказано");
КонецЕсли;
 
I

Ivanushka

Функция ТекстЗапросаБезКомиссии()

СтрПериод = ?(ДатаКонца>= ПолучитьДатуТА(),"",
"Период с ДатаКонца по ДатаКонца;");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|" + СтрПериод +
"
|Фирма = Регистр.ОстаткиТМЦ.Фирма,
| Регистр.РезервыТМЦ.Фирма;
|УпрАналитика = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика,
| Регистр.РезервыТМЦ.Фирма.УпрАналитика;
|ЮрЛицо = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо,
| Регистр.РезервыТМЦ.Фирма.ЮрЛицо;
|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура,
| Регистр.Заказы.Номенклатура,
| Регистр.РезервыТМЦ.Номенклатура;
|Склад = Регистр.ОстаткиТМЦ.Склад,
| Регистр.РезервыТМЦ.Склад;
|РозничныйСклад = Регистр.ОстаткиТМЦ.Склад.РозничныйСклад,
| Регистр.РезервыТМЦ.Склад.РозничныйСклад;";

Если ВыводитьЗаказанный = 1 Тогда
ТекстЗапроса = ТекстЗапроса +
"Заказано = Регистр.Заказы.КоличествоПриход;
|ДатаЗаказа = Регистр.Заказы.ЗаказПоставщику.ДатаДок;
|СтатДок = Регистр.Заказы.ЗаказПоставщику.СтатусДокумента1;
|Функция ЗаказаноКонОст = КонОст(Заказано);";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса +
"Количество = Регистр.ОстаткиТМЦ.Количество;
|Резерв = Регистр.РезервыТМЦ.Количество;
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура"+?(ПоказатьОстатки.ТекущаяСтрока()>=2," Все","")+";";

Возврат ТекстЗапроса;

КонецФункции // ТекстЗапросаБезКомиссии()


....


// выводим группы ТМЦ
Пока СписокГрупп.РазмерСписка()>0 Цикл
Группа = СписокГрупп.ПолучитьЗначение(1);
Если ТМЦ.ПринадлежитГруппе(Группа)=1 Тогда
ТЗ.НоваяСтрока();
ТЗ.Уровень = СписокГрупп.РазмерСписка();
ТЗ.ПечТекстСтроки = Группа.Наименование;
ТЗ.Родитель = Группа.Родитель;
ТЗ.ТекРасшифровка = Группа;
КонецЕсли;
СписокГрупп.УдалитьЗначение(1);
КонецЦикла;

ТМЦСтрока = "" + ТМЦ +?(ПечататьКомментарий=1," "+ТМЦ.Комментарий,"");//+ ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТМЦ.Артикул), "");

ТЗ.НоваяСтрока();
ТЗ.Уровень = 0;
ТЗ.ТекРасшифровка = ТМЦ;
ТЗ.Родитель = ТМЦ.Родитель;
ТЗ.ПечЕд = ТМЦ.БазоваяЕдиница;
ТЗ.ПечТекстСтроки = ТМЦСтрока;// + ?(ТМЦ.МинОстаток=0,"",", мин. остаток = "+СокрЛП(глФРМКоличество(ТМЦ.МинОстаток,ТЗ.ПечЕд)));
Если ВыводитьЗаказанный = 1 Тогда
ТЗ.Заказано = Запрос.ЗаказаноКонОст;
ТЗ.ДатаЗаказа = Запрос.ДатаЗаказа;
ТЗ.СтатДок = Запрос.СтатДок;
КонецЕсли;
ЗаполнитьСтроку(ТЗ, Запрос, СписокСкладов, 0);
глОживить(1);

КонецЦикла;





отчет выводит только одну дату и соответсвенно один статус. какой цикл нужно написать, чтобы выводил все вхождения ТМЦСтрока в документ заказ поставщику и выводил все даты документа
 
U

unknown181538

Такой текст я тоже могу читать из большого интереса или за деньги)
 
I

Ivanushka

что тогда конкретно нужно чтобы вы мне захотели помочь? я не знаю, как реализовать это в 1с 7.7((
 
V

vbs

Попробуй так :


Если ВыводитьЗаказанный = 1 Тогда
ТекстЗапроса = ТекстЗапроса +"
|Группировка СтатДок;";
КонецЕсли;
Синтаксис только проверь
 
I

Ivanushka

как написать цикл по всем документам, потому что сейчас в отчете берется во внимание только последний документ
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!