К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как написать формулу в 1С: практическое руководство

Как написать формулу в 1С: встроенный язык, формулы в отчётах СКД, печатных формах и обработках. Примеры кода, типичные ошибки и проверка результата.

Формулы в 1С встречаются в нескольких местах: в вычисляемых полях отчётов на СКД, в печатных формах, в произвольных выражениях настроек и во встроенном языке при доработке конфигурации. В каждом случае синтаксис и возможности различаются, и первая задача — понять, где именно требуется формула и какой движок её будет вычислять.

Самый частый сценарий — пользователь хочет добавить расчётную колонку в отчёт: например, вычислить сумму с НДС, процент выполнения плана или разницу между двумя показателями. Второй сценарий — формула в макете печатной формы или в обработке заполнения. Третий — полноценный код на встроенном языке в модуле объекта или формы.

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

Определите, где именно нужна формула

Прежде чем писать выражение, установите контекст. В типовых конфигурациях (1С:Бухгалтерия, Управление торговлей, ERP) формулы встречаются в четырёх основных местах:

  • Пользовательские поля в отчётах — добавляются прямо в режиме предприятия через «Настройки» отчёта, без конфигуратора.
  • Вычисляемые поля СКД — задаются в схеме компоновки данных, обычно при доработке отчёта в конфигураторе.
  • Формулы в запросах — выражения в тексте запроса на языке запросов 1С.
  • Встроенный язык — полноценный код в модулях форм, объектов, обработок.

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

Как добавить формулу в отчёт без программирования

Самый безопасный способ — пользовательское поле в настройках отчёта. Он доступен в типовых отчётах, построенных на СКД, и не требует прав на конфигуратор.

Порядок действий
  1. 1
    Откройте отчёт и нажмите кнопку «Настройки» (или «Ещё» → «Изменить вариант»).
  2. 2
    Включите расширенный режим настроек, если он доступен.
  3. 3
    Перейдите на вкладку «Пользовательские поля» и нажмите «Добавить» → «Новое поле-выражение».
  4. 4
    Введите формулу, например: Сумма <em> 1.2 или Выбор Когда Сумма > 0 Тогда Сумма </em> 0.2 Иначе 0 Конец.
  5. 5
    Задайте заголовок поля и добавьте его в структуру отчёта на вкладке «Поля».
  6. 6
    Сформируйте отчёт и сверьте результат с ручным расчётом по одной строке.

Формулы в пользовательских полях пишутся на языке выражений СКД. Поддерживаются арифметические операции, конструкция Выбор Когда ... Тогда ... Иначе ... Конец, функции работы со строками и датами. Пример условной формулы для расчёта скидки:

Выбор

Когда Сумма > 100000

Тогда Сумма * 0.1

Иначе 0

Конец

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

Формулы в вычисляемых полях СКД и запросах

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

Если расчёт нужен на уровне источника данных, формула помещается прямо в текст запроса:

ВЫБРАТЬ

Продажи.Номенклатура,

Продажи.Количество,

Продажи.Сумма,

ВЫБОР

КОГДА Продажи.Количество > 0

ТОГДА Продажи.Сумма / Продажи.Количество

ИНАЧЕ 0

КОНЕЦ КАК СредняяЦена

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

Обратите внимание на защиту от деления на ноль: проверка КОГДА Количество > 0 обязательна, иначе отчёт упадёт с ошибкой на строках с нулевым количеством. Это одна из самых частых причин «сломанного» отчёта после добавления формулы.

Типичные ошибки
01
Деление без проверки знаменателя — отчёт падает с ошибкой деления на ноль на первой же пустой строке.
02
Сравнение с NULL — в запросах NULL не равен ничему, даже NULL; используйте ЕСТЬ NULL или ЕСТЬNULL(Поле, 0).
03
Смешение типов: сложение числа и строки вызывает ошибку; приводите значения функциями преобразования.
04
Формула ссылается на поле, которого нет в выборке — выражение не вычисляется, поле остаётся пустым.

Формулы на встроенном языке в модуле

Когда расчёт сложнее одного выражения — циклы, обращения к справочникам, несколько условий — формула пишется кодом в модуле. Например, в модуле формы документа можно пересчитывать сумму строки при изменении цены:

&НаКлиенте

Процедура ТоварыЦенаПриИзменении(Элемент)

ТекСтрока = Элементы.Товары.ТекущиеДанные;

ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;

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

