RE: Можно ли вводить данные вручную в отчёте 1С с пересчётом данных?

#33447
bot_avaOdin — Одинэсник
Участник

    Да, в 1С:Предприятии можно реализовать ввод данных вручную прямо в форме отчёта с автоматическим пересчётом связанных данных. Для этого обычно применяются следующие подходы:

    1. **Использование управляемых форм с табличным элементом, поддерживающим редактирование**
    В отчёте создаётся табличный элемент (ТабличноеПоле или ТабличныйДокумент), в котором разрешается редактирование ячеек. Пользователь может вводить или изменять данные прямо в отчёте.

    2. **Обработка события изменения данных**
    Для пересчёта связанных данных реализуют обработчики событий изменения значения ячейки (например, событие `ПриИзменении` или `ПриИзмененииЯчейки`), в которых выполняется перерасчёт зависимых значений и обновление данных в отчёте.

    3. **Хранение данных в промежуточных структурах**
    Для удобства и производительности данные отчёта и введённые пользователем значения хранятся в структуре (например, во временной таблице или массиве), что позволяет быстро пересчитывать и обновлять связанные показатели.

    4. **Обновление отображения отчёта**
    После пересчёта связанных данных обновляется содержимое табличного поля, чтобы пользователь видел актуальные значения.

    5. **Сохранение введённых данных**
    При необходимости введённые пользователем данные можно сохранить в базе (например, в регистре сведений, в документе или в пользовательских настройках), чтобы они не терялись при закрытии отчёта.

    ### Пример упрощённого кода для управляемой формы отчёта с редактируемым табличным полем и пересчётом

    1C
    Процедура ПриИзмененииЯчейки(Элемент, Строка, Колонка)
        // Получаем новое значение
        НовоеЗначение = Элемент.Значение[Строка][Колонка];
        
        // Обновляем данные в структуре отчёта
        МассивДанных[Строка][Колонка] = НовоеЗначение;
        
        // Пересчитываем связанные данные (пример)
        // Допустим, колонка 3 = колонка 1 * колонка 2
        МассивДанных[Строка][3] = МассивДанных[Строка][1] * МассивДанных[Строка][2];
        
        // Обновляем отображение
        Элемент.Значение[Строка][3] = МассивДанных[Строка][3];
    КонецПроцедуры
    

    ### Важные моменты

    — В управляемом интерфейсе для полноценного редактирования и пересчёта лучше использовать **ТабличноеПоле** с включённым редактированием.
    — Для сложных отчётов с большим объёмом данных может потребоваться оптимизация пересчётов.
    — Если отчёт построен на обычном табличном документе (ТабличныйДокумент), то прямое редактирование и динамический пересчёт реализовать сложнее, но возможно через дополнительные формы и обработчики.

    Рекомендую посмотреть здесь:
    https://its.1c.ru/db/metod8dev#content:456:hdoc
    https://its.1c.ru/db/v8std#content:456:hdoc
    (официальная документация по управляемым формам и табличным полям)

    Если нужно, могу помочь с конкретным примером кода под вашу задачу.

    База знаний 1С