Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 дек 2024, 16:27

Отчет складской учет МПЗ

Автор Poltev86, 29 июл 2014, 16:06

0 Пользователей и 1 гость просматривают эту тему.

Poltev86

Ребят помогите новичку! Начальник попросил доработать отчет складской учет МПЗ! Конфигурация 1С 7.7 производство. Необходимо помимо наименования выводить еще и код справочника..ну что то на подобии порядкового номера! Ниже преведен код данного отчета!


// для расшифровки и обновления таблицы
Перем Расшифровка;
Перем Обновить;
Перем Таб;
Перем ТекРасшифровка;
Перем РасшифровыватьОтчет;

// для формирования и вывода таблицы
Перем Запрос;
Перем КоличествоГруппировок;
Перем СписокГруппировок;

// для формирования текущего остатка по документам
Перем ГруппировкаПоКодамОпераций;
Перем КолТекОст;
Перем ИтогоКолОст;

// для работы со списками условий
Перем КонтекстФормыПодбора;
Перем ТекущийСписок;
Перем ТекущееДействие;

Перем ТаблицаОтчета;
Перем ТекПолноеНаименование, ТекПорядок;
Перем НомерГруппировкиМПЗ;
Перем НомерГруппировкиМестоХранения;

// для управления закладками при расширенном условии
Перем СписокЗакладок;   
// для вывода сумм
Перем ТаблицаСумм;
Перем ИтогСуммаВсего;
Перем КонОстСумма;
Перем Действие;   
Перем ПредЦена;
Перем СуммовойУчетПоСкладам;

// для условия по пустому контрагенту - собственные МПЗ
Перем ПустойКонтрагент;
Перем ТипЦеныДляМатериаловСтр;

Процедура УстановитьУсловиеЗапроса(НомерУсловия, ФлагБольше, МоноУсловие, Список, ПеременнаяЗапроса, Текст, Заголовок) Далее

//******************************************************************************
// ПроверкаГП()
//
// Параметры:
//   Нет.
//
// Вызывается из формул элементов диалога:
//   Нет.
//
// Описание: Управляет текстом информации о границе последовательности.
//
Процедура ПроверкаГП()
   Если ДатаКон >= ПолучитьДатуТА() Тогда
      ПозицияГП = ПолучитьПозициюТА();
   Иначе
      ПозицияГП = ДатаКон + 1;
   КонецЕсли;
   Если Последовательность.Производство.Сравнить(ПозицияГП) = -1 Тогда
      Форма.ТекстГП.Заголовок("Граница последовательности: " + Формат(Последовательность.Производство.ПолучитьДату(), "Д ДДММГГГ") + " " + Последовательность.Производство.ПолучитьВремя(,,) + ". Необходимо восстановить последовательность.");
   Иначе
      Форма.ТекстГП.Заголовок("");
   КонецЕсли;
КонецПроцедуры // ПроверкаГП

//******************************************************************************
// УстановитьЗначенияСпискаГруппировок(НастраиваемыйСписок = 0)
//
// Параметры:
//  Нет.
//
// Вызывается из формул элементов диалога:
//   Нет.
//
// Описание:
//   Устанавливает значения группировок по представлению
//
Процедура УстановитьЗначенияСпискаГруппировок(НастраиваемыйСписок = 0)
   Если НастраиваемыйСписок = 0 Тогда
      НастраиваемыйСписок = Группировки;
   КонецЕсли;
   НастраиваемыйСписок.Установить("Вид МПЗ",       "ВидМПЗ");
   НастраиваемыйСписок.Установить("Место хранения",         "МестоХранения");
   НастраиваемыйСписок.Установить("Качество",      "Качество");
   НастраиваемыйСписок.Установить("МПЗ",           "МПЗ");
   НастраиваемыйСписок.Установить("Владелец",    "Владелец");
   НастраиваемыйСписок.Установить("По документам", "ТекДок");
КонецПроцедуры // УстановитьЗначенияСпискаГруппировок

