При работе с Системой Компоновки Данных (СКД) в 1С, особенно при создании сложных отчетов, мы часто сталкиваемся с ситуациями, когда система выдает ошибку "Поле не найдено". Одним из частых случаев является отсутствие возможности найти вычисляемое поле или ресурс, которое, казалось бы, было добавлено и настроено в схеме компоновки данных. Давайте вместе разберем, почему такая ошибка возникает, на что следует обратить внимание и как ее эффективно диагностировать и устранять, особенно на примере вычисляемого поля ОбъемПродаж.
Ситуация, описанная нашим коллегой, когда "Поле не найдено ОбъемПродаж", несмотря на то, что, по его словам, все сделано идентично работающему примеру из книги Хрусталевой, является классической. Она показывает, насколько важно внимательно относиться к деталям настройки СКД, ведь даже малейшее отклонение может привести к неработоспособности отчета.
Одной из самых распространенных и, казалось бы, очевидных причин ошибки "Поле не найдено" для вычисляемого поля является отсутствие или некорректное заполнение его выражения. Если мы добавляем новое вычисляемое поле, например, ОбъемПродаж, но забываем указать, как именно оно должно вычисляться, система не сможет его "найти" или, точнее, определить его значение. Это как если бы мы спросили кого-то о результате, не объяснив, что именно нужно посчитать.
ОбъемПродаж в закладке "Наборы данных" – "Поля" – "Вычисляемые поля" (или "Ресурсы", если это ресурс) заполнено свойство "Выражение". Здесь должно быть указано, как рассчитывается наше поле, например:
Количество * Цена
или
ВЫБОР КОГДА Продажи.Номенклатура.ВидНоменклатуры = "Услуга" ТОГДА Продажи.СуммаУслуг ИНАЧЕ Продажи.СуммаТоваров КОНЕЦ
Даже если поле определено как ресурс, его выражение также должно быть заполнено, поскольку оно определяет агрегированную функцию (например, Сумма(Количество * Цена)).
Еще одна частая причина, которую подсветили наши коллеги, это путаница между вычисляемыми полями и ресурсами, или некорректное их использование. В СКД вычисляемые поля предназначены для расчета значений на уровне каждой детальной записи, тогда как ресурсы – для агрегирования данных (сумм, средних, минимумов, максимумов) по группировкам.
ОбъемПродаж должен быть суммой (или любым другим итоговым значением) по какой-либо группировке (например, по менеджеру, дате), то его следует определять как ресурс. Если же это просто расчет значения для каждой строки детализации, тогда это вычисляемое поле. Нельзя использовать ресурс как поле группировки напрямую, если он не является также вычисляемым полем или полем набора данных. Если мы пытаемся добавить поле, определенное только как ресурс, в группировку, СКД может выдать ошибку, так как ожидает поле, по которому можно группировать записи, а не агрегированное значение.ОбъемПродаж является ресурсом, мы должны убедиться, что это свойство либо не заполнено (тогда ресурс будет рассчитываться по всем доступным группировкам), либо содержит те конкретные группировки, для которых этот ресурс должен выводиться. Если мы хотим, чтобы ОбъемПродаж рассчитывался на уровне детальных записей, мы должны определить его как вычисляемое поле, а затем при необходимости агрегировать его через другие ресурсы.Мы должны помнить, что в СКД существуют определенные ограничения. Например, нельзя напрямую использовать одно вычисляемое поле в выражении другого вычисляемого поля, если они не находятся на одном уровне вычисления. СКД обрабатывает выражения в определенной последовательности, и если поле, на которое мы ссылаемся, еще не вычислено, мы получим ошибку "Поле не найдено".
Что делать? В таких случаях нам часто приходится дублировать логику расчета. Вместо того чтобы ссылаться на ВычисляемоеПоле1 в выражении для ВычисляемоеПоле2, мы должны вставить полное выражение для ВычисляемоеПоле1 непосредственно в выражение для ВычисляемоеПоле2, используя исходные поля запроса. Например, если ОбъемПродаж зависит от СуммаСкидки, которая сама является вычисляемым полем, мы не можем просто написать ОбъемПродаж = ОбщаяСумма - СуммаСкидки, если СуммаСкидки еще не вычислена. Мы должны использовать базовые поля: ОбъемПродаж = ИсходнаяСуммаБезСкидки - (ИсходнаяСуммаБезСкидки * ПроцентСкидки / 100).
Если наш отчет использует несколько наборов данных, и поле ОбъемПродаж каким-либо образом зависит от связей между ними, ошибка "Поле не найдено" может возникнуть, если подчиненный набор данных пуст или содержит значения NULL в колонках, по которым настроена обязательная связь. В этом случае СКД не сможет установить связь и, как следствие, получить данные, необходимые для вычисления ОбъемПродаж.
NULL.ЕСТЬNULL: После снятия обязательной связи, если в выражении ОбъемПродаж используются поля из подчиненного набора данных, необходимо обязательно обернуть их в функцию ЕСТЬNULL(<ПолеИзПодчиненногоНабора>, <ЗначениеПоУмолчанию>), чтобы избежать ошибок при попытке использования NULL в расчетах.Иногда, особенно при активной разработке и частых изменениях в схеме СКД, могут возникать ошибки из-за кэширования старых настроек. Система может "помнить" предыдущее состояние схемы, в котором поле ОбъемПродаж отсутствовало или было настроено иначе.
Что делать? В таких случаях мы можем попробовать следующие шаги:
В некоторых случаях поле ОбъемПродаж может быть рассчитано корректно, но не выводиться в отчет из-за настроек выбранных полей или условного оформления. СКД может успешно вычислить поле, но если оно не включено в список выводимых полей или скрыто, мы можем ошибочно полагать, что оно "не найдено".
Что мы проверяем:
ОбъемПродаж добавлено в список выбранных полей отчета для нужных группировок или для детальных записей. Это делается в настройках отчета, на закладке "Поля".ОбъемПродаж при определенных условиях. Это находится на закладке "Условное оформление" в настройках отчета.Если мы используем пользовательские макеты отчета (например, для вывода заголовков, подвалов или специфического форматирования), возможно, в них некорректно указано поле ОбъемПродаж или оно отсутствует в соответствующей области макета. Макет ожидает получить определенное имя поля, и если оно отличается или отсутствует в запросе, возникнет ошибка.
Как мы проверяем макеты:
ОбъемПродаж вообще существует в наборе данных, который используется для данной области макета.ЕСТЬNULLЕсли в выражении вычисляемого поля или ресурса есть проверка на NULL, мы должны убедиться, что она применяется корректно и что вместо NULL возвращается ожидаемое значение (например, 0 для числовых полей или пустая строка для строковых), чтобы избежать ошибок при дальнейших вычислениях или при попытке использовать поле, которое фактически оказалось NULL. СКД может неявно преобразовывать NULL, но лучше явно контролировать это.
Например, вместо:
Количество * Цена
Если Количество или Цена могут быть NULL, лучше написать:
ЕСТЬNULL(Количество, 0) * ЕСТЬNULL(Цена, 0)
Столкнувшись с ошибкой "Поле не найдено", мы не должны паниковать, а должны подойти к ее решению системно, как истинные профессионалы. Наш коллега правильно задал вопрос о понимании сути ошибки. Простое повторение действий по книге, не понимая, почему что-то работает, а что-то нет, мало что дает. Давайте рассмотрим основные шаги диагностики:
ОбъемПродаж, присутствуют в запросе и имеют правильные имена. Мы можем выполнить запрос отдельно в консоли запросов.ОбъемПродаж является ресурсом, мы проверяем его "Выражение" и свойство "Рассчитывать по...".ОбъемПродаж, и само ОбъемПродаж.Как справедливо заметил один из участников обсуждения, "значит сделано не так, как в книге". Очень часто, особенно при копировании сложных примеров, мы можем допустить незначительную, но критическую ошибку: пропустить галочку, неверно указать имя поля, забыть заполнить одно из свойств. Поэтому мы должны быть максимально внимательными и методичными в процессе отладки.
Пусть это руководство послужит нам надежным помощником в решении проблемы "Поле не найдено" в СКД 1С. Помните, что каждый случай уникален, но системный подход к диагностике всегда приводит к успеху.