Почему в СКД пропадают поля при связи наборов данных и как это исправить?

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

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

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

Причина 1. Кэширование пользовательских настроек (Самый частый случай)

Если вы создали новый отчет путем копирования старого файла (формата .erf) или копированием объекта внутри конфигуратора, то с высокой долей вероятности вы столкнетесь с проблемой "залипания" кэша. Платформа 1С:Предприятие оптимизирует работу с отчетами и сохраняет пользовательские настройки (выбранные поля, отборы, группировки) во внутреннем кэше и системных хранилищах настроек.

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

Как решить проблему с кэшем без пересоздания отчета:

  1. Сброс к стандартным настройкам: В режиме "1С:Предприятие" откройте форму отчета, нажмите кнопку Еще, выберите пункт Установить стандартные настройки (или "Сбросить настройки"). Это заставит систему очистить текущий пользовательский сеанс настроек и перечитать схему СКД из конфигуратора.
  2. Изменение имени объекта: Перейдите в конфигуратор, откройте свойства отчета и измените его техническое свойство Имя. Это сгенерирует новый ключ для хранилища настроек, и старый кэш перестанет влиять на форму.
  3. Очистка кэша конфигурационной базы: Физически удалите файлы локального кэша вашей информационной базы на компьютере разработчика.
  4. Экспорт и импорт схемы: Выгрузите созданную схему компоновки во внешний XML-файл, создайте абсолютно новый чистый отчет и загрузите XML-схему обратно. Это обновит все внутренние GUID-идентификаторы схемы компоновки.

Причина 2. Особенности агрегации ресурсов в связанных наборах

Если пропадающее поле является числовым показателем (ресурсом), СКД требует обязательного указания правил его агрегирования. В СКД поля делятся на измерения (реквизиты) и ресурсы. Если вы пытаетесь вывести поле-число из подчиненного набора данных, но не добавили его на вкладку Ресурсы с указанием функции (например, СУММА(...)), компоновщик может некорректно обработать детальные записи, из-за чего поле останется пустым.

Перейдите на вкладку Ресурсы в схеме компоновки данных и убедитесь, что ваше числовое поле добавлено в список ресурсов, а в колонке "Выражение" задана соответствующая агрегатная функция. Для базового знакомства с этой темой подойдёт руководство по использованию ресурсов в СКД.

Причина 3. Специфика работы связей наборов данных в СКД

Связывание наборов данных в СКД принципиально отличается от классического соединения таблиц в запросе СУБД (LEFT JOIN). Компоновщик СКД выполняет запросы к наборам данных последовательно:

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

Проанализируем пример запроса для второго (связанного) набора данных:


ВЫБРАТЬ
    ВыпускПродукцииОбороты.Регистратор КАК ДокументПроизводства,
    ВыпускПродукцииОбороты.Организация КАК Организация,
    ВыпускПродукцииОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Изделие,
    ВыпускПродукцииОбороты.Подразделение КАК Подразделение,
    СУММА(ЕСТЬNULL(ВыпускПродукцииОбороты.КоличествоОборот, 0)) КАК ВыпускКоличество
ПОМЕСТИТЬ втВыпуски
ИЗ
    РегистрНакопления.ВыпускПродукции.Обороты(&ПериодНачало, &ПериодКонец, Авто, ) КАК ВыпускПродукцииОбороты
СГРУППИРОВАТЬ ПО
    ВыпускПродукцииОбороты.Подразделение,
    ВыпускПродукцииОбороты.Регистратор,
    ВыпускПродукцииОбороты.Организация,
    ВыпускПродукцииОбороты.АналитикаУчетаНоменклатуры.Номенклатура
;
 ////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втВыпуски.ДокументПроизводства КАК ДокументПроизводства,
    втВыпуски.Организация КАК Организация,
    втВыпуски.Изделие КАК Изделие,
    втВыпуски.Подразделение КАК Подразделение,
    втВыпуски.ВыпускКоличество КАК ВыпускКоличество
{ВЫБРАТЬ
    ДокументПроизводства.*,
    Организация.*,
    Изделие.*,
    Подразделение.*,
    ВыпускКоличество}
ИЗ
    втВыпуски КАК втВыпуски
{ГДЕ
    втВыпуски.ДокументПроизводства.*,
    втВыпуски.Организация.*,
    втВыпуски.Изделие.*,
    втВыпуски.Подразделение.*}

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

Причина 4. Влияние функциональных опций

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

Резюме и чеклист для решения проблемы

Для того чтобы быстро диагностировать и решить проблему исчезающего поля в СКД при связи наборов данных, пройдите по следующему алгоритму:

  1. Сделайте сброс настроек отчета к стандартным в режиме Предприятия.
  2. Если отчет был скопирован, измените его имя в свойствах конфигуратора или пересоздайте отчет заново.
  3. Проверьте вкладку Ресурсы. Если пропадающее поле числовое — обязательно добавьте его в ресурсы.
  4. Если вы отключили флаг Автозаполнение, убедитесь, что все новые поля описаны в секциях расширения языка запросов СКД внутри фигурных скобок {}.
  5. Проверьте корректность сопоставления параметров на вкладке Связи наборов данных. Убедитесь, что типы связующих полей в источнике и приемнике строго совпадают.
← На главную