//******************************************************************************
// ПроверкаДат()
//
// Параметры:
//   Нет.
//
// Вызывается из формул элементов диалога:
//   Нет.
//
// Описание: Проверяет интервал дат периода отчета.
//
Функция ПроверкаДат()
   Если ДатаНач > ПолучитьДатуТА() Тогда
      ДатаНач = ПолучитьДатуТА();
      Предупреждение("Начальная дата не может быть
                     |больше даты точки актуальности!");
      Возврат 0;
   ИначеЕсли ДатаНач > ДатаКон Тогда
      ДатаНач = ДатаКон;
      Предупреждение("Начальная дата не может быть больше
                     |конечной даты формирования отчета!");
      Возврат 0;
   КонецЕсли;
   ПроверкаГП();
   Возврат 1;
КонецФункции // ПроверкаДат

//******************************************************************************
// ПолучитьТекСписок()
//
// Параметры:
//  Нет.
//
// Вызывается из формул элементов диалога:
//   Нет.
//
// Описание:
//  Возвращает список условие, соответствующий текущему слою.
//
Функция ПолучитьТекСписок()
   ЗначениеЗакладки = Форма.Закладки.ПолучитьЗначение(Форма.Закладки.ТекущаяСтрока());
   Если ЗначениеЗакладки = "РасширенныеУсловияОбщий, СписокУсловие1" Тогда
      Возврат СписокУсловие1;
   ИначеЕсли ЗначениеЗакладки = "РасширенныеУсловияОбщий, СписокУсловие2" Тогда
      Возврат СписокУсловие2;
   ИначеЕсли ЗначениеЗакладки = "РасширенныеУсловияОбщий, СписокУсловие3" Тогда
      Возврат СписокУсловие3;
   ИначеЕсли ЗначениеЗакладки = "РасширенныеУсловияОбщий, СписокУсловие4" Тогда
      Возврат СписокУсловие4;
   ИначеЕсли ЗначениеЗакладки = "РасширенныеУсловияОбщий, СписокУсловие5" Тогда
      Возврат СписокУсловие5;   
   КонецЕсли;
КонецФункции // ПолучитьТекСписок()

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


//******************************************************************************
// УправлениеДиалогомУсловия(НомерУсловия, ФлагБольше)
//
// Параметры:
//  НомерУсловия  - число, номер условия.
//   ФлагБольше - число, 0 - используется одиночное условие, 1 - используется список условий.
//
// Вызывается из формул элементов диалога:
//   Нет.
//
// Описание:
//   Управление видимостью и надписями кнопок слоя "ПростыеУсловия".
//
Процедура УправлениеДиалогомУсловия(НомерУсловия, ФлагБольше)
   Если ФлагБольше = 1 Тогда
      Форма.ПолучитьАтрибут("МоноУсловие" + НомерУсловия).Видимость(0);
      Форма.ПолучитьАтрибут("КнопкаОчиститьУсловие" + НомерУсловия).Видимость(0);
      Форма.ПолучитьАтрибут("СтрБольшеУсловие" + НомерУсловия).Видимость(1);
      Форма.ПолучитьАтрибут("КнопкаБольшеУсловие" + НомерУсловия).Заголовок("<<");
      Если НомерУсловия = 4 Тогда
         Форма.ПолучитьАтрибут("КнопкаПустоеУсловие4").Видимость(0);
      КонецЕсли;
   Иначе
      Форма.ПолучитьАтрибут("МоноУсловие" + НомерУсловия).Видимость(1);
      Форма.ПолучитьАтрибут("КнопкаОчиститьУсловие" + НомерУсловия).Видимость(1);
      Форма.ПолучитьАтрибут("СтрБольшеУсловие" + НомерУсловия).Видимость(0);
      Форма.ПолучитьАтрибут("КнопкаБольшеУсловие" + НомерУсловия).Заголовок(">>");
      Если НомерУсловия = 4 Тогда
         Форма.ПолучитьАтрибут("КнопкаПустоеУсловие4").Видимость(1);
      КонецЕсли;
   КонецЕсли;
   СписокЗакладок.Пометка(НомерУсловия + 1, ФлагБольше);
КонецПроцедуры // УправлениеДиалогомУсловия

//******************************************************************************
// УправлениеВидимостьюСлояПростыеУсловия()
//
// Параметры:
//  Нет.
//
// Вызывается из формул элементов диалога:
//   Нет.
//
// Описание:
//   Процедура управления диалогом.
//
Процедура УправлениеВидимостьюСлояПростыеУсловия()
   УправлениеДиалогомУсловия(1, ФлажокУсловие1);
   УправлениеДиалогомУсловия(2, ФлажокУсловие2);
   УправлениеДиалогомУсловия(3, ФлажокУсловие3);
   УправлениеДиалогомУсловия(4, ФлажокУсловие4);
   УправлениеДиалогомУсловия(5, ФлажокУсловие5);

   СписокЗакладок.Пометка(1,?(ВидОтчета = 2,1,0))
КонецПроцедуры // УправлениеВидимостьюСлояПростыеУсловия

//******************************************************************************
// УправлениеДиалогом()
//
// Параметры:
//  Нет.
//
// Вызывается из формул элементов диалога:
//   Нет.
//
// Описание:
//   Управление закладками.
//
Процедура УправлениеДиалогом()
   УправлениеВидимостьюСлояПростыеУсловия();
   Если ФлажокУсловие1 +
        ФлажокУсловие2 +
        ФлажокУсловие3 +
       ФлажокУсловие4 +
       ФлажокУсловие5 +
       ВидОтчета - 1 = 0 Тогда
      Форма.ИспользоватьЗакладки(0);
   Иначе
      Если Форма.ИспользоватьЗакладки() = 0 Тогда
         Форма.ИспользоватьЗакладки(1);
      КонецЕсли;
      Форма.Закладки.УдалитьВсе();
      Форма.Закладки.ДобавитьЗначение("ПростыеУсловия", "Простые условия");
      Для х = 1 по СписокЗакладок.РазмерСписка() Цикл
         ПредставлениеЗакладки = "";
         ЗначениеЗакладки = СписокЗакладок.ПолучитьЗначение(х, ПредставлениеЗакладки);
         ЕстьЗакладка = Форма.Закладки.НайтиЗначение(ЗначениеЗакладки);
         Если (СписокЗакладок.Пометка(х) = 1) и (ЕстьЗакладка = 0) Тогда
            Форма.Закладки.ДобавитьЗначение(ЗначениеЗакладки, ПредставлениеЗакладки);
         ИначеЕсли (СписокЗакладок.Пометка(х) = 0) и (ЕстьЗакладка > 0) Тогда
            Форма.Закладки.УдалитьЗначение(ЕстьЗакладка);
         КонецЕсли;
      КонецЦикла;
   КонецЕсли;
КонецПроцедуры // УправлениеДиалогом()

//******************************************************************************
// УправлениеРеквизитами()
//
// Параметры:
//   Нет.
//
// Вызывается из формул элементов диалога:
//  Нет.
//
// Описание:
//   Управление элементами слоя "Общий".
//
Процедура УправлениеРеквизитами()
   Если ВидОтчета  = 2 Тогда
      Форма.ВыводитьПриход.Доступность(0);
      Форма.ВыводитьРасход.Доступность(0);
      Форма.ВыводитьНачОст.Доступность(0);
      Форма.ВыводитьКонОст.Доступность(0);
      Форма.РамкаГрафы.Доступность(0);
      Форма.ВыводитьОстаткиСЦенами.Доступность(1);
      //Форма.ВыводитьСвободныеОстатки.Доступность(1);
      //Форма.ВыводитьОтрицательныеОстатки.Доступность(1);
      Форма.кнНастройкаГруппировок.Доступность(0);
   Иначе
      Форма.ВыводитьПриход.Доступность(1);
      Форма.ВыводитьРасход.Доступность(1);
      Форма.ВыводитьНачОст.Доступность(1);
      Форма.ВыводитьКонОст.Доступность(1);
      Форма.РамкаГрафы.Доступность(1);
      Форма.ВыводитьОстаткиСЦенами.Доступность(0);
      //Форма.ВыводитьСвободныеОстатки.Доступность(0);
      //Форма.ВыводитьОтрицательныеОстатки.Доступность(0);
      Форма.кнНастройкаГруппировок.Доступность(1);
   КонецЕсли;
КонецПроцедуры // УправлениеРеквизитами

//******************************************************************************
// УправлениеСпискомГруппировок(ПоКнопкеОбновить = 0)
//
// Параметры:
//   ПоКнопкеОбновить - число, 1 - при вызове из процедуры ПриОткрытии();
//
// Возвращаемое значение:
//   Нет.
//
// Вызывается из формул элементов диалога:
//  Нет.
//
// Описание:
//   Управление составом списка группировок.
//
Процедура УправлениеСпискомГруппировок(ПоКнопкеОбновить = 0)
   Если ВидОтчета  = 2 Тогда
      Если (ПоКнопкеОбновить = 0) и ((ПоказатьОстатки.ТекущаяСтрока() = 1) или (ПоказатьОстатки.ТекущаяСтрока() = 3) или (ПоказатьОстатки.ТекущаяСтрока() = 5)) Тогда
         
         ПометкаМХ = 0;
         ПометкаВладелец = 0;
         ПометкаВидМПЗ = 1;
         ПометкаМПЗ = 1;
         ПометкаКачество = 1;
         // Запомним пометки
         Если Группировки.НайтиЗначение("МестоХранения") > 0  Тогда
            ПометкаМХ = Группировки.Пометка(Группировки.НайтиЗначение("МестоХранения"));
         КонецЕсли;
         Если Группировки.НайтиЗначение("Владелец") > 0  Тогда
            ПометкаВладелец = Группировки.Пометка(Группировки.НайтиЗначение("Владелец"));
         КонецЕсли;
         Если Группировки.НайтиЗначение("Качество") > 0  Тогда
            ПометкаКачество = Группировки.Пометка(Группировки.НайтиЗначение("Качество"));
         КонецЕсли;
         
         
         НастраиваемыйСписок = СоздатьОбъект("СписокЗначений");
         НастраиваемыйСписок.ДобавитьЗначение("", "Место хранения");
         НастраиваемыйСписок.ДобавитьЗначение("", "Владелец");
         НастраиваемыйСписок.ДобавитьЗначение("", "Вид МПЗ");
         НастраиваемыйСписок.ДобавитьЗначение("", "Качество");
         НастраиваемыйСписок.ДобавитьЗначение("", "МПЗ");
         
         // состав группировок отчета
         НастраиваемыйСписок.Пометка(1, ПометкаМХ);
         НастраиваемыйСписок.Пометка(2, ПометкаВладелец);
         НастраиваемыйСписок.Пометка(3, ПометкаВидМПЗ);
         НастраиваемыйСписок.Пометка(4, ПометкаКачество);
         НастраиваемыйСписок.Пометка(5, ПометкаМПЗ);
         
         НастраиваемыйСписок.Установить("Вид МПЗ",       "ВидМПЗ");
         НастраиваемыйСписок.Установить("Место хранения",         "МестоХранения");
         НастраиваемыйСписок.Установить("МПЗ",           "МПЗ");
         НастраиваемыйСписок.Установить("Владелец",    "Владелец");
         НастраиваемыйСписок.Установить("Качество",    "Качество");
         
         НастраиваемыйСписок.Выгрузить(Группировки);
         
      КонецЕсли;

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

//*****************************************************************************
// ПриВыбореТипаСуммы()
//
// Параметры:
//   Нет.
//
// Возвращаемое значение:
//   Нет.
//
// Вызывается из формул элементов диалога:
//  Список типа суммы.
//
// Описание:
//
Процедура ПриВыбореТипаСуммы()
   Если (ТипыСуммы.ТекущаяСтрока() = 2) Тогда
      Форма.ТипЦеныДляМатериалов.Доступность(ВыводитьОстаткиСЦенами);
      Форма.ТипЦеныДляНоменклатуры.Доступность(ВыводитьОстаткиСЦенами);
      Форма.ПодписьТипЦеныДляМатериалов.Доступность(ВыводитьОстаткиСЦенами);
      Форма.ПодписьТипЦеныДляНоменклатуры.Доступность(ВыводитьОстаткиСЦенами);
   Иначе
      Форма.ПодписьТипЦеныДляМатериалов.Доступность(0);
      Форма.ПодписьТипЦеныДляНоменклатуры.Доступность(0);
      Форма.ТипЦеныДляМатериалов.Доступность(0);
      Форма.ТипЦеныДляНоменклатуры.Доступность(0);
   КонецЕсли;   
КонецПроцедуры //ПриВыбореТипаСуммы()

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

   Иначе

      Форма.КнопкаВверх.Доступность(1);
      Форма.КнопкаВниз.Доступность(1);
      
   КонецЕсли;
   
   Если (ПоказатьОстатки.ТекущаяСтрока() > 2) Тогда
      ВыводитьОстаткиСЦенами = 0;

      Форма.ВыводитьОстаткиСЦенами.Доступность(0);

      Форма.ТипыСуммы.Доступность(0);   
      
   Иначе

      Форма.ВыводитьОстаткиСЦенами.Доступность(1);
      
   КонецЕсли;
   
   ПриВыбореТипаСуммы();
   
   УправлениеСпискомГруппировок(ПоКнопкеОбновить);   
КонецПроцедуры // ПриУстановкеВидаОтчетаПоОстаткам()

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

   Форма.ИспользоватьСлой("Основной," + ЗначениеЗакладки, 2);
   Если ЗначениеЗакладки = "ПростыеУсловия" Тогда
      УправлениеВидимостьюСлояПростыеУсловия();      
   КонецЕсли;
   Если ЗначениеЗакладки = "УсловияПоОстаткам" Тогда
      Форма.РамкаГруппыУсловия.Заголовок("Условия отчета по остаткам на конец периода");
   Иначе
      Форма.РамкаГруппыУсловия.Заголовок("Условия (если не выбрано, то по всем)");
   КонецЕсли;

КонецПроцедуры //ОбработкаВыбораЗакладки(НомерЗакладки, ЗначениеЗакладки)

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


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

//******************************************************************************
// ОбработкаФормулы(ИдентЭлементаДиалога)
//
// Параметры:
//   ИдентЭлементаДиалога - строка, идентификатор элемента диалога..
//
// Возвращаемое значение:
//   Нет.
//
// Вызывается из формул элементов диалога:
//  Да.
//
// Описание:
//   Обработка действия на элементы управления слоя "ПростыеУсловия".
//
Процедура ОбработкаФормулы(ИдентЭлементаДиалога)
   Если ИдентЭлементаДиалога = "МоноУсловие1" Тогда
      ПриВыбореУсловия("ВидМПЗ", МоноУсловие1);
   ИначеЕсли ИдентЭлементаДиалога = "МоноУсловие2" Тогда
      ПриВыбореУсловия("МестоХранения",    МоноУсловие2);
   ИначеЕсли ИдентЭлементаДиалога = "МоноУсловие3" Тогда
      ПриВыбореУсловия("МПЗ", МоноУсловие3);
   ИначеЕсли ИдентЭлементаДиалога = "МоноУсловие4" Тогда
      ПриВыбореУсловия("Владелец", МоноУсловие4);
   ИначеЕсли ИдентЭлементаДиалога = "МоноУсловие5" Тогда
      ПриВыбореУсловия("Качество", МоноУсловие5);   
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаОчиститьУсловие1" Тогда
      МоноУсловие1 = "";
      ПриВыбореУсловия("ВидМПЗ", МоноУсловие1);
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаОчиститьУсловие2" Тогда
      МоноУсловие2 = "";
      ПриВыбореУсловия("МестоХранения",    МоноУсловие2);
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаОчиститьУсловие3" Тогда
      МоноУсловие3 = "";
      ПриВыбореУсловия("МПЗ", МоноУсловие3);
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаОчиститьУсловие4" Тогда
      МоноУсловие4 = "";
      ПриВыбореУсловия("Владелец", МоноУсловие4);
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаОчиститьУсловие5" Тогда
      МоноУсловие5 = "";
      ПриВыбореУсловия("Качество", МоноУсловие5);   
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаБольшеУсловие1" Тогда
      ФлажокУсловие1 = ?(ФлажокУсловие1 = 1, 0, 1);
      УправлениеДиалогом();
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаБольшеУсловие2" Тогда
      ФлажокУсловие2 = ?(ФлажокУсловие2 = 1, 0, 1);
      УправлениеДиалогом();
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаБольшеУсловие3" Тогда
      ФлажокУсловие3 = ?(ФлажокУсловие3 = 1, 0, 1);
      УправлениеДиалогом();
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаБольшеУсловие4" Тогда
      ФлажокУсловие4 = ?(ФлажокУсловие4 = 1, 0, 1);
      УправлениеДиалогом();
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаПустоеУсловие4" Тогда
      Форма.МоноУсловие4.НазначитьТип("Строка",30);
      МоноУсловие4 = "<не выбран - собственные МПЗ>";
      ПриВыбореУсловия("Владелец", МоноУсловие4);
   ИначеЕсли ИдентЭлементаДиалога = "КнопкаБольшеУсловие5" Тогда
      ФлажокУсловие5 = ?(ФлажокУсловие5 = 1, 0, 1);
      УправлениеДиалогом();   
   КонецЕсли;
КонецПроцедуры // ОбработкаФормулы()

//******************************************************************************
// НастройкаГруппировок()
//
// Параметры:
//   Нет.
//
// Возвращаемое значение:
//   Нет.
//
// Вызывается из формул элементов диалога:
//  - кнопка стандартных настроек группировок.
//
// Описание:
//   Стандартные настройки списка группировок.
//
Процедура НастройкаГруппировок()
   
   Меню = СоздатьОбъект("СписокЗначений");
   Меню.ДобавитьЗначение("Стандарт", "Развернутая (стандартная)");
   Меню.ДобавитьЗначение("ПоМПЗ", "Анализ складских запасов");
   Меню.ДобавитьЗначение("ПоСкладам", "Анализ МПЗ по складам");
   Значение = "";
   
   Если Меню.ВыбратьЗначение(Значение, , , , 1) = 0 Тогда
      Возврат;
   КонецЕсли;
   
   НастраиваемыйСписок = СоздатьОбъект("СписокЗначений");
   Если Значение = "Стандарт" Тогда
      // порядок группировок и расшифровок отчета
      НастраиваемыйСписок.ДобавитьЗначение("", "Вид МПЗ");
      НастраиваемыйСписок.ДобавитьЗначение("", "Место хранения");
      НастраиваемыйСписок.ДобавитьЗначение("", "МПЗ");
      НастраиваемыйСписок.ДобавитьЗначение("", "Качество");
      НастраиваемыйСписок.ДобавитьЗначение("", "Владелец");
      НастраиваемыйСписок.ДобавитьЗначение("", "По документам");

      // состав группировок отчета
      НастраиваемыйСписок.Пометка(1, 1);
      НастраиваемыйСписок.Пометка(2, 1);
      НастраиваемыйСписок.Пометка(3, 1);
      НастраиваемыйСписок.Пометка(4, 0);
      НастраиваемыйСписок.Пометка(5, 0);
      НастраиваемыйСписок.Пометка(6, 0);
   ИначеЕсли Значение = "ПоМПЗ" Тогда
      // порядок группировок и расшифровок отчета
      НастраиваемыйСписок.ДобавитьЗначение("", "Вид МПЗ");
      НастраиваемыйСписок.ДобавитьЗначение("", "Место хранения");
      НастраиваемыйСписок.ДобавитьЗначение("", "МПЗ");
      НастраиваемыйСписок.ДобавитьЗначение("", "Качество");
      НастраиваемыйСписок.ДобавитьЗначение("", "Владелец");
      НастраиваемыйСписок.ДобавитьЗначение("", "По документам");

      // состав группировок отчета
      НастраиваемыйСписок.Пометка(1, 0);
      НастраиваемыйСписок.Пометка(2, 1);
      НастраиваемыйСписок.Пометка(3, 1);
      НастраиваемыйСписок.Пометка(4, 0);
      НастраиваемыйСписок.Пометка(5, 0);
      НастраиваемыйСписок.Пометка(6, 0);
   ИначеЕсли Значение = "ПоСкладам" Тогда
      // порядок группировок и расшифровок отчета
      НастраиваемыйСписок.ДобавитьЗначение("", "Вид МПЗ");
      НастраиваемыйСписок.ДобавитьЗначение("", "МПЗ");
      НастраиваемыйСписок.ДобавитьЗначение("", "Место хранения");
      НастраиваемыйСписок.ДобавитьЗначение("", "Качество");
      НастраиваемыйСписок.ДобавитьЗначение("", "Владелец");
      НастраиваемыйСписок.ДобавитьЗначение("", "По документам");

      // состав группировок отчета
      НастраиваемыйСписок.Пометка(1, 0);
      НастраиваемыйСписок.Пометка(2, 1);
      НастраиваемыйСписок.Пометка(3, 1);
      НастраиваемыйСписок.Пометка(4, 0);
      НастраиваемыйСписок.Пометка(5, 0);
      НастраиваемыйСписок.Пометка(6, 0);
   КонецЕсли;
   УстановитьЗначенияСпискаГруппировок(НастраиваемыйСписок);
   Если НастраиваемыйСписок.РазмерСписка() = 5 Тогда
      НастраиваемыйСписок.Выгрузить(Группировки);
   КонецЕсли;
КонецПроцедуры // КнопкаНастройкиГруппировок()

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

   Если НомерУсловия = 3 Тогда
      Если Представление = "Продукция" Тогда
         ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Продукция;
      ИначеЕсли Представление = "Полуфабрикаты" Тогда
         ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Полуфабрикат;
      ИначеЕсли Представление = "Товары" Тогда
         ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Товар;
      КонецЕсли;
   КонецЕсли;
   Возврат "Справочник." + Значение;
КонецФункции // ВыбратьСправочник()

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

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

//******************************************************************************
// ДействиеСоСписком(Список, Действие)
//
// Параметры:
//   Список - Список значений условий,
//   Действие - строка, команда.
//
// Вызывается из формул элементов диалога:
//  - кнопки управления списком условий.
//
// Описание:
//   Управление списком условий.
//
Процедура ДействиеСоСписком(Список, Действие)
   Если (ТипЗначения(КонтекстФормыПодбора) = 100) и
        ((Действие = "Изменить") или
        (Действие = "Добавить") или
        (Действие = "Подобрать")) Тогда
      Предупреждение("Сначала завершите предыдущий выбор");
      КонтекстФормыПодбора.Активизировать();
      Возврат;
   КонецЕсли;
   
   ЗаголовокФормыПодбора = "";
   Если (Действие = "Добавить") или (Действие = "Подобрать") или (Действие = "Изменить") Тогда
      Если Список = СписокУсловие1 Тогда
         ФормаПодбора = "Обработка.ВыводТаблицыЗначений";
         КонтекстФормыПодбора = СформироватьТаблицуПеречислений(Перечисление.ВидыМПЗ, ЗаголовокФормыПодбора);
      ИначеЕсли Список = СписокУсловие2 Тогда
         ФормаПодбора = "Справочник.МестаХранения";
      ИначеЕсли Список = СписокУсловие3 Тогда
         ФормаПодбора = 3;
      ИначеЕсли Список = СписокУсловие4 Тогда
         ФормаПодбора = "Справочник.Контрагенты";
      ИначеЕсли Список = СписокУсловие5 Тогда
         ФормаПодбора = "Обработка.ВыводТаблицыЗначений";
         КонтекстФормыПодбора = СформироватьТаблицуПеречислений(Перечисление.КачествоМПЗ, ЗаголовокФормыПодбора);
      КонецЕсли;
   КонецЕсли;

   Если (Действие = "Изменить") или
        (Действие = "Добавить") или
        (Действие = "Подобрать") Тогда
      ТекущийСписок = Список;
      ТекущееДействие = Действие;
   КонецЕсли;
   
   Если Действие = "Изменить" Тогда
      Если Список.РазмерСписка() = 0 Тогда
         ДействиеСоСписком(Список, "Добавить");
      Иначе
         ФормаСписка = "";
         Значение = Список.ПолучитьЗначение(Список.ТекущаяСтрока());
         Если ТипЗначенияСтр(ФормаПодбора) = "Число" Тогда // выбор МПЗ
            ФормаСписка = "ДляВыбора";
            ФормаПодбора = ВыбратьСправочник(ФормаПодбора, , КонтекстФормыПодбора, Значение);
         КонецЕсли;   
         ОткрытьПодбор(ФормаПодбора, ФормаСписка, КонтекстФормыПодбора, , Значение);
         Если Лев(ФормаПодбора, 9) = "Обработка" Тогда
            КонтекстФормыПодбора.Форма.Заголовок(ЗаголовокФормыПодбора);
         КонецЕсли;
      КонецЕсли;
   ИначеЕсли (Действие = "Добавить") или (Действие = "Подобрать") Тогда
      Если ТипЗначенияСтр(ФормаПодбора) = "Число" Тогда // выбор МПЗ
         ФормаСписка = "ДляВыбора";
         ФормаПодбора = ВыбратьСправочник(ФормаПодбора, , КонтекстФормыПодбора);
         Если ФормаПодбора = 0 Тогда
            Возврат;
         КонецЕсли;
      КонецЕсли;
      ОткрытьПодбор(ФормаПодбора, ФормаСписка, КонтекстФормыПодбора);
      Если Лев(ФормаПодбора, 9) = "Обработка" Тогда
         КонтекстФормыПодбора.Форма.Заголовок(ЗаголовокФормыПодбора);
      КонецЕсли;
   ИначеЕсли Действие = "Удалить" Тогда
      Если Список.ТекущаяСтрока() <> 0 Тогда
         НомерТекущейСтроки = Список.ТекущаяСтрока();
         Список.УдалитьЗначение(НомерТекущейСтроки);
         Если НомерТекущейСтроки > Список.РазмерСписка() Тогда
            // если удален последний элемент списка, то текущая строка сбрасывается
            // и при последующем нажатие на кнопку удалить ничего не происходит
            Список.ТекущаяСтрока(0);
         Иначе
            Список.ТекущаяСтрока(НомерТекущейСтроки);
         КонецЕсли;
      КонецЕсли;
   ИначеЕсли Действие = "УдалитьВсе" Тогда
      Если Список.РазмерСписка() <> 0 Тогда
         Если Вопрос("Удалить все значения списка?", "Да+Нет") = "Да" Тогда
            Список.УдалитьВсе();
         КонецЕсли;
      КонецЕсли;
   КонецЕсли;

   Если (ТипЗначения(КонтекстФормыПодбора) = 100) и
        (Лев(ФормаПодбора, 10) = "Справочник") Тогда
      КонтекстФормыПодбора.ВыборГруппы(1);
   КонецЕсли;
КонецПроцедуры // ДействиеСоСписком

//******************************************************************************
// ПолучитьИндекс(МПЗ, МестоХранения = "")
//
Функция ПолучитьИндекс(МПЗ, МестоХранения = "")
   
   Индекс = ЗначениеВСтрокуВнутр(МПЗ);
   Если (СуммовойУчетПоСкладам = 1) и
       (ПустоеЗначение(МестоХранения) = 0) и
       (НомерГруппировкиМестоХранения <> 0) и
       (ТипыСуммы.ТекущаяСтрока() = 1) Тогда
      Индекс = Индекс + " " + ЗначениеВСтрокуВнутр(МестоХранения);
   КонецЕсли;
   
   Возврат Индекс;
   
КонецФункции // ПолучитьИндекс()

//*****************************************************************************
// ЗаполнитьСебестоимости(ТаблицаСебестоимостей, СписокОстМПЗ)
//
// Параметры:
//   ТаблицаСебестоимостей - таблица значений, получаемая по ссылке, заполняется из запроса,
//   СписокМПЗ - список МПЗ, для которых нужно получить остатки партий.
//
// Вызывается из формул элементов диалога:
//  Нет.
//
// Описание:
//   используется для получения таблицы партионных остатков МПЗ из списка
//
Процедура ЗаполнитьСебестоимости(ТаблицаСебестоимостей, СписокМПЗ)
   
   Если ТипЗначенияСтр(СписокМПЗ) <> "СписокЗначений" Тогда
      СписокМПЗ = СоздатьОбъект("СписокЗначений");
   КонецЕсли;
   
   Если ТипЗначенияСтр(ТаблицаСебестоимостей) <> "ТаблицаЗначений"  Тогда
      ТаблицаСебестоимостей = СоздатьОбъект("ТаблицаЗначений");
    КонецЕсли;

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

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

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


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

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

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

   ПозГруппировкиМПЗ = СписокГруппировок.НайтиЗначение("МПЗ");
   Действие = "";
   Для Сч = 1 по ПозГруппировкиМПЗ - 1 Цикл
      Действие = Действие + "+";
   КонецЦикла;
   Действие = Действие + " ";
   Для Сч = ПозГруппировкиМПЗ + 1 по СписокГруппировок.РазмерСписка() Цикл
   Действие = Действие + "=";
   КонецЦикла;
   
   
Возврат Действие;
КонецФункции   // СформироватьТаблицуОстатковСЦенами()

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

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

//******************************************************************************
// ВывестиСтроку(ИдентификаторСекции, ИмяРесурса, НаименГруппировки, Наимен, ТекДок, ДатаДок, НомерГруппировки = 0)
//
// Параметры:
//   ИдентификаторСекции - строка, идентификатор секции таблицы,
//   ИмяРесурса - строка, наименование ресурса,
//   НаименГруппировки - строка, наименование группировки,
//   Наимен - строка, значение группировки,
//   ТекДок - документ для расшифровки отчета по документам,
//   ДатаДок - дата документа,
//   НомерГруппировки - число, номер группировки.
//
// Возвращаемое значение:
//   Нет.
//
// Вызывается из формул элементов диалога:
//  Нет.
//
// Описание:
//   Вывод строки отчета в таблицу.
//
Процедура ВывестиСтроку(ИдентификаторСекции, ИмяРесурса, НаименГруппировки, Наимен, ТекДок, ДатаДок, НомерГруппировки = 0, ИзЗапроса = 0)
   
   СтрНаимен = "" + Наимен;
   // Добавим перед наименованием МПЗ код, артикул или счет учета.
   Если (НаименГруппировки = "МПЗ") и (ТипЗначенияСтр(Наимен) = "Справочник") Тогда
      ДопИнформация = глПолучитьИнформациюДляКолонки(Наимен, "ВыводитьДляМПЗвОтчетах");
      Если Наимен.ЭтоГруппа() = 0 Тогда
         СтрНаимен = "" + СтрНаимен + " (" + Наимен.ЕдиницаИзмерения + ")";
         Если ПустоеЗначение(ДопИнформация) = 0 Тогда
            СтрНаимен = СокрЛП(ДопИнформация) + " " + СтрНаимен;
         КонецЕсли;
      КонецЕсли;
   КонецЕсли;
   
   Таб.ВывестиСекцию(ИдентификаторСекции + ИмяРесурса + "|Показатель");
   Приход = 0;
   Расход = 0;
   Если ВыводитьНачОст = 1 Тогда
      Если ИзЗапроса = 1 Тогда
         НачОст = Запрос.ПолучитьАтрибут(ИмяРесурса + "НачОст");
      Иначе
         НачОст = ТаблицаОтчета.ПолучитьЗначение(ТаблицаОтчета.НомерСтроки, ИмяРесурса + "НачОст");
      КонецЕсли;
      Таб.ПрисоединитьСекцию(ИдентификаторСекции + ИмяРесурса + "|НачОст");
   КонецЕсли;
   Если ВыводитьПриход = 1 Тогда
      Если ИзЗапроса = 1 Тогда
         Приход = Запрос.ПолучитьАтрибут(ИмяРесурса + "Приход");
      Иначе
         Приход = ТаблицаОтчета.ПолучитьЗначение(ТаблицаОтчета.НомерСтроки, ИмяРесурса + "Приход");
      КонецЕсли;
      Таб.ПрисоединитьСекцию(ИдентификаторСекции + ИмяРесурса + "|Приход");
   КонецЕсли;
   Если ВыводитьРасход = 1 Тогда
      Если ИзЗапроса = 1 Тогда
         Расход = Запрос.ПолучитьАтрибут(ИмяРесурса + "Расход");
      Иначе
         Расход = ТаблицаОтчета.ПолучитьЗначение(ТаблицаОтчета.НомерСтроки, ИмяРесурса + "Расход");
      КонецЕсли;
      Таб.ПрисоединитьСекцию(ИдентификаторСекции + ИмяРесурса + "|Расход");
   КонецЕсли;
   
   Если ВыводитьКонОст = 1 Тогда
      Если ПоказатьОстатки.ТекущаяСтрока() = 2 Тогда
         РезКонОст = 0;
         Если ИзЗапроса = 0 Тогда
            РезКонОст = ТаблицаОтчета.ПолучитьЗначение(ТаблицаОтчета.НомерСтроки, "РезКонОст");
         КонецЕсли;
      КонецЕсли;
      
      Если НаименГруппировки = "ТекДок" Тогда
         КолТекОст = КолТекОст + Приход - Расход;
         Таб.ПрисоединитьСекцию(ИдентификаторСекции + ИмяРесурса + "|КонОст");
      Иначе
         Если ИзЗапроса = 1 Тогда
            Если (ПоказатьОстатки.ТекущаяСтрока() = 4) или (ПоказатьОстатки.ТекущаяСтрока() = 5) Тогда
               КонОст = ИтогоКолОст;
            Иначе
               КонОст = Запрос.ПолучитьАтрибут(ИмяРесурса + "КонОст");
            КонецЕсли;
         Иначе
            КонОст = ТаблицаОтчета.ПолучитьЗначение(ТаблицаОтчета.НомерСтроки, ИмяРесурса + "КонОст");
         КонецЕсли;
         
         Если ПоказатьОстатки.ТекущаяСтрока() = 2 Тогда
            КонОст = КонОст - РезКонОст;
         КонецЕсли;
         
         КолТекОст = НачОст;
         Таб.ПрисоединитьСекцию(ИдентификаторСекции + ИмяРесурса + "|КонОст");
      КонецЕсли;

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

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

   НаименГруппировки = СписокГруппировок.ПолучитьЗначение(НомерГруппировки);
   Наимен = ТаблицаОтчета.ПолучитьЗначение(ТаблицаОтчета.НомерСтроки, НаименГруппировки);

   ЭтоГруппа = 0;
   Если ТипЗначенияСтр(Наимен) = "Справочник" Тогда
      Если Наимен.Вид() <> "" Тогда
         ЭтоГруппа = Наимен.ЭтоГруппа();
      КонецЕсли;
   КонецЕсли;

   Если ПустоеЗначение(Наимен) = 1 Тогда
      Если НаименГруппировки = "Владелец" Тогда
         Наимен = "<не выбран - собственные МПЗ>";
      ИначеЕсли НаименГруппировки = "ТекДок" Тогда
         Возврат;
      ИначеЕсли НаименГруппировки = "Качество" Тогда
         Наимен = "Нов.";
      Иначе
         Наимен = "<...>";
      КонецЕсли;
   КонецЕсли;

   // определим как будет выводится текущая строка отчета
   НомерСекции = КоличествоГруппировок - НомерГруппировки;
   Если НаименГруппировки = "ТекДок" Тогда
      ИдентификаторСекции = "ТекДок";
   Иначе
      ИдентификаторСекции = "Строка" + НомерСекции;
   КонецЕсли;

   Если (РасшифровыватьОтчет = 1) и (ЭтоГруппа = 0) Тогда
      НомерТекГруппировкиЗапросаВСписке = Группировки.НайтиЗначение(НаименГруппировки);
      УстановитьЗначениеРасшифровки(1, "ВидМПЗ", НомерТекГруппировкиЗапросаВСписке);
      УстановитьЗначениеРасшифровки(2, "МестоХранения",    НомерТекГруппировкиЗапросаВСписке);
      УстановитьЗначениеРасшифровки(3, "МПЗ", НомерТекГруппировкиЗапросаВСписке);
      УстановитьЗначениеРасшифровки(4, "Владелец", НомерТекГруппировкиЗапросаВСписке);
      УстановитьЗначениеРасшифровки(5, "Качество", НомерТекГруппировкиЗапросаВСписке);

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

   // если выводится строка по группе справочника, отобразим ее курсивом
   НачСтр = Таб.ВысотаТаблицы();
   ВысТаб = Таб.ВысотаТаблицы();

   ВыведенаСтрока = ?(ВысТаб - НачВысТаб = 1, 1, 0);

   ШирТаб = 4 + ВыводитьНачОст + ВыводитьПриход + ВыводитьРасход + ВыводитьКонОст; 
   Если (ЭтоГруппа = 1) и (ВыведенаСтрока = 1) Тогда
      Таб.Область(НачСтр, 2, ВысТаб, ШирТаб).Курсив(1);
      Таб.Область(НачСтр, 2, ВысТаб, 2).Расшифровка("", 2);
   КонецЕсли;
   Если (РасшифровыватьОтчет = 0) и (НаименГруппировки <> "ТекДок") Тогда
      Таб.Область(НачСтр, 2, ВысТаб, 2).Расшифровка("", 2);
   КонецЕсли;
   Состояние("В отчет выведено " + ВысТаб + " строк.");
КонецПроцедуры // СформироватьСтроку()

//******************************************************************************
// УстановитьГруппировкиЗапроса(Текст)
//
// Параметры:
//   Текст - текст запроса.
//
// Возвращаемое значение:
//   Нет.
//
// Вызывается из формул элементов диалога:
//  Нет.
//
// Описание:
//   Добавляет в текст запроса группировки из списка группировок.
//
Функция УстановитьГруппировкиЗапроса(Текст)
   ОтмеченныеГруппировки = "";
   ПредставлениеГруппы = "";
   Для х = 1 по Группировки.РазмерСписка() Цикл
      Если Группировки.Пометка(х) = 1 Тогда

         ПеременнаяЗапроса = Группировки.ПолучитьЗначение(х, ПредставлениеГруппы);
         
         Текст = Текст + "Группировка " + ПеременнаяЗапроса + ";";

         СписокГруппировок.ДобавитьЗначение(ПеременнаяЗапроса, ПредставлениеГруппы);

         ОтмеченныеГруппировки = ОтмеченныеГруппировки + ?(ОтмеченныеГруппировки = "", "", ", ") + ПредставлениеГруппы;

      КонецЕсли;
   КонецЦикла;
   Возврат ОтмеченныеГруппировки + ?(ОтмеченныеГруппировки = "", "нет.", ".");
КонецФункции // УстановитьГруппировкиЗапроса()

//******************************************************************************
// УстановитьУсловиеЗапроса(НомерУсловия, ФлагБольше, МоноУсловие, Список, ПеременнаяЗапроса, Текст, Заголовок)
//
// Параметры:
//   НомерУсловия - число, номер условия,
//   ФлагБольше - число, признак использования списка условий,
//   МоноУсловие - значение одиночного условия,
//   Список - список значений условий,
//   ПеременнаяЗапроса  - строка, название переменной запроса,
//   Текст - текст запроса,
//   Заголовок - строка, описание параметров отчета для вывода в шапке отчета.
//
// Вызывается из формул элементов диалога:
//  Нет.
//
// Описание:
//   Добавляет в текст запроса условия.
//
Процедура УстановитьУсловиеЗапроса(НомерУсловия, ФлагБольше, МоноУсловие, Список, ПеременнаяЗапроса, Текст, Заголовок)
   ПредставлениеГруппы = "";
   ПозГруппировкиПеременнаяЗапроса = Группировки.НайтиЗначение(ПеременнаяЗапроса);
   Если ПозГруппировкиПеременнаяЗапроса >0 Тогда
      Группировки.ПолучитьЗначение(ПозГруппировкиПеременнаяЗапроса, ПредставлениеГруппы);
   Иначе
      сообщить("Группировка по "+ПеременнаяЗапроса+" не найдена");
      Возврат;
   КонецЕсли;
   Если Прав(Заголовок, 19) = "Выбранные условия: " Тогда
      Разделитель = ПредставлениеГруппы + " - ";
   Иначе
      Разделитель = "; " + ПредставлениеГруппы + " - ";
   КонецЕсли;
   Если ФлагБольше = 1 Тогда
      Если Список.РазмерСписка() > 0 Тогда
         Заголовок = Заголовок + Разделитель;
         Для х = 1 по Список.РазмерСписка() - 1 Цикл
            Заголовок = Заголовок + " " + Список.ПолучитьЗначение(х) + ", ";
         КонецЦикла;
         Заголовок = Заголовок + " " + Список.ПолучитьЗначение(Список.РазмерСписка());
         Если (НомерУсловия = 5) и (Список.НайтиЗначение(Перечисление.КачествоМПЗ.Новое) = 1) Тогда
            Текст = Текст + "Условие ((" + ПеременнаяЗапроса + " в СписокУсловие" + НомерУсловия + ") или (ПустоеЗначение("+ПеременнаяЗапроса+") = 1));";
         Иначе
            Текст = Текст + "Условие (" + ПеременнаяЗапроса + " в СписокУсловие" + НомерУсловия + ");";
         КонецЕсли;
      КонецЕсли;
   ИначеЕсли ПустоеЗначение(МоноУсловие) = 0 Тогда
      ЗнакУсловия = "=";
      Заголовок = Заголовок + Разделитель + МоноУсловие;
      Если (ТипЗначенияСтр(МоноУсловие) = "Строка") и (МоноУсловие = МоноУсловие4) Тогда
         Текст = Текст + "Условие (" + ПеременнаяЗапроса + " " + ЗнакУсловия + " ПустойКонтрагент);";
      ИначеЕсли (НомерУсловия = 5) и (МоноУсловие = Перечисление.КачествоМПЗ.Новое) Тогда
         Текст = Текст + "Условие (ПустоеЗначение(" + ПеременнаяЗапроса + ") = 1);";
      Иначе
         Если ТипЗначенияСтр(МоноУсловие) = "Справочник" Тогда
            Если МоноУсловие.ЭтоГруппа() = 1 Тогда
               ЗнакУсловия = "в";
            КонецЕсли;
         КонецЕсли;
         Текст = Текст + "Условие (" + ПеременнаяЗапроса + " " + ЗнакУсловия + " МоноУсловие" + НомерУсловия + ");";
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры // УстановитьУсловиеЗапроса()

//******************************************************************************
// ЗапомнитьСтроку(НомерГруппировки)
//
// Параметры:
//   НомерГруппировки - номер группировки запроса.
//
// Вызывается из формул элементов диалога:
//  Нет.
//
// Описание:
//   Формирует таблицу значений по группировкам запроса.
//
Процедура ЗапомнитьСтроку(НомерГруппировки, МПЗ = "", ВидМПЗ = "", ИзСправочника = 0)
   
   НаименГруппировки = СписокГруппировок.ПолучитьЗначение(НомерГруппировки);
   НомерУровня = 0;
   Если ИзСправочника = 1 Тогда
      Наимен = МПЗ;
   ИначеЕсли ПустоеЗначение(МПЗ) = 1 Тогда
      Наимен = Запрос.ПолучитьАтрибут(НаименГруппировки);
   Иначе
      Если МПЗ.Уровень() > 1 Тогда
         Наимен = МПЗ.Родитель;
      Иначе
         Возврат;
      КонецЕсли;
   КонецЕсли;
   
   Если (ИзСправочника > 0) и (ПустоеЗначение(ВидМПЗ) = 1) Тогда
      Если Наимен.Вид() = "Материалы" Тогда
         ВидМПЗ = Перечисление.ВидыМПЗ.Материалы;
      ИначеЕсли Наимен.Вид() = "Номенклатура" Тогда
         Если Наимен.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Продукция Тогда
            ВидМПЗ = Перечисление.ВидыМПЗ.Продукция;
         ИначеЕсли Наимен.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Полуфабрикат Тогда
            ВидМПЗ = Перечисление.ВидыМПЗ.Полуфабрикаты;
         ИначеЕсли Наимен.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Товар Тогда
            ВидМПЗ = Перечисление.ВидыМПЗ.Товары;
         КонецЕсли;
      КонецЕсли;
   КонецЕсли;
   
   Если НаименГруппировки = "МПЗ" Тогда
      ЗапомнитьСтроку(НомерГруппировки, Наимен, ВидМПЗ, ?(ИзСправочника = 0, 0, 2));
   КонецЕсли;
   
   ТаблицаОтчета.НоваяСтрока();
   НомерСтроки = ТаблицаОтчета.НомерСтроки;
   
   ТаблицаОтчета.НомерГруппировки = НомерГруппировки;
   ТаблицаОтчета.УстановитьЗначение(НомерСтроки, НаименГруппировки, Наимен);
   
   Если НаименГруппировки = "МПЗ" Тогда
      Если Наимен.ЭтоГруппа() = 1 Тогда
         ТекПолноеНаименование = Наимен.ПолноеНаименование();
      Иначе
         ТекПолноеНаименование = Наимен.ПолноеНаименование() + ЗначениеВСтрокуВнутр(Наимен);
      КонецЕсли;
      Если (Наимен.Уровень() > 1) или (Наимен.ЭтоГруппа() = 1) Тогда
         ТекПорядок = "" + НомерГруппировки + "1";
      Иначе
         ТекПорядок = "" + НомерГруппировки + "2";
      КонецЕсли;
      
   ИначеЕсли (НомерГруппировки < НомерГруппировкиМПЗ) и (НомерГруппировкиМПЗ <> 0) Тогда
      ТекПолноеНаименование = "";
      ТекПорядок = 0;
   КонецЕсли;
   
   ТаблицаОтчета.ПолноеНаименование = ТекПолноеНаименование;
   ТаблицаОтчета.Порядок = ТекПорядок;
   
   НомСтрокиГруппировкиВидМПЗ = 0;
   Если ИзСправочника > 0 Тогда
      ТекНаименГруппировки = СписокГруппировок.ПолучитьЗначение(НомерГруппировки);
      Если ТекНаименГруппировки = "Качество" Тогда
         Наимен = Запрос.ПолучитьАтрибут(ТекНаименГруппировки);
      КонецЕсли;
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, ТекНаименГруппировки, Наимен);
      
      НомСтрокиГруппировкиВидМПЗ = СписокГруппировок.НайтиЗначение("ВидМПЗ");
      Если НомСтрокиГруппировкиВидМПЗ <> 0 Тогда
         ТекНаименГруппировки = СписокГруппировок.ПолучитьЗначение(НомСтрокиГруппировкиВидМПЗ);
         ТаблицаОтчета.УстановитьЗначение(НомерСтроки, ТекНаименГруппировки, ВидМПЗ);
      КонецЕсли;
   КонецЕсли;
   
   Если (НомерГруппировки >= 2) и (НомСтрокиГруппировкиВидМПЗ <> 1) Тогда
      ТекНаименГруппировки = СписокГруппировок.ПолучитьЗначение(1);
      Наимен = Запрос.ПолучитьАтрибут(ТекНаименГруппировки);
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, ТекНаименГруппировки, Наимен);
   КонецЕсли;
   
   Если (НомерГруппировки >= 3) и (НомСтрокиГруппировкиВидМПЗ <> 2) Тогда
      ТекНаименГруппировки = СписокГруппировок.ПолучитьЗначение(2);
      Наимен = Запрос.ПолучитьАтрибут(ТекНаименГруппировки);
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, ТекНаименГруппировки, Наимен);
   КонецЕсли;
   
   Если (НомерГруппировки >= 4) и (НомСтрокиГруппировкиВидМПЗ <> 3) Тогда
      ТекНаименГруппировки = СписокГруппировок.ПолучитьЗначение(3);
      Наимен = Запрос.ПолучитьАтрибут(ТекНаименГруппировки);
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, ТекНаименГруппировки, Наимен);
   КонецЕсли;
   
   Если (НомерГруппировки >= 5) и (НомСтрокиГруппировкиВидМПЗ <> 4) Тогда
      ТекНаименГруппировки = СписокГруппировок.ПолучитьЗначение(4);
      Наимен = Запрос.ПолучитьАтрибут(ТекНаименГруппировки);
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, ТекНаименГруппировки, Наимен);
   КонецЕсли;
   
   Если (НомерГруппировки >= 6) и (НомСтрокиГруппировкиВидМПЗ <> 4) Тогда
      ТекНаименГруппировки = СписокГруппировок.ПолучитьЗначение(5);
      Наимен = Запрос.ПолучитьАтрибут(ТекНаименГруппировки);
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, ТекНаименГруппировки, Наимен);
   КонецЕсли;
   
   Если ВыводитьНачОст = 1 Тогда
      НачОст = Запрос.ПолучитьАтрибут("КолНачОст");
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, "КолНачОст", НачОст);
   КонецЕсли;
   
   Если ВыводитьПриход = 1 Тогда
      Приход = Запрос.ПолучитьАтрибут("КолПриход");
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, "КолПриход", Приход);
   КонецЕсли;
   
   Если ВыводитьРасход = 1 Тогда
      Расход = Запрос.ПолучитьАтрибут("КолРасход");
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, "КолРасход", Расход);
   КонецЕсли;
   
   КонОст = 0;
   Если (ВыводитьКонОст = 1) и (ИзСправочника = 0) Тогда
      КонОст = Запрос.ПолучитьАтрибут("КолКонОст");
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, "КолКонОст", КонОст);
   КонецЕсли;
   
   Если ВыводитьОстаткиСЦенами = 1 Тогда
      ТекМПЗ = Запрос.ПолучитьАтрибут("МПЗ");
      ТекМестоХранения = Запрос.ПолучитьАтрибут("МестоХранения");
      ЦенаЗаЕд = ПолучитьЦену(ТекМПЗ, ТекМестоХранения);
      КонОстСумма = ЦенаЗаЕд * КонОст;
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, "КонОстСумма", КонОстСумма);
   КонецЕсли;
   
   Если (ПоказатьОстатки.ТекущаяСтрока() = 2) и (ИзСправочника = 0) Тогда
      РезКонОст = Запрос.ПолучитьАтрибут("РезКонОст");
      ТаблицаОтчета.УстановитьЗначение(НомерСтроки, "РезКонОст", РезКонОст);
   
   ИначеЕсли ПоказатьОстатки.ТекущаяСтрока() = 4 Тогда
      Если (НаименГруппировки = "МПЗ") и (КонОст > 0) Тогда
         ТаблицаОтчета.УдалитьСтроку(НомерСтроки);
      КонецЕсли;
   
   КонецЕсли;
   
