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