3ERP

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

Автосервис (управление клиентами)

# ============================================
# 3ERP: УПРАВЛЕНИЕ АВТОСЕРВИСОМ (МУЛЬТИФИРМА)
# ============================================
# ============================================
# ПОЛЬЗОВАТЕЛИ, РОЛИ И ДОСТУП
# ============================================
РОЛЬ Администратор
    ДОСТУП Организации ПОЛНЫЙ
    ДОСТУП Клиенты ПОЛНЫЙ
    ДОСТУП Автомобили ПОЛНЫЙ
    ДОСТУП Сотрудники ПОЛНЫЙ
    ДОСТУП Склады ПОЛНЫЙ
    ДОСТУП Номенклатура ПОЛНЫЙ
    ДОСТУП Задачи ПОЛНЫЙ
    ДОСТУП Контрагенты ПОЛНЫЙ
    ДОСТУП СчетНаОплату ПОЛНЫЙ
    ДОСТУП ПоступлениеЗапчастей ПОЛНЫЙ
    ДОСТУП ЗаказНаряд ПОЛНЫЙ
    ДОСТУП ОплатаОтКлиента ПОЛНЫЙ
    ДОСТУП ОстаткиЗапчастей ПОЛНЫЙ
    ДОСТУП Взаиморасчеты ПОЛНЫЙ
    ДОСТУП ВыработкаМехаников ПОЛНЫЙ
    ДОСТУП Хозрасчетный ПОЛНЫЙ
    ДОСТУП Проводки ПОЛНЫЙ
    ДОСТУП ЕжедневныйОтчет ПОЛНЫЙ
КОНЕЦ_РОЛИ
РОЛЬ Менеджер
    ДОСТУП Клиенты ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ
    ДОСТУП Автомобили ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ
    ДОСТУП Номенклатура ЧТЕНИЕ
    ДОСТУП Склады ЧТЕНИЕ
    ДОСТУП Контрагенты ЧТЕНИЕ
    ДОСТУП ЗаказНаряд ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ, ПРОВЕДЕНИЕ
    ДОСТУП СчетНаОплату ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ, ПРОВЕДЕНИЕ
    ДОСТУП ОплатаОтКлиента ЧТЕНИЕ, ДОБАВЛЕНИЕ, ПРОВЕДЕНИЕ
    ДОСТУП Задачи ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ
    # Обработка ограничения на уровне строк (RLS) - менеджер видит только свои заказы
    ОГРАНИЧЕНИЕ_ДОСТУПА ЗаказНаряд ГДЕ Менеджер = ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ()
КОНЕЦ_РОЛИ
РОЛЬ ДиректорФилиала
    ДОСТУП Клиенты ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ
    ДОСТУП Автомобили ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ
    ДОСТУП Номенклатура ЧТЕНИЕ
    ДОСТУП Склады ЧТЕНИЕ
    ДОСТУП Контрагенты ЧТЕНИЕ
    ДОСТУП ЗаказНаряд ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ, ПРОВЕДЕНИЕ
    ДОСТУП ОплатаОтКлиента ЧТЕНИЕ, ДОБАВЛЕНИЕ, ПРОВЕДЕНИЕ
    # ---------------------------------------------------------
    # МУЛЬТИФИРМЕННЫЙ УЧЕТ (RLS ПО ОРГАНИЗАЦИИ)
    # ---------------------------------------------------------
    # Директор филиала видит документы ВСЕХ менеджеров, но СТРОГО в рамках своей фирмы.
    ОГРАНИЧЕНИЕ_ДОСТУПА ЗаказНаряд ГДЕ Организация = ТЕКУЩАЯ_ОРГАНИЗАЦИЯ()
    ОГРАНИЧЕНИЕ_ДОСТУПА ОплатаОтКлиента ГДЕ Организация = ТЕКУЩАЯ_ОРГАНИЗАЦИЯ()
КОНЕЦ_РОЛИ
РОЛЬ РегиональныйДиректор
    ДОСТУП Клиенты ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ
    ДОСТУП Автомобили ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ
    ДОСТУП Номенклатура ЧТЕНИЕ
    ДОСТУП Склады ЧТЕНИЕ
    ДОСТУП Контрагенты ЧТЕНИЕ
    ДОСТУП ЗаказНаряд ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ, ПРОВЕДЕНИЕ
    ДОСТУП ОплатаОтКлиента ЧТЕНИЕ, ДОБАВЛЕНИЕ, ПРОВЕДЕНИЕ
    # ---------------------------------------------------------
    # МУЛЬТИФИРМЕННЫЙ УЧЕТ (НЕСКОЛЬКО ФИРМ ИЗ СПИСКА)
    # ---------------------------------------------------------
    # Региональный директор видит документы сразу нескольких организаций.
    # В SQL IN можно безопасно перечислить как точные названия, так и числовые ID из БД.
    ОГРАНИЧЕНИЕ_ДОСТУПА ЗаказНаряд ГДЕ Организация IN ('ООО "Ауди РУС"', 'ООО "Ромашка"', '1', '2')
    ОГРАНИЧЕНИЕ_ДОСТУПА ОплатаОтКлиента ГДЕ Организация IN ('ООО "Ауди РУС"', 'ООО "Ромашка"', '1', '2')
КОНЕЦ_РОЛИ
ПОЛЬЗОВАТЕЛЬ admin
    ПАРОЛЬ "admin"
    ПОЛНОЕ_ИМЯ "Иван (Админ)"
    ЭЛЕКТРОННАЯ_ПОЧТА "admin@3erp.ru"
    ТЕЛЕФОН "+7(999)123-45-67"
    РОЛЬ Администратор
КОНЕЦ_ПОЛЬЗОВАТЕЛЯ
ПОЛЬЗОВАТЕЛЬ manager
    ПАРОЛЬ "123"
    ПОЛНОЕ_ИМЯ "Петров Петр (Менеджер)"
    ЭЛЕКТРОННАЯ_ПОЧТА "manager@3erp.ru"
    ТЕЛЕФОН "+7(999)000-11-22"
    РОЛЬ Менеджер
КОНЕЦ_ПОЛЬЗОВАТЕЛЯ
ПОЛЬЗОВАТЕЛЬ manager2
    ПАРОЛЬ "123"
    ПОЛНОЕ_ИМЯ "Капелюш (Менеджер)"
    ЭЛЕКТРОННАЯ_ПОЧТА "manager@3erp.ru"
    ТЕЛЕФОН "+7(999)000-11-22"
    РОЛЬ Менеджер
КОНЕЦ_ПОЛЬЗОВАТЕЛЯ
ПОЛЬЗОВАТЕЛЬ director
    ПАРОЛЬ "123"
    ПОЛНОЕ_ИМЯ "Сидоров Сидор (Директор)"
    ЭЛЕКТРОННАЯ_ПОЧТА "director@3erp.ru"
    ТЕЛЕФОН "+7(999)555-44-33"
    РОЛЬ ДиректорФилиала
КОНЕЦ_ПОЛЬЗОВАТЕЛЯ
ПОЛЬЗОВАТЕЛЬ director2
    ПАРОЛЬ "123"
    ПОЛНОЕ_ИМЯ "Смирнов С.С. (Рег. Директор)"
    ЭЛЕКТРОННАЯ_ПОЧТА "regdir@3erp.ru"
    ТЕЛЕФОН "+7(999)111-22-33"
    РОЛЬ РегиональныйДиректор
КОНЕЦ_ПОЛЬЗОВАТЕЛЯ
# ============================================
# НАСТРОЙКИ
# ============================================
НАСТРОЙКИ
    ПОЛЕ НазваниеСистемы СТРОКА ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ "3ERP: Автосервис (Мультифирма)"
    ПОЛЕ ТемаОформления СТРОКА ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ "AutoServiceDark"
КОНЕЦ
КОЛЛЕКЦИЯ СистемныеКонстанты
    ПОЛЕ ОсновнаяОрганизация ВЫБОР Организации
    ПОЛЕ ОсновнойСклад ВЫБОР Склады
    ПОЛЕ Логотип ФАЙЛ
    ПОЛЕ Печать ФАЙЛ
    ПОЛЕ ЛоготипСдвигВправо ЧИСЛО ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ 0
    ПОЛЕ ЛоготипСдвигВниз ЧИСЛО ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ 0
    ПОЛЕ ПечатьСдвигВправо ЧИСЛО ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ 0
    ПОЛЕ ПечатьСдвигВниз ЧИСЛО ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ 0
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
# --- СПРАВОЧНИКИ (НСИ) ---
КОЛЛЕКЦИЯ Организации
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ ТипЮрЛица СТРОКА ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ "ООО"
    ПОЛЕ ИНН СТРОКА
    ПОЛЕ КПП СТРОКА
    ПОЛЕ Руководитель ВЫБОР Сотрудники
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
КОЛЛЕКЦИЯ Контрагенты
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ ИНН СТРОКА
    ПОЛЕ КПП СТРОКА
    ПОЛЕ Руководитель
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
КОЛЛЕКЦИЯ Клиенты
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Телефон СТРОКА
    ПОЛЕ Email СТРОКА
    ПОЛЕ СкидкаПроцент ЧИСЛО ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ 0
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
КОЛЛЕКЦИЯ Автомобили
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ ГосНомер СТРОКА
    ПОЛЕ VIN СТРОКА
    ПОЛЕ Марка СТРОКА
    ПОЛЕ Модель СТРОКА
    ПОЛЕ Владелец ВЫБОР Клиенты ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Фото ФАЙЛ
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
КОЛЛЕКЦИЯ Сотрудники
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Должность СТРОКА ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ "Механик"
    ПОЛЕ ПроцентОтВыработки ЧИСЛО ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ 40
    ПОЛЕ Организация ВЫБОР Организации # Оформлен в конкретном ИП/ООО
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
КОЛЛЕКЦИЯ Склады
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
КОЛЛЕКЦИЯ Номенклатура
    АВТОНУМЕРАЦИЯ "АРТ-{00000}" ПОЛЕ Артикул
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ ЭтоГруппа БУЛЕВО
    ПОЛЕ Категория ВЫБОР Номенклатура
    ПОЛЕ ЭтоУслуга БУЛЕВО ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ 0
    ПОЛЕ Артикул СТРОКА
    ПОЛЕ БазоваяЦена ЧИСЛО ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ 0
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
КОЛЛЕКЦИЯ Задачи
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Описание СТРОКА
    ПОЛЕ Статус СТРОКА ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ "Новая"
    ПОЛЕ Создано ДАТАВРЕМЯ ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ ТЕКУЩАЯ_ДАТА_ВРЕМЯ
    ПОЛЕ ВыполнитьДо ДАТАВРЕМЯ
    КНОПКА "Записать" ЗАПИСАТЬ
