При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются с неприятным визуальным эффектом: в настройках отчета (на вкладках «Выбранные поля», «Отбор» или «Сортировка») рядом с именами полей появляются красные крестики. Это сигнализирует о том, что схема компоновки больше не «видит» эти поля в наборе данных, хотя сам отчет может продолжать формироваться. Рассмотрим подробнее, почему это происходит и как исправить ситуацию, особенно когда разработка ведется в расширении.
Красный крестик в интерфейсе настроек СКД — это индикатор «битой ссылки». Система сообщает нам: «В текущих настройках выбрано поле X, но в источнике данных (запросе или объектной схеме) поля с таким идентификатором нет». Это может произойти из-за изменения текста запроса, удаления поля из набора данных или, что чаще всего бывает в современных версиях 1С, из-за проблем с правами доступа или метаданными в расширениях.
Если ваш отчет расположен в расширении, а данные он берет из основной конфигурации, основной причиной появления крестиков становится неполное заимствование типов. Разберем этот механизм по шагам:
экзОперативныйУчетФизическогоВеса).Регистратор и далее через точку к его реквизитам: Регистратор.Дата или Регистратор.Номер.Важный нюанс: Поле Регистратор имеет составной тип данных. Если в основной конфигурации у регистра 20 типов документов-регистраторов, а в расширение вы заимствовали только 5 из них, то для конструктора запроса СКД внутри расширения поле Регистратор становится «неполноценным». Система не может гарантировать наличие поля Дата у всех типов, которые ей известны в контексте расширения. В итоге поле пропадает из списка доступных, и вы видите красные крестики.
Решение: Убедитесь, что все документы, которые могут выступать регистраторами для используемого регистра, заимствованы в расширение. Если в систему был добавлен новый тип документа (регистратор), его также необходимо добавить в расширение.
Проанализируем текст запроса, который часто становится источником проблем:
ВЫБРАТЬ
экзОперативныйУчетФизическогоВеса.Регистратор.Дата КАК РегистраторДата,
экзОперативныйУчетФизическогоВеса.Регистратор КАК Регистратор,
экзОперативныйУчетФизическогоВеса.ФизВесПриход КАК ФизВесПриход
ИЗ
РегистрНакопления.экзОперативныйУчетФизическогоВеса.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, ДвиженияИГраницыПериода, ) КАК экзОперативныйУчетФизическогоВеса
В данном примере используется виртуальная таблица. Поля Регистратор и ПериодСекунда доступны в СКД только при определенных настройках периодичности. Если в параметрах виртуальной таблицы на уровне запроса или в настройках набора данных СКД будет установлена периодичность, отличная от Период, Запись или Авто (например, установлена периодичность Месяц), то поле Регистратор физически исчезнет из выборки. Это немедленно приведет к появлению красных крестиков во всех настройках, где этот регистратор использовался.
В сообщениях форума предлагается использовать конструкцию ТИПЗНАЧЕНИЯ(Регистратор.Ссылка) = ТИП(Документ.Имя). С точки зрения СКД это не самый удачный вариант, так как он заставляет систему выполнять сложные преобразования типов при попытке построить дерево доступных полей.
Рассмотрим более правильный подход с использованием оператора ССЫЛКА. Это работает стабильнее и лучше распознается визуальным конструктором:
ВЫБОР
КОГДА экзОперативныйУчетФизическогоВеса.Регистратор ССЫЛКА Документ.экзПриемнаяКвитанция
ТОГДА экзОперативныйУчетФизическогоВеса.ФизВесПриход
ИНАЧЕ 0
КОНЕЦ КАК ПриемныеКвитанцииПриход
Использование оператора ССЫЛКА позволяет платформе четко определить тип данных на этапе компиляции запроса. Если тип Документ.экзПриемнаяКвитанция не заимствован в расширение, конфигуратор сразу подсветит это место как ошибку, что позволит вам быстро исправить проблему, не гадая, почему появились крестики.
Иногда механизм автозаполнения (флажок Автозаполнение на закладке «Набор данных») работает слишком агрессивно или, наоборот, не может корректно интерпретировать сложный запрос с множественными соединениями.
Посмотрим, как решить проблему вручную:
Этот метод «замораживает» структуру доступных полей. Даже если конструктор запроса временно не может разрешить какой-то тип из-за особенностей расширения, поле останется в списке доступных, и настройки не «слетят».
Выясним причину исчезновения настроек сортировки. В СКД все элементы настроек (группировки, пользовательские поля, условное оформление) связаны с полями набора данных по их именам. Как только поле помечается красным крестиком (становится недоступным), все зависимые элементы деактивируются.
Если система не может найти поле РегистраторДата, она не может выполнить по нему сортировку. В некоторых случаях при сохранении схемы в таком состоянии платформа может автоматически удалить «ошибочные» настройки. Чтобы восстановить их, нужно сначала вернуть доступность базового поля (исправить заимствование или запрос), а затем заново выбрать его в настройках или сбросить настройки пользователя к стандартным.
ТИПЗНАЧЕНИЯ(...) = ТИП(...) на ... ССЫЛКА ....Соблюдение этих шагов поможет восстановить целостность схемы компоновки данных и обеспечит стабильную работу отчета в любых условиях.