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

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

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

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

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

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

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

Где в 1С используются формулы и как выбрать контекст

Прежде чем писать выражение, ответьте на вопрос: где оно будет исполняться. От этого зависит синтаксис, доступные функции и даже регистр написания. Всего выделяют четыре основных контекста.

Встроенный язык (модули). Формулы пишутся в процедурах и функциях модулей объектов, форм, общих модулей. Здесь доступен полный набор операторов и функций платформы, переменные, обращения к реквизитам объектов. Пример: СуммаСНДС = Сумма + Сумма * СтавкаНДС / 100;.

Язык запросов. Формулы встраиваются в текст запроса как вычисляемые поля. Синтаксис похож на SQL, но с собственными функциями платформы. Пример: ВЫБРАТЬ Товары.Количество * Товары.Цена КАК Сумма ИЗ Документ.Продажа.Товары КАК Товары.

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

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

Маршрут решения

Как выбрать контекст для формулы

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

Формулы во встроенном языке: операторы и функции

Встроенный язык поддерживает стандартные арифметические операторы + - * /, оператор остатка от деления %, операции сравнения = <> > < >= <= и логические операторы И ИЛИ НЕ. Строки соединяются оператором +, при этом числа перед конкатенацией нужно преобразовать функцией Строка() или Формат().

Из математических функций чаще всего используются Окр(Число, Разрядность) для округления, Цел() для отбрасывания дробной части, Мин() и Макс() для выбора из двух значений. Для дат полезны НачалоДня(), КонецДня(), ДобавитьМесяц(), а разность дат вычисляется простым вычитанием с результатом в секундах.

Условные вычисления записываются либо конструкцией Если ... Тогда ... Иначе ... КонецЕсли;, либо оператором выбора ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Второй вариант компактнее, но при вложенных условиях быстро становится нечитаемым — больше двух уровней вложенности использовать не стоит.

// Пример: расчёт итога строки с учётом скидки и округления

СуммаБезСкидки = Количество * Цена;

СуммаСкидки = Окр(СуммаБезСкидки * ПроцентСкидки / 100, 2);

ИтогПоСтроке = СуммаБезСкидки - СуммаСкидки;

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

Формулы в языке запросов

В запросах формулы записываются как выражения в секции ВЫБРАТЬ, в условиях ГДЕ и в секциях группировки. Доступны арифметические операции над полями, функции агрегации СУММА, СРЕДНЕЕ, МИНИМУМ, МАКСИМУМ, КОЛИЧЕСТВО, а также специальные функции платформы.

Условная логика реализуется конструкцией ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Это аналог If...Else, но в декларативном виде. Типичный пример — расчёт цены в зависимости от типа цен или признака строки:

ВЫБРАТЬ

Товары.Номенклатура,

ВЫБОР

КОГДА Товары.Количество >= 100

ТОГДА Товары.Цена * 0.9

ИНАЧЕ Товары.Цена

КОНЕЦ КАК ЦенаСоСкидкой

ИЗ

Документ.Продажа.Товары КАК Товары

Для работы с датами в запросах есть функции НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, РАЗНОСТЬДАТ, ДОБАВИТЬКДАТЕ. Для строк — ПОДСТРОКА с позицией и длиной. Важное ограничение: в запросе нельзя вызывать произвольные функции встроенного языка напрямую. Если нужна сложная логика, её выносят либо в вычисляемое поле СКД поверх запроса, либо в обход результата запроса во встроенном языке.

Частая задача — деление с защитой от нуля. В запросе это делается через ВЫБОР: ВЫБОР КОГДА СуммаПлана = 0 ТОГДА 0 ИНАЧЕ СуммаФакта / СуммаПлана * 100 КОНЕЦ. Без такой защиты запрос упадёт с ошибкой деления на ноль при первой же строке с пустым планом.

bsl
ВЫБОР
    КОГДА Продажи.СуммаПлана = 0
        ТОГДА 0
    ИНАЧЕ Продажи.СуммаФакта / Продажи.СуммаПлана * 100
КОНЕЦ КАК ПроцентВыполнения

Формулы в СКД: вычисляемые и пользовательские поля

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

Язык выражений компоновки поддерживает арифметику, сравнения, конструкцию Выбор Когда ... Тогда ... Иначе ... Конец и функции работы со строками и датами. Отдельно стоит функция ВычислитьВыражение, позволяющая считать агрегаты с учётом группировок — например, долю строки в итоге группы. Это стандартный способ вывести процент от итога без доработки запроса.