КонецПроцедуры // ЗапомнитьСтроку()

//******************************************************************************
// ЗапомнитьСтрокуИзСправочника(СписокМПЗизЗапроса)
//
// Параметры:
//
// Вызывается из формул элементов диалога:
//  Нет.
//
// Описание:
//   Формирует таблицу значений по группировкам запроса.
//
Процедура ЗапомнитьСтрокуИзСправочника(СписокМПЗизЗапроса)
   
   Если (ВидОтчета = 1) или ((ПоказатьОстатки.ТекущаяСтрока() <> 3) и (ПоказатьОстатки.ТекущаяСтрока() <> 5)) Тогда
      Возврат;
   КонецЕсли;
   
   ТипыНоменклатурыУслуга  = Перечисление.ТипыНоменклатуры.Услуга;
   ТипыНоменклатурыРабота = Перечисление.ТипыНоменклатуры.Работа;
   
   ЗапросМПЗ = СоздатьОбъект("Запрос");
   Текст = "
   |Обрабатывать НеПомеченныеНаУдаление;
   |
   |МПЗ = Справочник.Номенклатура.ТекущийЭлемент, Справочник.Материалы.ТекущийЭлемент;
   |ТипНоменклатуры = Справочник.Номенклатура.ТипНоменклатуры;
   |
   |Группировка МПЗ Без Групп;
   |Условие((ТипНоменклатуры <> ТипыНоменклатурыУслуга) и (ТипНоменклатуры <> ТипыНоменклатурыРабота));
   |Условие( Не(МПЗ В СписокМПЗизЗапроса));
   |";
   
   ТекЗаголовок = "";
   УстановитьУсловиеЗапроса(3, ФлажокУсловие3, МоноУсловие3, СписокУсловие3, "МПЗ", Текст, ТекЗаголовок);
   
   Если ФлажокУсловие1 = 1 Тогда
      РазмерСписка = СписокУсловие1.РазмерСписка();
      Если РазмерСписка > 0 Тогда
         ВыбТипНоменклатуры = СоздатьОбъект("СписокЗначений");
         ЕстьМатериалы = 0;
         Для Сч = 1 По РазмерСписка Цикл
            Условие = СписокУсловие1.ПолучитьЗначение(Сч);
            ТипНоменклатуры = ПолучитьПустоеЗначение(Перечисление.ТипыНоменклатуры);
            Если Условие = Перечисление.ВидыМПЗ.Товары Тогда
               ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Товар;
            ИначеЕсли Условие = Перечисление.ВидыМПЗ.Продукция Тогда
               ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Продукция;
            ИначеЕсли Условие = Перечисление.ВидыМПЗ.Полуфабрикаты Тогда
               ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Полуфабрикат;
            ИначеЕсли Условие = Перечисление.ВидыМПЗ.Материалы Тогда
               ЕстьМатериалы = 1;
            КонецЕсли;
            ВыбТипНоменклатуры.ДобавитьЗначение(ТипНоменклатуры);
         КонецЦикла;
         Если (ВыбТипНоменклатуры.РазмерСписка() = 0) и (ЕстьМатериалы = 0) Тогда
            
         ИначеЕсли (ВыбТипНоменклатуры.РазмерСписка() = 0) и (ЕстьМатериалы = 1) Тогда
            Текст = Текст + "Условие (ПустоеЗначение(ТипНоменклатуры) = 1);";
         ИначеЕсли ЕстьМатериалы = 0 Тогда
            Текст = Текст + "Условие ((ТипНоменклатуры в ВыбТипНоменклатуры) и (ПустоеЗначение(ТипНоменклатуры) = 0));";
         Иначе
            Текст = Текст + "Условие (ТипНоменклатуры в ВыбТипНоменклатуры);";
         КонецЕсли;
      КонецЕсли;                                                             
   ИначеЕсли ПустоеЗначение(МоноУсловие1) = 0 Тогда
      Если МоноУсловие1 = Перечисление.ВидыМПЗ.Материалы Тогда
         Текст = Текст + "Условие (ПустоеЗначение(ТипНоменклатуры) = 1);";
      Иначе
         ВыбТипНоменклатуры = "";
         Если МоноУсловие1 = Перечисление.ВидыМПЗ.Товары Тогда
            ВыбТипНоменклатуры = Перечисление.ТипыНоменклатуры.Товар;
         ИначеЕсли МоноУсловие1 = Перечисление.ВидыМПЗ.Продукция Тогда
            ВыбТипНоменклатуры = Перечисление.ТипыНоменклатуры.Продукция;
         ИначеЕсли МоноУсловие1 = Перечисление.ВидыМПЗ.Полуфабрикаты Тогда
            ВыбТипНоменклатуры = Перечисление.ТипыНоменклатуры.Полуфабрикат;
         КонецЕсли;
         Текст = Текст + "Условие ((ТипНоменклатуры = ВыбТипНоменклатуры) и (ПустоеЗначение(ТипНоменклатуры) = 0));";
      КонецЕсли;
   КонецЕсли;
   
   Если ЗапросМПЗ.Выполнить(Текст) = 0 Тогда
      Возврат;
   КонецЕсли;
   
   НомерГруппировкиВидМПЗ = СписокГруппировок.НайтиЗначение("ВидМПЗ");
   НомерГруппировкиКачество = СписокГруппировок.НайтиЗначение("Качество");
   
   Пока ЗапросМПЗ.Группировка(1) = 1 Цикл
      Если НомерГруппировкиКачество <> 0 Тогда
         ЗапомнитьСтроку(НомерГруппировкиКачество, ЗапросМПЗ.МПЗ, , 1);   
      КонецЕсли;
      Если НомерГруппировкиВидМПЗ <> 0 Тогда
         ЗапомнитьСтроку(НомерГруппировкиВидМПЗ, ЗапросМПЗ.МПЗ, , 1);   
      КонецЕсли;
      ЗапомнитьСтроку(НомерГруппировкиМПЗ, ЗапросМПЗ.МПЗ, , 1);
   КонецЦикла;
   
