Как массово изменить сумму и вид цены в проведенных документах реализации в 1С:УТ 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто в практике работы с конфигурацией 1С:Управление торговлей 11 возникает ситуация, когда необходимо массово изменить вид цены (например, с розничной на оптовую) в большом количестве уже проведенных документов РеализацияТоваровИУслуг. При этом пользователи сталкиваются с неочевидной проблемой: если использовать типовую обработку группового изменения реквизитов и поменять вид цены, сам реквизит в шапке документа обновится, но сумма в табличной части и общая сумма документа останутся прежними. Давайте разберем по шагам, почему так происходит, и рассмотрим эффективные способы решения этой задачи.

Выясним причину проблемы

Почему же сумма не пересчитывается автоматически при использовании стандартной групповой обработки? Дело в том, что в 1С:УТ 11 пересчет цен и сумм привязан к событиям формы документа. Обработчик, который обновляет цены в строках табличной части, срабатывает только при интерактивном изменении вида цены пользователем в открытой форме. При потоковом групповом изменении реквизитов платформа записывает объект напрямую, минуя клиентские обработчики формы. Из-за этого вид цены меняется, а значения в колонках Цена, Сумма и СуммаНДС остаются старыми.

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

Способ 1: Использование произвольного алгоритма в типовой обработке

Вместо того чтобы писать полноценную внешнюю обработку с нуля, мы можем воспользоваться скрытыми возможностями типовой обработки Групповое изменение реквизитов. Это значительно сэкономит нам время.

  1. Откроем групповое изменение реквизитов и выберем нужный тип документа — реализации товаров и услуг. Настроим отбор по периоду и организации, чтобы получить нужные 3000 документов.
  2. Перейдем в настройки обработки (кнопка с шестеренкой или «Дополнительные параметры»).
  3. Включим режим разработчика и активируем опцию Выполнять произвольный алгоритм. У нас появится специальное текстовое поле для ввода кода на встроенном языке 1С.
  4. В этом поле мы можем прописать алгоритм, который выполнится для каждого выбранного документа. Контекст обработки предоставляет нам доступ к текущему документу через переменную Объект.

Посмотрим на пример кода, который мы можем использовать в этом поле (схематичный вариант для понимания логики):


// Устанавливаем новый вид цены в шапке
Объект.ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая");

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

// Обновляем общие итоги по документу в шапке
Объект.СуммаДокумента = Объект.Товары.Итог("Сумма");

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

Способ 2: Написание собственной внешней обработки

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

  1. Создаем запрос, в котором отбираем проведенные реализации за нужный период, где вид цены равен старом значению ("своя").
  2. Выполняем запрос и начинаем обход результата в цикле.
  3. Для каждой записи получаем объект документа: ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();.
  4. Меняем вид цены документа.
  5. В цикле обходим табличную часть Товары, где программно подтягиваем актуальную цену из регистра сведений ЦеныНоменклатуры (срез последних на дату реализации).
  6. Пересчитываем колонки Цена, Сумма и СуммаНДС.
  7. Пересчитываем итог по документу СуммаДокумента.
  8. Записываем документ в режиме проведения: ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);.

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

Способ 3: Использование готовых универсальных обработок

Для пользователей и начинающих программистов есть еще один отличный путь. В сообществе 1С существует множество готовых универсальных обработок табличных частей для управляемых форм. Мы можем просто найти такое решение, загрузить в базу как дополнительную обработку и задать математическую формулу для пересчета колонок прямо в пользовательском интерфейсе. Это избавит нас от необходимости писать код с нуля.

Как приравнять сумму приобретения к сумме реализации?

Вторая часть задачи — привязка суммы в документе ПриобретениеТоваровУслуг к сумме реализации. Хоть на форуме это и назвали неординарной задачей, в бизнесе такое встречается часто (агентские схемы, дропшиппинг).

Рассмотрим, как мы можем это реализовать в 1С:УТ 11:

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

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

← На главную