КОНЕЦ
# --- ДОКУМЕНТЫ ---
ДОКУМЕНТ ПоступлениеЗапчастей
    АВТОНУМЕРАЦИЯ "ПЗ-{YYYY}-{0000}" ПОЛЕ Номер
    ПОЛЕ Номер СТРОКА
    ПОЛЕ Дата ДАТАВРЕМЯ ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ ТЕКУЩАЯ_ДАТА_ВРЕМЯ
    ПОЛЕ Организация ВЫБОР Организации ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Склад ВЫБОР Склады ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Поставщик ВЫБОР Контрагенты ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ СуммаДокумента ЧИСЛО
    ТАБЛИЧНАЯЧАСТЬ Запчасти
        КОЛОНКА Номенклатура ВЫБОР Номенклатура
        КОЛОНКА Количество ЧИСЛО
        КОЛОНКА Цена ЧИСЛО
        КОЛОНКА Сумма ЧИСЛО
    КОНЕЦ
    КНОПКА "Записать" ЗАПИСАТЬ
    КНОПКА "Провести и закрыть" ПРОВЕСТИ
    КНОПКА "Отмена" ЗАКРЫТЬ
    ШАБЛОН ШаблонПоступлениеЗапчастей
    ЛОГИКА
        ПРИ СОЗДАНИИ
            ЗАПОЛНИТЬ data.Организация = Константы.ОсновнаяОрганизация
            ЗАПОЛНИТЬ data.Склад = Константы.ОсновнойСклад
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Запчасти.Цена
            ВЫЧИСЛИТЬ Запчасти.Сумма = Запчасти.Цена * Запчасти.Количество
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Запчасти.Количество
            ВЫЧИСЛИТЬ Запчасти.Сумма = Запчасти.Цена * Запчасти.Количество
        КОНЕЦ
        ПРИ СОХРАНЕНИИ
            ВЫЧИСЛИТЬ data.СуммаДокумента = СУММА(data.Запчасти, "Сумма")
        КОНЕЦ
    КОНЕЦ
    ДВИЖЕНИЕ ОстаткиЗапчастей ПРИХОД ПОЛЯ Организация=Организация, Склад=Склад, Номенклатура=Запчасти.Номенклатура, Количество=Запчасти.Количество, Сумма=Запчасти.Сумма
    ДВИЖЕНИЕ Проводки ДЕБЕТ 10 КРЕДИТ 60 ПОЛЯ Сумма=Запчасти.Сумма, СубконтоДт1=Запчасти.Номенклатура, СубконтоКт1=Поставщик
КОНЕЦ
ДОКУМЕНТ СчетНаОплату
    АВТОНУМЕРАЦИЯ "СЧ-{YYYY}-{0000}" ПОЛЕ Номер
    ПОЛЕ Номер СТРОКА
    ВВОД_НА_ОСНОВАНИИ ОплатаОтКлиента
    ПОЛЕ Дата ДАТАВРЕМЯ ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ ТЕКУЩАЯ_ДАТА_ВРЕМЯ
    ПОЛЕ Организация ВЫБОР Организации ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Клиент ВЫБОР Клиенты ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Основание ВЫБОР ЗаказНаряд
    ПОЛЕ ИтогоСумма ЧИСЛО
    ПОЛЕ ИтогоРаботы ЧИСЛО
    ПОЛЕ ИтогоЗапчасти ЧИСЛО
    ТАБЛИЧНАЯЧАСТЬ Работы
        КОЛОНКА Услуга ВЫБОР Номенклатура
        КОЛОНКА НормоЧасы ЧИСЛО
        КОЛОНКА Цена ЧИСЛО
        КОЛОНКА Сумма ЧИСЛО
    КОНЕЦ
    ТАБЛИЧНАЯЧАСТЬ Запчасти
        КОЛОНКА Номенклатура ВЫБОР Номенклатура
        КОЛОНКА Количество ЧИСЛО
        КОЛОНКА Цена ЧИСЛО
        КОЛОНКА Сумма ЧИСЛО
    КОНЕЦ
    КНОПКА "Записать" ЗАПИСАТЬ
    КНОПКА "Провести и закрыть" ПРОВЕСТИ
    КНОПКА "Отмена" ЗАКРЫТЬ
    ШАБЛОН ШаблонСчетНаОплату
    ЛОГИКА
        ПРИ СОЗДАНИИ
            ЗАПОЛНИТЬ data.Организация = Константы.ОсновнаяОрганизация
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Работы.Услуга
            ВЫЧИСЛИТЬ Работы.Цена = Работы.Услуга.БазоваяЦена * (1 - Клиент.СкидкаПроцент / 100)
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Запчасти.Номенклатура
            ВЫЧИСЛИТЬ Запчасти.Цена = Запчасти.Номенклатура.БазоваяЦена * (1 - Клиент.СкидкаПроцент / 100)
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Работы.НормоЧасы
            ВЫЧИСЛИТЬ Работы.Сумма = Работы.Цена * Работы.НормоЧасы
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Работы.Цена
            ВЫЧИСЛИТЬ Работы.Сумма = Работы.Цена * Работы.НормоЧасы
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Запчасти.Количество
            ВЫЧИСЛИТЬ Запчасти.Сумма = Запчасти.Цена * Запчасти.Количество
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Запчасти.Цена
            ВЫЧИСЛИТЬ Запчасти.Сумма = Запчасти.Цена * Запчасти.Количество
        КОНЕЦ
        ПРИ СОХРАНЕНИИ
            ВЫЧИСЛИТЬ data.ИтогоРаботы = СУММА(data.Работы, "Сумма")
            ВЫЧИСЛИТЬ data.ИтогоЗапчасти = СУММА(data.Запчасти, "Сумма")
            ВЫЧИСЛИТЬ data.ИтогоСумма = data.ИтогоРаботы + data.ИтогоЗапчасти
        КОНЕЦ
    КОНЕЦ
КОНЕЦ
ДОКУМЕНТ ЗаказНаряд
    АВТОНУМЕРАЦИЯ "ЗН-{YYYY}-{0000}" ПОЛЕ Номер
    ПОЛЕ Номер СТРОКА
    ВВОД_НА_ОСНОВАНИИ СчетНаОплату, ОплатаОтКлиента
    ПОЛЕ Дата ДАТАВРЕМЯ ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ ТЕКУЩАЯ_ДАТА_ВРЕМЯ
    ПОЛЕ Организация ВЫБОР Организации ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Клиент ВЫБОР Клиенты ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Автомобиль ВЫБОР Автомобили ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Механик ВЫБОР Сотрудники ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Менеджер ВЫБОР Сотрудники
    ПОЛЕ Склад ВЫБОР Склады ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Статус СТРОКА ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ "В работе"
    ПОЛЕ ИтогоСумма ЧИСЛО
    ПОЛЕ ИтогоРаботы ЧИСЛО
    ПОЛЕ ИтогоЗапчасти ЧИСЛО
    ТАБЛИЧНАЯЧАСТЬ Работы
        КОЛОНКА Услуга ВЫБОР Номенклатура
        КОЛОНКА НормоЧасы ЧИСЛО
        КОЛОНКА Цена ЧИСЛО
        КОЛОНКА Сумма ЧИСЛО
    КОНЕЦ
    ТАБЛИЧНАЯЧАСТЬ Запчасти
        КОЛОНКА Номенклатура ВЫБОР Номенклатура
        КОЛОНКА Количество ЧИСЛО
        КОЛОНКА Цена ЧИСЛО
        КОЛОНКА Сумма ЧИСЛО
    КОНЕЦ
    КНОПКА "Записать" ЗАПИСАТЬ
    КНОПКА "Провести и закрыть" ПРОВЕСТИ
    КНОПКА "Отмена" ЗАКРЫТЬ
    ШАБЛОН ШаблонПечатьЗаказНаряда
    ЛОГИКА
        ПРИ СОЗДАНИИ
            ЗАПОЛНИТЬ data.Организация = Константы.ОсновнаяОрганизация
            ЗАПОЛНИТЬ data.Склад = Константы.ОсновнойСклад
            ЗАПОЛНИТЬ data.Менеджер = ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ()
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Работы.Услуга
            ВЫЧИСЛИТЬ Работы.Цена = Работы.Услуга.БазоваяЦена * (1 - Клиент.СкидкаПроцент / 100)
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Запчасти.Номенклатура
            ВЫЧИСЛИТЬ Запчасти.Цена = Запчасти.Номенклатура.БазоваяЦена * (1 - Клиент.СкидкаПроцент / 100)
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Работы.НормоЧасы
            ВЫЧИСЛИТЬ Работы.Сумма = Работы.Цена * Работы.НормоЧасы
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Работы.Цена
            ВЫЧИСЛИТЬ Работы.Сумма = Работы.Цена * Работы.НормоЧасы
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Запчасти.Количество
            ВЫЧИСЛИТЬ Запчасти.Сумма = Запчасти.Цена * Запчасти.Количество
        КОНЕЦ
        ПРИ ИЗМЕНЕНИИ Запчасти.Цена
            ВЫЧИСЛИТЬ Запчасти.Сумма = Запчасти.Цена * Запчасти.Количество
        КОНЕЦ
        ПРИ СОХРАНЕНИИ
            ВЫЧИСЛИТЬ data.ИтогоРаботы = СУММА(data.Работы, "Сумма")
            ВЫЧИСЛИТЬ data.ИтогоЗапчасти = СУММА(data.Запчасти, "Сумма")
            ВЫЧИСЛИТЬ data.ИтогоСумма = data.ИтогоРаботы + data.ИтогоЗапчасти
        КОНЕЦ
    КОНЕЦ
    ДВИЖЕНИЕ ОстаткиЗапчастей РАСХОД ПОЛЯ Организация=Организация, Склад=Склад, Номенклатура=Запчасти.Номенклатура, Количество=Запчасти.Количество, Сумма=Запчасти.Сумма
    ДВИЖЕНИЕ Взаиморасчеты ПРИХОД ПОЛЯ Организация=Организация, Клиент=Клиент, ЗаказНаряд=id, Автомобиль=Автомобиль, Сумма=Запчасти.Сумма
    ДВИЖЕНИЕ Взаиморасчеты ПРИХОД ПОЛЯ Организация=Организация, Клиент=Клиент, ЗаказНаряд=id, Автомобиль=Автомобиль, Сумма=Работы.Сумма
    ДВИЖЕНИЕ ВыработкаМехаников ПРИХОД ПОЛЯ Организация=Организация, Сотрудник=Механик, Услуга=Работы.Услуга, Сумма=Работы.Сумма
    ДВИЖЕНИЕ Проводки ДЕБЕТ 90 КРЕДИТ 10 ПОЛЯ Сумма=Запчасти.Сумма, СубконтоДт1=Представление, СубконтоДт2="Запчасти", СубконтоКт1=Запчасти.Номенклатура
    ДВИЖЕНИЕ Проводки ДЕБЕТ 62 КРЕДИТ 90 ПОЛЯ Сумма=Запчасти.Сумма, СубконтоДт1=Клиент, СубконтоДт2=Представление, СубконтоКт1=Представление, СубконтоКт2="Запчасти"
    ДВИЖЕНИЕ Проводки ДЕБЕТ 62 КРЕДИТ 90 ПОЛЯ Сумма=Работы.Сумма, СубконтоДт1=Клиент, СубконтоДт2=Представление, СубконтоКт1=Представление, СубконтоКт2="Услуги"
    ДВИЖЕНИЕ Проводки ДЕБЕТ 90 КРЕДИТ 70 ПОЛЯ Сумма=ИтогоРаботы, СубконтоДт1=Представление, СубконтоДт2="Услуги", СубконтоКт1=Механик
