Как реализовать механизм ручной корректировки движений в документе 1С

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

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

Разберем подробно, как правильно настроить этот механизм, чтобы он работал стабильно и корректно, опираясь на опыт решения подобных задач.

Суть проблемы и первичная настройка метаданных

Проанализируем типичную ситуацию: в конфигурацию добавлен новый документ (например, Заказ-наряд). Мы добавили в него реквизит РучнаяКорректировка с типом Булево и вызвали стандартную функцию обработки. Казалось бы, этого достаточно, но при записи проводок в форме корректировки данные в регистрах остаются прежними. Выясним причину этого поведения.

Основная причина кроется в свойствах самого объекта Документ в Конфигураторе. По умолчанию платформа 1С управляет записями регистров в зависимости от настроек проведения. Для корректной работы ручных правок нам необходимо изменить режим записи движений.

Рассмотрим пошагово настройки в Конфигураторе:

  1. Откроем свойства нашего документа на вкладке «Движения».
  2. Найдем свойство «Запись движений при проведении».
  3. Установим значение «Записывать модифицированные».

Почему это важно? Если установлено значение «Записывать выбранные», платформа ожидает явного указания набора записей для записи. Режим «Записывать модифицированные» позволяет системе сохранять только те наборы записей (движения), которые были изменены в процессе проведения или через форму корректировки движений.

Также обратим внимание на свойство «Удаление движений». Для документов с ручной правкой рекомендуется устанавливать «Удалять автоматически при отмене проведения». Если оставить просто «Удалять автоматически», то при каждом нажатии кнопки «Провести» система будет полностью очищать старые ручные правки еще до начала выполнения кода в модуле объекта.

Программная логика в модуле документа

Теперь проанализируем код внутри модуля документа. Главная задача — сделать так, чтобы при установленном флаге РучнаяКорректировка стандартный алгоритм проведения не выполнялся и не перезаписывал то, что пользователь ввел руками.

В процедуре ОбработкаПроведения необходимо добавить проверку в самом начале:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Если включена ручная корректировка, мы не должны пересчитывать движения
    Если РучнаяКорректировка Тогда
        Возврат;
    КонецЕсли;

    // Далее идет типовой код формирования движений
    // ...
    
КонецПроцедуры

Эта простая проверка гарантирует, что если бухгалтер один раз внес правки в проводки, последующее нажатие на кнопку «ОК» в форме документа не уничтожит его работу.

Связь с обработкой КорректировкаДвижений

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

У обработки КорректировкаДвижений есть основной реквизит (чаще всего ДокументОбъект) с составным типом данных. Вам необходимо:

  1. Найти эту обработку в дереве метаданных.
  2. В списке типов реквизита ДокументОбъект отметить галочкой ваш новый документ.
  3. Убедиться, что в модуле формы документа настроено открытие этой обработки при нажатии на кнопку «Результат проведения» или при изменении флага корректировки.

Если этого не сделать, форма корректировки либо не откроется, либо не сможет корректно «прочитать» движения вашего документа, и вы увидите пустые таблицы вместо проводок.

Сравнение правильного и неправильного подходов

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


// Пример неоптимального решения (из сообщения №6 форума)
Если РучнаяКорректировка Тогда
    Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Ссылка);
    Набор.Прочитать();
    // Предполагается, что данные берутся из формы корректировки
    Набор.Загрузить(ТаблицаИзФормы); 
    Набор.Записать(Истина);
КонецЕсли;

Почему это плохой путь? Такой код обходит стандартные механизмы транзакций платформы 1С. Это может привести к блокировкам данных, потере контроля целостности и сложностям при обновлении конфигурации. Правильный путь — это именно настройка свойств «Записывать модифицированные», как мы разобрали выше. В этом случае платформа сама поймет, какой набор записей нужно сохранить, когда пользователь нажмет «Записать» в форме корректировки.

Дополнительные нюансы: регистры накопления и НДС

Проанализируем ситуацию, когда документ делает записи не только в бухгалтерию (счета), но и в регистры накопления (например, НДС или взаиморасчеты). Часто пользователи жалуются: «Я поправил проводку на 44 счет, а в отчете по НДС цифры старые». Для оперативного исправления движений в различных регистрах в режиме предприятия можно использовать обработку для групповой корректировки записей регистров.

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

Подведем итоги

Для того чтобы механизм ручной корректировки заработал в вашем документе, выполните следующие действия:

  1. Добавьте реквизит РучнаяКорректировка (Булево) в документ.
  2. В свойствах документа (Конфигуратор) установите Запись движений при проведении: Записывать модифицированные.
  3. Установите Удаление движений: Удалять автоматически при отмене проведения.
  4. В модуле объекта в начале процедуры ОбработкаПроведения добавьте выход из процедуры, если флаг установлен.
  5. Включите ваш документ в состав типов реквизита обработки КорректировкаДвижений.

Соблюдение этих правил позволит вам избежать «исчезновения» ручных правок и обеспечит корректную работу документа в рамках типового функционала 1С:Бухгалтерии.

← На главную