Система компоновки данных (СКД) в 1С:Предприятие — мощный инструмент для формирования отчётов, но её возможности раскрываются полностью только при грамотном использовании вычисляемых полей. Эти поля позволяют добавлять в отчёт данные, которые не хранятся напрямую в базе, а рассчитываются на лету по заданным формулам. Например, вы можете вывести процент выполнения плана, разницу между суммами или конкатенировать строковые значения из разных колонок.
Добавление вычисляемого поля кажется простой задачей, но на практике разработчики сталкиваются с нюансами: от синтаксиса выражений до оптимизации производительности. В этой статье разберём пошаговый алгоритм создания таких полей, рассмотрим типичные ошибки, которые приводят к падению отчёта или некорректным расчётам, и покажем примеры кода для разных сценариев — от арифметических операций до работы с датами и условной логикой.
Материал ориентирован на разработчиков 1С уровня "средний-продвинутый", но будет полезен и новичкам, которые только осваивают СКД. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3, но принципы работы вычисляемых полей остаются неизменными уже много лет.
1. Что такое вычисляемое поле в СКД и зачем оно нужно
Вычисляемое поле — это колонка в отчёте, значение которой динамически рассчитывается на основе других полей или параметров. В отличие от обычных полей, которые берут данные напрямую из таблиц базы, вычисляемые поля позволяют:
- 📊 Агрегировать данные: например, посчитать сумму продаж по группам товаров или средний чек по клиентам.
- 🔄 Трансформировать форматы: преобразовать дату в строку, округлить числовое значение или привести текст к верхнему регистру.
- 🔍 Добавлять бизнес-логику: вычислять скидки, наценки, маржу или проверять выполнение условий (например, "если сумма заказа > 10 000, то статус 'Крупный клиент'").
- 🔗 Объединять данные: конкатенировать ФИО из отдельных полей "Фамилия", "Имя", "Отчество".
Без вычисляемых полей многие отчёты пришлось бы делать в несколько этапов: сначала выгружать данные в таблицу значений, затем обрабатывать их в модуле, и только потом выводить результат. СКД позволяет сделать это "на лету", экономя время и ресурсы.
Пример из практики: в отчёте по продажам нужно показать не только сумму продаж, но и её долю в общем обороте компании. Без вычисляемого поля пришлось бы:
- Сначала получить общую сумму продаж (запросом или агрегацией).
- Затем для каждой строки отчёта вручную рассчитывать процент.
- Добавлять результат как отдельную колонку.
С вычисляемым полем это делается в одном месте — прямо в настройках СКД.
2. Способы добавления вычисляемого поля в СКД
Есть три основных способа добавить вычисляемое поле в отчёт на базе СКД. Выбор зависит от версии платформы, сложности формулы и ваших предпочтений:
| Способ | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| Через конструктор СКД (визуальный редактор) | Простые формулы, быстрая правка | Не требует знания синтаксиса, наглядно | Ограниченные возможности для сложной логики |
| Прямо в схеме компоновки (XML-редактирование) | Сложные выражения, автоматизация | Полный контроль над формулой, удобно для версионирования | Требует понимания структуры СКД |
| Программно в модуле (через свойства отчёта) | Динамические поля, зависимые от параметров | Максимальная гибкость, можно менять логику "на лету" | Сложнее поддерживать, риск ошибок |
Рассмотрим каждый способ подробнее.
2.1. Добавление через конструктор СКД
Это самый простой метод, который подходит для большинства задач. Инструкция:
- Откройте отчёт в режиме
1С:Предприятие(не в конфигураторе!). - Перейдите в
Настройки → Настройки системы компоновки данных. - В дереве настроек выберите раздел
Поля. - Нажмите
Добавить полеи выберите типВычисляемое поле. - Задайте имя поля (например,
ПроцентВыполненияПлана) и напишите формулу в полеВыражение.
Пример формулы для расчёта процента выполнения плана:
Выполнено / План * 100
Где Выполнено и План — имена полей из источника данных.
Имя поля не содержит пробелов и специальных символов|
Все используемые поля существуют в источнике данных|
Формула не содержит синтаксических ошибок (проверьте скобки и операторы)|
Типы данных совместимы (например, не делите строку на число)-->
2.2. Редактирование схемы компоновки в XML
Если вам нужно добавить поле программно или перенести настройки между базами, удобнее работать напрямую с XML-схемой. Для этого:
- Откройте схему компоновки данных в конфигураторе (раздел
Отчёты). - Перейдите на вкладку
Текст(илиXML, в зависимости от версии). - Найдите раздел
<Fields>и добавьте новый элемент:
<Field Name="ПроцентВыполненияПлана" Expression="Выполнено / План * 100" />
После сохранения схемы поле станет доступно в отчёте.
Если формула длинная или содержит много условий, разбейте её на несколько вычисляемых полей. Например, сначала посчитайте промежуточный результат в поле ПромежуточныйИтог, а затем используйте его в финальной формуле. Это упростит отладку.
2.3. Программное добавление в модуле
Для динамических полей, которые зависят от параметров отчёта или внешних условий, используйте программное создание. Пример кода для добавления поля в схему компоновки:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, Результат)
СхемаКомпоновки = Результат.СхемаКомпоновкиДанных;
// Добавляем вычисляемое поле
НовоеПоле = СхемаКомпоновки.Поля.Добавить();
НовоеПоле.Имя = "ДоляВОбороте";
НовоеПоле.Выражение = "Сумма / ОбщийОборот * 100";
НовоеПоле.Заголовок = "Доля в обороте, %";
// Обновляем результат
Результат.СхемаКомпоновкиДанных = СхемаКомпоновки;
КонецПроцедуры
Этот метод удобен, если логика поля меняется в зависимости от прав пользователя или других динамических параметров.
3. Синтаксис выражений для вычисляемых полей
Формулы в вычисляемых полях пишутся на встроенном языке 1С, но с некоторыми ограничениями. Вот ключевые правила:
- 🔢 Арифметические операции: используйте стандартные операторы
+,-,*,/. Для деления нацело —ДИВ, для остатка —МОД. - 📌 Сравнения:
=,<>,<,>,<=,>=. Для строк —СокрЛП()(убирает пробелы). - 🔀 Логические операторы:
И,ИЛИ,НЕ. - 📅 Работа с датами: функции
Год(),Месяц(),День(),ДобавитьМесяц(). - 🔍 Условные выражения:
ЕСЛИ Условие ТОГДА Значение1 ИНАЧЕ Значение2 КОНЕЦЕСЛИ.
Примеры формул:
| Задача | Формула |
|---|---|
| Разница между датами в днях | ДатаОкончания - ДатаНачала |
| Процент выполнения плана | ЕСЛИ План <> 0 ТОГДА Выполнено / План * 100 ИНАЧЕ 0 КОНЕЦЕСЛИ |
| Конкатенация ФИО | СокрЛП(Фамилия + " " + Имя + " " + Отчество) |
| Проверка просрочки | ЕСЛИ ТекущаяДата() > ДатаОплаты ТОГДА "Просрочено" ИНАЧЕ "В срок" КОНЕЦЕСЛИ |
Обратите внимание на типы данных: если вы делите два целых числа, результат тоже будет целым (например, 5 / 2 = 2). Чтобы получить дробный результат, умножайте одно из чисел на 1.0:
Выполнено 1.0 / План 100
Как отладить формулу, если поле не рассчитывается?
Если вычисляемое поле возвращает ошибку или пустое значение, проверьте:
1. Синтаксис: все ли скобки закрыты, правильно ли написаны имена функций.
2. Типы данных: не пытаетесь ли вы сложить строку с числом или разделить на ноль.
3. Имена полей: совпадают ли они с источником данных (регистр не важен, но опечатки — критичны).
4. Контекст: некоторые функции (например, ТекущаяДата()) могут не работать в вычисляемых полях — используйте параметры отчёта.
4. Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с проблемами при работе с вычисляемыми полями. Вот самые распространённые ошибки и способы их решения:
⚠️ Внимание: Если в формуле используется деление, всегда проверяйте делитель на ноль! Например, вместоСумма / Количествопишите:ЕСЛИ Количество <> 0 ТОГДА Сумма / Количество ИНАЧЕ 0 КОНЕЦЕСЛИИначе отчёт упадёт с ошибкой при первом же нулевом значении.
4.1. Ошибка "Поле не найдено"
Симптом: поле в формуле подсвечивается красным, а при выполнении отчёта появляется сообщение Поле не найдено: [ИмяПоля].
Причины и решения:
- 🔍 Опечатка в имени: проверьте регистр и символы. Имя
СуммаПродажне то же самое, чтоСумма продаж(пробелы не допускаются). - 📤 Поле не выбрано в источнике данных: откройте настройки источника и убедитесь, что нужное поле добавлено в выборку.
- 🔄 Поле добавлено после создания вычисляемого: удалите вычисляемое поле и создайте его заново.
4.2. Неправильный тип данных
Симптом: вместо числа отображается #Значение! или пустая ячейка.
Пример ошибки: вы пытаетесь сложить строку и число:
Цена + " руб." // Ошибка!
Правильный вариант:
Строка(Цена) + " руб."
Другие типичные случаи:
- 🔢 Деление целых чисел:
5 / 2 = 2(нужно5.0 / 2). - 📅 Сравнение даты со строкой:
ДатаДокумента = "01.01.2023"не сработает. ИспользуйтеДатаДокумента = Дата(2023, 1, 1).
4.3. Циклические зависимости
Симптом: отчёт зависает или выдаёт ошибку Циклическая ссылка в вычисляемых полях.
Причина: вычисляемое поле А ссылается на поле Б, а поле Б — на А. Например:
// Поле "СуммаСНДС"
СуммаБезНДС * 1.2
// Поле "СуммаБезНДС"
СуммаСНДС / 1.2
Решение: разорвите цикл, используя промежуточные поля или перенеся логику в одно место.
⚠️ Внимание: В версиях 1С:Предприятие 8.3.20+ появилась поддержка рекурсивных выражений, но её нужно включать явно в настройках схемы компоновки. Без необходимости не используйте эту возможность — она сильно усложняет отладку.
5. Оптимизация производительности
Вычисляемые поля могут замедлить выполнение отчёта, особенно если:
- 📊 Формула сложная (много вложенных
ЕСЛИили вызовов функций). - 🔢 Источник данных большой (десятки тысяч строк).
- 🔄 Поле используется в группировках или итогах.
Способы ускорить работу:
5.1. Перенесите логику в запрос
Если вычисляемое поле использует только поля из источника данных, перенесите его в SQL-запрос. Например, вместо:
// В вычисляемом поле
Сумма * КурсВалюты
Пишите в запросе:
ВЫБРАТЬ
Сумма * КурсВалюты КАК СуммаВРублях
ИЗ ...
Это снизит нагрузку на СКД, так как расчёт выполнит СУБД.
5.2. Используйте промежуточные поля
Если формула длинная, разбейте её на несколько простых полей. Например, вместо:
ЕСЛИ Сумма > 10000 И Дата > НачалоМесяца(ТекущаяДата())
ТОГДА Сумма * 0.9
ИНАЧЕ Сумма * 1.1
КОНЕЦЕСЛИ
Создайте два поля:
УсловиеСкидки:Сумма > 10000 И Дата > НачалоМесяца(ТекущаяДата())СуммаСоСкидкой:ЕСЛИ УсловиеСкидки ТОГДА Сумма 0.9 ИНАЧЕ Сумма 1.1 КОНЕЦЕСЛИ
5.3. Ограничьте область видимости
Если поле нужно только для одной группировки, настройте его видимость в параметрах отчёта. Для этого:
- Откройте настройки вычисляемого поля.
- В разделе
Дополнительноукажите, для каких группировок поле активно.
Это уменьшит количество вычислений.
Самая частая причина тормозов — вычисляемые поля в итогах по большим выборкам. Если возможно, рассчитывайте итоги напрямую в запросе с помощью ГРУППИРОВКА и агрегатных функций (СУММА, МАКСИМУМ).
6. Практический пример: сложное вычисляемое поле
Рассмотрим реальную задачу: в отчёте по продажам нужно показать:
- Процент выполнения плана.
- Категорию клиента ("Крупный", "Средний", "Мелкий") в зависимости от суммы заказов.
- Срок оплаты ("В срок", "Просрочено", "Оплачено").
Решение:
6.1. Процент выполнения плана
Формула:
ЕСЛИ НЕ План = 0 ТОГДА
Окр(Выполнено / План * 100, 2)
ИНАЧЕ
0
КОНЕЦЕСЛИ
Здесь:
Окр()— округляет результат до 2 знаков после запятой.- Проверка
НЕ План = 0предотвращает деление на ноль.
6.2. Категория клиента
Формула с вложенными условиями:
ЕСЛИ СуммаЗаказов > 100000 ТОГДА
"Крупный"
ИНАЧЕЕСЛИ СуммаЗаказов > 50000 ТОГДА
"Средний"
ИНАЧЕ
"Мелкий"
КОНЕЦЕСЛИ
6.3. Срок оплаты
Формула с работой с датами:
ЕСЛИ СтатусОплаты = "Оплачено" ТОГДА
"Оплачено"
ИНАЧЕЕСЛИ ТекущаяДата() > ДатаОплаты ТОГДА
"Просрочено"
ИНАЧЕ
"В срок"
КОНЕЦЕСЛИ
Обратите внимание: ТекущаяДата() в вычисляемых полях может не обновляться при повторном открытии отчёта. Для актуальных данных используйте параметр отчёта с текущей датой.
Как передать текущую дату в вычисляемое поле?
Создайте параметр отчёта (например, ДатаОтчёта) и используйте его вместо ТекущаяДата(). Так вы гарантированно получите актуальное значение при каждом формировании отчёта.
7. Расширенные возможности: функции и параметры
Вычисляемые поля могут использовать не только поля источника данных, но и:
- 📝 Параметры отчёта: например, курс валюты или дату отсечения.
- 🔧 Встроенные функции:
СтрДлина(),Найти(),Лев(),Прав()и др. - 📊 Агрегатные функции:
СУММА(),МАКСИМУМ()(доступны в группировках). - 🔄 Пользовательские функции: если логика слишком сложная, её можно вынести в общий модуль и вызывать оттуда.
7.1. Использование параметров
Пример: в отчёте нужно показать сумму в рублях, используя курс валюты из параметра.
Шаги:
- Создайте параметр отчёта
КурсДоллара(тип — число). - В вычисляемом поле напишите:
СуммаВДолларах * КурсДоллара
Теперь пользователь сможет вводить актуальный курс при формировании отчёта.
7.2. Вызов пользовательских функций
Если логика слишком сложная для выражения в одной строке, создайте функцию в общем модуле и вызовите её из вычисляемого поля. Пример:
В общем модуле:
Функция РассчитатьБонус(СуммаЗаказов, СтажКлиента)
Если СтажКлиента > 12 Тогда
Возврат СуммаЗаказов * 0.05; // 5% бонуса
Иначе
Возврат СуммаЗаказов * 0.02; // 2% бонуса
КонецЕсли;
КонецФункции
В вычисляемом поле:
РассчитатьБонус(СуммаЗаказов, СтажКлиента)
⚠️ Внимание: Функции из общих модулей должны быть экспортными (Экспорт) и не использовать глобальные переменные, иначе отчёт может работать нестабильно.
7.3. Работа с агрегатными функциями
В группировках можно использовать агрегатные функции. Например, чтобы показать долю строки в общей сумме:
Сумма / СУММА(Сумма) * 100
Здесь СУММА(Сумма) вернёт сумму по текущей группировке.
FAQ: Частые вопросы по вычисляемым полям в СКД
Можно ли в вычисляемом поле использовать данные из другой таблицы?
Нет, вычисляемое поле работает только с данными из текущего источника (запроса или объекта). Если нужны данные из другой таблицы, добавьте их в основной запрос через СОЕДИНЕНИЕ или используйте временные таблицы.
Как отладить формулу, если поле не рассчитывается?
Используйте пошаговую проверку:
- Упростите формулу до минимального рабочего варианта.
- Проверьте типы данных (например, преобразуйте всё к строке через
Строка()). - Выведите промежуточные значения в отдельные поля.
Также поможет вывод в отладчик (Сообщить()) в обработчике ПриКомпоновкеРезультата.
Почему вычисляемое поле тормозит отчёт?
Частые причины:
- Слишком сложная формула с множеством вложенных
ЕСЛИ. - Поле используется в итогах по большому количеству строк.
- В формуле вызываются тяжелые функции (например, регулярные выражения).
Решения: оптимизируйте запрос, разбейте формулу на части или перенесите логику в СУБД.
Можно ли изменить вычисляемое поле программно при открытии отчёта?
Да, для этого используйте обработчик ПриКомпоновкеСхемы. Пример:
Процедура ПриКомпоновкеСхемы(СхемаКомпоновки, Отчёт)
Поле = СхемаКомпоновки.Поля.Найти("ПроцентВыполнения");
Поле.Выражение = "Выполнено / План * " + Строка(ПараметрыОтчёта.Коэффициент);
КонецПроцедуры
Как сделать вычисляемое поле видимым только для определённых пользователей?
Используйте права доступа или программно скрывайте поле в обработчике ПриКомпоновкеРезультата:
Если НЕ Пользователь.ИмеетРоль("Руководитель") Тогда
Результат.СхемаКомпоновкиДанных.Поля.Удалить("ЗарплатаСотрудников");
КонецЕсли;