КОНЕЦ
ДОКУМЕНТ ОплатаОтКлиента
    АВТОНУМЕРАЦИЯ "ПКО-{YYYY}-{0000}" ПОЛЕ Номер
    ПОЛЕ Номер СТРОКА
    ПОЛЕ Дата ДАТАВРЕМЯ ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ ТЕКУЩАЯ_ДАТА_ВРЕМЯ
    ПОЛЕ Организация ВЫБОР Организации ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Клиент ВЫБОР Клиенты ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Сумма ЧИСЛО ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Основание ВЫБОР ЗаказНаряд ОБЯЗАТЕЛЬНОЕ
    КНОПКА "Записать" ЗАПИСАТЬ
    КНОПКА "Провести и закрыть" ПРОВЕСТИ
    КНОПКА "Отмена" ЗАКРЫТЬ
    ЛОГИКА
        ПРИ СОЗДАНИИ
            ЗАПОЛНИТЬ data.Организация = Константы.ОсновнаяОрганизация
        КОНЕЦ
    КОНЕЦ
    ДВИЖЕНИЕ Взаиморасчеты РАСХОД ПОЛЯ Организация=Организация, Клиент=Клиент, ЗаказНаряд=Основание, Автомобиль="", Сумма=Сумма
    ДВИЖЕНИЕ Проводки ДЕБЕТ 50 КРЕДИТ 62 ПОЛЯ Сумма=Сумма, СубконтоКт1=Клиент, СубконтоКт2=Основание.Представление
КОНЕЦ
ДОКУМЕНТ ЕжедневныйОтчет
    АВТОНУМЕРАЦИЯ "ОТЧ-{YYYY}-{0000}" ПОЛЕ Номер
    ПОЛЕ Номер СТРОКА
    ПОЛЕ Дата ДАТАВРЕМЯ ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ ТЕКУЩАЯ_ДАТА_ВРЕМЯ
    ПОЛЕ Описание СТРОКА
    ПОЛЕ ИтогоСумма ЧИСЛО
    ПОЛЕ ИтогоЗадач ЧИСЛО
    КНОПКА "Записать" ЗАПИСАТЬ
    КНОПКА "Отмена" ЗАКРЫТЬ
КОНЕЦ
# --- УЧЕТ (ЖУРНАЛЫ/РЕГИСТРЫ) ---
ЖУРНАЛ ОстаткиЗапчастей
    # ---------------------------------------------------------
    # КОНТРОЛЬ ОТРИЦАТЕЛЬНЫХ ОСТАТКОВ
    # ---------------------------------------------------------
    # Движок автоматически запретит проведение документа (тип РАСХОД),
    # если на складе не хватает нужного количества запчастей.
    КОНТРОЛЬ_ОСТАТКОВ ДА
    ИЗМЕРЕНИЕ Организация ВЫБОР Организации
    ИЗМЕРЕНИЕ Склад ВЫБОР Склады
    ИЗМЕРЕНИЕ Номенклатура ВЫБОР Номенклатура
    ИЗМЕРЕНИЕ Дата ДАТАВРЕМЯ
    ИЗМЕРЕНИЕ Номер СТРОКА
    ИЗМЕРЕНИЕ Документ СТРОКА
    РЕСУРС Количество ЧИСЛО
    РЕСУРС Сумма ЧИСЛО
    КНОПКА "Записать" ЗАПИСАТЬ
    КНОПКА "Отмена" ЗАКРЫТЬ
КОНЕЦ
ЖУРНАЛ Взаиморасчеты
    ИЗМЕРЕНИЕ Организация ВЫБОР Организации
    ИЗМЕРЕНИЕ Клиент ВЫБОР Клиенты
    ИЗМЕРЕНИЕ ЗаказНаряд ВЫБОР ЗаказНаряд
    ИЗМЕРЕНИЕ Автомобиль ВЫБОР Автомобили
    ИЗМЕРЕНИЕ Дата ДАТАВРЕМЯ
    ИЗМЕРЕНИЕ Номер СТРОКА
    ИЗМЕРЕНИЕ Документ СТРОКА
    РЕСУРС Сумма ЧИСЛО
    КНОПКА "Записать" ЗАПИСАТЬ
    КНОПКА "Отмена" ЗАКРЫТЬ
КОНЕЦ
ЖУРНАЛ ВыработкаМехаников
    ИЗМЕРЕНИЕ Организация ВЫБОР Организации
    ИЗМЕРЕНИЕ Сотрудник ВЫБОР Сотрудники
    ИЗМЕРЕНИЕ Услуга ВЫБОР Номенклатура
    ИЗМЕРЕНИЕ Дата ДАТАВРЕМЯ
    ИЗМЕРЕНИЕ Номер СТРОКА
    ИЗМЕРЕНИЕ Документ СТРОКА
    РЕСУРС Сумма ЧИСЛО
    КНОПКА "Записать" ЗАПИСАТЬ
    КНОПКА "Отмена" ЗАКРЫТЬ
КОНЕЦ
# --- БУХГАЛТЕРСКИЙ УЧЕТ ---
ПЛАН_СЧЕТОВ Хозрасчетный
    СЧЕТ 10 "Запчасти и материалы" СУБКОНТО Номенклатура
    СЧЕТ 50 "Касса"
    СЧЕТ 60 "Расчеты с поставщиками"
    СЧЕТ 62 "Расчеты с покупателями" СУБКОНТО Клиенты
    СЧЕТ 70 "Расчеты с персоналом" СУБКОНТО Сотрудники
    СЧЕТ 90 "Продажи и Выручка" СУБКОНТО ЗаказНаряд
КОНЕЦ
ЖУРНАЛ Проводки ПО_ПЛАНУ Хозрасчетный
    ИЗМЕРЕНИЕ Дата ДАТАВРЕМЯ
    ИЗМЕРЕНИЕ Номер СТРОКА
    ИЗМЕРЕНИЕ Документ СТРОКА
    РЕСУРС Сумма
    СУБКОНТО СубконтоДт1
    СУБКОНТО СубконтоКт1
    СУБКОНТО СубконтоДт2
    СУБКОНТО СубконтоКт2
    КНОПКА "Записать (Корректировка)" ЗАПИСАТЬ
    КНОПКА "Отмена" ЗАКРЫТЬ
КОНЕЦ
# --- API ЭНДПОИНТЫ ---
API ИнтеграцияСайт
    API_ЭНДПОИНТ "/api/v1/zayavka"
        МЕТОД POST
        ПАРОЛЬ "secret123"
        ОБЪЕКТ Процедура.СоздатьЗаявкуСайта
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/clients"
        МЕТОД GET
        ОБЪЕКТ Клиенты
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/orders"
        МЕТОД GET
        ОБЪЕКТ ЗаказНаряд
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/reports/stocks"
        МЕТОД GET
        ОБЪЕКТ СкладскиеОстатки
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
КОНЕЦ
# --- СХЕМЫ ДАННЫХ ДЛЯ POST/PUT ТЕСТОВ ---
СХЕМА_ДАННЫХ СхемаКонтрагента
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Телефон СТРОКА
    ПОЛЕ Email СТРОКА
КОНЕЦ
СХЕМА_ДАННЫХ СхемаСклада
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
КОНЕЦ
СХЕМА_ДАННЫХ СхемаНоменклатуры
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ ЭтоГруппа БУЛЕВО
    ПОЛЕ Категория ВЫБОР Номенклатура
    ПОЛЕ Артикул СТРОКА
КОНЕЦ
СХЕМА_ДАННЫХ СхемаЗадачи
    ПОЛЕ Наименование СТРОКА ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Описание СТРОКА
    ПОЛЕ Статус СТРОКА
КОНЕЦ
СХЕМА_ДАННЫХ СхемаПриходТовара
    ПОЛЕ Номер СТРОКА
    ПОЛЕ Организация ВЫБОР Организации ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Склад ВЫБОР Склады ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Поставщик СТРОКА
КОНЕЦ
СХЕМА_ДАННЫХ СхемаПродажа
    ПОЛЕ Номер СТРОКА
    ПОЛЕ Организация ВЫБОР Организации ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Клиент ВЫБОР Клиенты ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Склад ВЫБОР Склады ОБЯЗАТЕЛЬНОЕ
КОНЕЦ
СХЕМА_ДАННЫХ СхемаСписание
    ПОЛЕ Номер СТРОКА
    ПОЛЕ Организация ВЫБОР Организации ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Клиент ВЫБОР Клиенты ОБЯЗАТЕЛЬНОЕ
    ПОЛЕ Сумма ЧИСЛО ОБЯЗАТЕЛЬНОЕ
КОНЕЦ
# --- API ЭНДПОИНТЫ ДЛЯ ТЕСТИРОВАНИЯ (CRUD) ---
API ТестированиеPHP
    API_ЭНДПОИНТ "/api/v1/kontragenty"
        МЕТОД GET
        ОБЪЕКТ Клиенты
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/kontragenty"
        МЕТОД POST
        ОБЪЕКТ Клиенты
        ПАРОЛЬ "secret123"
        СХЕМА СхемаКонтрагента
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/sklady"
        МЕТОД GET
        ОБЪЕКТ Склады
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/sklady"
        МЕТОД POST
        ОБЪЕКТ Склады
        ПАРОЛЬ "secret123"
        СХЕМА СхемаСклада
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/nomenklatura"
        МЕТОД GET
        ОБЪЕКТ Номенклатура
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/nomenklatura"
        МЕТОД POST
        ОБЪЕКТ Номенклатура
        ПАРОЛЬ "secret123"
        СХЕМА СхемаНоменклатуры
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/zadachi"
        МЕТОД GET
        ОБЪЕКТ Задачи
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/zadachi"
        МЕТОД POST
        ОБЪЕКТ Задачи
        ПАРОЛЬ "secret123"
        СХЕМА СхемаЗадачи
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/prihodtovara"
        МЕТОД GET
        ОБЪЕКТ ПоступлениеЗапчастей
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/prihodtovara"
        МЕТОД POST
        ОБЪЕКТ ПоступлениеЗапчастей
        ПАРОЛЬ "secret123"
        СХЕМА СхемаПриходТовара
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/prodazha"
        МЕТОД GET
        ОБЪЕКТ ЗаказНаряд
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/prodazha"
        МЕТОД POST
        ОБЪЕКТ ЗаказНаряд
        ПАРОЛЬ "secret123"
        СХЕМА СхемаПродажа
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/spisanie"
        МЕТОД GET
        ОБЪЕКТ ОплатаОтКлиента
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/spisanie"
        МЕТОД POST
        ОБЪЕКТ ОплатаОтКлиента
        ПАРОЛЬ "secret123"
        СХЕМА СхемаСписание
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/ostatki"
        МЕТОД GET
        ОБЪЕКТ ОстаткиЗапчастей
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/provodki"
        МЕТОД GET
        ОБЪЕКТ Проводки
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/planschetov"
        МЕТОД GET
        ОБЪЕКТ Хозрасчетный
        ПАРОЛЬ "secret123"
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/procedury/eksportdannyh"
        МЕТОД POST
        ОБЪЕКТ Процедура.ЭкспортДанных
        ПАРОЛЬ "secret123"
        ВЫЗВАТЬ Процедура.ЭкспортДанных
    КОНЕЦ_ЭНДПОИНТА
    API_ЭНДПОИНТ "/api/v1/procedury/proveritochered"
        МЕТОД POST
        ОБЪЕКТ Процедура.ПроверитьОчередь
        ПАРОЛЬ "secret123"
        ВЫЗВАТЬ Процедура.ПроверитьОчередь
    КОНЕЦ_ЭНДПОИНТА
