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

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

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

Многие начинающие разработчики сталкиваются с ошибкой «Недопустимая операция» при попытке вызвать метод НоваяПроводка() непосредственно у объекта типа Документ. Рассмотрим подробнее, почему это происходит и как правильно решить данную задачу.

Причина возникновения ошибки «Недопустимая операция»

В архитектуре 1С 7.7 объект Документ и объект Операция — это разные сущности, хотя они тесно связаны. Когда мы открываем документ через СоздатьОбъект("Документ"), мы получаем доступ к его реквизитам (дата, номер, контрагент и т.д.). Однако попытка работать с проводками через свойство Документ.Операция напрямую часто ограничена, если документ не находится в режиме проведения или если контекст вызова не позволяет изменять подчиненные объекты.

Проанализируем ситуацию: для изменения бухгалтерских записей нам нужно «перепрыгнуть» с объекта документа на объект операции, который управляет движениями по счетам. Если пытаться добавлять проводки к объекту документа, который просто выбран из базы, система блокирует это действие для обеспечения целостности данных, так как проводки по умолчанию должны формироваться только процедурой ОбработкаПроведения.

Решение задачи через объект Операция

Чтобы обойти ограничение и программно изменить проводки, нам необходимо использовать отдельный объект Операция. Выясним последовательность действий по шагам:

  1. Создаем объект типа «Операция».
  2. Используем специальный метод НайтиОперацию(), передавая в него ссылку на нужный документ.
  3. Производим необходимые манипуляции (добавление, удаление или редактирование проводок).
  4. Обязательно вызываем метод Записать() для сохранения изменений в базе данных.

Рассмотрим пример кода, который реализует этот алгоритм:


Процедура ИзменитьПроводки(ВыбДок)
    Перем Опер;
    
    // Создаем объект Операция
    Опер = СоздатьОбъект("Операция");
    
    // Пытаемся найти операцию, принадлежащую конкретному документу
    Если Опер.НайтиОперацию(ВыбДок) = 1 Тогда
        // Теперь мы можем работать с проводками документа
        // Например, добавим новую забалансовую проводку
        Опер.НоваяПроводка();
        Опер.СчетДт = СчетПоКоду("001");
        Опер.Сумма = 1000;
        Опер.Содержание = "Дополнительная проводка из обработки";
        
        // Фиксируем изменения в базе данных
        Опер.Записать();
        Сообщить("Проводки документа успешно изменены!");
    Иначе
        Сообщить("У данного документа нет операции (он не делает бухгалтерских проводок).");
    КонецЕсли;
КонецПроцедуры

Как изменить существующие проводки?

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


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

Проблема блокировок и ошибка «Объект заблокирован»

Разберем ситуацию, описанную в сообщении 11: при попытке вызвать этот же код из модуля формы самого документа возникает ошибка «Объект заблокирован».

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

Как решить проблему блокировки:

Важное предупреждение о перепроведении

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

Стандартный механизм работы 1С 7.7 устроен так: перед запуском процедуры ОбработкаПроведения система полностью удаляет старые проводки документа. Затем модуль проведения формирует их заново согласно алгоритму, прописанному в конфигураторе.

Поэтому данный метод (правка через объект Операция) подходит только для двух случаев:

  1. Документ является «пустышкой» без модуля проведения (как в сообщении 10), используемой просто как контейнер для записей.
  2. Вы уверены, что данный документ никогда не будет перепроведен (например, он относится к закрытому периоду).

Если же документ планируется перепроводить, единственно верным способом изменения проводок будет внесение правок непосредственно в Модуль проведения этого документа в Конфигураторе.

← На главную