В процессе работы с 1С часто возникает ситуация, когда в уже проведенном документе необходимо исправить какую-либо информацию, не затрагивающую бухгалтерский или управленческий учет. Например, нужно поправить комментарий, указать другого ответственного или изменить аналитический признак, который не влияет на движения по регистрам. Перепроведение документа в таких случаях нежелательно, так как может изменить существующие проводки, нарушить последовательность документов или просто занять много времени. Разберемся, как можно отредактировать и сохранить документ, сохранив его движения неизменными.
Прежде чем переходить к решениям, давайте проясним ключевой момент, который упоминается в обсуждении. Когда вы работаете с документом, есть два основных действия:
Таким образом, наша задача сводится к тому, чтобы записать изменения в реквизитах, но не запускать процедуру проведения повторно. Рассмотрим, как это можно сделать.
Наиболее надежный и контролируемый способ — это внесение изменений с помощью кода. Этот метод дает максимальную гибкость и позволяет обойти многие стандартные ограничения платформы. Разберем основной прием.
Использование флага ОбменДанными.Загрузка
Это самый мощный и часто используемый способ. Установка свойства ОбменДанными.Загрузка в значение Истина перед записью объекта сообщает системе, что операция выполняется в режиме загрузки данных (например, при обмене между базами). В этом режиме отключается множество стандартных проверок, обработчиков событий и бизнес-логики, включая автоматическое перепроведение.
Посмотрим на пример кода. Допустим, нам нужно изменить комментарий в документе "Реализация товаров и услуг".
// Сначала нужно получить ссылку на нужный документ
// Например, мы ее нашли запросом или получили из формы
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000-001234", ТекущаяДата());
// Получаем объект документа из ссылки
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Изменяем нужный реквизит
ДокументОбъект.Комментарий = "Новый комментарий, который не влияет на проводки.";
// Устанавливаем флаг режима загрузки
ДокументОбъект.ОбменДанными.Загрузка = Истина;
// Записываем объект в режиме "Запись", а не "Проведение"
// Это сохранит изменения в реквизитах, но не будет выполнять модуль проведения
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Важный момент: этот метод позволяет записать объект, сохраняя его признак Проведен = Истина, но не выполняя саму процедуру проведения. В результате реквизиты обновятся, а старые движения по регистрам останутся нетронутыми.
Иногда, как подсказывают на форуме, можно обойтись и без установки флага ОбменДанными.Загрузка, просто выполнив метод Записать(). Однако успех этого подхода сильно зависит от конкретной конфигурации. Во многих типовых решениях в обработчиках событий (например, ПередЗаписью) встроены проверки, которые принудительно запускают перепроведение при любой записи проведенного документа. Режим загрузки как раз и помогает обойти такие проверки.
Что если пользователь хочет внести правки прямо в форме документа, без привлечения программиста? Поведение системы в этом случае зависит от настроек самой формы документа.
Ключевую роль здесь играет свойство формы ПриЗаписиПерепроводить. Программист, разрабатывая конфигурацию, может установить это свойство для формы документа.
ПриЗаписиПерепроводить установлено в Истина, любая попытка записать изменения в форме проведенного документа (даже по кнопке "Записать", а не "Провести и закрыть") вызовет его полное перепроведение. Это сделано для обеспечения целостности данных.Таким образом, если вы хотите просто поправить комментарий, откройте документ, внесите правку и попробуйте нажать кнопку "Записать". Если документ после этого не начал перепроводиться, значит, ваша задача решена.
Несмотря на кажущуюся простоту, изменение проведенных документов "в обход" стандартных механизмов несет в себе серьезные риски. Прежде чем применять описанные методы, проанализируйте возможные последствия.
1. Нарушение последовательностей документов
В 1С существует механизм последовательностей, который гарантирует хронологический порядок проведения документов, важных для учета (например, партионного или складского). Даже простая запись документа методом Записать() может сдвинуть его позицию в последовательности (границу последовательности). Это, в свою очередь, может привести к тому, что при последующем восстановлении последовательности система посчитает учет некорректным и потребует перепроведения большого числа документов.
2. Пользовательские проверки в обработчиках событий
Как верно отмечено в обсуждении, в модуле объекта документа (в обработчиках ПередЗаписью или ПриЗаписи) может быть прописана дополнительная логика. Например, проверка:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Если пытаются просто записать уже проведенный документ
Если Проведен И РежимЗаписи = РежимЗаписиДокумента.Запись Тогда
// и это не режим загрузки
Если НЕ ОбменДанными.Загрузка Тогда
Сообщить("Запись проведенного документа без перепроведения запрещена!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В таком случае простой вызов ДокументОбъект.Записать() приведет к ошибке, и только использование флага ОбменДанными.Загрузка = Истина поможет обойти эту защиту.
3. Включенное версионирование объектов
Если в вашей информационной базе включен механизм версионирования, то каждое сохранение документа, даже без перепроведения, создаст новую его версию. Это может быть полезно для отслеживания истории изменений, но также может привести к "засорению" истории версий незначительными правками, такими как исправление опечатки в комментарии.
4. Нарушение целостности данных — главный риск
Самое главное — вы должны быть на 100% уверены, что изменяемый реквизит действительно нигде не используется при формировании движений. Если вы измените реквизит, который косвенно или напрямую влияет на проводки (например, "Склад", "Организация", "Договор контрагента", "Статья затрат"), то возникнет рассинхронизация. Данные в документе будут одни, а его движения в регистрах будут соответствовать старым данным. Обнаружить такую ошибку позже может быть очень сложно, и она может привести к серьезным проблемам в учете.
Вывод: изменять таким способом можно только "безопасные" реквизиты, такие как "Комментарий", "Ответственный" или специально созданные дополнительные реквизиты, которые используются только для аналитики и отчетов, но не для проводок.