КОНЕЦ
# --- СИСТЕМНЫЕ ПРОЦЕДУРЫ ---
ПРОЦЕДУРА СоздатьЗаявкуСайта
    ВЫВЕСТИ "API: Обработка заявки с сайта"
    ВЫЧИСЛИТЬ Данные = ПОЛУЧИТЬ(args, 0)
    ВЫЧИСЛИТЬ Клиент = НАЙТИ("Клиенты", "Телефон = '" + Данные.phone + "'")
    ЕСЛИ ПУСТО(Клиент) ТО
        ВЫЧИСЛИТЬ Клиент = СОЗДАТЬ("Клиенты")
        ПРИСВОИТЬ Клиент.Наименование = Данные.client_name
        ПРИСВОИТЬ Клиент.Телефон = Данные.phone
        ЗАПИСАТЬ(Клиент)
    КОНЕЦ
    ВЫЧИСЛИТЬ ЗН = СОЗДАТЬ("ЗаказНаряд")
    ПРИСВОИТЬ ЗН.Клиент = Клиент.id
    ПРИСВОИТЬ ЗН.Статус = "Новая заявка (Сайт)"
    ЗАПИСАТЬ(ЗН)
    ВОЗВРАТ {"status": "success", "order_id": ЗН.id, "client_id": Клиент.id}
КОНЕЦ
ПРОЦЕДУРА ЭкспортДанных
    ВЫВЕСТИ "API: Запущен экспорт данных"
    ВОЗВРАТ {"status": "success", "message": "Экспорт успешно запущен"}
КОНЕЦ
# --- ПРИМЕР 1: Создание объекта в фоне и HTTP POST-запрос ---
ПРОЦЕДУРА СоздатьАвтоматическуюЗадачу
    ВЫВЕСТИ "Планировщик: Создание новой задачи и отправка..."
    ВЫЧИСЛИТЬ НоваяЗадача = СОЗДАТЬ("Задачи")
    ВЫЧИСЛИТЬ НоваяЗадача.Наименование = "Автоматическая задача от КРОНа"
    ВЫЧИСЛИТЬ НоваяЗадача.Описание = "Сгенерировано в фоновом режиме"
    ВЫЧИСЛИТЬ НоваяЗадача.Статус = "Новая"
    ВЫЧИСЛИТЬ Успех = ЗАПИСАТЬ(НоваяЗадача)
    # [ОТЛАДКА] Проверяем, что задача успешно создалась
    ВЫВЕСТИ "[ОТЛАДКА] Сохраненная новая задача:"
    ОТЛАДКА НоваяЗадача
    ПОПЫТКА
        ВЫЧИСЛИТЬ Ответ = HTTP_ЗАПРОС("POST", "http://localhost:8086/", НоваяЗадача)
        ВЫВЕСТИ "Задача " + НоваяЗадача.id + " успешно отправлена на вебхук!"
    ИСКЛЮЧЕНИЕ Ош
        ВЫВЕСТИ "Ошибка отправки на вебхук: " + Ош
    КОНЕЦ_ПОПЫТКИ
    ВОЗВРАТ ИСТИНА
КОНЕЦ
# --- ПРИМЕР 2: Массовый поиск и обработка базы через ЦИКЛ ---
ПРОЦЕДУРА ПроверитьОчередь
    ВЫВЕСТИ "Планировщик: Массовая очистка задач..."
    # Получаем все задачи, которые еще не обработаны
    ВЫЧИСЛИТЬ СписокЗадач = НАЙТИ_ВСЕ("Задачи", "Статус='Новая'")
    # [ОТЛАДКА] Смотрим, сколько и какие задачи попали в очередь
    ВЫВЕСТИ "[ОТЛАДКА] Массив найденных новых задач:"
    ОТЛАДКА СписокЗадач
    ЕСЛИ ПУСТО(СписокЗадач) ТО
        ВЫВЕСТИ "Очередь пуста, отдыхаем."
        ВОЗВРАТ ИСТИНА
    КОНЕЦ
    ВЫВЕСТИ "Найдено новых задач: " + КОЛИЧЕСТВО(СписокЗадач)
    # Перебираем массив и меняем статусы
    ЦИКЛ ПО СписокЗадач КАК Задача
        ВЫВЕСТИ "Закрываем задачу ID: " + Задача.id
        ВЫЧИСЛИТЬ Задача.Статус = "Отменена (Закрыто КРОНом)"
        ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Задача)
    КОНЕЦ
    ВЫВЕСТИ "Все задачи успешно обработаны!"
КОНЕЦ
# --- ПРИМЕР 3: Выполнение прямого SQL-запроса ---
ПРОЦЕДУРА ТестSQLЗапроса
    ВЫВЕСТИ "Планировщик: Выполнение аналитического SQL-запроса..."
    # Получаем статистику задач по статусам
    # ПРИМЕНЯЕМ ЭТАЛОН ПРИМЕРА 10: Формируем запросы заранее
    ВЫЧИСЛИТЬ ЗапросСтатистики = "SELECT Статус, COUNT(id) as Количество FROM Задачи GROUP BY Статус"
    ВЫЧИСЛИТЬ ЗапросЭксплейн = "EXPLAIN QUERY PLAN SELECT Статус, COUNT(id) as Количество FROM Задачи GROUP BY Статус"
    ВЫЧИСЛИТЬ План = ЗАПРОС(ЗапросЭксплейн)
    ВЫВЕСТИ "[ОТЛАДКА] План SQL-запроса статистики:"
    ОТЛАДКА План
    ВЫЧИСЛИТЬ Статистика = ЗАПРОС(ЗапросСтатистики)
    ВЫВЕСТИ "Статистика задач в базе:"
    ОТЛАДКА Статистика
    ВОЗВРАТ ИСТИНА
КОНЕЦ
# --- ПРИМЕР 4: Фоновое создание бухгалтерских проводок ---
ПРОЦЕДУРА ФоновоеНачисление
    ВЫВЕСТИ "Планировщик: Регламентная операция (начисление)..."
    # Вычисляем случайную сумму и текст описания
    ВЫЧИСЛИТЬ СуммаОперации = СЛУЧАЙНОЕ(1000, 5000)
    ВЫЧИСЛИТЬ Описание = "Регламентное начисление из КРОНа"
    # Делаем проводку. Движок сам возьмет локальные переменные СуммаОперации и Описание
    # и запишет их в регистр под системным документом "ФоноваяОперация"
    ДВИЖЕНИЕ Проводки ДЕБЕТ 90 КРЕДИТ 70 ПОЛЯ Сумма = СуммаОперации, СубконтоДт1 = Описание
    ВЫВЕСТИ "Создана проводка на сумму: " + СуммаОперации + " руб."
КОНЕЦ
# --- ПРИМЕР 5: Комплексная логика (Виртуальный аналитик) ---
ПРОЦЕДУРА НочнойАналитик
    ВЫВЕСТИ "Планировщик: Запуск виртуального аналитика..."
    # 1. Делаем ЗАПРОС в базу (считаем новые задачи)
    ВЫЧИСЛИТЬ ЗапросПодсчета = "SELECT COUNT(id) as Всего FROM Задачи WHERE Статус = 'Новая'"
    ВЫЧИСЛИТЬ ЭксплейнПодсчета = "EXPLAIN QUERY PLAN SELECT COUNT(id) as Всего FROM Задачи WHERE Статус = 'Новая'"
    ВЫЧИСЛИТЬ ПланПодсчета = ЗАПРОС(ЭксплейнПодсчета)
    ВЫВЕСТИ "[ОТЛАДКА] План подсчета задач:"
    ОТЛАДКА ПланПодсчета
    ВЫЧИСЛИТЬ Статистика = ЗАПРОС(ЗапросПодсчета)
    ВЫВЕСТИ "[ОТЛАДКА] Результат подсчета задач:"
    ОТЛАДКА Статистика
    ВЫЧИСЛИТЬ ПерваяСтрока = ПОЛУЧИТЬ(Статистика, 0)
    # 2. ЗАЩИТА ОТ ДУБЛЕЙ (UPSERT): Ищем, создавали ли мы уже отчет за сегодня
    ВЫЧИСЛИТЬ ЗапросОтчета = "SELECT id FROM ЕжедневныйОтчет WHERE Описание = 'Автоматический сводный отчет от КРОНа' AND date(Дата) = date('now', 'localtime') LIMIT 1"
    ВЫЧИСЛИТЬ ЭксплейнОтчета = "EXPLAIN QUERY PLAN SELECT id FROM ЕжедневныйОтчет WHERE Описание = 'Автоматический сводный отчет от КРОНа' AND date(Дата) = date('now', 'localtime') LIMIT 1"
    ВЫЧИСЛИТЬ ПланОтчета = ЗАПРОС(ЭксплейнОтчета)
    ВЫВЕСТИ "[ОТЛАДКА] План поиска отчета:"
    ОТЛАДКА ПланОтчета
    ВЫЧИСЛИТЬ СуществующийОтчет = ЗАПРОС(ЗапросОтчета)
    ВЫВЕСТИ "[ОТЛАДКА] Найденный отчет (если есть):"
    ОТЛАДКА СуществующийОтчет
    ВЫЧИСЛИТЬ Отчет = ""
    ЕСЛИ ПУСТО(СуществующийОтчет) ТО
        # Отчета нет — создаем новый
        ВЫЧИСЛИТЬ Отчет = СОЗДАТЬ("ЕжедневныйОтчет")
        ВЫЧИСЛИТЬ Отчет.Описание = "Автоматический сводный отчет от КРОНа"
    ИНАЧЕ
        # Отчет уже есть — прочитаем его из базы, чтобы просто обновить цифры!
        ВЫЧИСЛИТЬ IDОтчета = ПОЛУЧИТЬ(СуществующийОтчет, 0).id
        ВЫЧИСЛИТЬ Отчет = ПРОЧИТАТЬ("ЕжедневныйОтчет", IDОтчета)
    КОНЕЦ
    # 3. Обновляем поля актуальными цифрами
    ВЫЧИСЛИТЬ Отчет.ИтогоЗадач = ПерваяСтрока.Всего
    ВЫЧИСЛИТЬ Отчет.ИтогоСумма = СЛУЧАЙНОЕ(10000, 50000)
    # 4. Вызывает ЗАПИСАТЬ (сохраняя этот документ в базу)
    ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Отчет)
    ВЫВЕСТИ "Сохранен ЕжедневныйОтчет с ID: " + Отчет.id
    # 5. Делает HTTP_ЗАПРОС и отправляет этот отчет директору в Telegram (заглушка)
    ПОПЫТКА
        ВЫЧИСЛИТЬ ТГ_Ответ = HTTP_ЗАПРОС("POST", "https://api.telegram.org/bot<TOKEN>/sendMessage", {"chat_id": "12345678", "text": "Сформирован отчет № " + Отчет.id + ". Новых задач: " + ПерваяСтрока.Всего})
        ВЫВЕСТИ "Отчет отправлен в Telegram!"
    ИСКЛЮЧЕНИЕ Ош
        ВЫВЕСТИ "Не удалось отправить в Telegram (ожидаемо, нет токена): " + Ош
    КОНЕЦ_ПОПЫТКИ
    ВОЗВРАТ ИСТИНА
