Почему компоновщик макета 1С не находит поле замены и как это починить
Содержание
Ошибка «Не найдено поле замены» в 1С означает одно: в настройках отчёта на СКД (схеме компоновки данных) упомянуто поле, которого компоновщик макета не нашёл среди полей наборов данных. Чаще всего это поле удалили или переименовали в запросе, а в схеме, варианте отчёта или сохранённых пользовательских настройках оно осталось.
Отчёт падает сразу при нажатии «Сформировать», данных вы не видите. Исправление почти всегда сводится к трём действиям: найти имя поля, понять, где на него ссылаются, и убрать ссылку либо вернуть поле в набор. Ниже разбор по шагам для конфигуратора и для кода.
Как СКД превращает настройки в запрос и где ломается замена
У отчёта на СКД есть три слоя, и ошибка живёт на стыке между ними:
- 📦 Наборы данных — запрос, объект или объединение. Каждое поле набора имеет путь к данным (
ПутьКДанным) и заголовок. - 🧮 Схема — вычисляемые поля, ресурсы, параметры, связи наборов.
- ⚙️ Настройки — выбранные поля, отборы, сортировка, группировки, условное оформление. Сюда же попадают варианты отчёта и пользовательские настройки.
Когда отчёт формируется, вызывается КомпоновщикМакетаКомпоновкиДанных.Выполнить(). Он берёт схему и настройки и собирает из них макет: итоговый текст запроса, выражения ресурсов, описание областей вывода. На этом шаге каждое поле из настроек заменяется на реальное поле набора или на выражение вычисляемого поля. Это и есть «поле замены».
Если для какого-то пути замены нет, компоновщик останавливается и выдаёт ошибку. Обычно в тексте сообщения рядом с фразой стоит имя проблемного поля — например, Контрагент.ИНН или СуммаОборот. Это главная подсказка, сохраните её.
Ошибка возникает до выполнения запроса к базе. Поэтому сам запрос в консоли может работать отлично, а отчёт всё равно падать: проблема не в данных, а в описании схемы и настроек.
Откуда в отчёте берётся несуществующее поле
Причин немного, и почти все сводятся к рассинхрону между слоями.
| Причина | Где искать | Типичный сценарий |
|---|---|---|
| Поле убрали или переименовали в запросе | Вкладка «Наборы данных», колонка полей | Сменили псевдоним КАК Сумма на КАК СуммаДокумента |
| Автозаполнение выключено | Свойства набора-запроса | Запрос правили, а список полей набора не обновился |
| Вычисляемое поле ссылается на исчезнувшее поле | Вкладка «Вычисляемые поля», колонка «Выражение» | В выражении осталось старое имя |
| Ресурс считается по отсутствующему полю | Вкладка «Ресурсы» | Сумма(СуммаНДС) при удалённом СуммаНДС |
| Связь наборов по удалённому полю | Вкладка «Связи наборов данных» | Выражение источника или приёмника устарело |
| Старый вариант или пользовательские настройки | Сохранённые настройки пользователя | После обновления конфигурации поле исчезло из типового отчёта |
| Поле добавляют программно | Модуль отчёта, обработчик ПриКомпоновкеРезультата | Новый ПолеКомпоновкиДанных("Имя") с опечаткой |
| Ошибка в пути через точку | Отборы, группировки, оформление | Контрагент.ИНН при поле Контрагент не ссылочного типа |
Отдельно про заголовки. В выражениях вычисляемых полей и ресурсов пишут путь к данным, а не заголовок. Заголовок «Сумма с НДС» в выражении не сработает, нужен путь вроде СуммаСНДС. Когда разработчик меняет заголовок и путь одновременно, старый путь часто остаётся где-то в настройках.
Ещё один источник — ограничения использования поля. Если в наборе у поля стоит запрет на использование как поля, а в настройках оно выбрано, компоновщик тоже не сможет его подставить. Проверьте колонку «Ограничение использования» у поля из сообщения.
Ищем виновника: консоль запросов, конструктор схемы и отладчик
Начните с имени поля из сообщения. Дальше идите от простого к сложному.
Проверка набора данных
- Откройте отчёт в конфигураторе, перейдите к схеме компоновки данных (кнопка «Открыть схему компоновки данных» на вкладке «Основные» свойств отчёта).
- На вкладке «Наборы данных» выберите набор и найдите поле в нижней таблице полей.
- Скопируйте текст запроса в консоль запросов и выполните. Убедитесь, что поле есть в результате с тем же псевдонимом.
Если в консоли поле есть, а в наборе нет — набор не обновился. Если нет и в консоли — поле действительно удалено из запроса.
Поиск по всей схеме
Поле может прятаться в нескольких местах одновременно. Пройдите вкладки по порядку:
- 🔗 «Связи наборов данных» — выражения источника и приёмника;
- 🧮 «Вычисляемые поля» — колонка выражения;
- 📊 «Ресурсы» — выражения агрегатов;
- ⚙️ «Настройки» — выбранные поля, отбор, порядок, условное оформление и каждая группировка структуры отдельно.
Быстрее всего искать текстом. Выгрузите конфигурацию в файлы (Конфигурация → Выгрузить конфигурацию в файлы): схема отчёта хранится в XML, и поиск по имени поля в любом редакторе сразу покажет все упоминания.
Отладчик
Если отчёт формируется программно или настройки меняются кодом, поставьте точку останова на строку с КомпоновщикМакета.Выполнить(...). В момент остановки откройте в табло переменную с настройками и разверните ВыбранныеПоля.Элементы, Отбор.Элементы, Структура. Поле, которого нет в схеме, увидите по имени.
Для типовых отчётов на БСП удобно остановиться в обработчике ПриКомпоновкеРезультата модуля объекта отчёта: туда приходят итоговые настройки с учётом пользовательских.
Исправление ошибки «не найдено поле замены»: пошагово
Действуйте в зависимости от того, что нашли на диагностике.
Шаг 1. Синхронизировать набор данных с запросом
- Откройте свойства набора-запроса и проверьте галочку «Автозаполнение».
- Если она включена — переключите её: снимите и поставьте снова. Список полей перечитается из запроса.
- Если автозаполнение намеренно выключено (поля настроены вручную) — добавьте поле в таблицу полей набора руками или верните его в запрос.
Переключение автозаполнения может сбросить ручные заголовки и роли полей. Если вы их меняли, перед этим сохраните копию схемы.
Шаг 2. Убрать ссылки на поле из схемы
- Исправьте выражения вычисляемых полей и ресурсов: замените старое имя на новое или удалите строку.
- Проверьте связи наборов. Связь по удалённому полю либо перенастройте, либо удалите.
- На вкладке «Настройки» удалите поле из выбранных полей, отбора, сортировки и условного оформления. Не забудьте вложенные группировки: у каждой свои настройки.
Шаг 3. Пересохранить варианты отчёта
Если у отчёта несколько вариантов, проверьте каждый. В конфигураторе варианты лежат на вкладке «Варианты» схемы. В пользовательском режиме варианты, сохранённые пользователями, живут отдельно от схемы — их нужно открыть, убрать поле и сохранить заново.
Шаг 4. Сбросить пользовательские настройки
Ошибка у одного сотрудника и нет у другого — почти всегда сохранённые настройки. Откройте отчёт под этим пользователем и в меню «Ещё» формы отчёта найдите команду возврата к стандартным настройкам. Если отчёт не открывается вовсе, настройки можно очистить в обработке администрирования настроек пользователей.
Сброс удалит все личные настройки отчёта у пользователя: отборы, группировки, оформление. Предупредите его заранее.
Шаг 5. Обновить конфигурацию базы данных
После правки схемы в основной конфигурации или расширении выполните Конфигурация → Обновить конфигурацию базы данных (F7). Если правили внешний отчёт .erf — просто сохраните файл и откройте его заново в пользовательском режиме.
Поля замены в коде: программные настройки и вычисляемые поля
Самые трудные случаи — когда поле подставляется кодом. В схеме его нет, поэтому визуальная проверка ничего не находит.
Типичная ошибка выглядит так: в ПриКомпоновкеРезультата разработчик добавляет выбранное поле по условию.
Поле = КомпоновщикНастроек.Настройки.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Поле.Поле = Новый ПолеКомпоновкиДанных("Контрагент.ИННКПП");
Если у контрагента нет реквизита ИННКПП, отчёт падает только тогда, когда срабатывает условие. Пользователи описывают это как «ломается при одной галочке».
Перед добавлением проверяйте, что поле доступно:
ИмяПоля = "Контрагент.ИНН";
ПолеСКД = Новый ПолеКомпоновкиДанных(ИмяПоля);
ДоступныеПоля = КомпоновщикНастроек.Настройки.ВыбранныеПоля.ДоступныеПоляВыбора;
Если ДоступныеПоля.НайтиПоле(ПолеСКД) <> Неопределено Тогда
Элемент = КомпоновщикНастроек.Настройки.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Элемент.Поле = ПолеСКД;
Иначе
Сообщить("Поле " + ИмяПоля + " отсутствует в схеме отчёта");
КонецЕсли;
Для отборов используйте Отбор.ДоступныеПоляОтбора, для сортировки — Порядок.ДоступныеПоляПорядка. Логика та же: НайтиПоле() возвращает Неопределено, если поля нет.
Чтобы разом выкинуть из настроек всё недоступное, у компоновщика настроек есть метод восстановления с проверкой доступности:
КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);
После него недоступные поля пропадают из настроек, и отчёт формируется без них. Это лечит симптом, а не причину: используйте как страховку, но имя поля всё равно найдите и поправьте.
Вычисляемые поля
Здесь три правила:
- В выражении — путь к данным, не заголовок.
- Ссылаться можно на поля наборов и на другие вычисляемые поля, но без циклических ссылок.
- Если вычисляемое поле используют в ресурсе, проверьте, что оно не удалено со вкладки «Вычисляемые поля».
Набор данных — объект
У набора-объекта поля описывают вручную, запроса нет. Поэтому любое поле в настройках должно совпадать с путём к данным в таблице полей этого набора. Колонки таблицы значений, которую вы передаёте во внешний набор, называйте так же — иначе данные не попадут в отчёт.
Чем эта ошибка отличается от похожих
| Сообщение | Что не найдено | Где искать |
|---|---|---|
| «Не найдено поле замены» | Поле из настроек или выражения при сборке макета | Настройки, вычисляемые поля, ресурсы |
| «Поле не найдено» | Поле в тексте запроса или выражении | Текст запроса, псевдонимы |
| «Не найден параметр» | Параметр данных | Вкладка «Параметры», код установки параметров |
Разбор на примере: переименованная сумма в отчёте по продажам
Возьмём доработанный отчёт по продажам. В запросе было поле Выручка, разработчик переименовал его в СуммаВыручки, чтобы не путать с выручкой без НДС. Автозаполнение было включено, набор обновился сам. Отчёт у разработчика формируется.
Через день звонит менеджер: отчёт падает с «Не найдено поле замены». Что произошло:
- На вкладке «Ресурсы» осталось выражение
Сумма(Выручка). Компоновщик не смог подставить поле. - Вычисляемое поле
РентабельностьделилоВыручкана себестоимость — тоже старое имя. - У менеджера сохранён личный вариант с колонкой
Выручкаи сортировкой по ней.
Разработчик исправил ресурс и вычисляемое поле, пункты 1 и 2 закрылись. Менеджеру пришлось сбросить личные настройки — пункт 3 правкой схемы не лечится. Кстати, приём с вычисляемым полем Выручка с выражением СуммаВыручки сохранил бы личные настройки без сброса.
Как не получить ошибку в новых отчётах
Несколько привычек, которые снимают проблему почти полностью:
- ✏️ Не переименовывайте поля без нужды. Сменили псевдоним в запросе — вы ломаете чужие сохранённые настройки. Если переименование неизбежно, сохраните старое поле вычисляемым полем с выражением на новое: старые настройки продолжат работать.
- 🧩 Дорабатывайте типовые отчёты через расширение. При обновлении конфигурации сразу видно, что схема изменилась, и проще сверить поля.
- 🧪 Держите тестовую базу. Прогоняйте все варианты отчёта после обновления, а не ждите звонка бухгалтера.
- 🧹 После обновления типовых отчётов предупредите пользователей, что при ошибке достаточно сбросить настройки к стандартным.