В заключение этой практической главы покажем возможность отладки схем компоновки данных с помощью консоли системы компоновки данных. Консоль опубликована на ИТС (), ее можно получить как внешний отчет/обработку и добавить в свою конфигурацию или открыть как внешний файл.
Консоль системы компоновки данных позволяет загрузить и выполнить уже готовый отчет или разработать новый отчет с нуля, используя встроенный конструктор схемы компоновки данных. При этом можно просмотреть XML-текст схемы компоновки данных и проанализировать результирующий запрос к информационной базе, который формирует платформа для получения данных отчета после применения всех настроек, параметров и т. п.
Это бывает нужно для анализа сложных схем компоновки данных, когда в результате отчета появляются непонятные ошибки и требуется понять изнутри, что же делает система компоновки данных.
Для примера рассмотрим схему компоновки данных разработанного ранее отчета ОстаткиИПродажиТоваров (). Напомним, что в данном отчете использовалась связь наборов данных (Остатки и Продажи) по периодам с использованием параметров связи. Во втором наборе данных мы отключали свойство Автозаполнение () и сформировали набор полей и их роли самостоятельно в тексте запроса. Дело в том, что автоматическое заполнение полей и значений параметров не всегда оптимально и иногда может привести к ошибкам. Чтобы это увидеть, проанализируем текст запроса платформы в сгенерированном макете компоновки данных при помощи консоли системы компоновки данных.
Сначала сохраним в файл схему компоновки данных нужного нам отчета ОстаткиИПродажиТоваров (рис. 2.314).
Рис. 2.314. Сохранение схемы компоновки данных в файл
Запустим «1С:Предприятие» в режиме Толстый клиент (управляемое приложение). Консоль системы компоновки данных добавлена в нашу демонстрационную конфигурацию в качестве обработки, и ее можно вызвать из группы команд Сервис. Запустим ее и добавим новый отчет в консоль системы компоновки данных. Для этого нажмем кнопку Добавить в командной панели консоли (рис. 2.315).
Рис. 2.315. Добавление отчета в консоль системы компоновки данных
После этого нажмем кнопку Загрузить схему из файла и загрузим из файла ранее сохраненную схему компоновки данных. В верхнем правом окне консоли мы увидим XML-текст загруженной схемы компоновки данных. Затем нажмем кнопку Сформировать. В нижнем окне консоли на закладке Табличный документ мы увидим результат выполнения отчета в виде табличного документа (рис. 2.316).
Рис. 2.316. Результат отчета в консоли системы компоновки данных
Откроем конструктор схемы компоновки данных и введем значения параметров отчетного периода (рис. 2.317).
Рис. 2.317. Редактирование настроек отчета в конструкторе схемы компоновки данных
Нажмем ОК, сформируем отчет и в нижней части консоли перейдем на закладку Макет для табличного документа XML. Здесь мы видим XML-текст сгенерированного макета компоновки данных, внутри которого мы можем найти и проанализировать текст запроса, выполняемого платформой для получения данных отчета (рис. 2.318).
Рис. 2.318. Сгенерированный макет компоновки данных
Поскольку схема компоновки данных, макет компоновки и т. п. представлены в виде XML-текста, разработчик должен представлять структуру описания этих объектов в XML-формате. Рассмотрим структуру описания схемы компоновки данных:
ПРИМЕЧАНИЕ
Некоторые символы, зарезервированные в XML, отображаются в тексте при помощи специальных обозначений. Так, символ "&" отображается как "&", символ "<" отображается как "<", символ ">" – как ">".
Найдем в тексте схемы компоновки данных (в верхнем правом окне консоли) запрос для первого набора данных Остатки (листинг 2.73).
Листинг 2.73. Запрос для набора данных «Остатки» в схеме компоновки данных
<query>ВЫБРАТЬ
ОстаткиНоменклатурыОстаткиИОбороты.Период КАК НачалоПериода,
КОНЕЦПЕРИОДА(ОстаткиНоменклатурыОстаткиИОбороты.Период, МЕСЯЦ)
КАК КонецПериода,
ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток
КАК НачальныйОстаток,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток
КАК КонечныйОстаток
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(, , Месяц, , )
КАК ОстаткиНоменклатурыОстаткиИОбороты</query>
Теперь посмотрим, как изменился текст этого запроса в макете компоновки данных (в нижнем окне консоли, на закладке Макет для табличного документа XML), листинг 2.74.
Листинг 2.74. Запрос для набора данных «Остатки» в макете компоновки данных
<query>ВЫБРАТЬ
ОстаткиНоменклатурыОстаткиИОбороты.Период КАК НачалоПериода,
КОНЕЦПЕРИОДА(ОстаткиНоменклатурыОстаткиИОбороты.Период, МЕСЯЦ)
КАК КонецПериода,
ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура КАК Номенклатура,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток
КАК НачальныйОстаток,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток
КАК КонечныйОстаток,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура)
КАК НоменклатураПредставление,
ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура.Наименование
КАК НоменклатураНаименование
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(&П, &П2,
Месяц, , ) КАК ОстаткиНоменклатурыОстаткиИОбороты</query>
Измененные фрагменты запроса выделены в листинге 2.74 жирным шрифтом. В результирующем запросе получается представление ссылки и наименования измерения Номенклатура, а также параметры НачалоПериода и КонецПериода виртуальной таблицы ОстаткиНоменклатуры.ОстаткиИОбороты заполняются значениями, введенными в настройках отчета на закладке Параметры (см. рис. 2.317). В макете компоновки данных параметры заполняются следующим образом (листинг 2.75).
Листинг 2.75. Заполнение параметров в макете компоновки данных
<parameterValue>
<name>КонецПериода</name>
<value xsi:type="xs:dateTime">2012-01-31T00:00:00</value>
</parameterValue>
<parameterValue>
<name>КонецПериодаПродаж</name>
<value xsi:type="xs:dateTime">0001-01-01T00:00:00</value>
</parameterValue>
<parameterValue>
<name>НачалоПериода</name>
<value xsi:type="xs:dateTime">2011-12-01T00:00:00</value>
</parameterValue>
<parameterValue>
<name>НачалоПериодаПродаж</name>
<value xsi:type="xs:dateTime">0001-01-01T00:00:00</value>
</parameterValue>
<parameterValue>
<name>П</name>
<value xsi:type="xs:dateTime">2011-12-01T00:00:00</value>
</parameterValue>
<parameterValue>
<name>П2</name>
<value xsi:type="xs:dateTime">2012-01-31T00:00:00</value>
</parameterValue>
Теперь проанализируем текст второго набора данных Продажи. В схеме компоновки данных он имеет следующий вид (листинг 2.76).
Листинг 2.76. Запрос для набора данных «Продажи» в схеме компоновки данных
<query>ВЫБРАТЬ
&НачалоПериодаПродаж КАК НачалоПериода,
&КонецПериодаПродаж КАК КонецПериода,
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество
{ВЫБРАТЬ
НачалоПериода,
КонецПериода,
Номенклатура.*,
Количество}
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериодаПродаж,
&КонецПериодаПродаж, , {(Контрагент).*, (Номенклатура).*})
КАК ПродажиОбороты</query>
Посмотрим, как изменился текст этого запроса в макете компоновки данных (листинг 2.77).
Листинг 2.77. Запрос для набора данных «Продажи» в макете компоновки данных
<query>ВЫБРАТЬ
&НачалоПериодаПродаж КАК НачалоПериода,
&КонецПериодаПродаж КАК КонецПериода,
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериодаПродаж,
&КонецПериодаПродаж, , ) КАК ПродажиОбороты
Поскольку связь исходного набора данных Остатки с набором Продажи выполняется по полям НачалоПериода и КонецПериода, с использованием параметров связи НачалоПериодаПродаж/КонецПериодаПродаж, значения полей НачалоПериода и КонецПериода набора данных Остатки (в данном случае начало и конец месяца) будут использоваться в качестве значений параметров НачалоПериодаПродаж/КонецПериодаПродаж виртуальной таблицы Продажи.Обороты.
При разработке отчета опытным путем мы выяснили, что установка свойства Автозаполнение для набора данных Продажи приводит к ошибке – данные в колонке Количество (Продано) увеличиваются пропорционально количеству периодов в отчете. Разберемся, почему это происходит.
Сначала на закладке Макет для табличного документа XML сохраним правильный вариант макета компоновки данных, нажав кнопку Сохранить эталон (см. рис. 2.318). Затем в конструкторе схемы компоновки данных включим свойство Автозаполнение для набора данных Продажи (рис. 2.319) и установим следующий текст запроса (листинг 2.78).
Рис. 2.319. Изменение запроса в конструкторе схемы компоновки данных
Листинг 2.78. Запрос для набора данных «Продажи» в конструкторе схемы компоновки данных
ВЫБРАТЬ
&НачалоПериодаПродаж КАК НачалоПериода,
&КонецПериодаПродаж КАК КонецПериода,
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериодаПродаж,
&КонецПериодаПродаж, , ) КАК ПродажиОбороты
Добавим в ресурсы схемы компоновки поле Количество, так как этот ресурс исчезнет при изменении запроса. Сформируем отчет. Найдем текст запроса для набора Продажи в сгенерированном макете компоновки данных (в нижнем окне консоли, на закладке Макет для табличного документа XML), листинг 2.79.
Листинг 2.79. Запрос для набора данных «Продажи» в макете компоновки данных
<query>ВЫБРАТЬ
&НачалоПериодаПродаж КАК НачалоПериода,
&КонецПериодаПродаж КАК КонецПериода,
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество
ИЗ
РегистрНакопления.Продажи.Обороты(&П, &П2, , )
КАК ПродажиОбороты</query>
Измененные фрагменты запроса по сравнению с листингом 2.77 выделены жирным шрифтом. Чтобы быстро найти отличия макета, сгенерированного в результате изменений, нажмем кнопку Сравнить с эталоном (рис. 2.320).
Рис. 2.320. Сравнение двух макетов компоновки данных
Из текста запроса мы видим, что параметры НачалоПериодаПродаж/КонецПериодаПродаж виртуальной таблицы Продажи.Обороты будут заполняться не значениями полей НачалоПериода и КонецПериода набора данных Остатки, а значениями настроек отчетного периода НачалоПериода и КонецПериода. То есть в нашем случае (когда данные выбираются с периодичностью Месяц) период продаж не разбивается по месяцам, а включает сразу два месяца, из-за чего и получается дублирование данных в колонке Количество (Продано).
Рассмотрим теперь другую важную особенность системы компоновки данных: система исключает из результирующего запроса поля, не участвующие в настройках отчета. Это также может приводить к ошибкам.
Рассмотрим пример. Разработаем простой отчет по продажам и проанализируем текст запроса в макете компоновки данных в зависимости от изменения настроек отчета.
Нажмем кнопку Добавить в командной панели консоли системы компоновки данных и добавим новый отчет. Откроем конструктор схемы компоновки данных и добавим набор данных – запрос. Заполним текст запроса для набора данных следующим образом (листинг 2.80).
Листинг 2.80. Запрос для набора данных в конструкторе схемы компоновки данных
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.Контрагент,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость
ИЗ
РегистрНакопления.Продажи.Обороты( ) КАК ПродажиОбороты
На закладке Вычисляемые поля добавим вычисляемое поле () Сумма и зададим выражение для его расчета как Количество * Стоимость (рис. 2.321).
Рис. 2.321. Вычисляемые поля в конструкторе схемы компоновки данных
Выражение для расчета вычисляемого поля задано просто для примера и не несет никакой смысловой нагрузки. На закладке Ресурсы добавим поле Сумма в ресурсы отчета ().
Рис. 2.322. Ресурсы в конструкторе схемы компоновки данных
На закладке Настройки добавим в настройки отчета группировку Детальные записи и в список выбранных полей – поля Контрагент, Номенклатура и Сумма (рис. 2.323).
Рис. 2.323. Структура и выбранные поля отчета
Нажмем ОК и сформируем отчет, нажав кнопку Сформировать (рис. 2.324).
Рис. 2.324. Результат отчета в консоли системы компоновки данных
Найдем текст запроса для набора данных в сгенерированном макете компоновки данных (в нижнем окне консоли, на закладке Макет для табличного документа XML), листинг 2.81.
Листинг 2.81. Запрос для набора данных в макете компоновки данных
<query>ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление
ИЗ
РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиОбороты</query>
Поскольку свойство Автозаполнение включено, в описании полей набора данных для полей Контрагент и Номенклатура установлена роль – Измерение (листинг 2.82).
Листинг 2.82. Роль поля «Номенклатура» в макете компоновки данных
<field>
<dataPath>Номенклатура</dataPath>
<name>Номенклатура</name>
<role>
<dcscom:dimension>true</dcscom:dimension>
</role>
</field>
Теперь в конструкторе схемы компоновки данных изменим настройки отчета – отключим использование поля Номенклатура (рис. 2.325).
Рис. 2.325. Изменение настроек отчета в конструкторе схемы компоновки данных
Сформируем отчет и сравним его с правильным вариантом на рис 2.324 (рис. 2.326).
Рис. 2.326. Результат отчета в консоли системы компоновки данных
Мы видим, что суммы продаж, не учитывающие разрез по номенклатуре, – неправильные. Почему так происходит?
Найдем текст запроса для набора данных в макете компоновки данных (листинг 2.83).
Листинг 2.83. Запрос для набора данных в макете компоновки данных
<query>ВЫБРАТЬ
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление
ИЗ
РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиОбороты</query>
Мы видим, что в запросе нет поля Номенклатура, так как это поле не показывается в отчете. Однако это поле является измерением оборотного регистра накопления Продажи, служащего источником данных для запроса. Поэтому при расчете любых вычисляемых полей отчета данные должны учитываться в разрезе номенклатуры. То есть поле Номенклатура должно обязательно присутствовать в тексте запроса, и у этого поля должна быть установлена роль – Измерение.
Чтобы этого добиться, откроем конструктор схемы компоновки данных и на закладке Наборы данных установим свойство Обязательное в роли поля Номенклатура (рис. 2.327).
Рис. 2.327. Установка признака «Обязательное» в роли поля «Номенклатура»
Сформируем отчет. Теперь результат правильный, поскольку данные в нем разрезаются по номенклатуре (рис. 2.328).
Рис. 2.328. Результат отчета в консоли системы компоновки данных
Найдем описание роли поля Номенклатура в макете компоновки данных (листинг 2.84).
Листинг 2.84. Роль поля «Номенклатура» в макете компоновки данных
<field>
<dataPath>Номенклатура</dataPath>
<name>Номенклатура</name>
<role>
<dcscom:dimension>true</dcscom:dimension>
<dcscom:required>true</dcscom:required>
</role>
</field>
В описании роли поля указаны свойства Измерение и Обязательное. Это значит, что поле Номенклатура обязательно будет присутствовать в списке полей запроса, независимо от настроек отчета (листинг 2.85).
Листинг 2.85. Запрос для набора данных в макете компоновки данных
<query>ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление
ИЗ
РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиОбороты</query>
Обратите внимание, что хотя поля Количество и Стоимость не выводятся в отчете, они все равно присутствуют в запросе, так как участвуют в расчете поля Сумма.
В заключение посмотрим, как будет влиять на текст результирующего запроса отбор, установленный в настройках отчета. Откроем конструктор схемы компоновки данных и установим отбор по номенклатуре – <Номенклатура> <В Группе> <Услуги> (рис. 2.329).
Рис. 2.329. Создание отбора в конструкторе схемы компоновки данных
Сформируем отчет (рис. 2.330).
Рис. 2.330. Результат отчета в консоли системы компоновки данных
Посмотрим, как изменился текст запроса для набора данных в макете компоновки данных (листинг 2.86).
Листинг 2.86. Запрос для набора данных в макете компоновки данных
<query>ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление
ИЗ
РегистрНакопления.Продажи.Обороты(, , , Номенклатура В ИЕРАРХИИ(&П))
КАК ПродажиОбороты</query>
</dataSet>
<parameterValue>
<name>П</name>
<value xmlns:d3p1="http://v8.1c.ru/8.1/data/enterprise/current-config"
xsi:type="d3p1:CatalogRef.Номенклатура">
56167a13-f50b-11dc-b151-001617c01d7d</value>
</parameterValue>
Мы видим, что условие отбора добавлено в параметр Условие виртуальной таблицы Продажи.Обороты, а параметр (&П) заполняется значением ссылки на элемент справочника.