Изменение документа без перепроведения. Когда это нужно и как это сделать?

Иногда возникает необходимость внести незначительные изменения в уже проведенный документ. "Незначительные" в данном контексте означает такие изменения, которые не влияют на движения регистров (и вообще на любые процедуры, выполняемые в процессе проведения документа). Самым простым примером может служить изменение поля "Комментарий".

автор статьи: Фёдор Езеев
опубликовано: февраль 2003

источник: http://hare.ru/

Иногда возникает необходимость внести незначительные изменения в уже проведенный документ. "Незначительные" в данном контексте означает такие изменения, которые не влияют на движения регистров (и вообще на любые процедуры, выполняемые в процессе проведения документа). Самым простым примером может служить изменение поля "Комментарий".

Однако движку V7 абсолютно безразлично, влияют ли внесённые в документ изменения на состояние регистров, или нет. Если документ был изменен – его надо перепровести. Ну а где проведение задним числом, там и восстановление границы последовательности, и прочие маленькие радости администраторов баз данных V7.

В статье описан технический прием, позволяющий обойти обозначенную проблему.

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

Процедура ПриВводеКомментария()

   ПриЗаписиПерепроводить(0);
   Записать();
   ПриЗаписиПерепроводить(1);

КонецПроцедуры

Так же нужно не забыть проверить состояние документа перед изменением нашего поля. Если документ уже был изменен – очевидно, записывать его без перепроведения было бы некорректно. Это тоже просто:

Процедура ПриВводеКомментария()

   НужноПерепроводить=?(Модифицированность()=0,0,1);

   Если НужноПерепроводить=0 Тогда
      ПриЗаписиПерепроводить(0);
      Записать();
      ПриЗаписиПерепроводить(1);
   КонецЕсли;

КонецПроцедуры

К сожалению, "просто" не всегда означает "правильно". Такая схема не работает, поскольку при изменении любого реквизита движок V7 сразу же ставит флажок модифицированности. То есть в нашей процедуре метод Модифицированность() вернет единицу в любом случае.

Но и этого можно избежать, правда, принеся в жертву наглядность. Поле для редактирования реквизита заменяем на текстовое поле, которое изображает текущее состояние реквизита (в поле "формула" нужно занести идентификатор реквизита, в нашем случае "Комментарий"). И рядом добавляем кнопку, на которую вешаем нашу процедуру.

Но нам еще нужно будет организовать изменение реквизита. Окончательный результат:

Процедура ВыборКомментария()

   НужноПерепроводить=?(Модифицированность()=0,0,1);

   НовыйКомментарий=СокрЛП(Комментарий);
   ВвестиСтроку(НовыйКомментарий,"Введите комментарий",400,1);
   Если СокрЛП(Комментарий)=СокрЛП(НовыйКомментарий) Тогда
      Возврат;
   КонецЕсли;
   Комментарий=СокрЛП(НовыйКомментарий);

   Если НужноПерепроводить=0 Тогда
      ПриЗаписиПерепроводить(0);
      Записать();
      ПриЗаписиПерепроводить(1);
   КонецЕсли;

КонецПроцедуры

Таким же образом можно разделаться с реквизитами любого типа: процедура будет такой же, только блок выбора значения для реквизита будет немного различаться (а если подойти творчески, то можно написать универсальную процедуру, которая сама определяет тип и выдаёт нужный диалог).

Кроме достоинства (оно действительно работает), у описанной техники есть и недостатки. Их два:

  1. Уже упоминавшаяся потеря привычной наглядности. Частично ее можно избежать, заменив текст на поле реквизита, недоступное для редактирования. Особенно хорошо это работает для флажков, чисел и агрегатных типов данных.
  2. Если таких "неважных" реквизитов в документе несколько, и пользователю требуется изменить их все, то на сервер "обрушится" несколько последовательных сохранений одного и того же документа.

Начать дискуссию