Как правильно удалить поле из отчета на СКД и исключить разрез учета

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Разберем подробно причины такого поведения платформы 1С:Предприятие, проанализируем влияние измерений на расчет развернутого сальдо в виртуальных таблицах и рассмотрим правильные способы решения задачи.

Почему поле не удаляется на вкладке «Наборы данных»

В схеме компоновки данных поля набора данных типа Запрос формируются платформой автоматически. По кнопке «Удалить» стереть поле нельзя, так как его состав жестко привязан к тексту запроса и специальным инструкциям расширения языка компоновки данных (конструкциям в фигурных скобках {}).

Платформа продолжает видеть поле в схеме, если оно присутствует хотя бы в одном из следующих мест:

  1. В основном списке полей оператора ВЫБРАТЬ;
  2. В секциях расширения {ВЫБРАТЬ ...};
  3. В секциях условий {ГДЕ ...};
  4. В параметрах виртуальных таблиц и их блоках расширения условий, например {(Подразделение).*}.

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

Влияние разреза учета на расчет развернутого сальдо

Рассмотрим практический пример запроса по взаиморасчетам. Допустим, перед нами стоит задача рассчитывать остатки задолженности без детализации по подразделениям:


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

Проанализируем работу ресурса СуммаРазвернутыйОстатокКт виртуальной таблицы РегистрБухгалтерии.Хозрасчетный.Остатки. Этот ресурс рассчитывается с учетом всех измерений и субконто, которые явно запрошены или переданы в параметры виртуальной таблицы.

Если измерение Подразделение присутствует в полях выборки виртуальной таблицы или в секции расширения {(Подразделение).*}, платформа при формировании итогового SQL-запроса включает подразделение в группировку. В результате взаиморасчеты будут разворачиваться в разрезе подразделений. Если по одному подразделению у контрагента дебет, а по другому кредит, то без исключения подразделения развернутый остаток не схлопнется на уровне договора.

Пошаговый алгоритм полного удаления поля из запроса

Разберем по шагам, как полностью исключить поле из запроса СКД, чтобы не сломать синтаксис:

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

Альтернативный способ: скрытие поля через ограничения

В типовых отчетах удаление поля из запроса может привести к ошибкам в программном коде модулей отчета (например, при программной установке отборов или обработке параметра ВключатьОбособленныеПодразделения). Если необходимо запретить пользователю выводить или группировать данные по полю без изменения структуры запроса, используем механизм ограничений СКД.

Выполним следующие действия:

  1. Перейдем на вкладку Наборы данных в схеме компоновки.
  2. В таблице полей найдем нужное поле (например, Подразделение).
  3. В колонке Ограничение поля установим флаги: запрет выбора, запрет условия, запрет группировки и запрет упорядочивания.
  4. На вкладке Настройки исключим поле из структуры группировок и выбранных полей варианта отчета.

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

← На главную