Почему добавленное поле не выводится в отчете на СКД в 1С 8.3

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

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

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

Причина проблемы: секция расширения запроса {ВЫБРАТЬ}

Проанализируем текст запроса, с которым возникла проблема. В исходном запросе к виртуальной таблице остатков регистра бухгалтерии было добавлено левое соединение с регистром сведений:


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

Обратим внимание на блок, заключенный в фигурные скобки: {ВЫБРАТЬ ...}. Это конструкция расширения языка запросов СКД. Она указывает компоновщику данных жесткий перечень полей, которые разрешено выбирать динамически при формировании отчета.

Если в основном списке полей ВЫБРАТЬ поле присутствует, но его нет внутри секции {ВЫБРАТЬ ...}, генератор макета СКД оптимизирует исполняемый SQL-запрос. Платформа видит, что поле не описано в расширении, исключает его из выборки и отсекает связанную таблицу РегистрСведений.СерийныеНомера как неиспользуемую. В результате поле вообще не попадает в результат запроса.

Способ 1. Корректировка секции расширения запроса

Рассмотрим самый простой способ исправления ситуации — явное объявление нового поля в блоке расширения компоновки данных. Для этого добавим поле серийного номера в фигурные скобки {ВЫБРАТЬ}:


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

Важно: если поле простого типа (число, строка, дата), звездочка .* после имени поля в секции {ВЫБРАТЬ} не ставится. Если поле ссылочного типа, синтаксис СерийныйНомер.* позволит пользователю обращаться ко всем реквизитам этой ссылки в пользовательских настройках отчета.

Опасность задвоения числовых ресурсов

Проанализируем важный нюанс: прямое левое соединение таблицы остатков с регистром серийных номеров только по полю Номенклатура таит в себе логическую ошибку. Если для одной номенклатурной позиции в регистре зарегистрировано несколько серийных номеров, строка остатка размножится на количество найденных серий.

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

Способ 2. Использование связей наборов данных в СКД

Разделим выборку данных на два независимых набора данных (запроса), что гарантирует целостность числовых показателей:

  1. Набор данных №1 (Остатки): запрос к регистру бухгалтерии, получающий остатки номенклатуры в разрезе складов и организаций без соединения с серийными номерами.
  2. Набор данных №2 (Серии): отдельный запрос к регистру сведений СерийныеНомера, выбирающий поля Номенклатура, Склад и СерийныйНомер.

После создания двух наборов перейдем на вкладку «Связи наборов данных» и настроим связь:

  1. Источник связи: НаборДанных1 (Остатки).
  2. Приемник связи: НаборДанных2 (Серии).
  3. Условие связи: Номенклатура = Номенклатура (и Склад = Склад, если серийный учет ведется с привязкой к складу).

При таком подходе СКД сама выполнит постобработку данных, не умножая строки с числовыми ресурсами в исходной выборке.

Способ 3. Сброс кэша пользовательских настроек

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

После изменения схемы компоновки данных в конфигураторе необходимо в режиме «1С:Предприятие» выполнить сброс формы отчета:

  1. Открыть отчет в пользовательском режиме.
  2. Нажать «Еще» → «Установить стандартные настройки».
  3. При необходимости зайти в форму «Настройки» (расширенный режим) и на вкладке «Поля и сортировки» проверить наличие флага напротив добавленного поля СерийныйНомер.
← На главную