Как программно отредактировать проводки документа без его перепроведения в 1С 7.7?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

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

Использование объекта «Операция» для изменения проводок

В платформе 1С:Предприятие 7.7 бухгалтерские проводки документа привязаны к его операции. Чтобы внести изменения в проводки конкретного документа без запуска процедур модуля проведения (процедура ОбработкаПроведения), мы можем позиционироваться на операции документа через специальный объект Операция.

Рассмотрим алгоритм работы с объектом Операция:

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

Посмотрим на пример программного кода внешней обработки, который обнуляет суммы по забалансовому счету «004» в выбранном документе:


// Переменная Док содержит ссылку на редактируемый документ
Опер = СоздатьОбъект("Операция"); 

Если Опер.НайтиОперацию(Док.ТекущийДокумент()) = 1 Тогда
    Опер.ВыбратьПроводки();
    Пока Опер.ПолучитьПроводку() = 1 Цикл
        // Проверяем, задействован ли счет 004 в дебете или кредите проводки
        Если (Опер.Дебет.Счет.Код = "004") Или (Опер.Кредит.Счет.Код = "004") Тогда
            Опер.Сумма = 0;
        КонецЕсли;
    КонецЦикла;
    
    // Записываем измененную операцию документа
    Опер.Записать();
КонецЕсли;

Особенности и риски прямого изменения проводок

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

1. Потеря изменений при перепроведении: Метод Опер.Записать() модифицирует только записи в журнале проводок. Если пользователь или регламентный процесс позже перепроведет этот документ (интерактивно, при выполнении групповой обработки или восстановлении последовательности), процедура модуля ОбработкаПроведения() переформирует проводки заново, и все внесённые ручные правки сбросятся.

2. Аналитика и дополнительные виды учета: При обнулении реквизита Сумма на забалансовых счетах нужно брать во внимание, настроен ли на счете количественный учет (реквизит Количество) или валютный учет (реквизит ВалютнаяСумма). Если требуется сбросить полностью все показатели проводки, их также стоит обнулить внутри цикла.

3. Блокировки объектов: Если документ открыт на редактирование у одного из пользователей базы данных, метод записи операции не сможет выполниться из-за блокировки объекта платформой.

Альтернативные варианты решения задачи

Если прямой забор и модификация проводок через объект Операция не подходят по требованиям безопасности данных, рассмотрите следующие альтернативы:

1. Корректирующая ручная операция: Вместо изменения первичных проводок документа создается документ «Операция, введенная вручную» на конец нужного периода. В нем вводятся сторнирующие или выравнивающие проводки. Этот способ сохраняет целостность истории и исключает риск утери данных при случайном перепроведении документов.

2. Доработка алгоритма проведения в Конфигураторе: Если суммы по забалансовому счету не должны формироваться бизнес-логикой в принципе, правильным решением будет скорректировать процедуру ОбработкаПроведения() в модуле документа. После этого проведение документов будет сразу формировать корректные проводки без сумм.

← На главную