Как добавить команду изменения цен на фиксированную сумму в обработку изменения таблицы товаров в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: почему меняется сумма, а не цена

Проанализируем распространенную ошибку разработчиков при доработке этой формы. При добавлении собственного действия программист часто пишет цикл обхода строк табличной части, рассчитывая только цену:


Для каждого СтрокаТабличнойЧасти Из Объект.Товары Цикл
    Если СтрокаТабличнойЧасти.Пометка Тогда
        СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Цена + СуммаРаспределения;
        // пересчитаем связанные реквизиты
        РассчитатьСуммыСтрокиТабличнойЧасти(СтрокаТабличнойЧасти, ПоказыватьСуммуНДС, ДокументСуммаВключаетНДС);
    КонецЕсли;
КонецЦикла;

На практике после такого кода пользователи сталкиваются с тем, что на форме или после переноса в документ изменяется итоговая сумма, а цена остается прежней либо пересчитывается не так, как ожидалось. Выясним причину такого поведения:

  1. Обратный пересчет в типовых процедурах: при вызове функции РассчитатьСуммыСтрокиТабличнойЧасти или аналогичных методов платформенной библиотеки в зависимости от переданных флагов приоритетом может обладать исходная сумма документа. Если реквизиты согласованы не полностью, алгоритм пересчитывает цену по формуле Сумма / Количество, тем самым затирая новое значение цены.
  2. Постобработка после пользовательского кода: если внедрить код в общий обработчик действия, далее по стеку могут выполняться стандартные процедуры округления или распределения сумм, которые заново вычисляют показатели на основании старых значений. В этом случае необходимо пройтись отладчиком по коду сразу после добавленного цикла.
  3. Взаимосвязь триады «Количество — Цена — Сумма»: цена, количество, ставка НДС и сумма взаимозависимы. При изменении цены обязательно требуется вручную или штатной функцией синхронизировать сумму строки и налоги, иначе при закрытии формы документ вернет значения к согласованному математическому виду.

Пошаговый алгоритм реализации правильного пересчета

Рассмотрим, как корректно организовать увеличение цены на фиксированную величину (наценку на единицу товара). Разберем по шагам:

  1. Определяем величину прибавки к цене из реквизита формы (например, СуммаРаспределения или отдельного поля наценки).
  2. Обходим только отмеченные пользователем строки коллекции.
  3. Увеличиваем значение реквизита Цена.
  4. Рассчитываем новое значение реквизита Сумма с обязательным округлением до двух знаков: Окр(Строка.Цена * Строка.Количество, 2).
  5. Вызываем штатный расчет НДС и итогов с учетом настроек документа (включает ли сумма НДС или налог начисляется сверху).

Посмотрим на пример корректного кода для изменения цены на фиксированную сумму:


Для каждого СтрокаТабличнойЧасти Из Объект.Товары Цикл
    Если СтрокаТабличнойЧасти.Пометка Тогда
        СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Цена + СуммаРаспределения;
        СтрокаТабличнойЧасти.Сумма = Окр(СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество, 2);
        
        // Вызываем штатный пересчет зависимых сумм (НДС, Всего)
        РассчитатьСуммыСтрокиТабличнойЧасти(СтрокаТабличнойЧасти, ПоказыватьСуммуНДС, ДокументСуммаВключаетНДС);
    КонецЕсли;
КонецЦикла;

Если требуется не просто увеличить цену за единицу, а распределить общую фиксированную сумму по строкам документа, подход меняется: сначала рассчитывается дельта суммы для каждой строки (пропорционально стоимости или количеству), затем вычисляется новая цена как НоваяСумма / Количество, а копейки погрешности округления относятся на позицию с наибольшей суммой.

Рекомендации по доработке без снятия конфигурации с поддержки

Рассмотрим способы внедрения нового функционала без изменения типового кода поставщика, чтобы не усложнять последующие обновления программы:

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

Таким образом, для стабильной работы алгоритма необходимо соблюдать баланс между ценой и суммой, ориентироваться на типовые процедуры пересчета (такие как в действиях «Изменить цены на процент») и контролировать выполнение сопутствующего кода через отладчик платформы 1С.

← На главную