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