Пользовательские поля бывают двух видов: поле-выбор (аналог ВЫБОР с условиями) и поле-выражение (произвольная формула). Пользовательские поля удобны для разовых аналитических задач, но у них есть ограничение: они хранятся в настройках конкретного варианта отчёта и не переносятся автоматически между базами и пользователями.

Как добавить вычисляемое поле в отчёт на СКД
  1. 1
    Откройте схему компоновки данных и перейдите на закладку «Вычисляемые поля»
  2. 2
    Добавьте поле, укажите путь к данным (латиницей, без пробелов) и заголовок
  3. 3
    В колонке «Выражение» запишите формулу, например: Количество * Цена
  4. 4
    Добавьте поле в ресурсы отчёта с нужной агрегатной функцией (обычно Сумма)
  5. 5
    Включите поле в выбранные поля настроек отчёта
  6. 6
    Запустите отчёт и сверьте итог с контрольным расчётом вручную

Формулы в печатных формах и макетах

В макетах табличных документов формулы появляются в двух формах. Первая — параметры: в ячейке пишется имя в квадратных скобках, например [ИтоговаяСумма], а при выводе область заполняется методом Параметры.ИтоговаяСумма = Значение;. Это предпочтительный способ: вся логика расчёта остаётся в коде, где её удобно тестировать.

Вторая форма — шаблоны, где текст и параметры смешаны: Итого по документу: [Сумма] руб.. Шаблоны удобны для надписей, но сложные вычисления внутри них поддерживаются ограниченно. Если нужен расчёт прямо в макете, выражение записывается в квадратных скобках в режиме шаблона, однако злоупотреблять этим не стоит: отлаживать формулы внутри макета тяжело, ошибки всплывают только при печати.

Для форматирования значений при выводе используйте функцию Формат(Значение, "Числовой или дата-формат") на стороне кода, а не в макете. Например, Формат(Сумма, "ЧДЦ=2") гарантирует два знака после запятой, а Формат(Дата, "ДЛФ=D") — длинный формат даты. Так форматирование централизовано и не зависит от региональных настроек макета.

Проверка результата и типичные ошибки

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

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

Типичные ошибки при написании формул
01
Смешение синтаксисов: попытка использовать функцию Окр() в запросе или СУММА() в модуле — выбирайте функции под конкретный контекст
02
Игнорирование NULL в запросах: арифметика с NULL обнуляет результат, оборачивайте поля в ЕСТЬNULL
03
Деление без проверки знаменателя: ошибка выполнения на первой строке с нулевым значением
04
Округление не на том шаге: копеечные расхождения между строками и итогами документа
05
Русские идентификаторы в путях данных СКД с пробелами: поле не находится, отчёт падает — используйте латиницу без пробелов
06
Тяжёлые формулы в макетах печатных форм: ошибки всплывают только при печати, выносите расчёт в код

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

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

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

Итог отчёта с новым вычисляемым полем
Норма

Совпадает с ручным расчётом на 2–3 контрольных документах

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

Расхождения на копейки или пустые значения в части строк

Строки с нулевыми и пустыми исходными данными
Норма

Отображается 0 или заданное значение по умолчанию

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

Ошибка деления на ноль или пустые ячейки

Печатная форма с новой формулой
Норма

Значения выведены с нужным форматом на тестовом документе

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

Текст ошибки в ячейке или незаполненные параметры

FAQ: частые вопросы о формулах в 1С

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

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

Чем отличается ВЫБОР в запросе от Если во встроенном языке?

ВЫБОР — декларативная конструкция внутри запроса: она вычисляется на сервере СУБД для каждой строки результата и не может содержать вызовы произвольного кода. Если...Тогда — императивный оператор модуля, который может включать любую логику, обращения к объектам и функции. Выбор между ними определяется местом вычисления.

Как вывести процент от итога группы в отчёте СКД?

Используйте функцию ВычислитьВыражение в выражении ресурса: она позволяет сослаться на агрегат по группировке верхнего уровня и поделить значение текущей строки на итог группы. Альтернатива — рассчитать итоги в запросе через соединение с группирующим подзапросом, но это сложнее и медленнее.

Почему формула в запросе возвращает NULL, хотя поля заполнены?

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

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

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

Как безопасно изменить формулу в типовой конфигурации?

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

Итог

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

Синтаксис формулы в 1С определяется контекстом: встроенный язык, запрос, СКД и макеты имеют разные функции и правила. Защищайте деление от нуля, оборачивайте поля запросов в ЕСТЬNULL, округляйте на правильном шаге и проверяйте результат на граничных данных. Изменения в рабочей базе вносите через расширения и только после проверки на копии.