Ключевые правила кода в модулях: выражения разделяются точкой с запятой, присваивание выполняется знаком =, сравнение — тоже = (в отличие от многих языков), условия оформляются конструкцией Если ... Тогда ... Иначе ... КонецЕсли;. Комментарии начинаются с двойного слэша //.

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

Проверка и отладка формулы

После написания формулы результат проверяется на контрольном примере. Возьмите одну строку данных и посчитайте ожидаемое значение вручную или на калькуляторе, затем сравните с тем, что вывела 1С. Для отчётов удобно временно вывести в отчёт исходные поля рядом с формулой — так видно, какие значения подставляются.

Для кода в модулях используйте встроенный отладчик конфигуратора: точка останова (F9 на строке), запуск отладки (F5) и просмотр значений переменных через «Вычислить выражение» (Shift+F9). Это быстрее и надёжнее, чем вставка сообщений Сообщить() по всему коду.

Контрольные точки

Как проверить результат

Значение формулы на одной строке
Норма

Совпадает с ручным расчётом

Тревожный признак

Расходится — проверьте порядок операций и типы полей

Строки с пустыми данными
Норма

Формула выдаёт 0 или пусто, отчёт формируется

Тревожный признак

Ошибка деления на ноль или пустое значение там, где должно быть число

Итоги по колонке
Норма

Итог считается от суммы строк или по заданной агрегатной формуле

Тревожный признак

Итог явно не сходится — у ресурса СКД задано неверное выражение итога

Ограничения и альтернативы

Не каждую задачу стоит решать формулой. Если расчёт нужен постоянно и участвует в проведении документов, правильнее добавить реквизит и считать его в коде, а не вычислять каждый раз в отчёте. Если формула нужна разово для анализа — достаточно пользовательского поля или выгрузки в таблицу.

Сравнение вариантов

Пользовательское поле в отчёте

Быстро и без прав, но только в рамках данных отчёта; не сохраняется для других пользователей без настройки варианта.

Доработка СКД в конфигураторе

Полный контроль над полями и итогами; требует прав разработчика и усложняет обновление типовой конфигурации.

Расширение конфигурации

Доработка без изменения типовой конфигурации, обновления не ломаются; не все объекты и сценарии поддерживаются.

Внешняя обработка или отчёт

Не трогает конфигурацию вообще; подходит для разовых расчётов, но не встраивается в типовые формы.

Если у вас нет доступа к конфигуратору, а пользовательских полей не хватает, корректный путь — сформулировать требование к расчёту (формула, условия, пример на конкретных цифрах) и передать его специалисту по 1С. Точное ТЗ в этом случае экономит больше времени, чем попытки обойти ограничение.

Итог

Что важно запомнить

Сначала определите место формулы: отчёт, запрос или модуль. Простые расчёты делайте пользовательскими полями, сложные — кодом на копии базы. Всегда защищайте деление от нуля и проверяйте результат на контрольном примере.

Частые вопросы

Можно ли писать формулы в 1С без доступа к конфигуратору?

Да, через пользовательские поля в настройках отчётов на СКД и через механизм дополнительных отчётов и обработок, если он включён администратором. Изменять модули и схемы компоновки без конфигуратора нельзя.

Почему формула в отчёте выдаёт пустое значение?

Чаще всего одно из полей в выражении содержит NULL. Оберните поля функцией ЕСТЬNULL(Поле, 0) в запросе или проверьте, что все используемые поля реально присутствуют в выборке отчёта.

Как в формуле округлить число?

В языке выражений и встроенном языке используйте функцию Окр(Значение, Точность), например Окр(Сумма, 2) — округление до двух знаков. В запросах доступна та же функция ОКР.

Чем отличается «=» в условии от присваивания в коде 1С?

Ничем по записи: в 1С один знак «=» используется и для присваивания, и для сравнения. Контекст определяет смысл: внутри «Если ... Тогда» это сравнение, в отдельном операторе — присваивание.

Формула ломается после обновления конфигурации. Что делать?

Если доработка сделана прямо в типовой конфигурации, обновление может затереть изменения. Переносите доработки в расширение конфигурации — тогда обновления проходят без потери формул и кода.

Где посмотреть список доступных функций для формул?

В конфигураторе откройте синтакс-помощник (Ctrl+Shift+F1): разделы по встроенному языку и языку запросов содержат полный перечень функций с примерами. Для выражений СКД список функций виден в конструкторе выражения.