При попытке кастомизации типовых отчетов в «1С:Бухгалтерия предприятия 3.0», таких как «Карточка счета», разработчики часто сталкиваются с тем, что простого добавления объекта в расширение недостаточно. Ошибка Поле не найдено ОстаткиНаНачало.СуммаОстатокДт является классическим примером нарушения связей метаданных внутри расширения. Разберем подробно, почему это происходит и как правильно решить задачу добавления контрагента в представление регистратора.
Проанализируем ситуацию: когда мы добавляем в расширение РегистрБухгалтерии.Хозрасчетный, система не всегда автоматически подтягивает все зависимости, необходимые для генерации виртуальных таблиц остатков. Поля СуммаОстатокДт и СуммаОстатокКт не существуют физически в таблице движений — они рассчитываются платформой «на лету» на основании ресурсов регистра и настроек плана счетов.
Выясним основные причины, по которым поле может быть «не найдено»:
ПланСчетов.Хозрасчетный добавлен в расширение, но в свойствах регистра бухгалтерии в расширении поле План счетов не заполнено (или ссылается на основную конфигурацию некорректно), виртуальные таблицы не смогут определить структуру остатков.ОстатокДт и ОстатокКт у ресурса Сумма в расширении обязательно должны быть активны флаги Балансовый и установлен соответствующий Признак учета. Если эти свойства не перенеслись, платформа «считает», что ресурс не участвует в балансе, и не создает колонки дебетовых и кредитовых остатков.ПланВидовХарактеристик.ВидыСубконтоХозрасчетные, механизм компоновки данных может давать сбой при обращении к виртуальным таблицам.Если вы твердо решили идти путем полного переноса макета отчета в расширение, выполним следующие шаги для обеспечения целостности данных:
Шаг 1. Захват базовых объектов. Добавим в расширение не только отчет, но и весь «каркас» бухгалтерского учета. Это включает в себя ПланСчетов.Хозрасчетный, РегистрБухгалтерии.Хозрасчетный и ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.
Шаг 2. Проверка признаков учета. Зайдем в свойства Регистра Бухгалтерии внутри расширения. Убедимся, что на вкладке «Данные» для ресурса Сумма стоят галочки Балансовый. Проверим, что выбраны правильные Признаки учета (например, УчетПоПодразделениям, если это используется в запросе).
Шаг 3. Обновление платформы. Рассмотрим технический нюанс: в версиях платформы ниже 8.3.18 Конструктор запроса в расширениях часто не видел виртуальные таблицы даже при правильном захвате. Если в режиме «Предприятие» отчет формируется, а в Конструкторе — ошибка, это баг платформы, который лечится обновлением.
Вместо того чтобы копировать сложный типовой отчет (что приведет к трудностям при обновлении конфигурации), рассмотрим более элегантный способ — перехват компоновки результата. Мы можем программно добавить поле Контрагент в запрос СКД прямо перед выполнением отчета.
Для этого создадим в расширении модуль объекта отчета КарточкаСчета и добавим процедуру-обработчик:
&После("ПриКомпоновкеРезультата")
Процедура Расш1_ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем основную схему компоновки
Схема = Отчеты.КарточкаСчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Проанализируем текст запроса основного набора данных
Для Каждого НаборДанных Из Схема.НаборыДанных Цикл
Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
// Добавляем выборку контрагента через обращение к реквизиту регистратора
// Платформа 1С позволяет обращаться через точку к реквизитам шапки документов
НаборДанных.Запрос = СтрЗаменить(НаборДанных.Запрос,
"РЕГИСТРАТОР КАК Регистратор,",
"РЕГИСТРАТОР КАК Регистратор, ВЫРАЗИТЬ(Регистратор КАК Документ.РеализацияТоваровУслуг).Контрагент КАК Контрагент,");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод позволяет избежать ошибки Поле не найдено, так как мы не меняем структуру виртуальных таблиц в метаданных расширения, а работаем с текстом запроса в памяти.
Если задача стоит только в выводе контрагента в отчет, разберем вариант использования вычисляемых полей в настройках СКД. В «Карточке счета» поле Регистратор имеет составной тип. Мы можем добавить вычисляемое поле, которое будет пытаться получить контрагента:
В схеме компоновки на закладке «Вычисляемые поля» добавим строку:
КонтрагентРегистратораВЫБОР КОГДА ТипЗнч(Регистратор) = ТИП("Документ.РеализацияТоваровУслуг") ТОГДА Регистратор.Контрагент ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) КОНЕЦВажный момент: Чтобы это поле было доступно без ошибок, все типы документов, которые мы перечисляем в ТИП(), должны быть добавлены в расширение. Однако, если контрагент нужен «для всех, у кого он есть», в управляемом приложении 1С часто срабатывает обращение Регистратор.Контрагент напрямую, если платформа может однозначно разрешить этот реквизит для большинства типов из состава типа Регистратор.
Проанализируем ситуацию, когда запрос в расширении прошел проверку, но отчет пуст. В БП 3.0 формирование отчетов идет через общие модули (например, ТиповыеОтчеты). Когда вы выносите отчет в расширение, он может потерять доступ к временным таблицам, которые подготавливаются в глобальном контексте основной конфигурации.
Рекомендация: Всегда проверяйте, захвачены ли вспомогательные таблицы. В «Карточке счета» часто используются данные из таблицы ДанныеПервичныхДокументов. Если её нет в расширении, запрос отработает, но связей с реальными номерами и датами документов может не быть.
Итог: Для решения проблемы СуммаОстатокДт убедитесь, что в расширении создана полная «бухгалтерская цепочка»: Регистр — План счетов — ПВХ. Если же цель — доработка представления, используйте программную подмену текста запроса в ПриКомпоновкеРезультата, это сохранит обновляемость вашей базы.