КОНЕЦ
# --- ПРИМЕР 6: Продвинутая аналитика (JOIN таблиц, вычисления и запись) ---
ПРОЦЕДУРА СложныйОтчетСJoin
    ВЫВЕСТИ "Планировщик: Сбор сложной сводки по заказам (JOIN)..."
    # 1. SQL-запрос с объединением (JOIN) таблиц ЗаказНаряд (ЗН) и Клиенты (К)
    # Мы хотим узнать, на какую сумму у каждого клиента сейчас открыты заказы
    ВЫЧИСЛИТЬ ЗапросСводки = "SELECT К.Наименование as КлиентИмя, COUNT(ЗН.id) as КолВоЗаказов, SUM(ЗН.ИтогоСумма) as ОбщаяСумма FROM ЗаказНаряд ЗН JOIN Клиенты К ON ЗН.Клиент = К.id WHERE ЗН.Статус = 'В работе' GROUP BY К.id"
    ВЫЧИСЛИТЬ ЭксплейнСводки = "EXPLAIN QUERY PLAN SELECT К.Наименование as КлиентИмя, COUNT(ЗН.id) as КолВоЗаказов, SUM(ЗН.ИтогоСумма) as ОбщаяСумма FROM ЗаказНаряд ЗН JOIN Клиенты К ON ЗН.Клиент = К.id WHERE ЗН.Статус = 'В работе' GROUP BY К.id"
    ВЫЧИСЛИТЬ ПланСводки = ЗАПРОС(ЭксплейнСводки)
    ВЫВЕСТИ "[ОТЛАДКА] План запроса JOIN (Сводка):"
    ОТЛАДКА ПланСводки
    ВЫЧИСЛИТЬ Сводка = ЗАПРОС(ЗапросСводки)
    ВЫВЕСТИ "[ОТЛАДКА] Результат сводки:"
    ОТЛАДКА Сводка
    ЕСЛИ ПУСТО(Сводка) ТО
        ВЫВЕСТИ "Открытых заказов для сложного отчета пока нет."
        ВОЗВРАТ ИСТИНА
    КОНЕЦ
    # 2. Перебираем результаты выборки
    ЦИКЛ ПО Сводка КАК Запись
        # 3. Делаем дополнительные расчеты прямо в памяти процедуры
        ВЫЧИСЛИТЬ СреднийЧек = Запись.ОбщаяСумма / Запись.КолВоЗаказов
        # 3.1. ЗАЩИТА ОТ ДУБЛЕЙ (SKIP): Проверяем, есть ли уже за сегодня отчет по ЭТОМУ клиенту
        ВЫЧИСЛИТЬ ИмяКлиента = Запись.КлиентИмя
        ВЫЧИСЛИТЬ ЗапросПоискаДубля = "SELECT id FROM ЕжедневныйОтчет WHERE Описание LIKE 'Сводка по клиенту: " + ИмяКлиента + "%' AND date(Дата) = date('now', 'localtime') LIMIT 1"
        ВЫЧИСЛИТЬ ЭксплейнДубля = "EXPLAIN QUERY PLAN SELECT id FROM ЕжедневныйОтчет WHERE Описание LIKE 'Сводка по клиенту: " + ИмяКлиента + "%' AND date(Дата) = date('now', 'localtime') LIMIT 1"
        ВЫЧИСЛИТЬ ПланДубля = ЗАПРОС(ЭксплейнДубля)
        ВЫВЕСТИ "[ОТЛАДКА] План поиска дубля отчета по клиенту:"
        ОТЛАДКА ПланДубля
        ВЫЧИСЛИТЬ ПоискОтчета = ЗАПРОС(ЗапросПоискаДубля)
        ВЫВЕСТИ "[ОТЛАДКА] Результат поиска дубля:"
        ОТЛАДКА ПоискОтчета
        ЕСЛИ НЕ ПУСТО(ПоискОтчета) ТО
            ВЫВЕСТИ "Отчет для клиента '" + ИмяКлиента + "' уже сформирован. Пропускаем."
            ПРОДОЛЖИТЬ
        КОНЕЦ
        # 4. Создаем документ для фиксации результатов
        ВЫЧИСЛИТЬ Отчет = СОЗДАТЬ("ЕжедневныйОтчет")
        ВЫЧИСЛИТЬ Отчет.Описание = "Сводка по клиенту: " + Запись.КлиентИмя + " (Средний чек: " + СреднийЧек + ")"
        ВЫЧИСЛИТЬ Отчет.ИтогоЗадач = Запись.КолВоЗаказов
        ВЫЧИСЛИТЬ Отчет.ИтогоСумма = Запись.ОбщаяСумма
        # 5. Сохраняем в базу данных
        ВЫЧИСЛИТЬ _ = ЗАПИСАТЬ(Отчет)
        ВЫВЕСТИ "Сформирован отчет (JOIN) ID " + Отчет.id + " для клиента: " + Запись.КлиентИмя
    КОНЕЦ
КОНЕЦ
# --- ПРИМЕР 7: Автоматическая очистка БД (Удаление старых записей) ---
ПРОЦЕДУРА НочнаяОчисткаМусора
    ВЫВЕСТИ "Планировщик: Запуск регламентной очистки базы данных..."
    # Ищем все задачи, которые были отменены (например, КРОНом из Примера 2)
    ВЫЧИСЛИТЬ Мусор = НАЙТИ_ВСЕ("Задачи", "Статус LIKE '%Отменена%'")
    # [ОТЛАДКА] Проверка мусора
    ВЫВЕСТИ "[ОТЛАДКА] Массив найденного мусора:"
    ОТЛАДКА Мусор
    ЕСЛИ ПУСТО(Мусор) ТО
        ВЫВЕСТИ "Мусора для очистки нет."
        ВОЗВРАТ ИСТИНА
    КОНЕЦ
    # Удаляем каждую найденную карточку из базы (включая связанные ТЧ)
    ЦИКЛ ПО Мусор КАК СтараяЗадача
        ВЫЧИСЛИТЬ _ = УДАЛИТЬ_ОБЪЕКТ(СтараяЗадача)
        ВЫВЕСТИ "Удалена старая задача ID: " + СтараяЗадача.id
    КОНЕЦ
    ВОЗВРАТ ИСТИНА
КОНЕЦ
# --- ПРИМЕР 10: Интеграция (Отправка закрытого заказа на вебхук) ---
ПРОЦЕДУРА ОтправитьЗакрытыйЗаказ
    ВЫВЕСТИ "=== СТАРТ: ПРИМЕР 10 (ФИНАЛ: Отправка по API) ==="
    ВЫВЕСТИ "[ОТЛАДКА] План запроса (EXPLAIN):"
    ВЫЧИСЛИТЬ План = ЗАПРОС("EXPLAIN QUERY PLAN SELECT id, Номер, Статус, _posted FROM ЗаказНаряд ORDER BY id DESC")
    ОТЛАДКА План
    ВЫЧИСЛИТЬ ВсеЗаказы = ЗАПРОС("SELECT id, Номер, Статус, _posted FROM ЗаказНаряд ORDER BY id DESC")
    ВЫВЕСТИ "[ОТЛАДКА] Полный дамп массива ВсеЗаказы:"
    ОТЛАДКА ВсеЗаказы
    ЦИКЛ ПО ВсеЗаказы КАК Запись
        ВЫВЕСТИ "----------------------------------------"
        ВЫВЕСТИ "Проверка заказа ID: " + Запись.id + " | Статус: [" + Запись.Статус + "]"
        # Используем строгое двойное равно (==) для логики,
        # чтобы ядро больше никогда не ломало наши SQL-запросы!
        ЕСЛИ Запись.Статус == "Завершен" ТО
            ЕСЛИ Запись._posted == 1 ТО
                ВЫВЕСТИ ">>> БИНГО! Найден целевой заказ: " + Запись.Номер + " (ID: " + Запись.id + ")"
                ВЫЧИСЛИТЬ ПолныйЗаказ = ПРОЧИТАТЬ("ЗаказНаряд", Запись.id)
                ОТЛАДКА ПолныйЗаказ
                ПОПЫТКА
                    ВЫВЕСТИ "--> Отправка POST запроса на http://localhost:8086/ ..."
                    ВЫЧИСЛИТЬ Ответ = HTTP_ЗАПРОС("POST", "http://localhost:8086/", ПолныйЗаказ)
                    ВЫВЕСТИ "[УСПЕХ] Ответ сервера: " + Ответ
                    # 1. Собираем строку SQL-запроса ВНЕ функции ЗАПРОС, чтобы ядро подставило ID
                    ВЫЧИСЛИТЬ ЗапросОбновления = "UPDATE ЗаказНаряд SET Статус = 'Закрыт' WHERE id = " + Запись.id
                    ВЫВЕСТИ "[ОТЛАДКА] Сгенерированный SQL: " + ЗапросОбновления
                    # 2. Смотрим EXPLAIN для нашего UPDATE
                    # Формируем строку целиком, чтобы избежать потери пробелов при склейке (PLANUPDATE)
                    ВЫЧИСЛИТЬ ЗапросЭксплейн = "EXPLAIN QUERY PLAN UPDATE ЗаказНаряд SET Статус = 'Закрыт' WHERE id = " + Запись.id
                    ВЫЧИСЛИТЬ ПланАпдейта = ЗАПРОС(ЗапросЭксплейн)
                    ВЫВЕСТИ "[ОТЛАДКА] План выполнения UPDATE:"
                    ОТЛАДКА ПланАпдейта
                    # 3. Выполняем точечный UPDATE в базе
                    ВЫЧИСЛИТЬ _ = ЗАПРОС(ЗапросОбновления)
                    ВЫВЕСТИ "[+] Статус заказа в БД успешно изменен на 'Закрыт'!"
                    # 4. Читаем из базы эту же запись, чтобы УБЕДИТЬСЯ, что статус сменился!
                    ВЫЧИСЛИТЬ ЗапросПроверки = "SELECT id, Номер, Статус FROM ЗаказНаряд WHERE id = " + Запись.id
                    ВЫЧИСЛИТЬ ПроверкаБД = ЗАПРОС(ЗапросПроверки)
                    ВЫВЕСТИ "[ОТЛАДКА] Дамп записи прямо из БД ПОСЛЕ апдейта:"
                    ОТЛАДКА ПроверкаБД
                ИСКЛЮЧЕНИЕ Ош
                    ВЫВЕСТИ "[ОШИБКА] Сбой отправки: " + Ош
                КОНЕЦ_ПОПЫТКИ
                ПРЕРВАТЬ
            КОНЕЦ
        КОНЕЦ
    КОНЕЦ
    ВЫВЕСТИ "=== ФИНИШ: ПРИМЕР 10 ==="
    ВОЗВРАТ ИСТИНА
