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