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