Разработка и Конфигурация · 13 мин
Как писать формулы в 1С: практическое руководство
Как писать формулы в 1С: где используются выражения, синтаксис встроенного языка, формулы в СКД, запросах и печатных формах, типичные ошибки и способы проверки результата.
Формулы в 1С встречаются повсюду: в выражениях встроенного языка, в запросах, в настройках СКД, в печатных формах, в произвольных алгоритмах подключаемых обработок и даже в пользовательских полях отчётов. При этом синтаксис и возможности в каждом контексте свои, и главная ошибка новичков — пытаться писать формулу «как в Excel», не разбираясь, где именно она будет вычисляться.
Под формулой в 1С обычно понимают выражение, которое система вычисляет и превращает в значение: число, строку, дату или булево. Такие выражения могут ссылаться на поля данных, переменные, функции и параметры. В зависимости от места применения меняется набор доступных функций и правила написания: то, что работает в модуле объекта, не сработает в языке запросов, и наоборот.
Эта статья разбирает основные контексты, в которых пишут формулы в 1С: встроенный язык, язык запросов, СКД и выражения в печатных формах. Для каждого случая приведены рабочие примеры, ограничения и способы проверить результат до того, как формула попадёт в рабочую базу.
Где в 1С используются формулы и как выбрать контекст
Прежде чем писать выражение, ответьте на вопрос: где оно будет исполняться. От этого зависит синтаксис, доступные функции и даже регистр написания. Всего выделяют четыре основных контекста.
Встроенный язык (модули). Формулы пишутся в процедурах и функциях модулей объектов, форм, общих модулей. Здесь доступен полный набор операторов и функций платформы, переменные, обращения к реквизитам объектов. Пример: СуммаСНДС = Сумма + Сумма * СтавкаНДС / 100;.
Язык запросов. Формулы встраиваются в текст запроса как вычисляемые поля. Синтаксис похож на SQL, но с собственными функциями платформы. Пример: ВЫБРАТЬ Товары.Количество * Товары.Цена КАК Сумма ИЗ Документ.Продажа.Товары КАК Товары.
СКД (система компоновки данных). Вычисляемые поля и пользовательские поля отчётов пишутся на языке выражений компоновки данных. Он близок к языку запросов, но имеет свои функции, например ВычислитьВыражение для агрегатных расчётов.
Печатные формы и шаблоны. В макетах табличных документов можно вставлять параметры и шаблоны с выражениями, которые подставляются при выводе. В простых случаях достаточно параметров вида [СуммаДокумента], в сложных — выражений с функцией Формат.
Как выбрать контекст для формулы
Формулы во встроенном языке: операторы и функции
Встроенный язык поддерживает стандартные арифметические операторы + - * /, оператор остатка от деления %, операции сравнения = <> > < >= <= и логические операторы И ИЛИ НЕ. Строки соединяются оператором +, при этом числа перед конкатенацией нужно преобразовать функцией Строка() или Формат().
Из математических функций чаще всего используются Окр(Число, Разрядность) для округления, Цел() для отбрасывания дробной части, Мин() и Макс() для выбора из двух значений. Для дат полезны НачалоДня(), КонецДня(), ДобавитьМесяц(), а разность дат вычисляется простым вычитанием с результатом в секундах.
Условные вычисления записываются либо конструкцией Если ... Тогда ... Иначе ... КонецЕсли;, либо оператором выбора ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Второй вариант компактнее, но при вложенных условиях быстро становится нечитаемым — больше двух уровней вложенности использовать не стоит.
// Пример: расчёт итога строки с учётом скидки и округления
СуммаБезСкидки = Количество * Цена;
СуммаСкидки = Окр(СуммаБезСкидки * ПроцентСкидки / 100, 2);
ИтогПоСтроке = СуммаБезСкидки - СуммаСкидки;
Обратите внимание на порядок: скидка сначала округляется до копеек, и только потом вычитается. Если округлить итог после вычитания, сумма скидки в аналитике и итог по документу могут разойтись на копейки — классический источник расхождений в отчётах.
Формулы в языке запросов
В запросах формулы записываются как выражения в секции ВЫБРАТЬ, в условиях ГДЕ и в секциях группировки. Доступны арифметические операции над полями, функции агрегации СУММА, СРЕДНЕЕ, МИНИМУМ, МАКСИМУМ, КОЛИЧЕСТВО, а также специальные функции платформы.
Условная логика реализуется конструкцией ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Это аналог If...Else, но в декларативном виде. Типичный пример — расчёт цены в зависимости от типа цен или признака строки:
ВЫБРАТЬ
Товары.Номенклатура,
ВЫБОР
КОГДА Товары.Количество >= 100
ТОГДА Товары.Цена * 0.9
ИНАЧЕ Товары.Цена
КОНЕЦ КАК ЦенаСоСкидкой
ИЗ
Документ.Продажа.Товары КАК Товары
Для работы с датами в запросах есть функции НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, РАЗНОСТЬДАТ, ДОБАВИТЬКДАТЕ. Для строк — ПОДСТРОКА с позицией и длиной. Важное ограничение: в запросе нельзя вызывать произвольные функции встроенного языка напрямую. Если нужна сложная логика, её выносят либо в вычисляемое поле СКД поверх запроса, либо в обход результата запроса во встроенном языке.
Частая задача — деление с защитой от нуля. В запросе это делается через ВЫБОР: ВЫБОР КОГДА СуммаПлана = 0 ТОГДА 0 ИНАЧЕ СуммаФакта / СуммаПлана * 100 КОНЕЦ. Без такой защиты запрос упадёт с ошибкой деления на ноль при первой же строке с пустым планом.
ВЫБОР
КОГДА Продажи.СуммаПлана = 0
ТОГДА 0
ИНАЧЕ Продажи.СуммаФакта / Продажи.СуммаПлана * 100
КОНЕЦ КАК ПроцентВыполненияФормулы в СКД: вычисляемые и пользовательские поля
СКД предлагает два уровня формул. Первый — вычисляемые поля на закладке «Вычисляемые поля» схемы компоновки: там задаётся выражение, которое считается для каждой строки данных после выполнения запроса. Второй — пользовательские поля, которые конечный пользователь добавляет в отчёт сам, без изменения конфигурации.
Язык выражений компоновки поддерживает арифметику, сравнения, конструкцию Выбор Когда ... Тогда ... Иначе ... Конец и функции работы со строками и датами. Отдельно стоит функция ВычислитьВыражение, позволяющая считать агрегаты с учётом группировок — например, долю строки в итоге группы. Это стандартный способ вывести процент от итога без доработки запроса.
Пользовательские поля бывают двух видов: поле-выбор (аналог ВЫБОР с условиями) и поле-выражение (произвольная формула). Пользовательские поля удобны для разовых аналитических задач, но у них есть ограничение: они хранятся в настройках конкретного варианта отчёта и не переносятся автоматически между базами и пользователями.
- 1Откройте схему компоновки данных и перейдите на закладку «Вычисляемые поля»
- 2Добавьте поле, укажите путь к данным (латиницей, без пробелов) и заголовок
- 3В колонке «Выражение» запишите формулу, например: Количество * Цена
- 4Добавьте поле в ресурсы отчёта с нужной агрегатной функцией (обычно Сумма)
- 5Включите поле в выбранные поля настроек отчёта
- 6Запустите отчёт и сверьте итог с контрольным расчётом вручную
Формулы в печатных формах и макетах
В макетах табличных документов формулы появляются в двух формах. Первая — параметры: в ячейке пишется имя в квадратных скобках, например [ИтоговаяСумма], а при выводе область заполняется методом Параметры.ИтоговаяСумма = Значение;. Это предпочтительный способ: вся логика расчёта остаётся в коде, где её удобно тестировать.
Вторая форма — шаблоны, где текст и параметры смешаны: Итого по документу: [Сумма] руб.. Шаблоны удобны для надписей, но сложные вычисления внутри них поддерживаются ограниченно. Если нужен расчёт прямо в макете, выражение записывается в квадратных скобках в режиме шаблона, однако злоупотреблять этим не стоит: отлаживать формулы внутри макета тяжело, ошибки всплывают только при печати.
Для форматирования значений при выводе используйте функцию Формат(Значение, "Числовой или дата-формат") на стороне кода, а не в макете. Например, Формат(Сумма, "ЧДЦ=2") гарантирует два знака после запятой, а Формат(Дата, "ДЛФ=D") — длинный формат даты. Так форматирование централизовано и не зависит от региональных настроек макета.
Проверка результата и типичные ошибки
Любую формулу проверяйте на граничных данных: нулевые значения, пустые ссылки, NULL в запросах, очень большие числа. Особое внимание — значениям NULL: в запросах они появляются при левых соединениях, и любая арифметика с NULL даёт NULL, что «съедает» итоги. Защита — функция ЕСТЬNULL(Поле, 0) вокруг каждого потенциально пустого поля.
Во встроенном языке удобно отлаживать формулы через конфигуратор: точка останова, табло значений переменных. Для запросов используйте консоль запросов — она показывает результат выражения до встраивания в код. Для СКД проверяйте формулу сначала на малой выборке, отфильтровав один-два документа.
Отдельная группа ошибок — производительность. Формулы, которые обращаются к данным через точку от ссылочных полей (например, Номенклатура.ЕдиницаИзмерения.Код), в запросах порождают дополнительные соединения, а в циклах встроенного языка — обращения к базе на каждой итерации. Если формула используется в массовой обработке, сначала получите данные одним запросом, а вычисления выполняйте уже в памяти.
Как проверить результат
Совпадает с ручным расчётом на 2–3 контрольных документах
Расхождения на копейки или пустые значения в части строк
Отображается 0 или заданное значение по умолчанию
Ошибка деления на ноль или пустые ячейки
Значения выведены с нужным форматом на тестовом документе
Текст ошибки в ячейке или незаполненные параметры
FAQ: частые вопросы о формулах в 1С
Можно ли писать формулы в 1С без навыков программирования?
Да, в ограниченном объёме. Пользовательские поля в отчётах на СКД доступны в режиме «Предприятие» без конфигуратора: достаточно понимать логику условий и арифметику. Для запросов и модулей уже нужны базовые знания встроенного языка и консоль запросов.
Чем отличается ВЫБОР в запросе от Если во встроенном языке?
ВЫБОР — декларативная конструкция внутри запроса: она вычисляется на сервере СУБД для каждой строки результата и не может содержать вызовы произвольного кода. Если...Тогда — императивный оператор модуля, который может включать любую логику, обращения к объектам и функции. Выбор между ними определяется местом вычисления.
Как вывести процент от итога группы в отчёте СКД?
Используйте функцию ВычислитьВыражение в выражении ресурса: она позволяет сослаться на агрегат по группировке верхнего уровня и поделить значение текущей строки на итог группы. Альтернатива — рассчитать итоги в запросе через соединение с группирующим подзапросом, но это сложнее и медленнее.
Почему формула в запросе возвращает NULL, хотя поля заполнены?
Чаще всего причина — левое соединение, по которому для части строк не нашлось пары: поля из присоединённой таблицы равны NULL, и арифметика с ними даёт NULL. Оберните такие поля в ЕСТЬNULL(Поле, 0). Также проверьте, что в выражении не участвуют поля примитивных типов, которые сами хранят NULL.
Можно ли вызывать свои функции из общего модуля в запросе?
Напрямую в тексте запроса — нет. Обходные пути: вычисляемые поля СКД (там в выражениях можно обращаться к функциям общих серверных модулей через специальную настройку), либо постобработка результата запроса во встроенном языке. Для типовых отчётов предпочтителен вариант с вычисляемыми полями.
Как безопасно изменить формулу в типовой конфигурации?
Не меняйте типовые модули и схемы напрямую — это усложнит обновления. Используйте расширение конфигурации: заимствуйте нужную форму, модуль или макет и переопределите логику там. Перед внедрением проверьте расчёт на копии базы и зафиксируйте старые результаты для сравнения.
Что важно запомнить
Синтаксис формулы в 1С определяется контекстом: встроенный язык, запрос, СКД и макеты имеют разные функции и правила. Защищайте деление от нуля, оборачивайте поля запросов в ЕСТЬNULL, округляйте на правильном шаге и проверяйте результат на граничных данных. Изменения в рабочей базе вносите через расширения и только после проверки на копии.