Как добавить свою колонку с вычислениями в типовой отчет СКД в 1С:Бухгалтерия 3.0

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Проблема программного формирования типовых отчетов

Многие современные отчеты в 1С (особенно бухгалтерские) построены на базе Системы компоновки данных (СКД), но имеют важную особенность: их настройки формируются программно. Это означает, что когда мы просто добавляем поле в схему компоновки в конфигураторе, оно может не появиться в отчете. Код в модуле объекта или менеджера отчета (часто использующий общие модули типа БухгалтерскиеОтчеты) при формировании результата может жестко определять список выбранных полей, игнорируя ручные правки пользователя или разработчика в схеме.

Разберем три способа решения задачи: от самого простого в пользовательском режиме до программного изменения логики отчета.

Способ 1: Использование пользовательских полей-выражений

Если нам нужно быстро добавить вычисляемое поле без изменения конфигурации, мы можем воспользоваться механизмом Пользовательских полей. Это наиболее безопасный способ, доступный прямо в режиме 1С:Предприятие.

Проанализируем шаги реализации:

  1. Откроем отчет (например, «Задолженность поставщикам по срокам долга») и нажмем кнопку Настройки.
  2. Перейдем в расширенный режим настроек и выберем закладку Дополнительные поля (в некоторых версиях это делается через закладку «Пользовательские поля»).
  3. Нажмем «Добавить» и выберем вариант Новое поле-выражение.
  4. В поле «Заголовок» укажем понятное название, например: Дата и срок оплаты.
  5. В поле «Выражение детальных записей» пропишем формулу. Важно использовать правильный синтаксис обращения к полям. Например:

    Формат([Регистратор.Дата], "ДФ=dd.MM.yyyy") + " до " + Формат([Договор.УстановленныйСрокОплаты], "ДФ=dd.MM.yyyy")

  6. После создания поля перейдем на закладку Выбранные поля и добавим наше новое поле в список отображаемых.

Важный нюанс: Если при проверке формулы система выдает ошибку «Поле не найдено», проверим, доступны ли эти реквизиты в дереве доступных полей. В типовых отчетах вместо [Документ.Дата] может потребоваться обращение через [ОбъектРасчетов.Дата] или другие связанные поля, в зависимости от того, как спроектирован запрос в СКД.

Способ 2: Настройка в конфигураторе через схему СКД

Если мы разрабатываем расширение или правим отчет в конфигураторе, мы можем добавить Вычисляемое поле непосредственно в схему компоновки данных.

Рассмотрим порядок действий в конфигураторе:

  1. Откроем схему СКД отчета.
  2. Перейдем на закладку Вычисляемые поля.
  3. Добавим новую строку:
    • Путь к данным: ДатаСрок
    • Заголовок: Дата и срок
    • Выражение: Представление(Регистратор.Дата) + " до " + Представление(Договор.СрокОплаты)
  4. Функция Представление() удобна тем, что она автоматически преобразует дату в строку в соответствии с региональными настройками пользователя, что упрощает конкатенацию (склеивание) строк.
  5. На закладке Настройки добавим это поле в Выбранные поля.

Если после этих действий колонка всё равно не появляется, значит, отчет относится к категории «программно формируемых», и нам придется перейти к третьему способу.

Способ 3: Программное добавление поля (Создание внешнего отчета)

Когда типовой механизм конфигурации переопределяет настройки СКД кодом, нам нужно вмешаться в этот процесс. Рассмотрим ситуацию, когда мы создаем копию типового отчета как Внешний отчет.

Выясним причину, почему поле пропадает: в модуле объекта часто вызываются процедуры, которые очищают коллекцию ВыбранныеПоля и заполняют её заново на основании предопределенных списков. Чтобы внедрить свое поле, выполним следующие шаги:

  1. Сохраним типовой отчет как внешний файл .erf.
  2. Перенесем необходимый код из модуля менеджера в модуль объекта (так как внешние отчеты работают через модуль объекта).
  3. Найдем процедуру, отвечающую за заполнение колонок. В отчетах по задолженности это часто ЗаполнитьПоляВСоответствииСоСпискомИнтервалов или аналогичные методы в общем модуле БухгалтерскиеОтчетыКлиентСервер.
  4. Внедрим программное добавление нашего поля в компоновщик настроек. Пример кода для модуля объекта:

// Пример программного добавления вычисляемого поля и его выбора
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Позволяем системе выполнить стандартную подготовку
    // Но если отчет типовой, здесь часто вызываются процедуры БСП
    
    // Добавляем поле в выбранные поля программно, если его там нет
    ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ДатаСрок");
    ВыбранноеПоле.Использование = Истина;
    ВыбранноеПоле.Заголовок = "Срок оплаты (подробно)";

КонецПроцедуры

Если отчет использует сложную структуру ресурсов (итогов), нам также может потребоваться программно добавить Поле итога в схему, чтобы оно корректно отображалось в группировках:


// Добавление итога для вычисляемого поля
ПолеИтога = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
ПолеИтога.ПутьКДанным = "ПроцентДолга";
ПолеИтога.Выражение = "100 * Сумма(ПросроченнаяЗадолженность) / Сумма(ОстатокДолга)";

Обработка пустых значений (NULL)

Проанализируем типичную ошибку при сложении строк в СКД. Если Договор.СрокОплаты не заполнен, то всё выражение "Дата " + Договор.СрокОплаты может вернуть NULL (пустоту), и колонка будет пустой даже там, где дата есть. Чтобы этого избежать, всегда используйте функцию ЕстьNull или проверку условия в выражении:


Выбор 
    Когда Договор.СрокОплаты Есть Null 
    Тогда Представление(Регистратор.Дата) 
    Иначе Представление(Регистратор.Дата) + " (до " + Представление(Договор.СрокОплаты) + ")" 
Конец

Подведение итогов

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

← На главную