3ERP

3ERP - простая и бесплатная программа для бухгалтерского и оперативного учёта в учреждениях сферы торговли и услуг, общественного питания, складского хранения, автосервиса, медицины, логистики, производства, управления работами и заявками, поддерживающая до 100 пользователей, на русском языке и полностью бесплатная для 1 пользователя. На сайт (скачать)

05. Бизнес-логика (ЛОГИКА)

5.1. Общая концепция

Блок ЛОГИКА внутри КОЛЛЕКЦИИ или ДОКУМЕНТА позволяет определить поведение объекта при различных событиях: создании, изменении полей, сохранении, проведении.

Где можно использовать ЛОГИКА:

  • В КОЛЛЕКЦИЯ (справочниках)
  • В ДОКУМЕНТ (документах)

5.2. События (хуки жизненного цикла) — ПОЛНАЯ ТАБЛИЦА

СобытиеСтатусКогда срабатываетГде можно использоватьТипичное применение
ПРИ СОЗДАНИИ✅ ПолностьюПри создании НОВОГО объекта (ещё не сохранён в БД)Коллекции, ДокументыЗаполнение полей по умолчанию, подстановка текущей даты/пользователя
ПРИ ИЗМЕНЕНИИ <Поле>✅ ПолностьюПри изменении конкретного поляТолько в документах (для полей шапки и колонок ТЧ)Пересчёт зависимых полей, валидация
ПЕРЕД СОХРАНЕНИЕМ✅ ПолностьюПеред записью в БД (после всех изменений)Коллекции, ДокументыФинальная валидация, сложные проверки
ПРИ СОХРАНЕНИИ✅ ПолностьюПосле успешной записи в БДКоллекции, ДокументыОбновление связанных объектов, логирование, отправка уведомлений
ПРИ ПРОВЕДЕНИИ✅ ПолностьюПри проведении документа (после формирования движений)Только документыПостобработка, обновление статусов, отправка уведомлений
ПРИ ОТМЕНЕ✅ Поддерживается (вместо ПРИ РАСПРОВЕДЕНИИ)При отмене проведения документа (после удаления движений)Только документыОткат статусов, очистка связанных данных
ПЕРЕД ПРОВЕДЕНИЕМ❌ Не поддерживаетсяЛогику "до проведения" размещайте в ПРИ СОХРАНЕНИИ или начале ПРИ ПРОВЕДЕНИИ
ПЕРЕД РАСПРОВЕДЕНИЕМ❌ Не поддерживаетсяЛогику "до отмены" размещайте в ПРИ ОТМЕНЕ

5.3. Синтаксис блока ЛОГИКА (Актуальный)

ЛОГИКА
    ПРИ СОЗДАНИИ
        ЗАПОЛНИТЬ data.Дата = ТЕКУЩАЯ_ДАТА_ВРЕМЯ()
        ЗАПОЛНИТЬ data.Автор = ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ()
    КОНЕЦ
    
    ПРИ ИЗМЕНЕНИИ Статус
        ЕСЛИ old.Статус == "Новый" И data.Статус == "В работе" ТО
            ВЫВЕСТИ "Заказ переведён в работу"
        КОНЕЦ
    КОНЕЦ
    
    ПРИ ИЗМЕНЕНИИ Запчасти.Количество
        ВЫЧИСЛИТЬ ТекущаяСтрока = data.Запчасти[индекс]
        ВЫЧИСЛИТЬ ТекущаяСтрока.Сумма = ТекущаяСтрока.Цена * ТекущаяСтрока.Количество
    КОНЕЦ
    
    ПЕРЕД СОХРАНЕНИЕМ
        ЕСЛИ ПУСТО(data.Наименование) ТО
            ОШИБКА "Наименование обязательно для заполнения"
        КОНЕЦ
    КОНЕЦ
    
    ПРИ СОХРАНЕНИИ
        ВЫПОЛНИТЬ_ФОНОВО Процедура.ОтправитьУведомление(data.id)
    КОНЕЦ
    
    ПРИ ПРОВЕДЕНИИ
        ЗАПОЛНИТЬ data.Статус = "Проведён"
        ЗАПОЛНИТЬ data.ДатаПроведения = ТЕКУЩАЯ_ДАТА_ВРЕМЯ()
        ВЫЧИСЛИТЬ Автомобиль = ПРОЧИТАТЬ("Автомобили", data.Автомобиль)
        ЗАПОЛНИТЬ Автомобиль.Статус = "В ремонте"
        ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Автомобиль)
    КОНЕЦ
    
    ПРИ ОТМЕНЕ
        ЗАПОЛНИТЬ data.Статус = "Черновик"
        ВЫЧИСЛИТЬ Автомобиль = ПРОЧИТАТЬ("Автомобили", data.Автомобиль)
        ЗАПОЛНИТЬ Автомобиль.Статус = "На складе"
        ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Автомобиль)
    КОНЕЦ