КОНЕЦ
# --- ФОНОВЫЕ ЗАДАЧИ (ПЛАНИРОВЩИК) ---
РАСПИСАНИЕ ГенераторЗадач
    КРОН "*/6 * * * * *" # Каждые 10 секунд
    ВЫЗВАТЬ Процедура.СоздатьАвтоматическуюЗадачу
КОНЕЦ_РАСПИСАНИЯ
РАСПИСАНИЕ ФоноваяПроверкаОчереди
    КРОН "*/7 * * * * *" # Каждые 11 секунд
    ВЫЗВАТЬ Процедура.ПроверитьОчередь
КОНЕЦ_РАСПИСАНИЯ
РАСПИСАНИЕ АналитикаSQL
    КРОН "*/8 * * * * *" # Каждые 12 секунд
    ВЫЗВАТЬ Процедура.ТестSQLЗапроса
КОНЕЦ_РАСПИСАНИЯ
РАСПИСАНИЕ ФоновыеПроводки
    КРОН "*/9 * * * * *" # Каждые 13 секунд
    ВЫЗВАТЬ Процедура.ФоновоеНачисление
КОНЕЦ_РАСПИСАНИЯ
РАСПИСАНИЕ АналитикОтчетов
    КРОН "*/10 * * * * *" # Каждые 14 секунд
    ВЫЗВАТЬ Процедура.НочнойАналитик
КОНЕЦ_РАСПИСАНИЯ
РАСПИСАНИЕ ПродвинутаяАналитика
    КРОН "*/11 * * * * *" # Каждые 15 секунд
    ВЫЗВАТЬ Процедура.СложныйОтчетСJoin
КОНЕЦ_РАСПИСАНИЯ
РАСПИСАНИЕ ОчисткаМусора
    КРОН "*/12 * * * * *" # Каждые 16 секунд
    ВЫЗВАТЬ Процедура.НочнаяОчисткаМусора
КОНЕЦ_РАСПИСАНИЯ
РАСПИСАНИЕ ИнтеграцияЗаказов
    КРОН "*/5 * * * * *" # Каждые 17 секунд
    ВЫЗВАТЬ Процедура.ОтправитьЗакрытыйЗаказ
КОНЕЦ_РАСПИСАНИЯ
# --- ОТЧЁТЫ (АНАЛИТИКА СТО) ---
ОТЧЁТ СкладскиеОстатки
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР Организация ВЫБОР Организации
    ПАРАМЕТР Склад ВЫБОР Склады
    ПАРАМЕТР Номенклатура ВЫБОР Номенклатура
    ЗАПРОС "SELECT Организация, Номенклатура, SUM(_type * Количество) as ОстатокШт, SUM(_type * Сумма) as СуммаНаСкладе FROM Журнал_ОстаткиЗапчастей WHERE ('{{Организация}}' = '' OR Организация = '{{Организация}}') AND ('{{Склад}}' = '' OR Склад = '{{Склад}}') AND ('{{Номенклатура}}' = '' OR Номенклатура = '{{Номенклатура}}') GROUP BY Организация, Номенклатура HAVING ОстатокШт <> 0"
    КОЛОНКА Организация ВЫБОР Организации
    КОЛОНКА Номенклатура ВЫБОР Номенклатура
    КОЛОНКА ОстатокШт ЧИСЛО
    КОЛОНКА СуммаНаСкладе ЧИСЛО
    ВЫВОД_ДИАГРАММА СТОЛБИКОВАЯ
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ Номенклатура
    РЕСУРС ОстатокШт
КОНЕЦ
ОТЧЁТ ВзаиморасчетыСКлиентами
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР Организация ВЫБОР Организации
    ПАРАМЕТР Клиент ВЫБОР Клиенты
    ЗАПРОС "SELECT Организация, Клиент, SUM(_type * Сумма) as ДолгКлиента FROM Журнал_Взаиморасчеты WHERE ('{{Организация}}' = '' OR Организация = '{{Организация}}') AND ('{{Клиент}}' = '' OR Клиент = '{{Клиент}}') GROUP BY Организация, Клиент HAVING ДолгКлиента <> 0"
    КОЛОНКА Организация ВЫБОР Организации
    КОЛОНКА Клиент ВЫБОР Клиенты
    КОЛОНКА ДолгКлиента ЧИСЛО
    ВЫВОД_ДИАГРАММА БУБЛИК
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ Клиент
    РЕСУРС ДолгКлиента
КОНЕЦ
ОТЧЁТ ИсторияОбслуживанияАвто
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР ДатаС ДАТАВРЕМЯ
    ПАРАМЕТР ДатаПо ДАТАВРЕМЯ
    ПАРАМЕТР Автомобиль ВЫБОР Автомобили
    ПАРАМЕТР Клиент ВЫБОР Клиенты
    ЗАПРОС "SELECT Дата, Организация, Автомобиль, Клиент, Документ, Сумма FROM Журнал_Взаиморасчеты WHERE _type = 1 AND ('{{ДатаС}}' = '' OR Дата >= '{{ДатаС}}') AND ('{{ДатаПо}}' = '' OR Дата <= '{{ДатаПо}}') AND ('{{Автомобиль}}' = '' OR Автомобиль = '{{Автомобиль}}') AND ('{{Клиент}}' = '' OR Клиент = '{{Клиент}}') ORDER BY Дата DESC"
    КОЛОНКА Дата ДАТАВРЕМЯ
    КОЛОНКА Организация ВЫБОР Организации
    КОЛОНКА Автомобиль ВЫБОР Автомобили
    КОЛОНКА Клиент ВЫБОР Клиенты
    КОЛОНКА Документ СТРОКА
    КОЛОНКА Сумма ЧИСЛО
    ВЫВОД_ДИАГРАММА ЛИНЕЙНАЯ
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ Дата
    РЕСУРС Сумма
КОНЕЦ
ОТЧЁТ ВыработкаСотрудников
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР ДатаС ДАТАВРЕМЯ
    ПАРАМЕТР ДатаПо ДАТАВРЕМЯ
    ПАРАМЕТР Сотрудник ВЫБОР Сотрудники
    ЗАПРОС "SELECT Организация, Сотрудник, SUM(_type * Сумма) as ВыполненоРаботНаСумму FROM Журнал_ВыработкаМехаников WHERE ('{{ДатаС}}' = '' OR Дата >= '{{ДатаС}}') AND ('{{ДатаПо}}' = '' OR Дата <= '{{ДатаПо}}') AND ('{{Сотрудник}}' = '' OR Сотрудник = '{{Сотрудник}}') GROUP BY Организация, Сотрудник"
    КОЛОНКА Организация ВЫБОР Организации
    КОЛОНКА Сотрудник ВЫБОР Сотрудники
    КОЛОНКА ВыполненоРаботНаСумму ЧИСЛО
    ВЫВОД_ДИАГРАММА РАДАР
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ Сотрудник
    РЕСУРС ВыполненоРаботНаСумму
КОНЕЦ
ОТЧЁТ ЖурналПроводок
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР ДатаС ДАТАВРЕМЯ
    ПАРАМЕТР ДатаПо ДАТАВРЕМЯ
    ПАРАМЕТР ФильтрСчет СТРОКА
    ПАРАМЕТР Субконто СТРОКА
    ПАРАМЕТР Документ СТРОКА
    ЗАПРОС "SELECT Дата, Документ, debit_acc AS СчетДт, credit_acc AS СчетКт, СубконтоДт1 AS СубконтоДт, СубконтоДт2 AS СубконтоДтДоп, СубконтоКт1 AS СубконтоКт, СубконтоКт2 AS СубконтоКтДоп, Сумма FROM [Журнал_Проводки] WHERE ('{{ДатаС}}' = '' OR Дата >= '{{ДатаС}}') AND ('{{ДатаПо}}' = '' OR Дата <= '{{ДатаПо}}') AND ('{{ФильтрСчет}}' = '' OR debit_acc = '{{ФильтрСчет}}' OR credit_acc = '{{ФильтрСчет}}') AND ('{{Субконто}}' = '' OR СубконтоДт1 LIKE '%{{Субконто}}%' OR СубконтоДт2 LIKE '%{{Субконто}}%' OR СубконтоКт1 LIKE '%{{Субконто}}%' OR СубконтоКт2 LIKE '%{{Субконто}}%') AND ('{{Документ}}' = '' OR Документ LIKE '%{{Документ}}%') ORDER BY Дата DESC"
    КОЛОНКА Дата ДАТАВРЕМЯ
    КОЛОНКА Документ СТРОКА
    КОЛОНКА СчетДт СТРОКА
    КОЛОНКА СчетКт СТРОКА
    КОЛОНКА СубконтоДт СТРОКА
    КОЛОНКА СубконтоДтДоп СТРОКА
    КОЛОНКА СубконтоКт СТРОКА
    КОЛОНКА СубконтоКтДоп СТРОКА
    КОЛОНКА Сумма ЧИСЛО
    ВЫВОД_ДИАГРАММА ТЕПЛОВАЯ
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ СчетДт
    РЕСУРС Сумма
