Часто в практике работы с конфигурацией 1С:Управление торговлей 11 возникает ситуация, когда необходимо массово изменить вид цены (например, с розничной на оптовую) в большом количестве уже проведенных документов РеализацияТоваровИУслуг. При этом пользователи сталкиваются с неочевидной проблемой: если использовать типовую обработку группового изменения реквизитов и поменять вид цены, сам реквизит в шапке документа обновится, но сумма в табличной части и общая сумма документа останутся прежними. Давайте разберем по шагам, почему так происходит, и рассмотрим эффективные способы решения этой задачи.
Почему же сумма не пересчитывается автоматически при использовании стандартной групповой обработки? Дело в том, что в 1С:УТ 11 пересчет цен и сумм привязан к событиям формы документа. Обработчик, который обновляет цены в строках табличной части, срабатывает только при интерактивном изменении вида цены пользователем в открытой форме. При потоковом групповом изменении реквизитов платформа записывает объект напрямую, минуя клиентские обработчики формы. Из-за этого вид цены меняется, а значения в колонках Цена, Сумма и СуммаНДС остаются старыми.
Проанализируем ситуацию: чтобы корректно обновить документы, нам недостаточно просто подставить новый вид цены. Нам потребуется заново получить актуальные цены из базы, перемножить их на количество товаров, пересчитать НДС и обновить итоговую сумму всего документа. Рассмотрим несколько вариантов, как мы можем это реализовать.
Вместо того чтобы писать полноценную внешнюю обработку с нуля, мы можем воспользоваться скрытыми возможностями типовой обработки Групповое изменение реквизитов. Это значительно сэкономит нам время.
Объект.Посмотрим на пример кода, который мы можем использовать в этом поле (схематичный вариант для понимания логики):
// Устанавливаем новый вид цены в шапке
Объект.ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая");
// Обходим табличную часть Товары
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
// Получаем новую цену на дату документа (потребуется написать запрос или использовать типовой метод)
НоваяЦена = ПолучитьЦенуНоменклатуры(СтрокаТЧ.Номенклатура, Объект.ВидЦены, Объект.Дата);
СтрокаТЧ.Цена = НоваяЦена;
// Формула пересчета суммы
СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
// Обязательно пересчитываем НДС в зависимости от ставки и флага "Цена включает НДС"
// Пример вызова типовой процедуры пересчета НДС:
// РасчетДДСервер.РассчитатьСуммуНДСВСтрокеТабличнойЧасти(СтрокаТЧ, Объект);
КонецЦикла;
// Обновляем общие итоги по документу в шапке
Объект.СуммаДокумента = Объект.Товары.Итог("Сумма");
Важно помнить: простая формула Сумма = Количество * Цена работает только в идеальных условиях без скидок и сложного НДС. В реальной базе обязательно нужно вызывать типовые серверные методы для расчета скидок и корректного выделения/начисления налога (например, из общих модулей ЦенообразованиеВызовСервера).
Если задача требует более сложной логики (например, сопоставления документов по комментариям, как советовали на форуме), мы можем написать простую внешнюю обработку. Разберем алгоритм ее работы:
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();.Товары, где программно подтягиваем актуальную цену из регистра сведений ЦеныНоменклатуры (срез последних на дату реализации).Цена, Сумма и СуммаНДС.СуммаДокумента.ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);.В этом случае, чтобы обезопасить себя от случайных ошибок, имеет смысл брать цены произвольно или жестко фиксировать их, чтобы при случайном перепроведении документа старых периодов суммы не слетели от нажатия кнопки на форме.
Для пользователей и начинающих программистов есть еще один отличный путь. В сообществе 1С существует множество готовых универсальных обработок табличных частей для управляемых форм. Мы можем просто найти такое решение, загрузить в базу как дополнительную обработку и задать математическую формулу для пересчета колонок прямо в пользовательском интерфейсе. Это избавит нас от необходимости писать код с нуля.
Вторая часть задачи — привязка суммы в документе ПриобретениеТоваровУслуг к сумме реализации. Хоть на форуме это и назвали неординарной задачей, в бизнесе такое встречается часто (агентские схемы, дропшиппинг).
Рассмотрим, как мы можем это реализовать в 1С:УТ 11:
ЗаказКлиенту). Найдя нужный документ поступления, мы можем перезаписать в нем цены из реализации.Важное предупреждение: Изменение сумм в проведенных документах поступления задним числом неизбежно нарушит партионный учет и взаиморасчеты с поставщиками. После того как мы программно приравняем суммы, нам придется в обязательном порядке заново выполнить регламентную операцию закрытия месяца за затронутые периоды. Только так программа сможет корректно пересчитать себестоимость товаров на складах и вывести правильный финансовый результат.