Как реализовать массовый пересчет цен в табличной части документа в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация Управленческий учет Промышленность, строительство и АПК
← На главную

При работе в таких конфигурациях как УПП 1.3 или КА 1.1 часто возникает потребность в автоматизации рутинных операций. Одной из таких задач является массовая корректировка цен в табличных частях документов (например, в «Инвойсе» или других реализациях) на определенный процент. Разберем, как реализовать этот инструмент грамотно, безопасно и с учетом требований платформы.

Вариант 1: Внешняя обработка заполнения табличных частей

Это наиболее предпочтительный метод, так как он не требует внесения изменений в типовую конфигурацию (снятия с поддержки). Мы создаем отдельную внешнюю обработку, которая подключается через стандартный механизм дополнительных обработок. Это позволяет вызывать её по нажатию кнопки «Заполнить» непосредственно из формы документа.

Для реализации такой задачи нам потребуется создать внешнюю обработку с табличной частью ЗаполнениеТЧ и прописать в модуле объекта стандартную экспортную процедуру Инициализировать. Рассмотрим пример реализации кода для такой обработки:


Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПоле) Экспорт
    Процент = 0;
    Если ВвестиЧисло(Процент, "Введите процент для изменения цены") Тогда
        Если ИмяТабличнойЧасти = "Товары" Тогда
            Если Процент <> 0 Тогда
                Для Каждого СтрТовары Из Объект.Товары Цикл
                    // Рассчитываем новую цену
                    СтрТовары.Цена = СтрТовары.Цена + ((СтрТовары.Цена * Процент) / 100);
                    
                    // Важно: пересчитываем сумму строки
                    СтрТовары.Сумма = СтрТовары.Цена * СтрТовары.Количество;
                    
                    // Здесь следует вызвать стандартные процедуры пересчета налогов, 
                    // если они предусмотрены в модуле объекта документа
                КонецЦикла;
                
                // Оповещаем форму о том, что данные изменились для обновления экрана
                ОповеститьОбИзменении(Объект.Товары);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важно: почему нельзя менять только цену?

При массовом изменении данных в ТЧ важно помнить о целостности документа. Простое изменение колонки Цена приведет к тому, что Сумма, СуммаНДС и Всего останутся старыми. Это вызовет ошибки при проведении документа.

  1. Пересчет итогов: После выполнения цикла изменений необходимо вызывать методы объекта документа, отвечающие за пересчет суммовых показателей (например, РассчитатьСуммуТабЧасти или аналогичные процедуры, специфичные для вашей конфигурации).
  2. Округление: Помните, что при умножении на процент могут возникать «копейки». Используйте функцию Окр(Значение, 2), чтобы данные в базе соответствовали требованиям финансового учета.
  3. Транзакционность: Выполняйте расчеты в рамках одной транзакции, чтобы избежать частичного сохранения данных при возникновении ошибок.

Вариант 2: Использование типового функционала «Изменить»

В некоторых типовых решениях (например, в УТ 10.3) уже присутствует кнопка «Изменить» в командной панели табличной части. Она позволяет выполнять массовые операции: умножение на коэффициент, добавление фиксированной суммы и другие.

Если вы работаете в УПП 1.3 и хотите внедрить такой же функционал, вы можете:

Рекомендации по реализации

Для того чтобы ваш инструмент работал надежно, придерживайтесь следующих советов:

  1. Используйте расширения: Если вы все же решили модифицировать конфигурацию, используйте механизм расширений. Это позволит обновлять типовую конфигурацию без удаления ваших доработок.
  2. Проверка состояния: В начале процедуры обязательно проверяйте, не помечен ли документ на удаление и не является ли он проведенным (если это недопустимо для вашей бизнес-логики).
  3. Оповещение: Метод ОповеститьОбИзменении() критически важен, иначе пользователь увидит старые данные на форме до тех пор, пока не переоткроет документ вручную.

Реализация через внешнюю обработку заполнения является наиболее чистым и быстрым способом решения задачи, который не требует глубокого вмешательства в архитектуру УПП 1.3 или КА 1.1. Анализируйте логику расчетов в модуле вашего конкретного документа перед запуском обработки, чтобы убедиться, что все налоги будут пересчитаны верно.

← На главную