КОНЕЦ
ОТЧЁТ ФинансовыйРезультатПоЗаказам
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР Заказ ВЫБОР ЗаказНаряд
    ЗАПРОС "SELECT CASE WHEN credit_acc='90' THEN СубконтоКт1 ELSE СубконтоДт1 END AS Заказ, SUM(CASE WHEN credit_acc='90' THEN Сумма ELSE 0 END) as Выручка, SUM(CASE WHEN debit_acc='90' THEN Сумма ELSE 0 END) as Себестоимость, SUM(CASE WHEN credit_acc='90' THEN Сумма ELSE 0 END) - SUM(CASE WHEN debit_acc='90' THEN Сумма ELSE 0 END) as Прибыль FROM Журнал_Проводки WHERE (credit_acc='90' OR debit_acc='90') AND ('{{Заказ}}' = '' OR СубконтоКт1 = '{{Заказ}}' OR СубконтоДт1 = '{{Заказ}}') GROUP BY CASE WHEN credit_acc='90' THEN СубконтоКт1 ELSE СубконтоДт1 END"
    КОЛОНКА Заказ ВЫБОР ЗаказНаряд
    КОЛОНКА Выручка ЧИСЛО
    КОЛОНКА Себестоимость ЧИСЛО
    КОЛОНКА Прибыль ЧИСЛО
    ВЫВОД_ДИАГРАММА СТОЛБИКОВАЯ
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ Заказ
    РЕСУРС Прибыль
КОНЕЦ
ОТЧЁТ ДолгиПоЗаказам
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР Клиент ВЫБОР Клиенты
    ПАРАМЕТР ЗаказНаряд ВЫБОР ЗаказНаряд
    ЗАПРОС "SELECT Организация, Клиент, ЗаказНаряд, SUM(CASE WHEN _type=1 THEN Сумма ELSE 0 END) as СуммаЗаказа, SUM(CASE WHEN _type=-1 THEN Сумма ELSE 0 END) as Оплачено, SUM(_type * Сумма) as Долг FROM Журнал_Взаиморасчеты WHERE ('{{Клиент}}' = '' OR Клиент = '{{Клиент}}') AND ('{{ЗаказНаряд}}' = '' OR ЗаказНаряд = '{{ЗаказНаряд}}') GROUP BY Организация, Клиент, ЗаказНаряд HAVING Долг <> 0"
    КОЛОНКА Организация ВЫБОР Организации
    КОЛОНКА Клиент ВЫБОР Клиенты
    КОЛОНКА ЗаказНаряд ВЫБОР ЗаказНаряд
    КОЛОНКА СуммаЗаказа ЧИСЛО
    КОЛОНКА Оплачено ЧИСЛО
    КОЛОНКА Долг ЧИСЛО
    ВЫВОД_ДИАГРАММА КРУГОВАЯ
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ ЗаказНаряд
    РЕСУРС Долг
КОНЕЦ
ОТЧЁТ ВыручкаПоВидам
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР ДатаС ДАТАВРЕМЯ
    ПАРАМЕТР ДатаПо ДАТАВРЕМЯ
    ЗАПРОС "SELECT СубконтоКт2 AS ВидВыручки, SUM(Сумма) as СуммаВыручки FROM Журнал_Проводки WHERE credit_acc='90' AND ('{{ДатаС}}' = '' OR Дата >= '{{ДатаС}}') AND ('{{ДатаПо}}' = '' OR Дата <= '{{ДатаПо}}') GROUP BY ВидВыручки"
    КОЛОНКА ВидВыручки СТРОКА
    КОЛОНКА СуммаВыручки ЧИСЛО
    ВЫВОД_ДИАГРАММА БУБЛИК
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ ВидВыручки
    РЕСУРС СуммаВыручки
КОНЕЦ
ОТЧЁТ СводкаПроводокПоДокументам
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР ДатаС ДАТАВРЕМЯ
    ПАРАМЕТР ДатаПо ДАТАВРЕМЯ
    ПАРАМЕТР ФильтрСчетДт СТРОКА
    ПАРАМЕТР ФильтрСчетКт СТРОКА
    ЗАПРОС "SELECT П.Дата AS ДатаПроводки, П.Документ AS ДокументОснование, П.debit_acc AS СчетДебета, П.credit_acc AS СчетКредита, П.Сумма AS СуммаПроводки, В.Клиент AS КлиентДокумента FROM Журнал_Проводки AS П LEFT JOIN (SELECT DISTINCT parent_id, parent_type, Клиент FROM Журнал_Взаиморасчеты) AS В ON П.parent_id = В.parent_id AND П.parent_type = В.parent_type WHERE ('{{ДатаС}}' = '' OR П.Дата >= '{{ДатаС}}') AND ('{{ДатаПо}}' = '' OR П.Дата <= '{{ДатаПо}}') AND ('{{ФильтрСчетДт}}' = '' OR П.debit_acc = '{{ФильтрСчетДт}}') AND ('{{ФильтрСчетКт}}' = '' OR П.credit_acc = '{{ФильтрСчетКт}}') ORDER BY П.Дата DESC"
    КОЛОНКА ДатаПроводки ДАТАВРЕМЯ
    КОЛОНКА ДокументОснование СТРОКА
    КОЛОНКА СчетДебета СТРОКА
    КОЛОНКА СчетКредита СТРОКА
    КОЛОНКА КлиентДокумента ВЫБОР Клиенты
    КОЛОНКА СуммаПроводки ЧИСЛО
    ВЫВОД_ДИАГРАММА ЛИНЕЙНАЯ
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ ДатаПроводки
    РЕСУРС СуммаПроводки
КОНЕЦ
ОТЧЁТ АнализРентабельностиЗаказов
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР Клиент ВЫБОР Клиенты
    ЗАПРОС "SELECT ВЗ.Документ AS ДокументОснование, ВЗ.Клиент AS КлиентДокумента, ВЗ.Автомобиль AS Автомобиль, ВЗ.Выручка, IFNULL(ОЗ.СебестоимостьЗапчастей, 0) AS СебестоимостьЗапчастей, IFNULL(ВМ.ЗарплатаМехаников, 0) AS ЗарплатаМехаников, (ВЗ.Выручка - IFNULL(ОЗ.СебестоимостьЗапчастей, 0) - IFNULL(ВМ.ЗарплатаМехаников, 0)) AS ВаловаяПрибыль FROM (SELECT parent_id, parent_type, Документ, Клиент, Автомобиль, SUM(Сумма) AS Выручка FROM Журнал_Взаиморасчеты WHERE _type=1 GROUP BY parent_id, parent_type, Документ, Клиент, Автомобиль) AS ВЗ LEFT JOIN (SELECT parent_id, parent_type, SUM(Сумма) AS СебестоимостьЗапчастей FROM Журнал_ОстаткиЗапчастей WHERE _type=-1 GROUP BY parent_id, parent_type) AS ОЗ ON ВЗ.parent_id = ОЗ.parent_id AND ВЗ.parent_type = ОЗ.parent_type LEFT JOIN (SELECT parent_id, parent_type, SUM(Сумма) AS ЗарплатаМехаников FROM Журнал_ВыработкаМехаников GROUP BY parent_id, parent_type) AS ВМ ON ВЗ.parent_id = ВМ.parent_id AND ВЗ.parent_type = ВМ.parent_type WHERE ('{{Клиент}}' = '' OR ВЗ.Клиент = '{{Клиент}}') ORDER BY ВаловаяПрибыль DESC"
    КОЛОНКА ДокументОснование СТРОКА
    КОЛОНКА КлиентДокумента ВЫБОР Клиенты
    КОЛОНКА Автомобиль ВЫБОР Автомобили
    КОЛОНКА Выручка ЧИСЛО
    КОЛОНКА СебестоимостьЗапчастей ЧИСЛО
    КОЛОНКА ЗарплатаМехаников ЧИСЛО
    КОЛОНКА ВаловаяПрибыль ЧИСЛО
    ВЫВОД_ДИАГРАММА ГИСТОГРАММА
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ Автомобиль
    РЕСУРС ВаловаяПрибыль
КОНЕЦ
# --- ИНТЕРФЕЙС И МЕНЮ ---
МЕНЮ Главное
    ГРУППА "Рабочее место"
        КНОПКА "Главная (Дашборд)" ОТКРЫТЬ desktop
    КОНЕЦ
    ГРУППА "СТО и Ремонт"
        КНОПКА "Счета на оплату" ОТКРЫТЬ СчетНаОплату
        КНОПКА "Заказ-Наряды" ОТКРЫТЬ ЗаказНаряд
        КНОПКА "Клиенты" ОТКРЫТЬ Клиенты
        КНОПКА "Автомобили" ОТКРЫТЬ Автомобили
    КОНЕЦ
    ГРУППА "Склад и Касса"
        КНОПКА "Поступления запчастей" ОТКРЫТЬ ПоступлениеЗапчастей
        КНОПКА "Оплаты от клиентов" ОТКРЫТЬ ОплатаОтКлиента
        КНОПКА "Каталог товаров и услуг" ОТКРЫТЬ Номенклатура
    КОНЕЦ
    ГРУППА "Отчеты и Аналитика"
        КНОПКА "Складские остатки" ОТКРЫТЬ СкладскиеОстатки
        КНОПКА "Долги клиентов" ОТКРЫТЬ ВзаиморасчетыСКлиентами
        КНОПКА "Долги по заказам" ОТКРЫТЬ ДолгиПоЗаказам
        КНОПКА "Прибыль по заказам" ОТКРЫТЬ ФинансовыйРезультатПоЗаказам
        КНОПКА "Выручка по видам" ОТКРЫТЬ ВыручкаПоВидам
        КНОПКА "История ремонтов" ОТКРЫТЬ ИсторияОбслуживанияАвто
        КНОПКА "Выработка механиков" ОТКРЫТЬ ВыработкаСотрудников
        КНОПКА "Журнал проводок" ОТКРЫТЬ ЖурналПроводок
        КНОПКА "Сводка проводок (JOIN)" ОТКРЫТЬ СводкаПроводокПоДокументам
        КНОПКА "Рентабельность заказов (2 JOIN)" ОТКРЫТЬ АнализРентабельностиЗаказов
    КОНЕЦ
    ГРУППА "Предприятие"
        КНОПКА "Ежедневные отчеты" ОТКРЫТЬ ЕжедневныйОтчет
        КНОПКА "Юр. лица (Организации)" ОТКРЫТЬ Организации
        КНОПКА "Контрагенты (Поставщики)" ОТКРЫТЬ Контрагенты
        КНОПКА "Склады" ОТКРЫТЬ Склады
        КНОПКА "Сотрудники" ОТКРЫТЬ Сотрудники
        КНОПКА "Задачи" ОТКРЫТЬ Задачи
        КНОПКА "План счетов" ОТКРЫТЬ Хозрасчетный
        КНОПКА "Проводки (Регистр)" ОТКРЫТЬ Проводки
        КНОПКА "Остатки запчастей (Регистр)" ОТКРЫТЬ ОстаткиЗапчастей
        КНОПКА "Взаиморасчеты (Регистр)" ОТКРЫТЬ Взаиморасчеты
        КНОПКА "Выработка (Регистр)" ОТКРЫТЬ ВыработкаМехаников
    КОНЕЦ