КонецПроцедуры // ЗапомнитьСтрокуИзСправочника()
                             
//******************************************************************************
// Сформировать(ФлагЗакрытияФормы = 0)
//
// Параметры:
//   ФлагЗакрытияФормы - число, 1 или 0.
//
// Возвращаемое значение:
//   Нет.
//
// Вызывается из формул элементов диалога:
//  - кнопки "Сформировать", "ОК".
//
// Описание:
//   Формирует таблицу отчета.
//
Процедура Сформировать(ФлагЗакрытияФормы = 0)
   Перем ПериодДляШапкиОтчета;
       
   Расшифровка = СоздатьОбъект("СписокЗначений");
   Расшифровка.Установить("Отчет",?(ПустаяСтрока(РасположениеФайла()) = 1,"СкладскойУчетМПЗ",РасположениеФайла()));
   Расшифровка.Установить("ДатаНач", ДатаНач);
   Расшифровка.Установить("ДатаКон", ДатаКон);
   Расшифровка.Установить("МоноУсловие1", МоноУсловие1);
   Расшифровка.Установить("МоноУсловие2", МоноУсловие2);
   Расшифровка.Установить("МоноУсловие3", МоноУсловие3);
   Расшифровка.Установить("МоноУсловие4", МоноУсловие4);
   Расшифровка.Установить("МоноУсловие5", МоноУсловие5);
   Расшифровка.Установить("ФлажокУсловие1", ФлажокУсловие1);
   Расшифровка.Установить("ФлажокУсловие2", ФлажокУсловие2);
   Расшифровка.Установить("ФлажокУсловие4", ФлажокУсловие4);
   Расшифровка.Установить("ФлажокУсловие3", ФлажокУсловие3);
   Расшифровка.Установить("ФлажокУсловие5", ФлажокУсловие5);
   Расшифровка.Установить("СписокУсловие1", СписокУсловие1);
   Расшифровка.Установить("СписокУсловие2", СписокУсловие2);
   Расшифровка.Установить("СписокУсловие3", СписокУсловие3);
   Расшифровка.Установить("СписокУсловие4", СписокУсловие4);
   Расшифровка.Установить("СписокУсловие5", СписокУсловие5);
   Расшифровка.Установить("Группировки", Группировки);
   Расшифровка.Установить("ВыводитьНачОст", ВыводитьНачОст);
   Расшифровка.Установить("ВыводитьПриход", ВыводитьПриход);
   Расшифровка.Установить("ВыводитьРасход", ВыводитьРасход);
   Расшифровка.Установить("ВыводитьКонОст", ВыводитьКонОст);
   Расшифровка.Установить("ВидОтчета",ВидОтчета);
   Расшифровка.Установить("ТипыСуммы",ТипыСуммы.ТекущаяСтрока());
   Расшифровка.Установить("ТипЦеныДляМатериалов",ТипЦеныДляМатериалов.ТекущаяСтрока());
   Расшифровка.Установить("ТипЦеныДляНоменклатуры",ТипЦеныДляНоменклатуры);
   Расшифровка.Установить("ТекПоказатьОстатки",ПоказатьОстатки.ТекущаяСтрока());
   Расшифровка.Установить("ВыводитьОстаткиСЦенами",ВыводитьОстаткиСЦенами);

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

   Если ПроверкаДат() = 0 Тогда
      Возврат;
   ИначеЕсли ДатаКон >= ПолучитьДатуТА() Тогда
      ПериодПо = "";
      ПериодДляШапкиОтчета = Формат(ДатаНач, "Д ДДММГГГГ") + " - " + Формат(ПолучитьДатуТА(), "Д ДДММГГГГ") + " " + ПолучитьВремяТА(,,);
   Иначе
      ПериодДляШапкиОтчета = ПериодСтр(ДатаНач, ДатаКон);
      ПериодПо = " по ДатаКон";
   КонецЕсли;
   Если ПоказатьОстатки.ТекущаяСтрока() = 2 Тогда
      Текст = "//{{ЗАПРОС(Складской учет свободного остатка МПЗ)
      |Период с ДатаНач" + ПериодПо + ";
      |
      |ВидМПЗ = Регистр.МестаХранения.ВидМПЗ;
      |МестоХранения = Регистр.МестаХранения.МестоХранения, Регистр.Резервы.МестоХранения;
      |МПЗ = Регистр.МестаХранения.МПЗ, Регистр.Резервы.Номенклатура;
      |Владелец = Регистр.МестаХранения.Владелец;
      |Качество = Регистр.МестаХранения.Качество;
      |ТекДок = Регистр.МестаХранения.ТекущийДокумент;
      |Количество = Регистр.МестаХранения.Количество;
      |Резерв = Регистр.Резервы.Количество;";
   Иначе
      Текст = "//{{Запрос(Складской учет МПЗ)
      |Период с ДатаНач"+ ПериодПо + ";
      |
      |ВидМПЗ = Регистр.МестаХранения.ВидМПЗ;
      |МестоХранения = Регистр.МестаХранения.МестоХранения;
      |МПЗ = Регистр.МестаХранения.МПЗ;
      |Владелец = Регистр.МестаХранения.Владелец;
      |Качество = Регистр.МестаХранения.Качество;
      |ТекДок = Регистр.МестаХранения.ТекущийДокумент;
      |Количество = Регистр.МестаХранения.Количество;"
   КонецЕсли;
   
   // определяем количество и значения функций, и их условия
   Текст = Текст + ?(ВыводитьНачОст = 1, "Функция КолНачОст = НачОст(Количество);", "");
   Текст = Текст + ?(ВыводитьПриход = 1, "Функция КолПриход = Приход(Количество);", "");
   Текст = Текст + ?(ВыводитьРасход = 1, "Функция КолРасход = Расход(Количество);", "");
   Текст = Текст + ?(ВыводитьКонОст = 1, "Функция КолКонОст = КонОст(Количество);", "");
   
   Если ПоказатьОстатки.ТекущаяСтрока() =  2 Тогда
      Текст = Текст + ?(ВыводитьКонОст = 1, "Функция РезКонОст = КонОст(Резерв);", "");
   КонецЕсли;
   
   Заголовок = "Отмеченные группировки: " + УстановитьГруппировкиЗапроса(Текст);
   Заголовок = Заголовок + РазделительСтрок + "Выбранные условия: ";
   Если (ПоказатьОстатки.ТекущаяСтрока() <> 2) Тогда
      УстановитьУсловиеЗапроса(1, ФлажокУсловие1, МоноУсловие1, СписокУсловие1, "ВидМПЗ", Текст, Заголовок);
   КонецЕсли;
   УстановитьУсловиеЗапроса(2, ФлажокУсловие2, МоноУсловие2, СписокУсловие2, "МестоХранения",    Текст, Заголовок);
   УстановитьУсловиеЗапроса(3, ФлажокУсловие3, МоноУсловие3, СписокУсловие3, "МПЗ", Текст, Заголовок);
   УстановитьУсловиеЗапроса(5, ФлажокУсловие5, МоноУсловие5, СписокУсловие5, "Качество", Текст, Заголовок);
   
   Если ПоказатьОстатки.ТекущаяСтрока() = 2 Тогда
      Текст = Текст + "Условие (Владелец = ПустойКонтрагент);"
   Иначе
      УстановитьУсловиеЗапроса(4, ФлажокУсловие4, МоноУсловие4, СписокУсловие4, "Владелец", Текст, Заголовок);
   КонецЕсли;
   Если Прав(Заголовок, 19) = "Выбранные условия: " Тогда
      Заголовок = Заголовок + "нет.";
   Иначе
      Заголовок = Заголовок + ".";
   КонецЕсли;

   ПозМПЗ = СписокГруппировок.НайтиЗначение("МПЗ");
   Если (ВидОтчета = 2) и (ПоказатьОстатки.ТекущаяСтрока() >= 3) Тогда
      Если (ПозМПЗ = 0)  Тогда
         Предупреждение("Не выбрана группировка МПЗ!");
         Возврат;
      КонецЕсли;
   КонецЕсли;
   
   Сообщить(Текст);
   Запрос.Выполнить(Текст);
   
   ИнформацияОСуммах = "";  // текст информации над таблицей
   ТекстПредупреждения = ""; // текст предупреждения под таблицей
   ЕстьПредупреждение = 0;
   

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

      ТабИт = СоздатьОбъект("ТаблицаЗначений");
      СписокОстМПЗ = СоздатьОбъект("СписокЗначений");
      Запрос.Выгрузить(ТабИт, 0);
      ТабИт.Свернуть("МПЗ", "");
      ТабИт.Выгрузить(СписокОстМПЗ,,,"МПЗ");

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

   Таб.ИсходнаяТаблица("СкладскойУчетМПЗ");
   Состояние("Заполнение выходной таблицы...");

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

   КоличествоГруппировок = СписокГруппировок.РазмерСписка();

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

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

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

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

Herby

Цитата: Poltev86 от 29 июл 2014, 16:06Необходимо помимо наименования выводить еще и код справочника..ну что то на подобии порядкового номера!

Вы думаете кому-то хочется разбираться в этой куче кода?

в общем ваши действия:

в таблице-шаблона, в которой выводится ваш отчет, нужно добавить колонку перед наименованием, значения в секциях заполняете по аналогии с колонкой наименование. Только вместо наименования, нужно будет прописывать Код.




Poltev86

Да конечно не кому не охото! Но а вдруг, найдутся добрые люди! Спасибо за подсказку! Но если честно для меня этот код темный лес(

Nekromant

никто код разбирать не будет.....это же бред......:^454^:
скорее всего данные сливаются в ТЗ, а таблица эти реквизиты подхватывает....
пробуй в таблице как было выше сказано нарисовать новую колонку в секции "данные" (или как там у вас) и обозвать ее <Код>

Poltev86

Ребят все разобрался! Всем огромное спасибо за ваши ответы!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск