Как исправить ошибку СКД «Не найдено поле замены для поля "Регистратор"»?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке или модификации отчетов в системе компоновки данных (СКД), особенно когда речь идет о стандартных бухгалтерских отчетах вроде «Оборотно-сальдовой ведомости» (ОСВ), программисты часто сталкиваются со специфической ошибкой: «Отчет не сформирован. Не найдено поле замены для поля "Регистратор"». Эта проблема может поставить в тупик, так как поле Регистратор кажется стандартным и интуитивно понятным. Разберем детально, почему возникает эта ситуация и как правильно настроить схему компоновки, чтобы отчет работал корректно.

Поймем природу ошибки

Система компоновки данных — это мощный механизм, который не просто выполняет запрос, а трансформирует его в зависимости от настроек пользователя (группировок, отборов, выбранных полей). Ошибка «Не найдено поле замены» обычно означает, что в настройках компоновки (или в пользовательских настройках) указано поле, которое процессор компоновки не может сопоставить с физическим полем в итоговом тексте запроса или в результирующем наборе данных.

Когда мы работаем с полем Регистратор, мы чаще всего обращаемся к виртуальным таблицам регистров бухгалтерии или накопления. Проанализируем основные причины возникновения конфликта.

Причина 1: Периодичность виртуальных таблиц

Это самая распространенная причина. Рассмотрим работу виртуальной таблицы ОстаткиИОбороты. У этой таблицы есть параметр Периодичность. Если в параметрах виртуальной таблицы установлено значение, например, Месяц, Квартал или Период, то система группирует данные по этим временным отрезкам. Поля Регистратор и НомерСтроки физически отсутствуют в выборке, сгруппированной по месяцу, так как в одном месяце может быть множество регистраторов.

Что нужно сделать:

  1. Откроем конструктор запроса в наборе данных СКД.
  2. Перейдем к параметрам виртуальной таблицы (например, РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты).
  3. Убедимся, что в поле Периодичность выбрано значение Запись.

Только при периодичности Запись (или Авто, если в выбранных полях явно присутствует регистратор) СКД сможет корректно извлечь документ-основание для каждой строки. Если же вам необходимо выводить итоги по месяцам, но иметь возможность отбора по регистратору, используйте периодичность Авто, но помните, что это может существенно повлиять на производительность отчета.

Причина 2: Использование нескольких наборов данных (UNION)

В стандартных отчетах 1С, таких как «Оборотно-сальдовая ведомость», запрос часто состоит из нескольких частей, объединенных оператором ОБЪЕДИНИТЬ. Например, в типовой ОСВ могут присутствовать наборы данных ПоСчетам, ПоСубконто и ПоСубконтоРазвернутое.

Если мы добавили поле Регистратор только в один из этих наборов, но пользователь пытается сделать отбор по этому полю во всем отчете, СКД выдаст ошибку. Процессор компоновки пытается применить отбор ко всем частям объединения, и если в одной из частей поля Регистратор нет (или оно не описано в схеме), возникает ошибка «поля замены».

Проанализируем пример структуры запроса, который может вызвать проблему:


ВЫБРАТЬ
    ХозрасчетныйОстатки.Счет,
    ХозрасчетныйОстатки.СуммаОстатокДт,
    NULL КАК Регистратор
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ХозрасчетныйОбороты.Счет,
    0,
    ХозрасчетныйОбороты.Регистратор
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(,, Запись, , , , , ) КАК ХозрасчетныйОбороты

В данном случае, если в схеме компоновки поле Регистратор помечено как обязательное или по нему идет отбор, СКД должна понимать, как сопоставить его в первой части запроса. Убедитесь, что поле добавлено во все наборы данных и везде имеет правильный тип (ссылка на документ).

Причина 3: Программное формирование внешних наборов данных

Иногда отчет строится не на прямом запросе к базе данных, а на основе ТаблицыЗначений, которая передается в СКД программно через ВнешниеНаборыДанных. Выясним, почему ошибка возникает здесь.

Если в конфигураторе в схеме компоновки данных (схема .xsd) вы добавили поле Регистратор, но в программном коде при формировании таблицы значений забыли добавить колонку с точно таким же именем или заполнили её значениями несоответствующего типа, СКД не сможет выполнить сопоставление. Процессор компоновки ищет колонку Регистратор в переданном объекте, не находит её и сообщает, что «поле замены» отсутствует.

Проверим код инициализации отчета:


ВнешниеНаборыДанных = Новый Структура;
// Ошибка будет, если в ТаблицаРезультат отсутствует колонка "Регистратор"
ВнешниеНаборыДанных.Вставить("ОсновнойНаборДанных", ТаблицаРезультат);

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

Причина 4: Роли полей в СКД

Посмотрим на вкладку «Наборы данных» в СКД, колонку «Роли». Для поля Регистратор часто важно правильно указать роль периода. Если система считает Регистратор периодом, но при этом в настройках виртуальной таблицы стоит периодичность Месяц, возникает логический конфликт.

Рекомендация: попробуйте временно отключить роли для этого поля или, наоборот, явно указать, что оно является обязательным (флаг «Обязательное»). Это заставит СКД всегда включать это поле в итоговый запрос к БД, что часто помогает избежать ошибок при замене полей в сложных иерархических отчетах.

Итоги и последовательность действий

Чтобы окончательно решить проблему, выполним следующие шаги:

  1. Проверим, что во всех виртуальных таблицах запроса установлена периодичность Запись или Авто.
  2. Если в отчете используется несколько наборов данных или объединений (UNION), убедимся, что поле Регистратор добавлено в каждый из них.
  3. В случае использования внешних наборов данных проверим соответствие имен колонок в ТаблицеЗначений и в схеме СКД.
  4. Проанализируем программный код модуля отчета. В типовых конфигурациях часто используется процедура ПриКомпоновкеРезультата, где запрос может модифицироваться динамически. Если код удаляет ваше поле из запроса перед выполнением, вы получите ошибку замены.

Соблюдение этих правил позволит вам создавать гибкие отчеты с возможностью глубокой детализации до документа-регистратора без технических сбоев в системе компоновки данных.

← На главную