КОНЕЦ
# ============================================
# ПЕЧАТНЫЕ ФОРМЫ (ШАБЛОНЫ)
# ============================================
ШАБЛОН ШаблонСчетНаОплату
<html>
<head>
    <meta charset="utf-8">
    <title>Счет на оплату № {{Номер}}</title>
    <style>
        @page { size: A4; margin: 15mm; }
        body { font-family: Arial, sans-serif; color: #333; width: 180mm; margin: 0 auto; font-size: 10pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 15px; margin-bottom: 20px; font-size: 9pt; }
        th, td { border: 1px solid #ccc; padding: 6px; text-align: left; }
        th { background-color: #f8f9fa; }
        .header { margin-bottom: 30px; border-bottom: 2px solid #065f46; padding-bottom: 10px; display: flex; align-items: center; }
        .total { text-align: right; font-size: 12pt; font-weight: bold; margin-top: 20px; }
    </style>
</head>
<body onload="window.print()">
    <div class="header">
        {{ЕСЛИ Константы.Логотип_URL}}
            <img src="{{Константы.Логотип_URL}}" alt="Логотип компании" style="float: left; max-width: 150px; max-height: 60px; margin-right: 20px; position: relative; left: {{Константы.ЛоготипСдвигВправо}}px; top: {{Константы.ЛоготипСдвигВниз}}px;">
        {{КОНЕЦ}}
        <div>
            <h2>Счет на оплату № {{Номер}} от {{ФОРМАТ(Дата)}}</h2>
            <p style="margin: 5px 0;"><strong>Исполнитель:</strong> {{Организация.Наименование}}</p>
            <p style="margin: 5px 0;"><strong>Заказчик:</strong> {{Клиент.Наименование}}</p>
            {{ЕСЛИ Основание}}<p style="margin: 5px 0;"><strong>Основание:</strong> {{Основание}}</p>{{КОНЕЦ}}
        </div>
    </div>
    <h3>Выполненные работы</h3>
    <table>
        <tr><th>Услуга</th><th>Нормочасы</th><th>Цена</th><th>Сумма</th></tr>
        {{ЦИКЛ ПО Работы КАК Р}}
        <tr>
            <td>{{Р.Услуга.Наименование}}</td>
            <td>{{Р.НормоЧасы}}</td>
            <td>{{ФОРМАТ(Р.Цена)}}</td>
            <td>{{ФОРМАТ(Р.Сумма)}}</td>
        </tr>
        {{КОНЕЦ}}
    </table>
    <h3>Запчасти и материалы</h3>
    <table>
        <tr><th>Номенклатура</th><th>Количество</th><th>Цена</th><th>Сумма</th></tr>
        {{ЦИКЛ ПО Запчасти КАК З}}
        <tr>
            <td>{{З.Номенклатура.Наименование}}</td>
            <td>{{З.Количество}}</td>
            <td>{{ФОРМАТ(З.Цена)}}</td>
            <td>{{ФОРМАТ(З.Сумма)}}</td>
        </tr>
        {{КОНЕЦ}}
    </table>
    <div class="total">Итого к оплате: {{ФОРМАТ(ИтогоСумма)}} руб.</div>
    <div style="text-align: right; margin-top: 5px; font-style: italic;">(Сумма прописью: {{ПРОПИСЬ(ИтогоСумма)}})</div>
    <div style="margin-top: 50px; padding-top: 20px; border-top: 1px solid #eee; position: relative;">
        <div style="display: flex; justify-content: space-between;">
            <div>
                <p style="margin-bottom: 0;">Руководитель: _________________ / {{РуководительФИО}}</p>
            </div>
        </div>
        {{ЕСЛИ Константы.Печать_URL}}
        <div style="position: absolute; right: 50px; top: -30px; z-index: -1;">
            <img src="{{Константы.Печать_URL}}" alt="Печать организации" style="max-height: 120px; position: relative; left: {{Константы.ПечатьСдвигВправо}}px; top: {{Константы.ПечатьСдвигВниз}}px;">
        </div>
        {{КОНЕЦ}}
    </div>
</body>
</html>
КОНЕЦ
ШАБЛОН ШаблонПечатьЗаказНаряда
<html>
<head>
    <meta charset="utf-8">
    <title>Заказ-наряд № {{Номер}}</title>
    <style>
        @page { size: A4; margin: 15mm; }
        body { font-family: Arial, sans-serif; color: #333; width: 180mm; margin: 0 auto; font-size: 10pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 15px; margin-bottom: 20px; font-size: 9pt; }
        th, td { border: 1px solid #ccc; padding: 6px; text-align: left; }
        th { background-color: #f8f9fa; }
        .header { text-align: center; margin-bottom: 30px; border-bottom: 2px solid #065f46; padding-bottom: 10px; }
        .total { text-align: right; font-size: 12pt; font-weight: bold; margin-top: 20px; }
    </style>
</head>
<body onload="window.print()">
    <div class="header">
        {{ЕСЛИ Константы.Логотип_URL}}
            <img src="{{Константы.Логотип_URL}}" alt="Логотип компании" style="float: left; max-width: 150px; max-height: 60px; margin-right: 20px; position: relative; left: {{Константы.ЛоготипСдвигВправо}}px; top: {{Константы.ЛоготипСдвигВниз}}px;">
        {{КОНЕЦ}}
        <h2>Заказ-наряд № {{Номер}} от {{ФОРМАТ(Дата)}}</h2>
        <div style="clear: both;"></div>
    </div>
    <p><strong>Организация:</strong> {{Организация.Наименование}}</p>
    <p><strong>Клиент:</strong> {{Клиент.Наименование}}</p>
    <p><strong>Автомобиль:</strong> {{Автомобиль.Наименование}}</p>
    <h3>Выполненные работы</h3>
    <table>
        <tr><th>Услуга</th><th>Нормочасы</th><th>Цена</th><th>Сумма</th></tr>
        {{ЦИКЛ ПО Работы КАК Р}}
        <tr>
            <td>{{Р.Услуга.Наименование}}</td>
            <td>{{Р.НормоЧасы}}</td>
            <td>{{Р.Цена}}</td>
            <td>{{Р.Сумма}}</td>
        </tr>
        {{КОНЕЦ}}
    </table>
    <h3>Использованные запчасти</h3>
    <table>
        <tr><th>Запчасть</th><th>Кол-во</th><th>Цена</th><th>Сумма</th></tr>
        {{ЦИКЛ ПО Запчасти КАК З}}
        <tr>
            <td>{{З.Номенклатура.Наименование}}</td>
            <td>{{З.Количество}}</td>
            <td>{{З.Цена}}</td>
            <td>{{З.Сумма}}</td>
        </tr>
        {{КОНЕЦ}}
    </table>
    <div class="total">Итого к оплате: {{ФОРМАТ(ИтогоСумма)}} руб.</div>
    <div style="text-align: right; margin-top: 5px; font-style: italic;">(Сумма прописью: {{ПРОПИСЬ(ИтогоСумма)}})</div>
    <div style="margin-top: 50px; padding-top: 20px; border-top: 1px solid #eee; position: relative;">
        <div style="display: flex; justify-content: space-between;">
            <div>
                <p style="margin-bottom: 0;">Исполнитель: _________________ / {{Механик}}</p>
            </div>
            <div>
                <p style="margin-bottom: 0;">Руководитель: _________________ / {{РуководительФИО}}</p>
            </div>
        </div>
        {{ЕСЛИ Константы.Печать_URL}}
        <div style="position: absolute; right: 50px; top: -30px; z-index: -1;">
            <img src="{{Константы.Печать_URL}}" alt="Печать организации" style="max-height: 120px; position: relative; left: {{Константы.ПечатьСдвигВправо}}px; top: {{Константы.ПечатьСдвигВниз}}px;">
        </div>
        {{КОНЕЦ}}
    </div>
</body>
</html>
КОНЕЦ
ШАБЛОН ШаблонПоступлениеЗапчастей
<html>
<head>
    <meta charset="utf-8">
    <title>Приходная накладная № {{Номер}}</title>
    <style>
        @page { size: A4; margin: 15mm; }
        body { font-family: Arial, sans-serif; color: #333; width: 180mm; margin: 0 auto; font-size: 10pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 15px; margin-bottom: 20px; font-size: 9pt; }
        th, td { border: 1px solid #ccc; padding: 6px; text-align: left; }
        th { background-color: #f8f9fa; }
        .header { margin-bottom: 30px; border-bottom: 2px solid #065f46; padding-bottom: 10px; display: flex; align-items: center; }
        .logo { width: 120px; margin-right: 20px; }
        .total { text-align: right; font-size: 12pt; font-weight: bold; margin-top: 20px; }
    </style>
</head>
<body onload="window.print()">
    <div class="header">
        {{ЕСЛИ Константы.Логотип_URL}}
            <img src="{{Константы.Логотип_URL}}" alt="Логотип компании" class="logo" style="position: relative; left: {{Константы.ЛоготипСдвигВправо}}px; top: {{Константы.ЛоготипСдвигВниз}}px;">
        {{КОНЕЦ}}
        <div>
            <h2>Приходная накладная № {{Номер}} от {{ФОРМАТ(Дата)}}</h2>
            <p style="margin: 5px 0;"><strong>Организация:</strong> {{Организация.Наименование}}</p>
            <p style="margin: 5px 0;"><strong>Поставщик:</strong> {{Поставщик.Наименование}}</p>
            <p style="margin: 5px 0;"><strong>Склад:</strong> {{Склад.Наименование}}</p>
        </div>
    </div>
    <h3>Поступившие запчасти</h3>
    <table>
        <tr><th>Номенклатура</th><th>Количество</th><th>Цена</th><th>Сумма</th></tr>
        {{ЦИКЛ ПО Запчасти КАК З}}
        <tr>
            <td>{{З.Номенклатура.Наименование}}</td>
            <td>{{З.Количество}}</td>
            <td>{{ФОРМАТ(З.Цена)}}</td>
            <td>{{ФОРМАТ(З.Сумма)}}</td>
        </tr>
        {{КОНЕЦ}}
    </table>
    <div class="total">Итого: {{ФОРМАТ(СуммаДокумента)}} руб.</div>
    <div style="text-align: right; margin-top: 5px; font-style: italic;">(Сумма прописью: {{ПРОПИСЬ(СуммаДокумента)}})</div>
    <div style="margin-top: 50px; padding-top: 20px; border-top: 1px solid #eee; position: relative;">
        <div style="display: flex; justify-content: space-between;">
            <div>
                <p style="margin-bottom: 0;">Сдал (Контрагент): _________________ / {{РуководительПоставщикаФИО}}</p>
            </div>
            <div>
                <p style="margin-bottom: 0;">Принял (Руководитель): _________________ / {{РуководительФИО}}</p>
            </div>
        </div>
        {{ЕСЛИ Константы.Печать_URL}}
        <div style="position: absolute; right: 50px; top: -30px; z-index: -1;">
            <img src="{{Константы.Печать_URL}}" alt="Печать организации" style="max-height: 120px; position: relative; left: {{Константы.ПечатьСдвигВправо}}px; top: {{Константы.ПечатьСдвигВниз}}px;">
        </div>
        {{КОНЕЦ}}
    </div>
</body>
</html>
КОНЕЦ

3559 | 0 | 3559 | 381 | 195 | 62