Как в УТ 11.5 программно пересчитать график оплаты и виды запасов после изменения суммы документа?

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

При программной работе с документами в 1С, например, при изменении общей суммы, часто возникает задача пересчитать зависимые данные в табличных частях. Стандартные интерактивные механизмы при этом могут не сработать. Разберем на примере конфигурации "Управление торговлей 11.5", как корректно обновить табличные части ЭтапыГрафикаОплаты и ВидыЗапасов после того, как мы программно изменили сумму документа.

Решение 1: Пересчет этапов графика оплаты

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

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

Посмотрим на пример:

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


// Получаем объект документа
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// ...здесь код, который изменяет сумму документа...
ДокОбъект.СуммаДокумента = НоваяСумма;

// Вызываем процедуру пересчета графика оплаты
ВзаиморасчетыСервер.ПроверитьЗаполнитьЭтапыГрафикаОплаты(ДокОбъект);

// Записываем измененный документ
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

Решение 2: Пересчет и перезаполнение видов запасов

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

  1. Некорректный учет НДС. Суммы налога в видах запасов останутся прежними, что потребует перезаполнения НДС.
  2. Расхождения во взаиморасчетах. Сумма по документу одна, а в регистрах взаиморасчетов, которые строятся по видам запасов, — другая; для выявления таких проблем полезен отчет для поиска ошибок в учете — для этого подойдет отчет контроля расхождений в ERP и УТ.
  3. Ошибки при расчете себестоимости. Регламентная операция закрытия месяца может рассчитать себестоимость неверно, а регистр Запасы и потребности может оказаться не заполнен — для устранения этой проблемы есть обработка исправления ошибок закрытия месяца в 1С:УТ.

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

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

Разберем по шагам, как это сделать:

  1. Получаем объект документа, который нужно изменить.
  2. Вносим необходимые изменения (например, меняем общую сумму).
  3. Перед записью документа добавляем в его коллекцию ДополнительныеСвойства новый элемент с ключом "ПерезаполнитьВидыЗапасов" и значением Истина.
  4. Записываем или проводим документ.

Посмотрим на итоговый код:


// Получаем объект документа
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// ...здесь код, который изменяет сумму и, возможно, другие реквизиты...
ДокОбъект.СуммаДокумента = НоваяСумма;

// Устанавливаем флаг для принудительного перезаполнения видов запасов
ДокОбъект.ДополнительныеСвойства.Вставить("ПерезаполнитьВидыЗапасов", Истина);

// Выполняем запись с проведением. 
// В обработчике ПередЗаписью система увидит наш флаг и выполнит пересчет.
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

Этот подход является наиболее правильным и эффективным. Он использует встроенную логику конфигурации, не требует "велосипедов" и гарантирует, что все связанные данные будут пересчитаны так же, как если бы это делалось при интерактивном вводе документа с нуля.

Таким образом, при программном изменении суммовых полей в документах всегда важно помнить о необходимости вызова штатных процедур пересчета. Это обеспечит целостность и корректность данных в вашей учетной системе.

← На главную