Как изменить договор в документе УПП 1.3 в закрытом периоде без перепроведения?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет
← На главную

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

Почему стандартные обработки не подходят?

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

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

Программный метод: использование режима «Загрузка»

Единственный технический способ внести изменения без перепроведения и обхода проверок — это использование свойства ОбменДанными.Загрузка = Истина. Этот флаг сообщает системе, что данные записываются «как есть», без выполнения кода в модулях объекта (например, ПередЗаписью, ПриЗаписи, ОбработкаПроведения). Рассмотрим алгоритм действий.

Во-первых, нам необходимо изменить сам реквизит ДоговорКонтрагента в объекте документа. Разберем пример кода:


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

// Устанавливаем новый договор
ДокОбъект.ДоговорКонтрагента = НовыйДоговор;

// Включаем режим загрузки для обхода проверок и блокировок
ДокОбъект.ОбменДанными.Загрузка = Истина;

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

Однако на этом работа не заканчивается. Основные данные для учета в УПП хранятся в регистрах накопления. Нам нужно последовательно обойти все наборы записей регистров, которые сделал этот документ, и заменить в них значение измерения ДоговорКонтрагента.

Корректировка движений по регистрам

В УПП документ может делать записи в десятки регистров. Самые критичные из них, где фигурирует договор:

Рассмотрим пример программного кода для корректировки движений в конкретном регистре:


НаборЗаписей = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл
    // Проверяем, есть ли в данном регистре измерение ДоговорКонтрагента
    Запись.ДоговорКонтрагента = НовыйДоговор;
КонецЦикла;

// Крайне важно включить флаг Загрузка для набора записей
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();

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

Анализ рисков и «подводных камней»

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

1. Нарушение последовательностей. В УПП существуют последовательности взаиморасчетов и партионного учета. Хотя программная запись с флагом Загрузка не сдвигает границу последовательности, при следующем штатном восстановлении (например, в конце текущего месяца) система может увидеть изменения в прошлых периодах и потребовать перепроведения этих документов. Это «взорвет» ваш закрытый период позже.

2. Влияние на НДС и счета-фактуры. Договор является связующим звеном. Если в «Поступлении товаров и услуг» вы договор поменяли, а в связанном «Счете-фактуре полученном» — нет, то при формировании декларации возникнет конфликт. Придется программно менять договор и во всех подчиненных документах (счета-фактуры, платежные поручения, корректировки).

3. Расчеты по документам. Если в договоре ведется учет «По документам расчетов», вам придется корректировать не только договор, но и саму ссылку на сделку или документ расчетов в движениях, иначе остатки «зависнут» на разных разрезах аналитики.

Методологически верная альтернатива

Если риски кажутся слишком высокими (а в УПП они всегда высоки), выясним, как сделать исправление правильно с точки зрения методологии 1С. Рассмотрим использование документа «Корректировка долга».

Для смены договора выполните следующие шаги:

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

Преимущества этого способа:

Резюме

Прямое исправление договора в закрытом периоде УПП 1.3 без перепроведения — это «хирургическая» операция. Если вы решите идти по этому пути, обязательно сделайте резервную копию базы. Используйте ОбменДанными.Загрузка = Истина и тщательно проверяйте все связанные регистры накопления. Однако, если есть возможность, всегда отдавайте предпочтение документу Корректировка долга в текущем периоде — это сохранит целостность вашей учетной системы.

← На главную