Разработка и Конфигурация · 9 мин
Как в 1С создать формулу расчета
Как создать формулу расчета в 1С: где прописываются формулы, синтаксис встроенного языка, примеры для документов, отчетов и зарплаты, типичные ошибки.
Формулы расчета в 1С встречаются в самых разных местах: в модулях документов при автоматическом подсчете суммы строки, в отчетах на СКД при вычислении пользовательских полей, в начислениях зарплаты, в формулах ценообразования и в печатных формах. Во всех случаях логика одна: вы описываете выражение на встроенном языке 1С или в специальном редакторе, а платформа вычисляет результат при проведении документа, формировании отчета или расчете начисления.
Ключевой момент — понять, где именно должна работать формула. От этого зависит инструмент: программный код в конфигураторе, конструктор выражений в настройках отчета, формула вида расчета в ЗУП или настройка в пользовательском режиме без изменения конфигурации. Ниже разобраны основные сценарии с примерами кода и способами проверки результата.
Определяем, где должна работать формула
Прежде чем писать выражение, ответьте на вопрос: когда и кем вызывается расчет? Если сумма должна пересчитываться при вводе строки документа — это обработчик в модуле формы или объекта. Если нужен вычисляемый показатель в отчете — достаточно пользовательского поля в СКД, конфигуратор не потребуется. Если речь о начислении зарплаты — используется редактор формулы вида расчета с показателями.
Отдельный случай — типовые механизмы, где формулы настраиваются пользователем без программирования: ценообразование в «Управлении торговлей», произвольные формулы в бюджетировании, формулы начислений в ЗУП. Там выражение вводится через конструктор с подстановкой доступных операндов, и синтаксис отличается от встроенного языка.
Как выбрать место для формулы
Пишем формулу в модуле документа
Самая частая задача — автоматический расчет суммы строки табличной части. Откройте конфигуратор, найдите нужный документ, перейдите в модуль формы и добавьте обработчик события изменения поля. Классический пример для пересчета суммы:
&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
Строка = Элементы.Товары.ТекущиеДанные;
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецПроцедуры
Если расчет сложнее — с НДС, скидкой или условиями — выносите его в отдельную процедуру в общем модуле, чтобы не дублировать код в нескольких документах. Обращение к такой процедуре из формы выглядит как вызов функции с параметрами:
Функция РассчитатьСуммуСоСкидкой(Количество, Цена, ПроцентСкидки)
Сумма = Количество * Цена;
Возврат Сумма - Сумма * ПроцентСкидки / 100;
КонецФункции
Обратите внимание: арифметические операторы в 1С стандартные — +, -, *, /, для возведения в степень и округления используются функции Окр(), Цел(), Мин(), Макс(). Условия внутри формулы задаются через конструкцию Если ... Тогда ... Иначе ... КонецЕсли или тернарный оператор ?(Условие, Значение1, Значение2).
Строка.Сумма = Окр(Строка.Количество <em> Строка.Цена </em> (1 - Строка.Скидка / 100), 2)Создаем вычисляемое поле в отчете на СКД
Для отчетов менять конфигурацию часто не нужно: платформа позволяет добавить пользовательское поле прямо в режиме «1С:Предприятие». Откройте отчет, перейдите в расширенные настройки, на вкладку «Пользовательские поля» и создайте поле типа «Выражение». В редакторе напишите формулу с использованием полей набора данных.
Например, формула маржинальности может выглядеть так:
Выбор
Когда СуммаПродажи = 0
Тогда 0
Иначе (СуммаПродажи - Себестоимость) / СуммаПродажи * 100
Конец
Конструкция Выбор ... Когда ... Иначе ... Конец — аналог условия в языке выражений СКД, и именно она защищает от деления на ноль. Если в конфигураторе вы редактируете саму схему компоновки, аналогичные выражения добавляются на закладке «Вычисляемые поля» с указанием типа значения и ресурсов для итогов.
Настраиваем формулу начисления в 1С:ЗУП
В зарплатных конфигурациях формулы начислений создаются без программирования. Откройте справочник «Начисления», создайте новый вид расчета и в поле «Формула расчета» нажмите «Редактировать формулу». В редакторе доступны показатели (оклад, отработанное время, процент премии) и функции: арифметика, округление, максимум, минимум.
Типовая формула премии выглядит так: Оклад ПроцентПремии / 100, а расчет по отработанному времени — Оклад ВремяВДнях / НормаДней. Показатели предварительно создаются в справочнике «Показатели расчета зарплаты» с указанием способа ввода: постоянный, разовый документом или накапливаемый. Без зарегистрированного показателя формула не сохранится.
- 1Создайте нужные показатели в справочнике показателей расчета зарплаты
- 2Откройте справочник 'Начисления' и добавьте новый вид расчета
- 3Нажмите 'Редактировать формулу' и соберите выражение из показателей и функций
- 4Проверьте формулу кнопкой проверки в редакторе
- 5Назначьте начисление сотруднику и рассчитайте зарплату на тестовом периоде
Проверяем результат и отлаживаем формулу
Любую формулу нужно проверять на контрольных примерах, где результат известен заранее. Для кода в конфигураторе используйте отладчик: поставьте точку останова в строке расчета, запустите базу в режиме отладки и смотрите значения переменных в табло. Это быстрее, чем гадать, почему сумма не сходится.
Для формул в ЗУП и СКД проверка делается через расчет на тестовых данных: заведите сотрудника с круглым окладом, задайте понятный процент и сравните результат с ручным подсчетом. В отчетах выведите рядом исходные поля и вычисляемое — расхождения сразу видны.
Как проверить результат
Результат совпадает с расчетом вручную
Расхождение даже на простых данных — ошибка в логике формулы
Формула возвращает 0 или заданное значение по умолчанию
Ошибка деления на ноль или пустая строка в отчете
Копейки сходятся с итогом документа
Накопленные расхождения в итогах из-за округления внутри строки
Типичные ошибки и ограничения
Чаще всего формулы ломаются не из-за синтаксиса, а из-за данных: пустая цена, незаполненный показатель, нулевое количество. Всегда добавляйте проверку знаменателя перед делением и задавайте поведение для пустых значений — через Если или функцию ЕстьNull в запросах и СКД.
Второй источник проблем — изменение типовой конфигурации. Прямая правка модулей типового документа усложняет обновление: при выходе релиза ваши изменения могут быть затерты или вызвать конфликт. Безопаснее использовать расширения конфигурации, подключаемые внешние обработки или механизмы пользовательской настройки, если они закрывают задачу.
Часто задаваемые вопросы
Можно ли создать формулу в 1С без программирования?
Да, если задача решается штатными механизмами: пользовательские поля в отчетах, формулы начислений в ЗУП, формулы цен в торговых конфигурациях настраиваются через встроенные редакторы в режиме «1С:Предприятие». Программирование требуется только для логики, которую эти механизмы не покрывают.
Чем отличается формула в модуле от формулы в СКД?
Это два разных языка. В модуле используется встроенный язык 1С с конструкциями «Если...Тогда», процедурами и функциями. В СКД — язык выражений компоновки с конструкцией «Выбор...Когда...Иначе...Конец» и ограниченным набором функций. Код между ними напрямую не переносится.
Как округлить результат формулы до двух знаков?
Во встроенном языке используйте функцию Окр(Значение, 2). В формулах СКД и ЗУП также доступна функция округления в редакторе выражений. Округляйте итоговое значение, а не промежуточные множители, иначе в итогах накапливаются расхождения.
Почему формула в ЗУП считает ноль, хотя синтаксис правильный?
Наиболее вероятная причина — у сотрудника не задано значение показателя, который участвует в формуле. Проверьте, назначен ли показатель кадровым документом или введен разовым документом за расчетный месяц, и совпадает ли период действия с периодом начисления.
Что делать, если формула нужна в нескольких документах?
Вынесите расчет в функцию общего серверного модуля и вызывайте ее из обработчиков каждого документа. Так логика хранится в одном месте, и исправление формулы не потребует правки десятка модулей.
Как безопасно изменить формулу в типовой конфигурации?
Используйте расширение конфигурации: в нем можно переопределить обработчики формы или дополнить модуль, не трогая типовой код. Расширение сохраняет работоспособность при обновлении и легко отключается при проблемах.
Что важно запомнить
Сначала определите место применения формулы: модуль документа, отчет СКД, вид расчета в ЗУП или пользовательская настройка. Пишите выражение на соответствующем языке, обязательно обрабатывайте деление на ноль и пустые значения, проверяйте результат на контрольных примерах и не правьте типовые модули напрямую — используйте расширения.