Создание гибкой системы тарификации в 1С:Предприятие — ключевая задача для компаний, работающих с абонентскими услугами, арендой, подписками или многоканальными продажами. Без правильной настройки тарифов бизнес теряет до 15-20% прибыли на ошибках расчетов, ручной работе бухгалтерии и конфликтах с клиентами. Эта статья поможет разобраться, как организовать тарификацию с учетом специфики вашего бизнеса — от простых фиксированных тарифов до сложных многоуровневых схем с бонусами и скидками.
Мы рассмотрим не только техническую сторону (какие объекты конфигурации задействовать и как их связать), но и практические кейсы: как тарифицировать интернет-провайдеру трафик, оператору связи — минуты разговоров, а фитнес-клубу — абонементы с заморозкой. Особое внимание уделим автоматизации пересчета тарифов при изменении условий договора — это избавит от ручного контроля и снизит нагрузку на сотрудников.
Статья актуальна для последних версий платформы 1С:Предприятие 8.3 (включая облачные решения) и адаптирована под типовые конфигурации: 1С:ERP, 1С:Управление торговлей, 1С:Бухгалтерия, а также отраслевые решения для телекома и ЖКХ. Если вы используете кастомизированную конфигурацию, принципы остаются теми же, но могут потребоваться доработки.
1. Что такое тарификация в 1С и зачем она нужна
Тарификация в 1С — это механизм автоматизированного расчета стоимости услуг или товаров по заранее определенным правилам. В отличие от простого ценообразования, тарификация учитывает:
- 📅 Временные параметры: почасовую оплату, дневные/ночные тарифы, сезонные коэффициенты.
- 📊 Объемные показатели: трафик, минуты разговоров, количество посещений, вес груза.
- 🔄 Динамические условия: скидки за лояльность, штрафы за просрочку, бонусы за предоплату.
- 📝 Индивидуальные соглашения: персональные тарифы для VIP-клиентов или оптовиков.
Без системы тарификации компании приходится:
- ⏳ Вручную просчитывать стоимость услуг для каждого клиента (риск ошибок до 30%).
- 📉 Терять прибыль из-за неучтенных надбавок или неверных скидок.
- 📋 Вести двойной учет — в 1С и в Excel (что нарушает целостность данных).
⚠️ Внимание: Если ваш бизнес работает по абонентской модели (интернет, связь, фитнес, SaaS), отсутствие автоматизированной тарификации может привести к искажению финансовой отчетности и конфликтам с регуляторами (например, Роскомнадзором для операторов связи).
Примеры бизнес-задач, которые решает тарификация в 1С:
| Отрасль | Задача | Пример тарификации |
|---|---|---|
| Телеком | Расчет стоимости звонков и SMS | Потарифная оплата за минуту разговора с учетом направления (город/межгород/роуминг) |
| ЖКХ | Начисление платы за коммунальные услуги | Фиксированная абонплата + переменная часть по счетчикам (вода, свет, газ) |
| Логистика | Оплата за хранение и перевозку грузов | Посуточная аренда склада + плата за кубометр груза |
| Фитнес-клубы | Продажа абонементов | Разовые посещения, месячные абонементы с заморозкой, семейные тарифы |
2. Подготовка системы: какие объекты конфигурации понадобятся
Прежде чем приступать к настройке, убедитесь, что в вашей конфигурации 1С есть необходимые объекты. Если их нет — придется доработать конфигурацию или подключить отраслевое решение. Вот минимальный набор:
- 📁 Справочники:
ТарифныеПланы— хранит шаблоны тарифов (например, "Базовый", "Премиум").Услуги— перечень услуг, подлежащих тарификации (интернет, аренда, консультации).КлиентыилиКонтрагенты— для привязки индивидуальных условий.
- 📄 Документы:
НачислениеУслуг— фиксирует фактическое потребление (минуты, трафик, посещения).АктВыполненныхРаботилиСчетНаОплату— для выставления счетов клиентам.
- ⚙️ Регистры:
ТарифыКлиентов(регистр сведений) — хранит актуальные тарифы для каждого клиента.ПотреблениеУслуг(регистр накопления) — учитывает объемы потребленных услуг.
Если вы используете типовую конфигурацию (например, 1С:ERP), часть объектов уже может быть предусмотрена. Например, в 1С:Управление торговлей есть справочник ТипыЦен, который можно адаптировать под тарифы. Для телекома подойдет отраслевое решение 1С:Оператор связи, где тарификация реализована "из коробки".
⚠️ Внимание: Если в вашей конфигурации нет регистра ПотреблениеУслуг, его придется создать самостоятельно. Без этого регистра невозможно будет отслеживать фактическое потребление услуг клиентами и корректно формировать счета.
Для сложных схем (например, тарификация с учетом времени суток или геолокации) могут потребоваться дополнительные объекты:
- 🕒
ВременныеИнтервалы— для хранения пиковых/непиковых часов. - 🌍
ЗоныТарификации— для географической привязки (например, роуминг). - 📈
Коэффициенты— для сезонных надбавок или скидок.
Создать справочник "ТарифныеПланы"|Настроить регистр сведений "ТарифыКлиентов"|Добавить регистр накопления "ПотреблениеУслуг"|Проверить наличие документа "НачислениеУслуг"|Связать объекты между собой (реквизиты и табличные части)-->
3. Создание тарифных планов: пошаговая инструкция
Рассмотрим процесс на примере простого тарифного плана для фитнес-клуба: абонемент на 8 посещений по фиксированной цене.Later we’ll complicate it with dynamic discounts.
Шаг 1. Заполнение справочника "ТарифныеПланы"
Откройте справочник ТарифныеПланы (если его нет — создайте через Конфигуратор → Объекты → Справочники) и добавьте новый элемент:
- Название: "Абонемент 8 посещений".
- Тип тарифа: выберите
Фиксированный(если тариф не зависит от объема услуг) илиДинамический(если цена зависит от количества посещений). - Периодичность: укажите
Разовый(для разовых абонементов) илиЕжемесячный(для подписок). - Цена: введите стоимость (например, 3 500 рублей).
- Количество услуг: укажите 8 (максимальное число посещений).
Шаг 2. Привязка тарифа к клиенту
Откройте карточку клиента в справочнике Контрагенты и в табличной части Тарифы добавьте:
- Тарифный план: выберите созданный "Абонемент 8 посещений".
- Дата начала действия: укажите дату активации абонемента.
- Дата окончания: если абонемент ограничен по времени (например, действует 1 месяц).
Шаг 3. Настройка регистра "ТарифыКлиентов"
Регистр сведений ТарифыКлиентов должен автоматически обновляться при изменении тарифов клиента. Для этого:
- Откройте регистр в
Конфигураторе. - Добавьте ресурсы:
ТарифныйПлан,ДатаНачала,ДатаОкончания. - Настройте запись движений в модуле документа
ИзменениеТарифа(если такого документа нет — создайте его).
Пример кода для записи в регистр (вставляйте в модуль документа):
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ТарифыКлиентов.Записать();
Движения.ТарифыКлиентов.ТарифныйПлан = Объект.ТарифныйПлан;
Движения.ТарифыКлиентов.Клиент = Объект.Клиент;
Движения.ТарифыКлиентов.ДатаНачала = Объект.ДатаНачала;
Движения.ТарифыКлиентов.ДатаОкончания = Объект.ДатаОкончания;
КонецПроцедуры
⚠️ Внимание: Если у клиента действует несколько тарифов одновременно (например, абонемент на тренажерный зал + бассейн), убедитесь, что в регистре ТарифыКлиентов настроена многомерность по виду услуги. Иначе система будет учитывать только последний добавленный тариф.
Для удобства работы добавьте в справочник "ТарифныеПланы" реквизит "Цвет" и настройте условное оформление в списке. Например, премиум-тарифы отображайте золотым цветом, а базовые — серым. Это упростит визуальный поиск.
4. Начисление услуг и автоматический расчет
Теперь настроим механизм, который будет фиксировать потребление услуг клиентом и автоматически рассчитывать сумму к оплате. Для этого потребуется:
- Создать документ
НачислениеУслуг(если его нет). - Настроить логику расчета в его модуле.
- Связать документ с регистром
ПотреблениеУслуг.
Пример: фиксация посещения фитнес-клуба
Когда клиент приходит на тренировку, администратор создает документ НачислениеУслуг с параметрами:
- Клиент: выбирает из справочника.
- Услуга: например, "Посещение тренажерного зала".
- Количество: 1 (одно посещение).
- Дата: текущая дата.
В модуле документа прописываем логику:
Процедура ОбработкаПроведения(Отказ, Режим)
// Проверяем, есть ли у клиента действующий тариф
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ТарифыКлиентов.ТарифныйПлан КАК ТарифныйПлан,
| ТарифыКлиентов.ДатаОкончания КАК ДатаОкончания
|ИЗ
| РегистрСведений.ТарифыКлиентов КАК ТарифыКлиентов
|ГДЕ
| ТарифыКлиентов.Клиент = &Клиент
| И ТарифыКлиентов.ДатаНачала <= &Дата
| И (ТарифыКлиентов.ДатаОкончания >= &Дата ИЛИ ТарифыКлиентов.ДатаОкончания = ДАТАВРЕМЯ(1,1,1))
|УПОРЯДОЧИТЬ ПО
| ДатаНачала УБЫВ";
Запрос.УстановитьПараметр("Клиент", Объект.Клиент);
Запрос.УстановитьПараметр("Дата", Объект.Дата);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
// Получаем данные тарифного плана
ТарифныйПлан = Результат[0].ТарифныйПлан;
Тариф = ТарифныйПлан.ПолучитьОбъект();
// Проверяем лимит посещений
Если Тариф.КоличествоУслуг > 0 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ СУММА(ПотреблениеУслуг.Количество) КАК Потреблено
|ИЗ РегистрНакопления.ПотреблениеУслуг КАК ПотреблениеУслуг
|ГДЕ ПотреблениеУслуг.Клиент = &Клиент
| И ПотреблениеУслуг.ТарифныйПлан = &ТарифныйПлан";
Запрос.УстановитьПараметр("Клиент", Объект.Клиент);
Запрос.УстановитьПараметр("ТарифныйПлан", ТарифныйПлан);
Потреблено = Запрос.Выполнить().Выгрузить()[0].Потреблено;
Если Потреблено >= Тариф.КоличествоУслуг Тогда
Сообщить("Превышен лимит посещений по тарифу!");
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
// Записываем потребление в регистр
Движение = Движения.ПотреблениеУслуг.Добавить();
Движение.Клиент = Объект.Клиент;
Движение.ТарифныйПлан = ТарифныйПлан;
Движение.Услуга = Объект.Услуга;
Движение.Количество = Объект.Количество;
Движение.Дата = Объект.Дата;
// Рассчитываем сумму к оплате (если тариф не безлимитный)
Если Тариф.ТипТарифа = Перечисление.ТипыТарифов.Динамический Тогда
Сумма = Объект.Количество * Тариф.ЦенаЗаЕдиницу;
Иначе
Сумма = 0; // Для фиксированных тарифов оплата списывается заранее
КонецЕсли;
Объект.Сумма = Сумма;
Иначе
Сообщить("У клиента нет действующего тарифного плана!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Этот код:
- Проверяет, есть ли у клиента действующий тариф на дату посещения.
- Контролирует лимит посещений (если тариф ограничен).
- Фиксирует факт потребления услуги в регистре
ПотреблениеУслуг. - Рассчитывает сумму к доплате (если тариф динамический).
Как модифицировать код для телеком-оператора?
Для оператора связи логика будет другой. Вместо количества посещений нужно учитывать:
1. Длительность разговора (в минутах) — для этого в документе НачислениеУслуг добавьте реквизит Длительность.
2. Направление вызова (городской, междугородний, международный) — для этого создайте справочник НаправленияВызовов и свяжите его с тарифом.
3. Время суток (пиковое/непиковое) — добавьте в регистр ТарифыКлиентов ресурс ВременнойИнтервал и настройте разные цены для разного времени.
Пример модифицированного кода для расчета стоимости звонка:
// Определяем временной интервал (пиковый/непиковый)
ВремяЗвонка = Час(Объект.ДатаНачала);
Если ВремяЗвонка >= 8 И ВремяЗвонка < 20 Тогда
Коэффициент = 1.0; // Пиковое время
Иначе
Коэффициент = 0.5; // Непиковое время (скидка 50%)
КонецЕсли;
// Рассчитываем стоимость
Сумма = Объект.Длительность Тариф.ЦенаЗаМинуту Коэффициент;
5. Автоматизация: как избежать ручного ввода
Ручной ввод данных о потреблении услуг — это риск ошибок и потеря времени. Автоматизируйте процесс с помощью:
- 🤖 Обмена данными: интеграция с оборудованием (например, турникеты в фитнес-клубе или ATC в телекоме) для автоматической фиксации посещений/звонков.
- ⏰ Регламентных заданий: ежемесячное автоматическое начисление абонентской платы.
- 📊 Отчетов с контрольными точками: например, еженедельная проверка клиентов, у которых заканчивается тариф.
Пример 1: Интеграция с турникетом
Для фитнес-клуба:
- Настройте обмен данными между 1С и системой контроля доступа (например, СКУД).
- Создайте обработку, которая будет принимать данные о проходах клиентов через турникет и автоматически создавать документы
НачислениеУслуг. - Добавьте проверку на "черный список" (клиенты с просроченной оплатой).
Пример 2: Регламентное задание для абонплаты
Для ежемесячного списания абонентской платы:
- Создайте регламентное задание (
Администрирование → Регламентные задания). - Напишите обработку, которая:
- Выбирает всех клиентов с действующими тарифами.
- Проверяет, не просрочена ли оплата.
- Создает документы
СчетНаОплатус суммой абонплаты. - Отправляет уведомления клиентам по email/SMS.
Пример кода для регламентного задания:
Процедура Выполнить() Экспорт
// Получаем клиентов с действующими тарифами
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТарифыКлиентов.Клиент КАК Клиент,
| ТарифыКлиентов.ТарифныйПлан КАК ТарифныйПлан
|ИЗ
| РегистрСведений.ТарифыКлиентов КАК ТарифыКлиентов
|ГДЕ
| ТарифыКлиентов.ДатаНачала <= &ТекущаяДата
| И (ТарифыКлиентов.ДатаОкончания >= &ТекущаяДата ИЛИ ТарифыКлиентов.ДатаОкончания = ДАТАВРЕМЯ(1,1,1))";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Результат = Запрос.Выполнить();
// Для каждого клиента создаем счет
Для Каждого Строка Из Результат Цикл
Клиент = Строка.Клиент;
ТарифныйПлан = Строка.ТарифныйПлан.ПолучитьОбъект();
// Проверяем, не оплачен ли тариф за текущий месяц
Если НЕ ТарифОплачен(Клиент, ТарифныйПлан, ТекущаяДата()) Тогда
Док = Документы.СчетНаОплату.СоздатьДокумент();
Док.Клиент = Клиент;
Док.СуммаДокумента = ТарифныйПлан.АбонентскаяПлата;
Док.Дата = ТекущаяДата();
Док.Комментарий = "Абонентская плата за " + Формат(ТекущаяДата(), "ММММ yyyy");
Док.Записать();
Док.Провести();
// Отправляем уведомление (пример для email)
ТекстПисьма = "Уважаемый клиент! Сформирован счет №" + Док.Номер + " на сумму " + Док.СуммаДокумента;
ОтправитьEmail(Клиент.Email, "Счет на оплату", ТекстПисьма);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ТарифОплачен(Клиент, ТарифныйПлан, Дата)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Счета.Номер КАК Номер
|ИЗ
| Документ.СчетНаОплату КАК Счета
|ГДЕ
| Счета.Клиент = &Клиент
| И Счета.ТарифныйПлан = &ТарифныйПлан
| И МЕСЯЦ(Счета.Дата) = МЕСЯЦ(&Дата)
| И ГОД(Счета.Дата) = ГОД(&Дата)
| И Счета.Статус = Перечисление.СтатусыСчетов.Оплачен";
Запрос.УстановитьПараметр("Клиент", Клиент);
Запрос.УстановитьПараметр("ТарифныйПлан", ТарифныйПлан);
Запрос.УстановитьПараметр("Дата", Дата);
Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции
⚠️ Внимание: При настройке регламентных заданий учитывайте пиковые нагрузки. Если у вас 10 000 клиентов, одновременное создание счетов может загрузить сервер. Разбейте процесс на пакеты (например, по 1 000 клиентов в час) или используйте фоновые задания.
Автоматизация тарификации снижает затраты на администрирование до 70% и исключает ошибки ручного ввода. Начните с самых трудоемких процессов (например, ежемесячное начисление абонплаты), затем добавляйте интеграции с оборудованием.
6. Типичные ошибки и как их избежать
Даже в хорошо спроектированной системе тарификации могут возникать проблемы. Вот самые распространенные:
- 🔄 Двойное начисление: когда одна и та же услуга учитывается дважды (например, при ручном и автоматическом вводе).
Решение: добавьте в документНачислениеУслугпроверку на дубли по клиенту, услуге и дате. - 💰 Неверный расчет скидок: когда скидка применяется к неправильной базе (например, к сумме с НДС вместо суммы без НДС).
Решение: прописывайте в тарифном плане, к какой части суммы применяется скидка (до или после налогов). - ⏳ Просроченные тарифы: когда клиенту продолжают начислять услуги по старому тарифу после истечения его действия.
Решение: настройте регламентное задание, которое будет деактивировать просроченные тарифы. - 📉 Потеря данных при изменении тарифа: когда при смене тарифного плана "сбиваются" накопленные бонусы или лимиты.
Решение: храните историю изменений тарифов в отдельном регистре сведений.
Чтобы минимизировать ошибки, используйте контрольные отчеты. Например:
| Отчет | Что проверяет | Периодичность |
|---|---|---|
| Сверка тарифов и платежей | Соответствие начисленных сумм оплаченным | Еженедельно |
| Клиенты без действующих тарифов | Клиентов, которым нечего начислять | Ежемесячно |
| Аномальное потребление | Внезапные скачки в потреблении услуг (возможная ошибка или мошенничество) | Ежедневно |
Пример запроса для отчета "Клиенты без действующих тарифов":
ВЫБРАТЬ
Контрагенты.Наименование КАК Клиент,
Контрагенты.КонтактноеЛицо КАК Контакт
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НЕ Контрагенты.ПометкаУдаления
И НЕ ВЫБРАТЬ РАЗЛИЧНЫЕ Контрагенты.Ссылка
ИЗ РегистрСведений.ТарифыКлиентов КАК ТарифыКлиентов
ГДЕ ТарифыКлиентов.Клиент = Контрагенты.Ссылка
И ТарифыКлиентов.ДатаНачала <= &ТекущаяДата
И (ТарифыКлиентов.ДатаОкончания >= &ТекущаяДата ИЛИ ТарифыКлиентов.ДатаОкончания = ДАТАВРЕМЯ(1,1,1))
7. Оптимизация тарификации для крупных баз данных
Если в вашей базе больше 10 000 клиентов или 100 000 записей о потреблении услуг, стандартные механи