Разработка и Конфигурация · 9 мин
Как написать формулу в 1С: практическое руководство
Как написать формулу в 1С: встроенный язык, формулы в отчётах СКД, печатных формах и обработках. Примеры кода, типичные ошибки и проверка результата.
Формулы в 1С встречаются в нескольких местах: в вычисляемых полях отчётов на СКД, в печатных формах, в произвольных выражениях настроек и во встроенном языке при доработке конфигурации. В каждом случае синтаксис и возможности различаются, и первая задача — понять, где именно требуется формула и какой движок её будет вычислять.
Самый частый сценарий — пользователь хочет добавить расчётную колонку в отчёт: например, вычислить сумму с НДС, процент выполнения плана или разницу между двумя показателями. Второй сценарий — формула в макете печатной формы или в обработке заполнения. Третий — полноценный код на встроенном языке в модуле объекта или формы.
Для большинства пользовательских задач программировать не нужно: конструктор формул и выражения СКД решают вопрос через интерфейс. Код потребуется только когда формула зависит от сложной логики — обращения к нескольким таблицам, условий по типам документов, обхода строк.
Определите, где именно нужна формула
Прежде чем писать выражение, установите контекст. В типовых конфигурациях (1С:Бухгалтерия, Управление торговлей, ERP) формулы встречаются в четырёх основных местах:
- Пользовательские поля в отчётах — добавляются прямо в режиме предприятия через «Настройки» отчёта, без конфигуратора.
- Вычисляемые поля СКД — задаются в схеме компоновки данных, обычно при доработке отчёта в конфигураторе.
- Формулы в запросах — выражения в тексте запроса на языке запросов 1С.
- Встроенный язык — полноценный код в модулях форм, объектов, обработок.
От места зависит синтаксис. Выражение Цена * Количество в пользовательском поле отчёта и в запросе выглядит одинаково, но набор доступных функций разный. В пользовательских полях недоступны многие функции языка запросов, а в модуле, наоборот, нельзя напрямую использовать агрегатные функции СКД.
Как добавить формулу в отчёт без программирования
Самый безопасный способ — пользовательское поле в настройках отчёта. Он доступен в типовых отчётах, построенных на СКД, и не требует прав на конфигуратор.
- 1Откройте отчёт и нажмите кнопку «Настройки» (или «Ещё» → «Изменить вариант»).
- 2Включите расширенный режим настроек, если он доступен.
- 3Перейдите на вкладку «Пользовательские поля» и нажмите «Добавить» → «Новое поле-выражение».
- 4Введите формулу, например: Сумма <em> 1.2 или Выбор Когда Сумма > 0 Тогда Сумма </em> 0.2 Иначе 0 Конец.
- 5Задайте заголовок поля и добавьте его в структуру отчёта на вкладке «Поля».
- 6Сформируйте отчёт и сверьте результат с ручным расчётом по одной строке.
Формулы в пользовательских полях пишутся на языке выражений СКД. Поддерживаются арифметические операции, конструкция Выбор Когда ... Тогда ... Иначе ... Конец, функции работы со строками и датами. Пример условной формулы для расчёта скидки:
Выбор
Когда Сумма > 100000
Тогда Сумма * 0.1
Иначе 0
Конец
Если отчёт не содержит нужного поля в списке доступных, значит, его нет в схеме компоновки — тогда без доработки в конфигураторе не обойтись. Это типичное ограничение: пользовательские поля оперируют только теми данными, которые отчёт уже получает.
Формулы в вычисляемых полях СКД и запросах
При доработке отчёта в конфигураторе формулы добавляются на вкладке «Вычисляемые поля» схемы компоновки. Там указывается путь к данным (имя поля), выражение и тип значения. Выражение пишется на том же языке выражений СКД.
Если расчёт нужен на уровне источника данных, формула помещается прямо в текст запроса:
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Количество,
Продажи.Сумма,
ВЫБОР
КОГДА Продажи.Количество > 0
ТОГДА Продажи.Сумма / Продажи.Количество
ИНАЧЕ 0
КОНЕЦ КАК СредняяЦена
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Обратите внимание на защиту от деления на ноль: проверка КОГДА Количество > 0 обязательна, иначе отчёт упадёт с ошибкой на строках с нулевым количеством. Это одна из самых частых причин «сломанного» отчёта после добавления формулы.
Формулы на встроенном языке в модуле
Когда расчёт сложнее одного выражения — циклы, обращения к справочникам, несколько условий — формула пишется кодом в модуле. Например, в модуле формы документа можно пересчитывать сумму строки при изменении цены:
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
ТекСтрока = Элементы.Товары.ТекущиеДанные;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;
КонецПроцедуры
Ключевые правила кода в модулях: выражения разделяются точкой с запятой, присваивание выполняется знаком =, сравнение — тоже = (в отличие от многих языков), условия оформляются конструкцией Если ... Тогда ... Иначе ... КонецЕсли;. Комментарии начинаются с двойного слэша //.
Директивы &НаКлиенте и &НаСервере определяют, где выполняется код. Обращение к базе данных (запросы, чтение справочников) возможно только на сервере. Если формула требует данных из базы, а процедура клиентская — вызывайте серверную процедуру, иначе получите ошибку выполнения.
Проверка и отладка формулы
После написания формулы результат проверяется на контрольном примере. Возьмите одну строку данных и посчитайте ожидаемое значение вручную или на калькуляторе, затем сравните с тем, что вывела 1С. Для отчётов удобно временно вывести в отчёт исходные поля рядом с формулой — так видно, какие значения подставляются.
Для кода в модулях используйте встроенный отладчик конфигуратора: точка останова (F9 на строке), запуск отладки (F5) и просмотр значений переменных через «Вычислить выражение» (Shift+F9). Это быстрее и надёжнее, чем вставка сообщений Сообщить() по всему коду.
Как проверить результат
Совпадает с ручным расчётом
Расходится — проверьте порядок операций и типы полей
Формула выдаёт 0 или пусто, отчёт формируется
Ошибка деления на ноль или пустое значение там, где должно быть число
Итог считается от суммы строк или по заданной агрегатной формуле
Итог явно не сходится — у ресурса СКД задано неверное выражение итога
Ограничения и альтернативы
Не каждую задачу стоит решать формулой. Если расчёт нужен постоянно и участвует в проведении документов, правильнее добавить реквизит и считать его в коде, а не вычислять каждый раз в отчёте. Если формула нужна разово для анализа — достаточно пользовательского поля или выгрузки в таблицу.
Сравнение вариантов
Быстро и без прав, но только в рамках данных отчёта; не сохраняется для других пользователей без настройки варианта.
Полный контроль над полями и итогами; требует прав разработчика и усложняет обновление типовой конфигурации.
Доработка без изменения типовой конфигурации, обновления не ломаются; не все объекты и сценарии поддерживаются.
Не трогает конфигурацию вообще; подходит для разовых расчётов, но не встраивается в типовые формы.
Если у вас нет доступа к конфигуратору, а пользовательских полей не хватает, корректный путь — сформулировать требование к расчёту (формула, условия, пример на конкретных цифрах) и передать его специалисту по 1С. Точное ТЗ в этом случае экономит больше времени, чем попытки обойти ограничение.
Что важно запомнить
Сначала определите место формулы: отчёт, запрос или модуль. Простые расчёты делайте пользовательскими полями, сложные — кодом на копии базы. Всегда защищайте деление от нуля и проверяйте результат на контрольном примере.
Частые вопросы
Можно ли писать формулы в 1С без доступа к конфигуратору?
Да, через пользовательские поля в настройках отчётов на СКД и через механизм дополнительных отчётов и обработок, если он включён администратором. Изменять модули и схемы компоновки без конфигуратора нельзя.
Почему формула в отчёте выдаёт пустое значение?
Чаще всего одно из полей в выражении содержит NULL. Оберните поля функцией ЕСТЬNULL(Поле, 0) в запросе или проверьте, что все используемые поля реально присутствуют в выборке отчёта.
Как в формуле округлить число?
В языке выражений и встроенном языке используйте функцию Окр(Значение, Точность), например Окр(Сумма, 2) — округление до двух знаков. В запросах доступна та же функция ОКР.
Чем отличается «=» в условии от присваивания в коде 1С?
Ничем по записи: в 1С один знак «=» используется и для присваивания, и для сравнения. Контекст определяет смысл: внутри «Если ... Тогда» это сравнение, в отдельном операторе — присваивание.
Формула ломается после обновления конфигурации. Что делать?
Если доработка сделана прямо в типовой конфигурации, обновление может затереть изменения. Переносите доработки в расширение конфигурации — тогда обновления проходят без потери формул и кода.
Где посмотреть список доступных функций для формул?
В конфигураторе откройте синтакс-помощник (Ctrl+Shift+F1): разделы по встроенному языку и языку запросов содержат полный перечень функций с примерами. Для выражений СКД список функций виден в конструкторе выражения.