Разработка и Конфигурация · 11 мин
Как записать формулу в 1С: практическое руководство
Как правильно записать формулу в 1С: встроенный язык, выражения в СКД, формулы в отчётах и печатных формах. Синтаксис, примеры кода, типичные ошибки и проверка результата.
Формулы в 1С встречаются в нескольких разных местах, и в каждом из них действуют свои правила записи. Выражение в модуле объекта пишется на встроенном языке 1С, формула в схеме компоновки данных — на языке выражений СКД, а вычисляемое поле в запросе — на языке запросов. Путаница между этими контекстами — главная причина ошибок вида «Поле не найдено» или «Неверное выражение».
Прежде чем писать формулу, определите, где она будет выполняться: в коде модуля, в консоли запросов, в настройках отчёта на СКД или в макете печатной формы. От этого зависит доступный набор функций, способ обращения к данным и синтаксис операторов. Ниже разобраны все основные сценарии с конкретными примерами.
Определите контекст: где будет выполняться формула
В 1С существует четыре основных места для формул. Первое — модули (модули объектов, форм, общие модули): здесь работает полный встроенный язык с переменными, условиями и циклами. Второе — язык запросов: формулы в списке выбираемых полей, в условиях и итогах. Третье — язык выражений СКД: вычисляемые поля, ресурсы, пользовательские поля в отчётах. Четвёртое — выражения в макетах и настройках, например параметры печатных форм.
Эти языки похожи, но не идентичны. Функция ЕстьNull() существует в запросах, а во встроенном языке аналогичную проверку делают через ЗначениеЗаполнено() или сравнение с Неопределено. В СКД доступна функция ЕстьNULL и оператор ВЫБОР, но нет присваивания переменных. Копирование формулы из одного контекста в другой без адаптации почти гарантированно даст ошибку.
Где какой язык используется
Полный язык 1С: переменные, циклы, вызовы функций. Формула завершается точкой с запятой.
Выражения в полях выборки: арифметика, ВЫБОР, ЕстьNULL, агрегаты СУММА, МАКСИМУМ. Нет переменных.
Вычисляемые поля и ресурсы отчётов. Похож на запросы, но работает на уровне настройки отчёта.
Параметры и шаблоны ячеек печатных форм, ограниченный набор функций.
Запись формулы во встроенном языке 1С
В модуле формула — это оператор присваивания: слева переменная или реквизит, справа выражение, в конце точка с запятой. Арифметика стандартная: +, -, *, /, скобки для приоритета. Пример расчёта суммы строки документа:
СтрокаТовара.Сумма = СтрокаТовара.Цена * СтрокаТовара.Количество;
Для условных вычислений используйте конструкцию Если ... Тогда ... Иначе ... КонецЕсли; или тернарный оператор через функцию ?(Условие, ЗначениеДа, ЗначениеНет). Например, расчёт скидки:
Скидка = ?(СуммаЗаказа > 100000, СуммаЗаказа * 0.05, 0);
ИтогоКОплате = СуммаЗаказа - Скидка;
Обращайте внимание на типы операндов. Сложение числа со строкой вызовет ошибку «Преобразование значения к типу Число не может быть выполнено». Для явного приведения используйте функции Число(), Строка(), Дата(). Деление на ноль во встроенном языке приводит к ошибке выполнения — перед делением проверяйте знаменатель: Если Количество <> 0 Тогда ....
Формулы в языке запросов
В запросе формула записывается в списке полей после ВЫБРАТЬ и обязательно получает псевдоним через КАК. Простейший пример — вычисляемое поле суммы:
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Количество * Продажи.Цена КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
Условная логика в запросах реализуется оператором ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Для защиты от NULL (возникает при левом соединении, когда в связанной таблице нет записи) применяйте ЕСТЬNULL(Поле, 0). Пропуск обработки NULL — частая причина «пустых» итогов и ошибок сравнения, потому что любая операция с NULL даёт NULL.
ВЫБОР
КОГДА ЕСТЬNULL(Остатки.Количество, 0) > 0
ТОГДА "В наличии"
ИНАЧЕ "Нет на складе"
КОНЕЦ КАК Статус
Проверять формулу удобнее всего в консоли запросов: она покажет результат выражения на реальных данных до того, как вы перенесёте запрос в код или отчёт. Это безопасный способ отладки, не затрагивающий данные базы.
Формулы в СКД: вычисляемые поля и ресурсы
В схеме компоновки данных формулы добавляются на закладке «Вычисляемые поля»: укажите путь к данным (имя поля), выражение и, при необходимости, заголовок. Язык выражений СКД поддерживает арифметику, оператор ВЫБОР, функции ЕстьNULL, Сумма, РазностьДат, Строка и ряд других.
Пример вычисляемого поля «Процент выполнения плана»:
ВЫБОР
КОГДА План = 0 ТОГДА 0
ИНАЧЕ Факт / План * 100
КОНЕЦ
Если вычисляемое поле участвует в итогах, его нужно указать на закладке «Ресурсы» и задать выражение агрегирования — обычно Сумма(ИмяПоля). Без этого в итоговой строке отчёта поле останется пустым. Помните: для процентов и средних значений суммирование итога некорректно, используйте Среднее() или пересчитывайте выражение на уровне итога: Сумма(Факт) / Сумма(План) * 100.
Проверка формулы и типичные ошибки
Проверку начинайте с синтаксиса: в конфигураторе используйте «Конфигурация → Проверка конфигурации», в консоли СКД — кнопку анализа выражения, в запросах — конструктор запроса. Затем проверяйте результат на контрольных примерах: посчитайте одну строку вручную и сравните с тем, что выдала формула.
Отдельно проверьте граничные случаи: нулевые значения, пустые поля, NULL из соединений, отрицательные числа, очень большие суммы. Именно на границах формулы ломаются чаще всего, даже если на типовых данных результат выглядит правильным.
Как проверить результат
Проверка конфигурации или конструктор не выдаёт ошибок
Сообщения «Ожидается символ», «Поле не найдено»
Результат совпадает с ручным расчётом
Расхождение даже на копейки — ищите ошибку в приоритете операций или округлении
Строки без связанных данных показывают 0 или заданное значение
Пустые ячейки или пропавшие строки
Итог сходится с суммой строк или пересчитан по корректной формуле
Итог по процентам равен сумме процентов строк
Когда формулу лучше не писать самостоятельно
Простые вычисляемые поля в отчётах и арифметику в пользовательских полях безопасно делать самостоятельно — это не меняет данные базы. Осторожность нужна, когда формула встраивается в код проведения документов, регламентные операции или обработки массового изменения данных: ошибка там исказит учётные регистры, и исправление потребует перепроведения документов.
Перед изменением формул в рабочей базе сделайте резервную копию или протестируйте изменения на копии. Если формула влияет на регламентированную отчётность, расчёт налогов или зарплаты, результат должен проверить специалист, отвечающий за соответствующий участок учёта.
Что важно запомнить
Синтаксис формулы зависит от места её выполнения: модули, запросы, СКД и пользовательские поля используют разные языки. Всегда обрабатывайте NULL и деление на ноль, проверяйте результат на контрольном примере и граничных значениях, а изменения формул в учётных механизмах сначала тестируйте на копии базы.
Частые вопросы
Как написать условие «если» в формуле отчёта на СКД?
Используйте оператор ВЫБОР: ВЫБОР КОГДА Сумма > 10000 ТОГДА "Крупный" ИНАЧЕ "Обычный" КОНЕЦ. В пользовательских полях в режиме «Предприятие» есть упрощённый вариант — поле-выбор со списком условий «Когда... Тогда...», где условия задаются через конструктор без ручной записи.
Почему формула из запроса не работает в модуле?
Язык запросов и встроенный язык — разные языки. Конструкции ВЫБОР, ЕСТЬNULL, СУММА существуют только в запросах. Во встроенном языке условие пишется через Если...Тогда или ?(), проверка NULL заменяется на сравнение с Неопределено или ЗначениеЗаполнено(), а итоги считаются в цикле или через метод Итог() таблицы значений.
Как избежать ошибки деления на ноль?
В модуле — проверкой: Если Знаменатель <> 0 Тогда Результат = Числитель / Знаменатель; Иначе Результат = 0; КонецЕсли;. В запросе и СКД — через ВЫБОР КОГДА Знаменатель = 0 ТОГДА 0 ИНАЧЕ Числитель / Знаменатель КОНЕЦ. Полностью полагаться на то, что ноль «не встретится», нельзя.
Почему в итогах отчёта пусто, хотя в строках значения есть?
Поле не добавлено в ресурсы схемы компоновки или для него не задано выражение агрегирования. Откройте закладку «Ресурсы», добавьте поле и укажите выражение, например Сумма(МоёПоле). Для процентов и средних выбирайте Среднее() или формулу пересчёта от итоговых сумм.
Можно ли добавить формулу в отчёт без прав на изменение конфигурации?
Да, через пользовательские поля в настройках отчёта — они доступны в режиме «Предприятие» и не требуют конфигуратора. Ограничение: работают только с полями текущего набора данных и поддерживают простую арифметику и условия. Для сложной логики понадобится доработка отчёта разработчиком.
Чем проверить формулу до переноса в конфигурацию?
Запросы удобно отлаживать в консоли запросов, выражения СКД — в консоли компоновки или прямо в настройках отчёта на тестовых данных. Для кода модуля используйте отладчик конфигуратора с точкой останова: он покажет значения операндов и промежуточный результат выражения.