Автор - Фёдор Езеев февраль 2003
Стилистическая коррекция - Никита Зайцев
Иногда возникает необходимость внести незначительные изменения в уже проведенный документ.
"Незначительные" в данном контексте означает такие изменения, которые не влияют на движения
регистров (и вообще на любые процедуры, выполняемые в процессе проведения документа). Самым простым
примером может служить изменение поля "Комментарий".
Однако движку V7 абсолютно безразлично, влияют ли внесённые в документ изменения на состояние регистров,
или нет. Если документ был изменен его надо перепровести. Ну а где проведение задним
числом, там и восстановление границы последовательности, и прочие маленькие радости администраторов баз
данных V7.
В статье описан технический прием, позволяющий обойти обозначенную проблему.
Для решения, очевидно, нужно использовать методы ПриЗаписиПерепроводить() и
Записать(). Пробуем сделать по-простому: на элемент формы "Комментарий" вешаем
функцию ПриВводеКомментария(), в которой написано следующее:
Процедура ПриВводеКомментария()
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецПроцедуры
|
Так же нужно не забыть проверить состояние документа перед изменением нашего поля. Если документ
уже был изменен очевидно, записывать его без перепроведения было бы некорректно.
Это тоже просто:
Процедура ПриВводеКомментария()
НужноПерепроводить=?(Модифицированность()=0,0,1);
Если НужноПерепроводить=0 Тогда
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецЕсли;
КонецПроцедуры
|
К сожалению, "просто" не всегда означает "правильно". Такая схема не работает, поскольку при
изменении любого реквизита движок V7 сразу же ставит флажок модифицированности. То есть в нашей
процедуре метод Модифицированность() вернет единицу в любом случае.
Но и этого можно избежать, правда, принеся в жертву наглядность. Поле для редактирования реквизита
заменяем на текстовое поле, которое изображает текущее состояние реквизита (в поле "формула" нужно
занести идентификатор реквизита, в нашем случае "Комментарий"). И рядом добавляем кнопку, на которую
вешаем нашу процедуру.
Но нам еще нужно будет организовать изменение реквизита. Окончательный результат:
Процедура ВыборКомментария()
НужноПерепроводить=?(Модифицированность()=0,0,1);
НовыйКомментарий=СокрЛП(Комментарий);
ВвестиСтроку(НовыйКомментарий,"Введите комментарий",400,1);
Если СокрЛП(Комментарий)=СокрЛП(НовыйКомментарий) Тогда
Возврат;
КонецЕсли;
Комментарий=СокрЛП(НовыйКомментарий);
Если НужноПерепроводить=0 Тогда
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецЕсли;
КонецПроцедуры
|
Таким же образом можно разделаться с реквизитами любого типа: процедура будет такой же,
только блок выбора значения для реквизита будет немного различаться (а если подойти
творчески, то можно написать универсальную процедуру, которая сама определяет тип и
выдаёт нужный диалог).
Кроме достоинства (оно действительно работает), у описанной техники есть и недостатки. Их два:
- Уже упоминавшаяся потеря привычной наглядности. Частично ее можно избежать, заменив текст на
поле реквизита, недоступное для редактирования. Особенно хорошо это работает для флажков, чисел и
агрегатных типов данных.
- Если таких "неважных" реквизитов в документе несколько, и пользователю требуется изменить их
все, то на сервер "обрушится" несколько последовательных сохранений одного и того же документа.
|