Разработчики 1С часто сталкиваются с ситуацией, когда при настройке схемы компоновки данных (СКД) одно или несколько полей наотрез отказываются выводиться в отчет. Особенно часто этот мистический феномен проявляется при использовании связей между несколькими наборами данных. Вы можете менять местами источник и приемник связи, проверять роли полей, возиться с флагом автозаполнения, но поле все равно бесследно исчезает на этапе вывода отчета.
В этой статье мы подробно разберем, почему в СКД пропадают поля, как устроены механизмы связей наборов данных изнутри и какие шаги необходимо предпринять, чтобы гарантированно вернуть потерянные данные в отчет.
Если вы создали новый отчет путем копирования старого файла (формата .erf) или копированием объекта внутри конфигуратора, то с высокой долей вероятности вы столкнетесь с проблемой "залипания" кэша. Платформа 1С:Предприятие оптимизирует работу с отчетами и сохраняет пользовательские настройки (выбранные поля, отборы, группировки) во внутреннем кэше и системных хранилищах настроек.
Когда вы открываете скопированный отчет, система видит его старый идентификатор или имя и автоматически накладывает сохраненные ранее пользовательские настройки поверх вашей новой схемы компоновки. Так как в старых настройках нового поля из связанного набора данных физически не существовало, СКД просто исключает его из вывода, игнорируя ваши изменения в конфигураторе.
Как решить проблему с кэшем без пересоздания отчета:
Имя. Это сгенерирует новый ключ для хранилища настроек, и старый кэш перестанет влиять на форму.Если пропадающее поле является числовым показателем (ресурсом), СКД требует обязательного указания правил его агрегирования. В СКД поля делятся на измерения (реквизиты) и ресурсы. Если вы пытаетесь вывести поле-число из подчиненного набора данных, но не добавили его на вкладку Ресурсы с указанием функции (например, СУММА(...)), компоновщик может некорректно обработать детальные записи, из-за чего поле останется пустым.
Перейдите на вкладку Ресурсы в схеме компоновки данных и убедитесь, что ваше числовое поле добавлено в список ресурсов, а в колонке "Выражение" задана соответствующая агрегатная функция. Для базового знакомства с этой темой подойдёт руководство по использованию ресурсов в СКД.
Связывание наборов данных в СКД принципиально отличается от классического соединения таблиц в запросе СУБД (LEFT JOIN). Компоновщик СКД выполняет запросы к наборам данных последовательно:
Если оптимизатор СКД "видит", что поле из связанного набора данных не используется в текущих выбранных полях группировки или детальных записей, он полностью исключает выполнение запроса ко второму набору данных. Это делается ради повышения производительности.
Проанализируем пример запроса для второго (связанного) набора данных:
ВЫБРАТЬ
ВыпускПродукцииОбороты.Регистратор КАК ДокументПроизводства,
ВыпускПродукцииОбороты.Организация КАК Организация,
ВыпускПродукцииОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Изделие,
ВыпускПродукцииОбороты.Подразделение КАК Подразделение,
СУММА(ЕСТЬNULL(ВыпускПродукцииОбороты.КоличествоОборот, 0)) КАК ВыпускКоличество
ПОМЕСТИТЬ втВыпуски
ИЗ
РегистрНакопления.ВыпускПродукции.Обороты(&ПериодНачало, &ПериодКонец, Авто, ) КАК ВыпускПродукцииОбороты
СГРУППИРОВАТЬ ПО
ВыпускПродукцииОбороты.Подразделение,
ВыпускПродукцииОбороты.Регистратор,
ВыпускПродукцииОбороты.Организация,
ВыпускПродукцииОбороты.АналитикаУчетаНоменклатуры.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втВыпуски.ДокументПроизводства КАК ДокументПроизводства,
втВыпуски.Организация КАК Организация,
втВыпуски.Изделие КАК Изделие,
втВыпуски.Подразделение КАК Подразделение,
втВыпуски.ВыпускКоличество КАК ВыпускКоличество
{ВЫБРАТЬ
ДокументПроизводства.*,
Организация.*,
Изделие.*,
Подразделение.*,
ВыпускКоличество}
ИЗ
втВыпуски КАК втВыпуски
{ГДЕ
втВыпуски.ДокументПроизводства.*,
втВыпуски.Организация.*,
втВыпуски.Изделие.*,
втВыпуски.Подразделение.*}
Обратите внимание на использование фигурных скобок {}. Это расширение языка запросов СКД. Если вы отключаете автозаполнение наборов данных (флаг Автозаполнение на вкладке "Наборы данных"), СКД будет опираться строго на те поля, которые объявлены внутри фигурных скобок {ВЫБРАТЬ ...}. Если вы добавили поле в основной текст запроса, но забыли прописать его в секции фигурных скобок расширения СКД при отключенном автозаполнении, данное поле никогда не появится в доступных полях компоновщика и не выведется в отчет.
Иногда поля пропадают не из-за ошибок в схеме СКД, а по причине работы механизмов платформы. Если реквизит конфигурации, который вы выбираете в запросе (например, Подразделение или Организация), связан с какой-либо функциональной опцией, платформа анализирует ее значение перед выводом отчета. Если в настройках вашей программы (в режиме Предприятия) данная функциональная опция выключена, платформа автоматически и без предупреждений удалит это поле из доступных полей СКД во время генерации макета компоновки.
Для того чтобы быстро диагностировать и решить проблему исчезающего поля в СКД при связи наборов данных, пройдите по следующему алгоритму:
{}.