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 в ПРИ СОХРАНЕНИИ, если ваша логика зависит от статуса проведения.
- Используйте ВЫПОЛНИТЬ_ФОНОВО для долгих операций в ПРИ СОХРАНЕНИИ и ПРИ ПРОВЕДЕНИИ, чтобы не тормозить интерфейс пользователя.
- Логируйте важные действия через ВЫВЕСТИ — это помогает отлаживать и аудировать.