В работе с типовыми конфигурациями, такими как 1С:Бухгалтерия предприятия 3.0, часто возникает необходимость расширить функционал стандартных отчетов. Одной из популярных задач является добавление новой колонки, которая объединяет данные из нескольких существующих полей. Например, в отчетах по задолженности бывает нужно вывести дату первичного документа и срок оплаты из договора в одной ячейке. Рассмотрим подробно, как это реализовать, и почему стандартные методы СКД не всегда работают «из коробки».
Многие современные отчеты в 1С (особенно бухгалтерские) построены на базе Системы компоновки данных (СКД), но имеют важную особенность: их настройки формируются программно. Это означает, что когда мы просто добавляем поле в схему компоновки в конфигураторе, оно может не появиться в отчете. Код в модуле объекта или менеджера отчета (часто использующий общие модули типа БухгалтерскиеОтчеты) при формировании результата может жестко определять список выбранных полей, игнорируя ручные правки пользователя или разработчика в схеме.
Разберем три способа решения задачи: от самого простого в пользовательском режиме до программного изменения логики отчета.
Если нам нужно быстро добавить вычисляемое поле без изменения конфигурации, мы можем воспользоваться механизмом Пользовательских полей. Это наиболее безопасный способ, доступный прямо в режиме 1С:Предприятие.
Проанализируем шаги реализации:
Дата и срок оплаты.Формат([Регистратор.Дата], "ДФ=dd.MM.yyyy") + " до " + Формат([Договор.УстановленныйСрокОплаты], "ДФ=dd.MM.yyyy")
Важный нюанс: Если при проверке формулы система выдает ошибку «Поле не найдено», проверим, доступны ли эти реквизиты в дереве доступных полей. В типовых отчетах вместо [Документ.Дата] может потребоваться обращение через [ОбъектРасчетов.Дата] или другие связанные поля, в зависимости от того, как спроектирован запрос в СКД.
Если мы разрабатываем расширение или правим отчет в конфигураторе, мы можем добавить Вычисляемое поле непосредственно в схему компоновки данных.
Рассмотрим порядок действий в конфигураторе:
ДатаСрокДата и срокПредставление(Регистратор.Дата) + " до " + Представление(Договор.СрокОплаты)Представление() удобна тем, что она автоматически преобразует дату в строку в соответствии с региональными настройками пользователя, что упрощает конкатенацию (склеивание) строк.Если после этих действий колонка всё равно не появляется, значит, отчет относится к категории «программно формируемых», и нам придется перейти к третьему способу.
Когда типовой механизм конфигурации переопределяет настройки СКД кодом, нам нужно вмешаться в этот процесс. Рассмотрим ситуацию, когда мы создаем копию типового отчета как Внешний отчет.
Выясним причину, почему поле пропадает: в модуле объекта часто вызываются процедуры, которые очищают коллекцию ВыбранныеПоля и заполняют её заново на основании предопределенных списков. Чтобы внедрить свое поле, выполним следующие шаги:
.erf.ЗаполнитьПоляВСоответствииСоСпискомИнтервалов или аналогичные методы в общем модуле БухгалтерскиеОтчетыКлиентСервер.
// Пример программного добавления вычисляемого поля и его выбора
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Позволяем системе выполнить стандартную подготовку
// Но если отчет типовой, здесь часто вызываются процедуры БСП
// Добавляем поле в выбранные поля программно, если его там нет
ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ДатаСрок");
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Заголовок = "Срок оплаты (подробно)";
КонецПроцедуры
Если отчет использует сложную структуру ресурсов (итогов), нам также может потребоваться программно добавить Поле итога в схему, чтобы оно корректно отображалось в группировках:
// Добавление итога для вычисляемого поля
ПолеИтога = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
ПолеИтога.ПутьКДанным = "ПроцентДолга";
ПолеИтога.Выражение = "100 * Сумма(ПросроченнаяЗадолженность) / Сумма(ОстатокДолга)";
Проанализируем типичную ошибку при сложении строк в СКД. Если Договор.СрокОплаты не заполнен, то всё выражение "Дата " + Договор.СрокОплаты может вернуть NULL (пустоту), и колонка будет пустой даже там, где дата есть. Чтобы этого избежать, всегда используйте функцию ЕстьNull или проверку условия в выражении:
Выбор
Когда Договор.СрокОплаты Есть Null
Тогда Представление(Регистратор.Дата)
Иначе Представление(Регистратор.Дата) + " (до " + Представление(Договор.СрокОплаты) + ")"
Конец
Рассмотренные методы позволяют гибко настраивать отчеты под нужды бухгалтерии. Первый способ (пользовательские поля) идеален для разовых задач и пользователей. Второй способ подходит для постоянных изменений в конфигурации через расширения. Третий способ — это «тяжелая артиллерия» для тех случаев, когда логика 1С программно ограничивает стандартные возможности СКД. Выбор метода зависит от того, насколько глубоко вы готовы погрузиться в код конфигурации и требуется ли сохранение возможности обновления типового решения без лишних сложностей.