КОНЕЦ

5.4. Контекстные переменные (Актуальные)

ПеременнаяТипДоступна вОписание
dataОбъектВсе событияТекущий объект (документ или запись справочника)
oldОбъектПРИ ИЗМЕНЕНИИ (только для скалярных полей)Предыдущее значение изменяемого поля
индексЧислоПРИ ИЗМЕНЕНИИ строки ТЧИндекс изменяемой строки в табличной части (0, 1, 2...)
КонстантыОбъектВсе событияГлобальные системные константы из коллекции СистемныеКонстанты
ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ()ОбъектВсе событияТекущий пользователь (с полями id, login, full_name, role)
ТЕКУЩАЯ_ОРГАНИЗАЦИЯ()ОбъектВсе событияТекущая организация (если выбрана пользователем)

5.5. Как заменить ПЕРЕД ПРОВЕДЕНИЕМ (не поддерживается)

Проверяйте в начале ПРИ ПРОВЕДЕНИИ. Это гарантирует, что документ не будет проведён, если проверка не пройдена:

ПРИ ПРОВЕДЕНИИ
    # Сначала проверяем
    ЕСЛИ НЕ ПРОВЕРИТЬ_УСЛОВИЯ() ТО
        ОШИБКА "Условия не выполнены"
    КОНЕЦ
    
    # Потом проводим
    ЗАПОЛНИТЬ data.Статус = "Проведён"
КОНЕЦ

5.6. Часто задаваемые вопросы (FAQ)

Вопрос: Где теперь делать проверку перед проведением, если ПЕРЕД ПРОВЕДЕНИЕМ не поддерживается?

Ответ: Проверяйте в начале ПРИ ПРОВЕДЕНИИ.

Вопрос: ПРИ ОТМЕНЕ срабатывает при нажатии кнопки "Распровести" через UI?

Ответ: Да, полностью. Пользователь нажимает "Распровести" → система удаляет движения → вызывает ПРИ ОТМЕНЕ.

Вопрос: Могу ли я в ПРИ СОХРАНЕНИИ изменить сам data и сохранить повторно?

Ответ: Технически да, но осторожно — это может вызвать рекурсию. Лучше использовать флаг.

5.7. Best Practices

  • Запомните список поддерживаемых событий: ПРИ СОЗДАНИИ, ПРИ ИЗМЕНЕНИИ <Поле>, ПЕРЕД СОХРАНЕНИЕМ, ПРИ СОХРАНЕНИИ, ПРИ ПРОВЕДЕНИИ, ПРИ ОТМЕНЕ
  • Для логики "до проведения" используйте начало блока ПРИ ПРОВЕДЕНИИ. Это стандартный паттерн.
  • Для логики "до отмены" используйте начало блока ПРИ ОТМЕНЕ.
  • Не пытайтесь использовать ПЕРЕД ПРОВЕДЕНИЕМ или ПЕРЕД РАСПРОВЕДЕНИЕМ — они не сработают. Парсер выдаст ошибку.
  • Всегда проверяйте _posted в ПРИ СОХРАНЕНИИ, если ваша логика зависит от статуса проведения.
  • Используйте ВЫПОЛНИТЬ_ФОНОВО для долгих операций в ПРИ СОХРАНЕНИИ и ПРИ ПРОВЕДЕНИИ, чтобы не тормозить интерфейс пользователя.
  • Логируйте важные действия через ВЫВЕСТИ — это помогает отлаживать и аудировать.
3525 | 0 | 3525 | 347 | 161 | 28