При доработке типовых или создании собственных отчетов на базе системы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией: в конструкторе запроса поле удалено из списка выборки, однако в схеме компоновки оно по-прежнему отображается в списке доступных полей, а кнопка удаления для него недоступна. Попытка принудительно вырезать поле из всех мест запроса нередко приводит к синтаксическим ошибкам или нарушению логики типового функционала.
Разберем подробно причины такого поведения платформы 1С:Предприятие, проанализируем влияние измерений на расчет развернутого сальдо в виртуальных таблицах и рассмотрим правильные способы решения задачи.
В схеме компоновки данных поля набора данных типа Запрос формируются платформой автоматически. По кнопке «Удалить» стереть поле нельзя, так как его состав жестко привязан к тексту запроса и специальным инструкциям расширения языка компоновки данных (конструкциям в фигурных скобках {}).
Платформа продолжает видеть поле в схеме, если оно присутствует хотя бы в одном из следующих мест:
ВЫБРАТЬ;{ВЫБРАТЬ ...};{ГДЕ ...};{(Подразделение).*}.Если не очистить секции расширения, СКД будет генерировать поле в списке доступных, даже если в основном теле запроса оно уже не выбирается.
Рассмотрим практический пример запроса по взаиморасчетам. Допустим, перед нами стоит задача рассчитывать остатки задолженности без детализации по подразделениям:
ВЫБРАТЬ
ВзаиморасчетыОстатки.Организация КАК Организация,
ВЫРАЗИТЬ(ВзаиморасчетыОстатки.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ВЫРАЗИТЬ(ВзаиморасчетыОстатки.Субконто2 КАК Справочник.ДоговорыКонтрагентов) КАК Договор,
ВзаиморасчетыОстатки.Счет КАК Счет,
ВзаиморасчетыОстатки.СуммаРазвернутыйОстатокКт КАК СуммаРазвернутыйОстатокКт,
ВзаиморасчетыОстатки.Подразделение КАК Подразделение,
ВзаиморасчетыОстатки.Субконто3 КАК ДокументРасчетов
ПОМЕСТИТЬ ОстаткиВсе
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период {(&Период)}, Счет В (&СчетаСДокументомРасчетов), , ВЫРАЗИТЬ(Субконто2 КАК Справочник.ДоговорыКонтрагентов).ВидДоговора В (&ВидыДоговоров) {(Организация).*, (Подразделение).*, (Субконто1).* КАК Контрагент, (Субконто2).* КАК Договор, (Субконто3).* КАК Документ}) КАК ВзаиморасчетыОстатки
;
ВЫБРАТЬ
ОстаткиВсе.Организация КАК Организация,
ОстаткиВсе.Контрагент КАК Контрагент,
ОстаткиВсе.Договор КАК Договор,
ОстаткиВсе.Счет КАК Счет,
ОстаткиВсе.Подразделение КАК Подразделение,
ОстаткиВсе.ДокументРасчетов КАК ДокументРасчетов,
ОстаткиВсе.СуммаРазвернутыйОстатокКт КАК ОбщаяСуммаЗадолженности
{ВЫБРАТЬ
Организация.*,
Подразделение.*,
Контрагент.*,
Договор.*,
Документ.*}
ИЗ
ОстаткиВсе КАК ОстаткиВсе
{ГДЕ
ОстаткиВсе.Организация.*,
ОстаткиВсе.Подразделение.*,
ОстаткиВсе.Контрагент.*,
ОстаткиВсе.Договор.*}
Проанализируем работу ресурса СуммаРазвернутыйОстатокКт виртуальной таблицы РегистрБухгалтерии.Хозрасчетный.Остатки. Этот ресурс рассчитывается с учетом всех измерений и субконто, которые явно запрошены или переданы в параметры виртуальной таблицы.
Если измерение Подразделение присутствует в полях выборки виртуальной таблицы или в секции расширения {(Подразделение).*}, платформа при формировании итогового SQL-запроса включает подразделение в группировку. В результате взаиморасчеты будут разворачиваться в разрезе подразделений. Если по одному подразделению у контрагента дебет, а по другому кредит, то без исключения подразделения развернутый остаток не схлопнется на уровне договора.
Разберем по шагам, как полностью исключить поле из запроса СКД, чтобы не сломать синтаксис:
ВЫБРАТЬ во всех пакетах (во временных таблицах и в результирующей выборке).(Подразделение).* из фигурных скобок {(...)}.{ВЫБРАТЬ ...} и {ГДЕ ...} в конце запроса.В типовых отчетах удаление поля из запроса может привести к ошибкам в программном коде модулей отчета (например, при программной установке отборов или обработке параметра ВключатьОбособленныеПодразделения). Если необходимо запретить пользователю выводить или группировать данные по полю без изменения структуры запроса, используем механизм ограничений СКД.
Выполним следующие действия:
Подразделение).Такой подход гарантирует, что пользователь не сможет вывести поле в отчет или сгруппировать по нему данные, при этом программные механизмы типовой конфигурации продолжат работать без ошибок.