8.х Ошибка В отчете Продажи

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем redmonkey, 4 сен 2008.

  1. TopicStarter Overlay
    redmonkey
    Offline

    redmonkey Опытный в 1С

    Регистрация:
    4 сен 2008
    Сообщения:
    133
    Симпатии:
    0
    Баллы:
    26
    В отчете "Продажи", при попытке группировки по свойствам выходит ошибка:

    (6,11) Поле не входит в группу "Свойство0.Значение"
    ЕСТЬNULL(<<?>>Свойство0.Значение?&ПараметрПустоеЗначениеСвойства14)КакСвойство0Значение,

    Что это значит?,если кто знает помогите
  2. opkc
    Offline

    opkc Опытный в 1С

    Регистрация:
    28 янв 2008
    Сообщения:
    149
    Симпатии:
    0
    Баллы:
    26
    конфа какая?
  3. lazy
    Offline

    lazy Модераторы Команда форума Модератор

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Весь запрос давайте.
  4. TopicStarter Overlay
    redmonkey
    Offline

    redmonkey Опытный в 1С

    Регистрация:
    4 сен 2008
    Сообщения:
    133
    Симпатии:
    0
    Баллы:
    26
    УТ 10.2.11.3 , платформа 8.0.17.25

    вечером с работы весь запрос скину
  5. TopicStarter Overlay
    redmonkey
    Offline

    redmonkey Опытный в 1С

    Регистрация:
    4 сен 2008
    Сообщения:
    133
    Симпатии:
    0
    Баллы:
    26
    #Если Клиент Тогда

    ////////////////////////////////////////////////////////////////////////////////
    // ПЕРЕМЕННЫЕ МОДУЛЯ

    // Все возможные показатели
    Перем мТаблицаПоказатели Экспорт;

    // Настройка периода
    Перем НП Экспорт;

    // Соответствия, содержащая назначения свойств и категорий именам
    Перем мСоответствиеНазначений Экспорт;

    Перем мСтруктураСвязиПоказателейИИзмерений Экспорт; // содержит связь показателей и измерений

    Перем мМассивШиринКолонок Экспорт; // массив ширин колонок табличного документа для сохранения между формированиями отчета

    Перем мИсходныйМакетОтчета Экспорт; // исходный макет, используемый для отчета. По умолчанию "Макет", но может быть переопределен

    Перем мНазваниеОтчета Экспорт; // название отчета

    Перем мВыбиратьИмяРегистра Экспорт; // признак выбора (изменения) имени регистра (вида отчета)

    Перем мВыбиратьИспользованиеСвойств Экспорт; // признак выбора (изменения) флажка использования свойств и категорий

    Перем мСтруктураДляОтбораПоКатегориям Экспорт; // содержит связь отборов текста запроса Построителя и значений категорий

    Перем мРежимВводаПериода Экспорт; // 0 - произвольный период, 1 - дата, 2 - месяц, 3 - квартал, 4 - год

    Перем ШиринаТаблицы;

    Перем СтруктураФорматаПолей Экспорт; // хранит формат полей примитивных типов

    Перем мСтруктураНевыводимыхГруппировок Экспорт; // Хранит список тех группировок, которые не надо выводить.
    // Применяется в тех случаях, когда нужно пропускать итоги,
    // например Номенклатура - Характеристика - Серия: итоги
    // по номенклатуре не нужны, нужно только для всех трех

    Перем СоответствиеТиповИнтервальныхПолей Экспорт;

    ////////////////////////////////////////////////////////////////////////////////
    // ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

    // Выполняет настройку отчета по умолчанию для заданного регистра накопления.
    //
    // Параметры:
    // Нет
    //
    Процедура ЗаполнитьНачальныеНастройки() Экспорт

    ТаблицаПоказатели = мТаблицаПоказатели.Скопировать();
    мТаблицаПоказатели.Очистить();

    СтруктураПредставлениеПолей = Новый Структура;

    мСоответствиеНазначений = Новый Соответствие;

    МассивОтбора = Новый Массив;

    Показатели.Очистить();

    //Очистим отбор
    Пока ПостроительОтчета.Отбор.Количество()>0 Цикл
    ПостроительОтчета.Отбор.Удалить(0);
    КонецЦикла;

    Если НЕ ПустаяСтрока(ИмяРегистра) Тогда

    // Заполним по метаданным регистра ИмяРегистра
    ЗаполнитьНачальныеНастройкиПоМетаданнымРегистра(СтруктураПредставлениеПолей, МассивОтбора, ЭтотОбъект, "СписокКроссТаблица");
    КонецЕсли;

    ЗаполнитьПредставленияПолей(СтруктураПредставлениеПолей, ПостроительОтчета);

    ОчиститьДополнительныеПоляПостроителя(ПостроительОтчета);

    ЗаполнитьОтбор(МассивОтбора, ПостроительОтчета);

    Если мТаблицаПоказатели.Количество() = 0 Тогда

    мТаблицаПоказатели = ТаблицаПоказатели.Скопировать();

    КонецЕсли;

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

    // Расшифровывает отчеты, реализуемые при помощи данного
    //
    // Параметры:
    // Расшифровка - Структура, значение расшифровки, взятое из табличного документа, и, в случае надобности, дополненное
    // СтандартнаяОбраьотка - Флаг стандартной обработки расшифровки
    // ЭтотОтчет - Контекст, из которого происходит вызов. Позволяет определить, как именно расшифровывать.
    //
    Процедура ОбработкаРасшифровкиСтандартногоОтчета(Расшифровка, СтандартнаяОбработка, ЭтотОтчет) Экспорт

    Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
    СтандартнаяОбработка = Ложь;

    СписокВыбора = Новый СписокЗначений;

    ДоступныеИзмерения = Новый Соответствие;

    Для ДП = 0 По ПостроительОтчета.ДоступныеПоля.Количество() - 1 Цикл
    Поле = ПостроительОтчета.ДоступныеПоля[ДП];
    Если Поле.Измерение Тогда
    ДоступныеИзмерения.Вставить(Поле.Имя, Поле.Представление);
    КонецЕсли;
    КонецЦикла;

    Для УИ = 0 По ПостроительОтчета.ИзмеренияСтроки.Количество() - 1 Цикл
    Измерение = ПостроительОтчета.ИзмеренияСтроки[УИ];
    ДоступныеИзмерения.Удалить(Измерение.Имя);
    КонецЦикла;

    Для УИ = 0 По ПостроительОтчета.ИзмеренияКолонки.Количество() - 1 Цикл
    Измерение = ПостроительОтчета.ИзмеренияКолонки[УИ];
    ДоступныеИзмерения.Удалить(Измерение.Имя);
    КонецЦикла;

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

    СписокВыбора.СортироватьПоПредставлению();


    // Расшифровка по регистратору, если его еще нет
    Если ПостроительОтчета.ДоступныеПоля.Найти("Регистратор")<>Неопределено Тогда

    Если ПостроительОтчета.ВыбранныеПоля.Найти("Регистратор")=Неопределено Тогда

    СписокВыбора.Добавить(0, "По документам движения");

    КонецЕсли;

    КонецЕсли;

    Если СписокВыбора.Количество()>0 Тогда

    Выбор = СписокВыбора.ВыбратьЭлемент("Выберите способ расшифровки", СписокВыбора[СписокВыбора.Количество()-1]);

    Иначе

    Выбор = Неопределено;

    КонецЕсли;

    Если Выбор = Неопределено Тогда
    Возврат;
    КонецЕсли;

    // Настройка отчета
    Отчет = Отчеты[ЭтотОтчет.Метаданные().Имя].Создать();
    Параметры = Новый Соответствие;

    // Поместим в параметры исходную расшифровку
    Для Каждого ЭлементРасшифровки Из Расшифровка Цикл

    Параметры.Вставить(ЭлементРасшифровки.Ключ, ЭлементРасшифровки.Значение);

    КонецЦикла;

    Параметры.Вставить("ИмяРегистра", ИмяРегистра);
    Параметры.Вставить("ДатаНач", ДатаНач);
    Параметры.Вставить("ДатаКон", ДатаКон);

    ИсходныйОтчет = ЭтотОтчет;

    // Это свойство влияет на заполнение
    Параметры.Вставить("ИспользоватьСвойстваИКатегории", ИспользоватьСвойстваИКатегории);

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

    // Перенос табличной части
    Параметры.Вставить("Показатели", Показатели.Выгрузить());

    Отчет.Настроить(Параметры);

    Форма = Отчет.ПолучитьОсновнуюФорму();

    ПостроительОтчета.НастроитьРасшифровку(Отчет.ПолучитьПостроительОтчета(), Расшифровка);

    // Добавим измерения из расшифровываемого отчета
    МассивДобавленныеИзмерения = Новый Массив;

    ТабОтбор = Новый ТаблицаЗначений;
    ТабОтбор.Колонки.Добавить("Имя");
    ТабОтбор.Колонки.Добавить("ВидСравнения");
    ТабОтбор.Колонки.Добавить("Значение");

    Для каждого Элемент Из Отчет.ПолучитьПостроительОтчета().Отбор Цикл

    Если Элемент.Использование Тогда

    НоваяСтрока = ТабОтбор.Добавить();
    НоваяСтрока.Имя = Элемент.Имя;
    НоваяСтрока.ВидСравнения = Элемент.ВидСравнения;
    НоваяСтрока.Значение = Элемент.Значение;

    КонецЕсли;

    КонецЦикла;

    Для Инд=0 По ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Цикл

    СтруктураПоиска = Новый Структура;
    СтруктураПоиска.Вставить("Имя",ПостроительОтчета.ИзмеренияСтроки[Инд].Имя);

    НайденныеСтрокиОтбора = ТабОтбор.НайтиСтроки(СтруктураПоиска);

    // Измерение не нужно добавлять, если в нем заведомо будет один элемент
    НеДобавлятьИзмерение = Ложь;

    Для каждого НайденныйЭлементОтбора Из НайденныеСтрокиОтбора Цикл

    // Не добавляем измерения по отборам на равенство - в них будет один элемент
    Если НайденныйЭлементОтбора.ВидСравнения = ВидСравнения.Равно Тогда

    НеДобавлятьИзмерение = Истина;
    Прервать;

    // Не добавляем измерения по отборам на вхождение в иерархию одного элемента справочника
    // или плана видов характеристик - в них будет один элемент
    ИначеЕсли НайденныйЭлементОтбора.ВидСравнения = ВидСравнения.ВСпискеПоИерархии
    ИЛИ НайденныйЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке Тогда

    Если НайденныйЭлементОтбора.Значение.Количество() = 1 Тогда
    ЗначениеОтбора = НайденныйЭлементОтбора.Значение[0].Значение;

    МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеОтбора));

    Если МетаданныеОбъекта<>Неопределено Тогда
    Если Метаданные.Справочники.Найти(МетаданныеОбъекта)<>Неопределено
    ИЛИ Метаданные.ПланыВидовХарактеристик.Найти(МетаданныеОбъекта)<>Неопределено Тогда

    Если НЕ ЗначениеОтбора.ЭтоГруппа Тогда

    НеДобавлятьИзмерение = Истина;
    Прервать;

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

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

    КонецЦикла;

    Если НеДобавлятьИзмерение Тогда

    // Удалим также и предыдущие измерения
    Для каждого ПредыдущееИзмерение Из МассивДобавленныеИзмерения Цикл

    Отчет.ПолучитьПостроительОтчета().ИзмеренияСтроки.Удалить(ПредыдущееИзмерение);

    КонецЦикла;

    Продолжить;

    КонецЕсли;

    // Добавляем новое измерение и запоминаем его в массиве
    МассивДобавленныеИзмерения.Добавить(Отчет.ПолучитьПостроительОтчета().ИзмеренияСтроки.Добавить(ПостроительОтчета.ИзмеренияСтроки[Инд].ПутьКДанным,
    ПостроительОтчета.ИзмеренияСтроки[Инд].Имя,
    ПостроительОтчета.ИзмеренияСтроки[Инд].ТипИзмерения));
    КонецЦикла;

    Для Инд=0 По ПостроительОтчета.ИзмеренияКолонки.Количество()-1 Цикл
    Отчет.ПолучитьПостроительОтчета().ИзмеренияКолонки.Добавить(ПостроительОтчета.ИзмеренияКолонки[Инд].ПутьКДанным,
    ПостроительОтчета.ИзмеренияКолонки[Инд].Имя,
    ПостроительОтчета.ИзмеренияКолонки[Инд].ТипИзмерения)
    КонецЦикла;


    // Текущий отчет с детальными записями по документам
    Если Выбор.Значение = 0 Тогда
    Отчет.ПолучитьПостроительОтчета().ИзмеренияКолонки.Очистить();

    Отчет.ПолучитьПостроительОтчета().ВыбранныеПоля.Добавить("Регистратор");

    Форма.ОбновитьОтчет();

    Иначе

    // Текущий отчет с дополнительным измерением

    Отчет.ПолучитьПостроительОтчета().ИзмеренияСтроки.Добавить(Выбор.Значение, Выбор.Значение);

    Форма.ОбновитьОтчет();
    КонецЕсли;
    Форма.Открыть();
    КонецЕсли;

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

    Процедура ЗаполнитьПоляОсновногоРеквизита(УниверсальныйОтчет) Экспорт
    РеквизитыЭтогоОбъекта = ЭтотОбъект.Метаданные().Реквизиты;
    Для каждого Реквизит из РеквизитыЭтогоОбъекта Цикл
    ЭтотОбъект[Реквизит.Имя] = УниверсальныйОтчет[Реквизит.Имя];
    КонецЦикла;
    СтруктураФорматаПолей.Вставить("Период", "ДЛФ=D");

    // Все возможные показатели
    мТаблицаПоказатели = УниверсальныйОтчет.мТаблицаПоказатели;

    // Настройка периода
    НП = УниверсальныйОтчет.НП;

    // Соответствия, содержащая назначения свойств и категорий именам
    мСоответствиеНазначений = УниверсальныйОтчет.мСоответствиеНазначений;

    мСтруктураСвязиПоказателейИИзмерений = УниверсальныйОтчет.мСтруктураСвязиПоказателейИИзмерений; // содержит связь показателей и измерений

    мМассивШиринКолонок = УниверсальныйОтчет.мМассивШиринКолонок; // массив ширин колонок табличного документа для сохранения между формированиями отчета

    мНазваниеОтчета = УниверсальныйОтчет.мНазваниеОтчета; // название отчета

    мВыбиратьИмяРегистра = УниверсальныйОтчет.мВыбиратьИмяРегистра; // признак выбора (изменения) имени регистра (вида отчета)

    мВыбиратьИспользованиеСвойств = УниверсальныйОтчет.мВыбиратьИспользованиеСвойств; // признак выбора (изменения) флажка использования свойств и категорий

    мРежимВводаПериода = УниверсальныйОтчет.мРежимВводаПериода;

    СтруктураФорматаПолей = УниверсальныйОтчет.СтруктураФорматаПолей; // хранит формат полей примитивных типов

    мСтруктураДляОтбораПоКатегориям = УниверсальныйОтчет.мСтруктураДляОтбораПоКатегориям; // предназначена для связи отборов Построителя с категориями из соединяемых таблиц

    УниверсальныйОтчет = ЭтотОбъект;
    КонецПРоцедуры

    // Настраивает отчет для параметрического вызова
    //
    // Параметры
    // СтруктураПараметров – Структура, Соответсвие – содержит список параметров:
    // ДатаНач,
    // ДатаКон,
    // ИмяРегистра,
    // ЗаполнитьПоУмолчанию,
    // ПоказыватьЗаголовок,
    // ВыводитьПоказателиВСтроку,
    // ВыводитьИтогиПоВсемУровням,
    // ВыводитьДополнительныеПолявОтдельнойКолонке,
    // РаскрашиватьИзмерения
    // ГруппировкиСтрок - структура или соответсвие,
    // ГруппировкиКолонок- структура или соответствие,
    // Показатели - таблица значений,
    // Отбор - структура или соответсвие
    //
    Процедура Настроить(СтруктураПараметров, ЗаполняемыйОбъект = Неопределено) Экспорт

    Параметры = Новый Соответствие;

    Для каждого Элемент Из СтруктураПараметров Цикл
    Параметры.Вставить(Элемент.Ключ, Элемент.Значение);
    КонецЦикла;

    // Это свойство влияет на заполнение
    ИспользоватьСвойстваИКатегории = Параметры["ИспользоватьСвойстваИКатегории"];

    ИмяРегистра = Параметры["ИмяРегистра"];

    Если ЗаполняемыйОбъект = Неопределено Тогда
    ЗаполняемыйОбъект = ЭтотОбъект;
    КонецЕсли;

    // Настраиваем по умолчанию
    ЗаполняемыйОбъект.ЗаполнитьНачальныеНастройки();

    ДатаНач = Параметры["ДатаНач"];
    ДатаКон = Параметры["ДатаКон"];

    // Прочие свойства
    ПоказыватьЗаголовок = Параметры["ПоказыватьЗаголовок"];
    ВыводитьПоказателиВСтроку = Параметры["ВыводитьПоказателиВСтроку"];
    ВыводитьИтогиПоВсемУровням = Параметры["ВыводитьИтогиПоВсемУровням"];
    ВыводитьДополнительныеПолявОтдельнойКолонке = Параметры["ВыводитьДополнительныеПолявОтдельнойКолонке"];
    РаскрашиватьИзмерения = Параметры["РаскрашиватьИзмерения"];


    Если НЕ (Параметры["ЗаполнитьПоУмолчанию"] = Истина) Тогда

    ПостроительОтчета.ИзмеренияСтроки.Очистить();
    ПостроительОтчета.ИзмеренияКолонки.Очистить();
    ПостроительОтчета.ВыбранныеПоля.Очистить();

    // Группировки строк

    ГруппировкиСтрок = Параметры["ГруппировкиСтрок"];
    Если ТипЗнч(ГруппировкиСтрок) = Тип("Соответствие")
    ИЛИ ТипЗнч(ГруппировкиСтрок) = Тип("Структура") Тогда

    ПостроительОтчета.ИзмеренияСтроки.Очистить();

    Для каждого Строка Из ГруппировкиСтрок Цикл

    ПостроительОтчета.ИзмеренияСтроки.Добавить(Строка.Ключ);

    КонецЦикла;

    КонецЕсли;

    // Группировки колонок

    ГруппировкиКолонок = Параметры["ГруппировкиКолонок"];
    Если ТипЗнч(ГруппировкиКолонок) = Тип("Соответствие")
    ИЛИ ТипЗнч(ГруппировкиКолонок) = Тип("Структура") Тогда

    ПостроительОтчета.ИзмеренияКолонки.Очистить();

    Для каждого Строка Из ГруппировкиКолонок Цикл

    ПостроительОтчета.ИзмеренияКолонки.Добавить(Строка.Ключ);

    КонецЦикла;

    КонецЕсли;

    // Показатели: флажки использования

    ТаблицаПоказатели = Параметры["Показатели"];
    Если ТипЗнч(ТаблицаПоказатели) = Тип("ТаблицаЗначений")
    И ТаблицаПоказатели.Колонки.Найти("Имя")<>Неопределено
    И ТаблицаПоказатели.Колонки.Найти("Использование")<>Неопределено Тогда

    Для Каждого Строка Из Показатели Цикл

    НайдСтрока = ТаблицаПоказатели.Найти(Строка.Имя, "Имя");
    Если НайдСтрока<>Неопределено Тогда
    Строка.Использование = НайдСтрока.Использование;
    КонецЕсли;

    КонецЦикла;

    КонецЕсли;


    КонецЕсли;


    // Выбранные поля

    ВыбранныеПоля = Параметры["ВыбранныеПоля"];
    Если ТипЗнч(ВыбранныеПоля) = Тип("Соответствие")
    ИЛИ ТипЗнч(ВыбранныеПоля) = Тип("Структура") Тогда

    ПостроительОтчета.ВыбранныеПоля.Очистить();

    Для каждого Строка Из ВыбранныеПоля Цикл

    ПостроительОтчета.ВыбранныеПоля.Добавить(Строка.Ключ);

    КонецЦикла;

    КонецЕсли;

    // Отбор, заданный списком

    СтрокиОтбора = Параметры["Отбор"];

    Если ТипЗнч(СтрокиОтбора) = Тип("Соответствие")
    ИЛИ ТипЗнч(СтрокиОтбора) = Тип("Структура") Тогда

    Для каждого Строка Из СтрокиОтбора Цикл

    ЭлементОтбора = Неопределено;

    // Установим существующие элементы, добавим новые
    Для Инд = 0 По ПостроительОтчета.Отбор.Количество()-1 Цикл

    Если Строка.Ключ = ПостроительОтчета.Отбор[Инд].ПутьКДанным Тогда
    ЭлементОтбора = ПостроительОтчета.Отбор[Инд];
    КонецЕсли;

    КонецЦикла;

    Если ЭлементОтбора = Неопределено Тогда

    ЭлементОтбора = ПостроительОтчета.Отбор.Добавить(Строка.Ключ);

    КонецЕсли;
    ЭлементОтбора.Установить(Строка.Значение);

    КонецЦикла;
    ИначеЕсли ТипЗнч(СтрокиОтбора) = Тип("ТаблицаЗначений") Тогда

    Для каждого Строка Из СтрокиОтбора Цикл
    ЭлементОтбора = Неопределено;

    // Установим существующие элементы, добавим новые
    Для Инд = 0 По ПостроительОтчета.Отбор.Количество()-1 Цикл

    Если Строка.Имя = ПостроительОтчета.Отбор[Инд].Имя Тогда
    ПостроительОтчета.Отбор[Инд].ВидСравнения = Строка.ВидСравнения;
    ПостроительОтчета.Отбор[Инд].Использование = Истина;
    ЭлементОтбора = ПостроительОтчета.Отбор[Инд];
    КонецЕсли;

    КонецЦикла;

    Если ЭлементОтбора = Неопределено Тогда

    ЭлементОтбора = ПостроительОтчета.Отбор.Добавить(Строка.Имя);
    ПостроительОтчета.Отбор[Инд].ВидСравнения = Строка.ВидСравнения;
    ПостроительОтчета.Отбор[Инд].Использование = Истина;

    //ЭлементОтбора = ПостроительОтчета.Отбор[Инд];

    КонецЕсли;

    Если Строка.Значение <> Null Тогда
    ЭлементОтбора.Значение = Строка.Значение;
    КонецЕсли;
    Если Строка.ЗначениеС <> Null Тогда
    ЭлементОтбора.ЗначениеС = Строка.ЗначениеС;
    КонецЕсли;
    Если Строка.ЗначениеПо <> Null Тогда
    ЭлементОтбора.ЗначениеПо = Строка.ЗначениеПо;
    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    // Загрузка интервалов
    ТабИнтервалы = Параметры["Интервалы"];
    Если ТипЗнч(ТабИнтервалы) = Тип("ТаблицаЗначений") Тогда

    Интервалы.Загрузить(ТабИнтервалы);

    Настройки=ПостроительОтчета.ПолучитьНастройки();
    ЗаполняемыйОбъект.ЗаполнитьНачальныеНастройки();
    ПостроительОтчета.УстановитьНастройки(Настройки);
    КонецЕсли;

    // Упорядочивение
    СтрокиПорядка = Параметры["Порядок"];
    Если ТипЗнч(СтрокиПорядка) = Тип("Структура")
    ИЛИ ТипЗнч(СтрокиПорядка) = Тип("Соответствие") Тогда

    Для Каждого СтрокаПорядка Из СтрокиПорядка Цикл
    Направление = НаправлениеСортировки.Возр;
    Если СтрокаПорядка.Значение = НаправлениеСортировки.Убыв
    ИЛИ Врег(СтрокаПорядка.Значение) = "УБЫВ" Тогда

    Направление = НаправлениеСортировки.Убыв;
    КонецЕсли;
    ПостроительОтчета.Порядок.Добавить(СтрокаПорядка.Ключ,,,Направление);
    КонецЦикла;

    КонецЕсли;

    НазваниеОтчета = Параметры["НазваниеОтчета"];
    Если ТипЗнч(НазваниеОтчета) = Тип("Строка") Тогда
    мНазваниеОтчета = НазваниеОтчета;
    КонецЕсли;

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

    // Читает свойство Построитель отчета
    //
    // Параметры
    // Нет
    //
    Функция ПолучитьПостроительОтчета() Экспорт

    Возврат ПостроительОтчета;

    КонецФункции // ПолучитьПостроительОтчета()

    // Возвращает основную форму отчета
    //
    // Параметры
    // Нет.
    //
    // Возвращаемое значение:
    // основная форма отчета
    //
    Функция ПолучитьОсновнуюФорму() Экспорт

    Возврат ПолучитьФорму();

    КонецФункции // ПолучитьОсновнуюФорму()

    Процедура ЗаполнитьПоказатели(ИмяПоля, ПредставлениеПоля, ВклПоУмолчанию, ФорматнаяСтрока) Экспорт

    //СтруктураПредставлениеПолей.Вставить(ИмяПоля, ПредставлениеПоля);

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

    ////////////////////////////////////////////////////////////////////////////////
    // ПРОЦЕДУРЫ И ФУНКЦИИ ФОРМИРОВАНИЯ ОТЧЕТА

    // Формирует табличку-заголовок
    //
    // Параметры
    // <Параметр1> – <Тип.Вид> – <описание параметра>
    // <продолжение описания параметра>
    // <Параметр2> – <Тип.Вид> – <описание параметра>
    // <продолжение описания параметра>
    //
    // Возвращаемое значение:
    // <Тип.Вид> – <описание возвращаемого значения>
    //
    Функция СформироватьЗаголовок(МакетОтчета, КоличествоКолонок, ТолькоЗаголовок, ВыводитьДетальныеЗаписи)


    // Формирование макета заголовка отчета
    МакетОтчета.Область(МакетОтчета.Область("Заголовок").Верх,1+1,МакетОтчета.Область("Заголовок").Низ,1+1).Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
    МакетОтчета.Область(МакетОтчета.Область("Заголовок").Верх,1+2,МакетОтчета.Область("Заголовок").Низ,2+КоличествоКолонок).Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Текст;
    МакетОтчета.Область(МакетОтчета.Область("Заголовок").Верх,1+2,МакетОтчета.Область("Заголовок").Низ,2+КоличествоКолонок).Очистить(Истина);
    МакетОтчета.Область(МакетОтчета.Область("Заголовок").Верх,1+1,МакетОтчета.Область("Заголовок").Низ,1+КоличествоКолонок).ПоВыделеннымКолонкам = Истина;

    ЗаголовокОтчета = МакетОтчета.ПолучитьОбласть("Заголовок");

    Заголовок = мНазваниеОтчета;

    // Вывод заголовка, описателя периода и фильтров и заголовка
    Если мРежимВводаПериода = 0 Тогда // произвольный период
    Если ДатаНач = '00010101000000' И ДатаКон = '00010101000000' Тогда
    ОписаниеПериода = "Период не установлен";

    Иначе
    Если ДатаНач = '00010101000000' ИЛИ ДатаКон = '00010101000000' Тогда
    ОписаниеПериода = "" + Формат(ДатаНач, "ДФ = ""дд.ММ.гггг""; ДП = ""...""")
    + " - " + Формат(ДатаКон, "ДФ = ""дд.ММ.гггг""; ДП = ""...""");

    Иначе
    Если ДатаНач <= ДатаКон Тогда
    ОписаниеПериода = "" + ПредставлениеПериода(НачалоДня(ДатаНач), КонецДня(ДатаКон), "ФП = Истина");
    Иначе
    ОписаниеПериода = "Неправильно задан период!"
    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    ИначеЕсли мРежимВводаПериода = 1 Тогда // на дату

    Если ДатаКон = '00010101000000' Тогда

    Если ТолькоЗаголовок Тогда
    ОписаниеПериода = "на текущее время " + Формат(ТекущаяДата(), "ДФ = ""дд.ММ.гггг""; ДП = ""...""");
    Иначе
    ОписаниеПериода = "на " + Формат(ТекущаяДата(), "ДФ = ""дд.ММ.гггг ЧЧ:мм:сс""; ДП = ""...""");
    КонецЕсли;

    Иначе

    ОписаниеПериода = "на конец дня " + Формат(ДатаКон, "ДФ = ""дд.ММ.гггг""; ДП = ""...""");

    КонецЕсли;

    ИначеЕсли мРежимВводаПериода = 2 Тогда // месяц

    Если ДатаНач = '00010101000000' Тогда
    ОписаниеПериода = "Период не установлен";
    Иначе
    ОписаниеПериода = "" + ПредставлениеПериода(НачалоМесяца(ДатаНач), КонецМесяца(ДатаНач), "ФП = Истина");
    КонецЕсли;

    ИначеЕсли мРежимВводаПериода = 3 Тогда // квартал

    Если ДатаНач = '00010101000000' Тогда
    ОписаниеПериода = "Период не установлен";
    Иначе
    ОписаниеПериода = "" + ПредставлениеПериода(НачалоКвартала(ДатаНач), КонецКвартала(ДатаНач), "ФП = Истина");
    КонецЕсли;

    ИначеЕсли мРежимВводаПериода = 4 Тогда // год
    Если ДатаНач = '00010101000000' Тогда
    ОписаниеПериода = "Период не установлен";
    Иначе
    ОписаниеПериода = "" + ПредставлениеПериода(НачалоГода(ДатаНач), КонецГода(ДатаНач), "ФП = Истина");
    КонецЕсли;

    КонецЕсли;

    СписокИзмерений = "";
    Для Сч=0 По ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Цикл

    СписокИзмерений = СписокИзмерений +", "+ ПостроительОтчета.ИзмеренияСтроки[Сч].Представление
    +" "+ ПостроительОтчета.ИзмеренияСтроки[Сч].ТипИзмерения;

    КонецЦикла;

    СписокКолонок = "";
    СписокПолейДетальныхЗаписей = "";
    Для Сч=0 По ПостроительОтчета.ВыбранныеПоля.Количество()-1 Цикл

    Для Инд = 0 По ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Цикл

    Если ПостроительОтчета.ВыбранныеПоля[Сч].ПутьКДанным <> ПостроительОтчета.ИзмеренияСтроки[Инд].ПутьКДанным
    И Найти(ПостроительОтчета.ВыбранныеПоля[Сч].ПутьКДанным, ПостроительОтчета.ИзмеренияСтроки[Инд].ПутьКДанным) >0 Тогда

    СписокКолонок = СписокКолонок +", "+ ПостроительОтчета.ВыбранныеПоля[Сч].Представление;
    КонецЕсли;

    КонецЦикла;
    Если ВыводитьДетальныеЗаписи Тогда

    СписокПолейДетальныхЗаписей = СписокПолейДетальныхЗаписей +", "+ ПостроительОтчета.ВыбранныеПоля[Сч].Представление;

    КонецЕсли;

    КонецЦикла;

    СписокПоказателей = "";
    Для Сч=0 По Показатели.Количество()-1 Цикл

    Если Показатели[Сч].Использование Тогда

    СписокПоказателей = СписокПоказателей +", "+ Показатели[Сч].Представление;

    КонецЕсли;

    КонецЦикла;

    СписокОтбор = "";
    Для Сч=0 По ПостроительОтчета.Отбор.Количество()-1 Цикл

    Если ПостроительОтчета.Отбор[Сч].Использование И Не ПостроительОтчета.Отбор[Сч].Имя = "Периодичность" Тогда

    СписокОтбор = СписокОтбор +", "+ ПостроительОтчета.Отбор[Сч].Представление
    +" "+ ПостроительОтчета.Отбор[Сч].ВидСравнения +" "+ ПостроительОтчета.Отбор[Сч].Значение;

    КонецЕсли;

    КонецЦикла;

    ЗаголовокОтчета.Параметры.ЗаголовокОтчета = Заголовок;
    ЗаголовокОтчета.Параметры.Период = "Период: "+ОписаниеПериода;
    ЗаголовокОтчета.Параметры.Измерения = "Итоги по: "+Сред(СписокИзмерений,2);
    ЗаголовокОтчета.Параметры.Показатели = "Показатели: " +Сред(СписокПоказателей,2);
    ЗаголовокОтчета.Параметры.Колонки =
    ?((ПостроительОтчета.ИзмеренияСтроки.Количество()>0 И Не ПустаяСтрока(СписокКолонок)), "Дополнительные поля: "+ Сред(СписокКолонок, 2)+" ", "")
    + ?(ВыводитьДетальныеЗаписи, "Поля детальных записей: "+Сред(СписокПолейДетальныхЗаписей, 2),"");
    ЗаголовокОтчета.Параметры.Отбор = "Отбор:" +Сред(СписокОтбор,2);

    Возврат ЗаголовокОтчета;
    КонецФункции // СформироватьЗаголовок()

    // Выводит шапку таблицы
    Процедура ВывестиКолонкуШапки(Выборка, Знач Индекс, СтруктураПараметров, ДокументРезультат, ДеревоКолонкиОтчета, Расшифровка)

    Пока Выборка.Следующий() Цикл

    // Если группировка не выводится, переходим к выбору следующей (кроме иерархии)
    Если СтруктураПараметров.СтруктураПропускаемыеГруппировки.Свойство(Выборка.Группировка()) Тогда

    НачКолонка = СтруктураПараметров.НачКолонка;

    Перейти ~M2;

    КонецЕсли;


    МакетКолонкаШапки = СтруктураПараметров.МакетКолонкаШапки;

    ФорматПоля = "";
    СтруктураПараметров.СтруктураФорматаПолей.Свойство(ПостроительОтчета.ИзмеренияКолонки[Индекс].Имя, ФорматПоля);

    // Если выводятся имена показателей, то их не очищаем
    Если Не ВыводитьПоказателиВСтроку Тогда

    МакетКолонкаШапки.Область().Очистить(Истина);
    Иначе

    МакетКолонкаШапки.Область(1,1,СтруктураПараметров.МакетКолонкаШапки.ВысотаТаблицы-1,СтруктураПараметров.МакетКолонкаШапки.ШиринаТаблицы).Очистить(Истина);

    КонецЕсли;

    // Накопление количества колонок в шапке.
    СтруктураПараметров.КоличествоКолонокПоказателей = СтруктураПараметров.КоличествоКолонокПоказателей + 1;

    Расшифровка.Вставить(Выборка.Группировка(), Выборка[Выборка.Группировка()]);

    СтруктураРасшифровки = Новый Структура;
    Для Каждого Элемент Из Расшифровка Цикл
    СтруктураРасшифровки.Вставить(Элемент.Ключ, Элемент.Значение);
    КонецЦикла;

    Обл = ДокументРезультат.Присоединить(МакетКолонкаШапки, Выборка.Уровень());
    Обл.Расшифровка = СтруктураРасшифровки;

    // Добавим 1 к количеству значений группировок колонок
    Если Индекс = 0 Тогда
    СтруктураПараметров.КоличествоКолонокГруппировок = СтруктураПараметров.КоличествоКолонокГруппировок+1;
    КонецЕсли;

    НачКолонка = Обл.Лево;

    // В специальном параметре будет сохраняться правая ячейка
    СтруктураПараметров.Вставить("КонКолонка", Обл.Право);

    // Нач. колонка для следующей группировки
    СтруктураПараметров.Вставить("НачКолонка", Обл.Право+1);

    ~M2: НоваяСтрока = ДеревоКолонкиОтчета.Строки.Добавить();
    НоваяСтрока.Значение = Выборка[Выборка.Группировка()];
    НоваяСтрока.ИмяИзмерения = ПостроительОтчета.ИзмеренияКолонки[Индекс].Имя;

    Если Индекс < ПостроительОтчета.ИзмеренияКолонки.Количество()-1 Тогда

    // На следующем уровне используем новую структуру расшифровки
    КопияРасшифровка = Новый Структура;

    Для Каждого Элемент Из Расшифровка Цикл

    КопияРасшифровка.Вставить(Элемент.Ключ, Элемент.Значение);

    КонецЦикла;

    ВывестиКолонкуШапки(Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, ПостроительОтчета.ИзмеренияКолонки[Индекс+1].Имя), Индекс+1, СтруктураПараметров, ДокументРезультат, НоваяСтрока, КопияРасшифровка);

    КонецЕсли;

    // Заголовок колонки
    ДокументРезультат.Область(СтруктураПараметров.ВысотаЗаголовка+2 +Индекс, НачКолонка, СтруктураПараметров.ВысотаЗаголовка+2 + Индекс, НачКолонка).Текст = Формат(Выборка[Выборка.Группировка()], ФорматПоля);

    // Оформление ячеек группы непоследнего уровня
    Если НачКолонка <> СтруктураПараметров.КонКолонка Тогда

    Обл = ДокументРезультат.Область(СтруктураПараметров.ВысотаЗаголовка+2 +Индекс, НачКолонка, СтруктураПараметров.ВысотаЗаголовка+2 + Индекс, СтруктураПараметров.КонКолонка);
    Обл.ПоВыделеннымКолонкам = Истина;
    Обл.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево;
    Обл.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Авто;

    // Очистим границы слева и справа
    ЛинияНетЛинии = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
    Обл.ГраницаСправа = ЛинияНетЛинии;
    Обл.ГраницаСнизу = ЛинияНетЛинии;

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

    КонецЕсли;

    КонецЦикла;

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

    // Выводит показатели в строку отчета
    Процедура ВывестиПоказатели(СтруктураПараметров, ДокументРезультат, ДеревоКолонкиОтчета, ДеревоСтроки, МакетПоказатель)

    Для Каждого Строка Из ДеревоКолонкиОтчета.Строки Цикл

    Если ДеревоСтроки <> Неопределено Тогда
    НайденнаяСтрока = ДеревоСтроки.Строки.Найти(Строка.Значение, "Значение", Ложь);
    Если НайденнаяСтрока <> Неопределено Тогда
    СтруктураЗначенийПоказателей = НайденнаяСтрока.СтруктураЗначенийПоказателей;
    Иначе

    СтруктураЗначенийПоказателей = Новый Структура();
    Для Каждого ИмяПоказателя Из СтруктураПараметров.Показатели Цикл
    СтруктураЗначенийПоказателей.Вставить(ИмяПоказателя);
    КонецЦикла;
    КонецЕсли;
    Иначе

    СтруктураЗначенийПоказателей = Новый Структура();
    Для Каждого ИмяПоказателя Из СтруктураПараметров.Показатели Цикл
    СтруктураЗначенийПоказателей.Вставить(ИмяПоказателя);
    КонецЦикла;
    КонецЕсли;

    // Если группировка не выводится, переходим к выбору следующей (кроме иерархии)
    Если НЕ СтруктураПараметров.СтруктураПропускаемыеГруппировки.Свойство(Строка.ИмяИзмерения) Тогда

    МакетПоказатель.Параметры.Заполнить(СтруктураЗначенийПоказателей);

    ДокументРезультат.Присоединить(МакетПоказатель);

    КонецЕсли;

    // Следующий уровень:
    ВывестиПоказатели(СтруктураПараметров, ДокументРезультат, Строка, НайденнаяСтрока, МакетПоказатель);

    КонецЦикла;


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

    // Получает значения показателей для
    Процедура ПолучитьПоказатели(Выборка, Знач Индекс, СтруктураПараметров, ДокументРезультат, ДеревоСтроки)

    Пока Выборка.Следующий() Цикл

    // Запомним соответствие значений показателей и группировки в дереве
    НоваяСтрока = ДеревоСтроки.Строки.Добавить();
    НоваяСтрока.Значение = Выборка[Выборка.Группировка()];
    НоваяСтрока.ИмяИзмерения = ПостроительОтчета.ИзмеренияКолонки[Индекс].Имя;
    НоваяСтрока.СтруктураЗначенийПоказателей = Новый Структура;

    Для Каждого ИмяПоказателя Из СтруктураПараметров.Показатели Цикл

    НоваяСтрока.СтруктураЗначенийПоказателей.Вставить(ИмяПоказателя, Выборка[ИмяПоказателя]);

    КонецЦикла;

    Если Индекс < ПостроительОтчета.ИзмеренияКолонки.Количество()-1 Тогда

    ПолучитьПоказатели(Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, ПостроительОтчета.ИзмеренияКолонки[Индекс+1].Имя, ПостроительОтчета.ИзмеренияКолонки[Индекс].Имя),
    Индекс+1, СтруктураПараметров, ДокументРезультат, НоваяСтрока);

    КонецЕсли;

    КонецЦикла;

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

    // Выводит строку отчета
    Процедура ВывестиСтроку(Выборка, Знач Индекс, СтруктураПараметров, ДокументРезультат, Расшифровка)

    ИзмерениеСтроки = ПостроительОтчета.ИзмеренияСтроки[Индекс];

    Пока Выборка.Следующий() Цикл

    // Вывод значения измерения
    МакетИзмерение = ?(Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии,
    СтруктураПараметров.МакетыИзмеренийИерархия[Индекс],
    СтруктураПараметров.МакетыИзмерений[Индекс]);

    // Значения измерений и т.д.
    МакетИзмерение.Параметры.Заполнить(Выборка);

    // Если группировка не выводится, переходим к выбору следующей (кроме иерархии)
    Если СтруктураПараметров.СтруктураПропускаемыеГруппировки.Свойство(Выборка.Группировка())
    И Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда

    Перейти ~M1;

    КонецЕсли;

    ДокументРезультат.Вывести(МакетИзмерение, Выборка.Уровень());

    // Дерево значений для хранения значений по измерениям колонки
    ДеревоСтроки = Новый ДеревоЗначений;
    ДеревоСтроки.Колонки.Добавить("ИмяИзмерения");
    ДеревоСтроки.Колонки.Добавить("Значение");
    ДеревоСтроки.Колонки.Добавить("СтруктураЗначенийПоказателей");

    // Получение значений показателей по измерениям колонки
    ПолучитьПоказатели(Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, ПостроительОтчета.ИзмеренияКолонки[0].Имя, "Все"),
    0, СтруктураПараметров, ДокументРезультат, ДеревоСтроки);

    // Колонка "Общий Итог"
    НоваяСтрока = ДеревоСтроки.Строки.Добавить();
    НоваяСтрока.ИмяИзмерения = "Общие";
    НоваяСтрока.Значение = "Общие";
    НоваяСтрока.СтруктураЗначенийПоказателей = Новый Структура;

    Для Каждого ИмяПоказателя Из СтруктураПараметров.Показатели Цикл

    НоваяСтрока.СтруктураЗначенийПоказателей.Вставить(ИмяПоказателя, Выборка[ИмяПоказателя]);

    // Если итоги выводятся не по всем уровням, и в колонках - связанное с показателем измерение, тогда общие итоги не выводим
    Если НЕ ВыводитьИтогиПоВсемУровням Тогда

    СвязанныеИзмерения = Неопределено;
    мСтруктураСвязиПоказателейИИзмерений.Свойство(ИмяПоказателя, СвязанныеИзмерения);

    Если СвязанныеИзмерения <> Неопределено Тогда
    Если (СвязанныеИзмерения.Количество()>0
    И СвязанныеИзмерения.Свойство(СтруктураПараметров.ПервоеИзмерениеКолонкиИмя)) Тогда

    НоваяСтрока.СтруктураЗначенийПоказателей.Вставить(ИмяПоказателя, 0);
    КонецЕсли;
    КонецЕсли;

    КонецЕсли;
    КонецЦикла;

    // Макет показателей
    МакетПоказатель = ?(Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии,
    СтруктураПараметров.МакетыПоказателейИерархия[Индекс],
    СтруктураПараметров.МакетыПоказателей[Индекс]);

    Расшифровка.Вставить(Выборка.Группировка(), Выборка[Выборка.Группировка()]);

    Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда

    СтруктураРасшифровки = Новый Структура("Расшифровка", Новый Структура);
    Для Каждого Элемент Из Расшифровка Цикл
    СтруктураРасшифровки.Расшифровка.Вставить(Элемент.Ключ, Элемент.Значение);
    КонецЦикла;


    МакетПоказатель.Параметры.Заполнить(СтруктураРасшифровки);
    КонецЕсли;


    // Выводим показатели в соответствии с их порядком в шапке
    ВывестиПоказатели(СтруктураПараметров, ДокументРезультат, СтруктураПараметров.ДеревоКолонкиОтчета, ДеревоСтроки, МакетПоказатель);

    ~M1: Если Индекс < ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Тогда

    // На следующем уровне используем новую структуру расшифровки
    КопияРасшифровка = Новый Структура;

    Для Каждого Элемент Из Расшифровка Цикл

    КопияРасшифровка.Вставить(Элемент.Ключ, Элемент.Значение);

    КонецЦикла;

    ВывестиСтроку(Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, ПостроительОтчета.ИзмеренияСтроки[Индекс+1].Имя),
    Индекс+1, СтруктураПараметров, ДокументРезультат, КопияРасшифровка);

    КонецЕсли;
    КонецЦикла;;

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

    // Выполняет запрос и формирует табличный документ-результат отчета
    // в соответствии с настройками, заданными значениями реквизитов отчета.
    //
    // Параметры:
    // ДокументРезультат - табличный документ, формируемый отчетом,
    // ЕстьОшибки - флаг того, что при формировании произошли ошибки
    //
    //Процедура СформироватьОтчет(ДокументРезультат, ЕстьОшибки = Ложь) Экспорт
    Процедура СформироватьОтчет(ДокументРезультат, ПоказыватьЗаголовок, ВысотаЗаголовка, ТолькоЗаголовок = Ложь, ЕстьОшибки = Ложь, УказыватьРасшифровки = Истина) Экспорт

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

    Предупреждение("Не определен запрос отчета!");

    ЕстьОшибки = Истина;
    Возврат;
    КонецЕсли;

    // Очищаем нач. дату
    Если мРежимВводаПериода = 1 Тогда
    ДатаНач = '00010101000000';
    КонецЕсли;

    Если ДатаНач > ДатаКон И ДатаКон <> '00010101000000' Тогда
    Предупреждение("Дата начала периода не может быть больше даты конца периода", 60);
    ЕстьОшибки = Истина;
    Возврат;
    КонецЕсли;

    Если НЕ ЗадатьПараметрыОтбораПоКатегориям(ПостроительОтчета, мСтруктураДляОтбораПоКатегориям) Тогда
    //повторные отборы по категориям
    Предупреждение("По одной категории нельзя устанавливать два отбора", 60);
    ЕстьОшибки = Истина;
    Возврат;
    КонецЕсли;

    Если ПроверитьПовторыИзмеренийПостроителя(ПостроительОтчета) = Ложь Тогда
    ЕстьОшибки = Истина;
    возврат;
    КонецЕсли;

    // Запоминание ширины колонки
    Если НЕ ДокументРезультат.ВысотаТаблицы = ВысотаЗаголовка Тогда

    мМассивШиринКолонок.Очистить();

    // Запоминать следует, если документ не пустой
    Если ДокументРезультат.ВысотаТаблицы > 0 Тогда

    Для Сч=1 По ШиринаТаблицы Цикл
    мМассивШиринКолонок.Добавить(ДокументРезультат.Область(1,Сч).ШиринаКолонки);
    КонецЦикла;

    КонецЕсли;

    КонецЕсли;

    Если Показатели.Количество() > 0 Тогда
    ЕстьПоказатели = Ложь;
    Для Каждого Показатель Из Показатели Цикл
    Если Показатель.Использование Тогда
    ЕстьПоказатели = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если НЕ ЕстьПоказатели Тогда
    Предупреждение("Не выбраны показатели!", 30);
    ЕстьОшибки = Истина;
    Возврат;
    КонецЕсли;
    КонецЕсли;

    ПроверитьПорядокПостроителяОтчета(ПостроительОтчета);

    // Признак вывода детальных записей: в кросс-таблице не выводятся, в списке - в зависимости от связи с измерениями
    ВыводитьДетальныеЗаписи = Ложь;

    // Если это отчет-список, то нужно оперделить, выводить ли детальные записи
    МассивИндексовНезависимыхВыбранныхПолей = Новый Массив;

    Если ПостроительОтчета.ИзмеренияКолонки.Количество() = 0 Тогда

    // Определим, нужно ли выводить детальные записи:
    // Если выбранное поле подчинено измерению, то выводим рядом с измерением,
    // Если выбранное поле не связано ни с обним измерением, то выводим его в детальных записях

    ЕстьНесвязанныеПоля = Ложь;

    Для Инд = 0 По ПостроительОтчета.ВыбранныеПоля.Количество()-1 Цикл

    НайденаСвязь = Ложь;

    Для Сч = 0 По ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Цикл

    Измерение = ПостроительОтчета.ИзмеренияСтроки[Сч];

    // Если поле совпадает с измерением, то считаем, что его нужно выводить в детальных записях
    Если Измерение.ПутьКДанным = ПостроительОтчета.ВыбранныеПоля[Инд].ПутьКДанным Тогда
    //Продолжить;
    Прервать;
    КонецЕсли;

    // Если поле - подчиненое: поищем в макете

    Попытка

    Пустышка = ПостроительОтчета.Макет.ПолучитьОбласть(Измерение.Имя).Параметры[ПостроительОтчета.ВыбранныеПоля[Инд].Имя];

    НайденаСвязь = Истина;
    Прервать;

    Исключение
    Попытка

    // Если в макете поле называется ИмяПоля+Представление
    Пустышка = ПостроительОтчета.Макет.ПолучитьОбласть(Измерение.Имя).Параметры[ПостроительОтчета.ВыбранныеПоля[Инд].Имя+"Представление"];

    НайденаСвязь = Истина;
    Прервать;

    Исключение


    КонецПопытки;
    КонецПопытки;

    КонецЦикла;

    Если НЕ НайденаСвязь Тогда

    МассивИндексовНезависимыхВыбранныхПолей.Добавить(Инд);

    КонецЕсли;

    ЕстьНесвязанныеПоля = ЕстьНесвязанныеПоля ИЛИ НЕ НайденаСвязь;
    КонецЦикла;

    // Детальные записи выводим, если есть несвязанные выбранные поля
    ВыводитьДетальныеЗаписи = ЕстьНесвязанныеПоля;
    Иначе
    //Это кросс-таблица. Подход простой. Заранее удаляем все несвязанные с измерениями строк (sic!) поля.
    //это позволит сэкономить на выборке, и позволит вывести правильный заголовок отчета.
    СписокИндексовНесвязанныхПолей = Новый СписокЗначений;
    Для Инд = 0 По ПостроительОтчета.ВыбранныеПоля.Количество()-1 Цикл
    НайденаСвязь = Ложь;
    Для Сч = 0 По ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Цикл

    Измерение = ПостроительОтчета.ИзмеренияСтроки[Сч];

    Попытка

    Пустышка = ПостроительОтчета.Макет.ПолучитьОбласть(Измерение.Имя).Параметры[ПостроительОтчета.ВыбранныеПоля[Инд].Имя];

    НайденаСвязь = Истина;
    Прервать;

    Исключение
    Попытка

    // Если в макете поле называется ИмяПоля+Представление
    Пустышка = ПостроительОтчета.Макет.ПолучитьОбласть(Измерение.Имя).Параметры[ПостроительОтчета.ВыбранныеПоля[Инд].Имя+"Представление"];

    НайденаСвязь = Истина;
    Прервать;

    Исключение


    КонецПопытки;
    КонецПопытки;
    КонецЦикла;

    Если НЕ НайденаСвязь Тогда

    СписокИндексовНесвязанныхПолей.Добавить(Инд);

    КонецЕсли;

    КонецЦикла;

    СписокИндексовНесвязанныхПолей.СортироватьПоЗначению(НаправлениеСортировки.Убыв);

    Для Инд = 0 По СписокИндексовНесвязанныхПолей.Количество()-1 Цикл

    ПостроительОтчета.ВыбранныеПоля.Удалить(ПостроительОтчета.ВыбранныеПоля[СписокИндексовНесвязанныхПолей[Инд].Значение])

    КонецЦикла;

    СписокИндексовНесвязанныхПолей = 0;

    КонецЕсли;

    ПостроительОтчета.Макет = Неопределено;

    ПостроительОтчета.Параметры.Вставить("ДатаНач", ДатаНач);

    Если ДатаКон <> '00010101000000' Тогда
    Если мРежимВводаПериода = 1 Тогда
    ПостроительОтчета.Параметры.Вставить("ДатаКон", НачалоДня(ДатаКон + 60*60*24));
    Иначе
    ПостроительОтчета.Параметры.Вставить("ДатаКон", КонецДня(ДатаКон ));
    КонецЕсли;
    Иначе
    ПостроительОтчета.Параметры.Вставить("ДатаКон", '00010101000000');
    КонецЕсли;

    // Макет по умолчанию может быть переопределен
    Если мИсходныйМакетОтчета = Неопределено Тогда

    МакетОтчета = ПолучитьМакет("Макет");

    Иначе

    МакетОтчета = мИсходныйМакетОтчета;

    КонецЕсли;

    // Если требуется раскрашивать измерения, сформируем массивы, содержащие параметры оформления измерений,
    // которые в дальнейшем будут использованы при создании макета отчета.
    ОформлениеДетальныхЗаписей = Неопределено;

    ОформлениеСтроки = Новый Массив;

    ОформлениеСтрокиИерархии = Новый Массив;

    Если РаскрашиватьИзмерения Тогда

    ТабДокОформлениеИзмерений = МакетОтчета.ПолучитьОбласть("ОформлениеИзмерений");
    Для Сч = 1 По ТабДокОформлениеИзмерений.ВысотаТаблицы Цикл

    // Нечетные строки - иерархия, четные - измерения
    Если Сч - Цел(Сч/2)*2 = 1 Тогда

    ОформлениеСтроки.Добавить(ТабДокОформлениеИзмерений.Область(Сч,2));
    Иначе
    ОформлениеСтрокиИерархии.Добавить(ТабДокОформлениеИзмерений.Область(Сч,2));
    КонецЕсли;

    КонецЦикла;

    Если ВыводитьДетальныеЗаписи Тогда

    // Удаляем последний цвет из оформлений
    Если ОформлениеСтроки.Количество()>0 Тогда
    ОформлениеСтроки.Удалить(ОформлениеСтроки.ВГраница());
    КонецЕсли;
    Если ОформлениеСтрокиИерархии.Количество()>0 Тогда
    ОформлениеСтрокиИерархии.Удалить(ОформлениеСтрокиИерархии.ВГраница());
    КонецЕсли;

    ТабДокОформлениеДеталей = МакетОтчета.ПолучитьОбласть("ОформлениеДеталей");

    КонецЕсли;

    КонецЕсли;

    // Если выбрана периодическая группировка, необходимо установить соответствующее значение элемента отбора Периодичность,
    // связанного с параметром периодичности итогов виртуальной таблицы регистра.
    Если ПостроительОтчета.ДоступныеПоля.Найти("Периодичность") <> Неопределено Тогда
    Периодичность=Неопределено;
    Если ПостроительОтчета.ИзмеренияСтроки.Найти("ПериодГод")<>Неопределено
    ИЛИ ПостроительОтчета.ИзмеренияКолонки.Найти("ПериодГод")<>Неопределено Тогда
    Периодичность = 9;
    КонецЕсли;
    Если ПостроительОтчета.ИзмеренияСтроки.Найти("ПериодПолугодие")<>Неопределено
    ИЛИ ПостроительОтчета.ИзмеренияКолонки.Найти("ПериодПолугодие")<>Неопределено Тогда
    Периодичность = 8;
    КонецЕсли;
    Если ПостроительОтчета.ИзмеренияСтроки.Найти("ПериодКвартал")<>Неопределено
    ИЛИ ПостроительОтчета.ИзмеренияКолонки.Найти("ПериодКвартал")<>Неопределено Тогда
    Периодичность = 7;
    КонецЕсли;
    Если ПостроительОтчета.ИзмеренияСтроки.Найти("ПериодМесяц")<>Неопределено
    ИЛИ ПостроительОтчета.ИзмеренияКолонки.Найти("ПериодМесяц")<>Неопределено Тогда
    Периодичность = 6;
    КонецЕсли;
    Если ПостроительОтчета.ИзмеренияСтроки.Найти("ПериодДекада")<>Неопределено
    ИЛИ ПостроительОтчета.ИзмеренияКолонки.Найти("ПериодДекада")<>Неопределено Тогда
    Периодичность = 5;
    КонецЕсли;
    Если ПостроительОтчета.ИзмеренияСтроки.Найти("ПериодНеделя")<>Неопределено
    ИЛИ ПостроительОтчета.ИзмеренияКолонки.Найти("ПериодНеделя")<>Неопределено Тогда
    Периодичность = 4;
    КонецЕсли;
    Если ПостроительОтчета.ИзмеренияСтроки.Найти("ПериодДень")<>Неопределено
    ИЛИ ПостроительОтчета.ИзмеренияКолонки.Найти("ПериодДень")<>Неопределено Тогда
    Периодичность = 3;
    КонецЕсли;

    Если ПостроительОтчета.ВыбранныеПоля.Найти("Регистратор")<>Неопределено Тогда
    Периодичность = 2;
    КонецЕсли;

    НайденаПериодичность=Ложь;

    Для Инд = 0 По ПостроительОтчета.Отбор.Количество()-1 Цикл

    ПолеОтбора = ПостроительОтчета.Отбор[Инд];

    Если Найти(ПолеОтбора.Представление, "Периодичность")>0 Тогда
    НайденаПериодичность=Истина;
    Прервать;
    КонецЕсли;

    КонецЦикла;

    Если Периодичность<>Неопределено Тогда
    Если Не НайденаПериодичность Тогда
    ПолеОтбора = ПостроительОтчета.Отбор.Добавить("Периодичность");

    Иначе

    ПостроительОтчета.Отбор.Удалить(ПостроительОтчета.Отбор.Индекс(ПолеОтбора));

    ПолеОтбора = ПостроительОтчета.Отбор.Добавить("Периодичность");

    КонецЕсли;

    ПолеОтбора.Значение = Периодичность;
    ПолеОтбора.Использование = (Периодичность<>Неопределено);
    КонецЕсли;

    КонецЕсли;

    // Расшифровки
    ПостроительОтчета.ЗаполнениеРасшифровки = ВидЗаполненияРасшифровкиПостроителяОтчета.Расшифровка;

    ПостроительОтчета.ВыводитьДетальныеЗаписи = ВыводитьДетальныеЗаписи;

    // Преобразуем исходный макет путем копирования областей, чтобы он соответствовал количеству выбранных показателей способу их расположения,
    // количеству и расположению выбранных полей

    // Области исходного макетамакета
    ОбластьСтрока = МакетОтчета.Область("Строка");
    ОбластьСтрокаИерархии = МакетОтчета.Область("СтрокаИерархии");
    ОбластьДетали = МакетОтчета.Область("СтрокаДетали");
    ОбластьОбщиеИтоги = МакетОтчета.Область("ОбщиеИтоги");

    ОбластьКолонкаПоказатель = МакетОтчета.Область("Показатель");

    МассивПоказателей = Новый Массив;

    // Сосчитаем количество заданных показателей
    КоличествоПоказателей = 0;

    КоличествоКолонок = 1;

    Для Каждого Показатель Из Показатели Цикл
    Если Показатель.Использование = Истина Тогда

    КоличествоПоказателей = КоличествоПоказателей+1;

    // Для первого показателя ничего менять не нужно: уже есть отдельная колонка в исходном макете
    Если КоличествоПоказателей>1 Тогда

    //Сюда мы попадаем для второго и более показателей, поэтому проверок на количество показателей не делаем.

    // Если показатели выводятся в колонку, добавляем по строке в каждую секцию для каждого покажателя
    Если НЕ ВыводитьПоказателиВСтроку Тогда
    МакетОтчета.ВставитьОбласть(ОбластьОбщиеИтоги, ОбластьОбщиеИтоги, ТипСмещенияТабличногоДокумента.ПоВертикали);
    МакетОтчета.ВставитьОбласть(ОбластьДетали, ОбластьДетали, ТипСмещенияТабличногоДокумента.ПоВертикали);
    МакетОтчета.ВставитьОбласть(ОбластьСтрока, ОбластьСтрока, ТипСмещенияТабличногоДокумента.ПоВертикали);
    МакетОтчета.ВставитьОбласть(ОбластьСтрокаИерархии, ОбластьСтрокаИерархии, ТипСмещенияТабличногоДокумента.ПоВертикали);

    ОбластьСтрока = МакетОтчета.Область("Строка");
    ОбластьСтрокаИерархии = МакетОтчета.Область("СтрокаИерархии");
    ОбластьДетали = МакетОтчета.Область("СтрокаДетали");
    ОбластьОбщиеИтоги = МакетОтчета.Область("ОбщиеИтоги");

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

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

    МассивПоказателей.Добавить(Показатель.Имя);

    КонецЕсли;
    КонецЦикла;

    // Для отчета без показателей область "Показатель" не нужна
    Если КоличествоПоказателей = 0 Тогда

    МакетОтчета.УдалитьОбласть(МакетОтчета.Область("Показатель"));

    КонецЕсли;

    // Добавление необходимого количества колонок для вывода выбранных полей
    ОбластьПоле = МакетОтчета.Область("Поле");

    ВыводДопРеквизитов = Ложь;

    // Либо выводятся детальные записи, либо доп. поля в отдельной колонке
    Если ВыводитьДетальныеЗаписи Тогда
    ВыводитьДополнительныеПоляВОтдельнойКолонке = Ложь;
    КонецЕсли;

    Если ВыводитьДетальныеЗаписи Тогда

    // В зависимости от того, есть ли измерения строки, используется разная шапка
    Если ПостроительОтчета.ИзмеренияСтроки.Количество()>0 Тогда

    ОбластьШапкаТаблицыНиз = МакетОтчета.Область("ШапкаТаблицыНиз");

    Иначе

    ОбластьШапкаТаблицыНиз = МакетОтчета.Область("ШапкаТаблицы");

    КонецЕсли;

    // Изменим макет: добавим по одной колонке для каждого независимого поля, которое будет выводиться на уровне детальных записей
    Для Сч=1 По МассивИндексовНезависимыхВыбранныхПолей.Количество()-1 Цикл // на 1(2) меньше количества полей - одно уже есть

    МакетОтчета.ВставитьОбласть(ОбластьПоле,ОбластьПоле,ТипСмещенияТабличногоДокумента.ПоГоризонтали);

    КоличествоКолонок = КоличествоКолонок+1;

    ОбластьПоле = МакетОтчета.Область("Поле");
    КонецЦикла;

    // Все поля, которые не подчинены группировкам, будут колонками детальных записей
    Сч = 0;
    Для Каждого Инд ИЗ МассивИндексовНезависимыхВыбранныхПолей Цикл

    // В заголовке колонки детальной записи оставим только название последнего поля (для краткости,
    // например, вместо "Номенклатура.Базовая единица измерения" будет выводиться "Базовая единица измерения")
    ЗаголовокКолонки = ПостроительОтчета.ВыбранныеПоля[Инд].Представление;

    // Слудующая замена нужна для сохранения названий с сокращениями, таких, как "Физ. лицо"
    // В таких сокращениях слова должны быть разделены пробелами
    ЗаголовокКолонки = СтрЗаменить(ЗаголовокКолонки, ". ", "__");

    Для Поз = 1 По СтрЧислоВхождений(ЗаголовокКолонки, ".") Цикл
    ЗаголовокКолонки = Сред(ЗаголовокКолонки, Найти(ЗаголовокКолонки,".")+1);
    КонецЦикла;

    ЗаголовокКолонки = СтрЗаменить(ЗаголовокКолонки, "__", ". ");

    МакетОтчета.Область(ОбластьШапкаТаблицыНиз.Низ,1+1+Сч).Текст = ЗаголовокКолонки;

    Сч = Сч+1;
    КонецЦикла;

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

    // В добавленных колонках установим параметры областей, чтобы при выводе они заполнялись значениями соответствующих выбранных полей
    Сч = 0;
    Для Каждого Инд ИЗ МассивИндексовНезависимыхВыбранныхПолей Цикл

    Поле = ПостроительОтчета.ВыбранныеПоля[Инд];

    ФорматПоляДетальнойЗаписи = "";
    СтруктураФорматаПолей.Свойство(Поле.Имя, ФорматПоляДетальнойЗаписи);

    // Определим, можно ли использовать представление поля. Для этого попытаемся разобрать автоматический макет, область "Детали" построителя
    Попытка
    Пустышка = ПостроительОтчета.Макет.ПолучитьОбласть("Детали").Параметры[Поле.Имя+"Представление"];
    ЕстьПредставление = Истина;
    Исключение
    ЕстьПредставление = Ложь;
    КонецПопытки;

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

    Сч = Сч+1;
    КонецЦикла;

    Кол = 0;
    Для Каждого Показатель Из Показатели Цикл

    Если Показатель.Использование = Истина Тогда

    ИмяПоказателя = Показатель.Имя;

    ФорматПоказателя = мТаблицаПоказатели.Найти(Показатель.Имя).ФорматнаяСтрока;

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

    Если Кол=0 Тогда
    Для Инд = 0 По ПостроительОтчета.ВыбранныеПоля.Количество()-1 Цикл

    Если НЕ ВыводитьПоказателиВСтроку Тогда
    Если КоличествоПоказателей>1 Тогда
    МакетОтчета.Область(ОбластьДетали.Верх+Кол,1+1+Инд,
    ОбластьДетали.Верх+Кол+КоличествоПоказателей-1, 1+1+Инд).Объединить();
    КонецЕсли;
    КонецЕсли;

    КонецЦикла;
    КонецЕсли;

    Если (ВыводитьПоказателиВСтроку И КоличествоПоказателей > 1) Тогда

    МакетОтчета.Область(ОбластьДетали.Верх,1+КоличествоКолонок+1+0*КоличествоПоказателей+Кол).Параметр = ИмяПоказателя;
    МакетОтчета.Область(ОбластьДетали.Верх,1+КоличествоКолонок+1+0*КоличествоПоказателей+Кол).Формат = ФорматПоказателя;

    Иначе

    МакетОтчета.Область(ОбластьДетали.Верх+Кол,1+КоличествоКолонок+1).Параметр = ИмяПоказателя;
    МакетОтчета.Область(ОбластьДетали.Верх+Кол,1+КоличествоКолонок+1).Формат= ФорматПоказателя;
    КонецЕсли;

    Кол = Кол+1;
    КонецЕсли;

    КонецЦикла;

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

    Если (ВыводитьПоказателиВСтроку И КоличествоПоказателей>1)
    ИЛИ КоличествоПоказателей=0 Тогда

    ПостроительОтчета.МакетДетальныхЗаписей = МакетОтчета.ПолучитьОбласть(ОбластьДетали.Верх, ,ОбластьДетали.Верх);
    Иначе
    ПостроительОтчета.МакетДетальныхЗаписей = МакетОтчета.ПолучитьОбласть(ОбластьДетали.Верх, ,ОбластьДетали.Верх+Кол-1);
    КонецЕсли;

    Иначе

    Если ВыводитьДополнительныеПоляВОтдельнойКолонке Тогда

    // Определим, нужна ли дополнительная колонка для реквизитов измерений
    СписокПроверенныхВыбранныхПолей = Новый СписокЗначений;
    Для Сч = 0 По ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Цикл

    Измерение = ПостроительОтчета.ИзмеренияСтроки[Сч];
    Для Инд = 0 По ПостроительОтчета.ВыбранныеПоля.Количество()-1 Цикл

    Если СписокПроверенныхВыбранныхПолей.НайтиПоЗначению(ПостроительОтчета.ВыбранныеПоля[Инд]) <> Неопределено Тогда
    Продолжить;
    КонецЕсли;

    Попытка

    Пустышка = ПостроительОтчета.Макет.ПолучитьОбласть(Измерение.Имя).Параметры[ПостроительОтчета.ВыбранныеПоля[Инд].Имя];
    СписокПроверенныхВыбранныхПолей.Добавить(ПостроительОтчета.ВыбранныеПоля[Инд]);

    И

Поделиться этой страницей