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

- docs11.jpg (213.35 КБ) 4318 просмотров
Вначале попытаюсь описать самый сложный в реализации момент теории документов - "Критические реквизиты". Если кратко, то это сохранение определенных реквизитов заглавной записи документа сразу после их изменений. При этом могут также сохраняться и некоторые связанные реквизиты в строчной части. Изменения критических реквизитов не откатываются автоматически при закрытии документа без сохранения изменений.
Чтобы было понятнее, приведу примеры критических реквизитов. У нас система не проводная, то есть при сохранении документов не делаются записи в другие служебные таблицы (регистры, проводки и т.п.). Поэтому, чтобы быстро получать отчеты, нужно правильно индексировать базу данных и использовать в некоторых случаях денормализацию. Например, чтобы быстро получить все операции по товару за заданный период времени, нужен индекс по значениям товар+дата+время. Но товары у нас фигурируют в строках накладных, а дата и время в заголовке. Делается денормализация, значения даты и времени документа дублируются в строках. Когда мы создали документ и добавляем туда строки, то все просто, надо присвоить значения соответствующих полей. Но теперь предположим, что у нас уже есть строки в документе и мы меняем его дату. Дата, время документа будут критическими реквизитами. Как только пользователь их изменил, их значения и измененные значения в строках сохраняются в базе данных. Для пользователя это происходит незаметно.
Другой пример критических реквизитов. При выписке накладных изменяется так называемый свободный остаток на складе. Он контролируется, не все пользователи имеют права выписки в минус. Когда пользователь наполняет документ строками, то все просто. Но он может захотеть изменить склад в заголовке накладной. Нам, соответственно, надо сразу сохранить новое значение склада в базе данных, и в той же транзакции пересчитать свободный остаток по старому и новому значению склада. Склад является критичным реквизитом документа.
Или еще пример. Нумерация документов у каждой фирмы своя. Если мы меняем фирму в заголовке документа, то автоматически изменяется номер. Мы сразу сохраняем новые значения фирмы и номера в базе данных, чтобы другие пользователи работали с учетом измененных значений. Фирма является критическим реквизитом документа.
Интерфейс форм документов стандартизирован. Кратко пробегусь.
В верхнем левом углу всегда выводится номер документа, дата и время. В верхнем правом углу статус документа и кнопки для его переключения. Идентификатор (Ид) документа также всегда присутствует в верхнем правом углу окна, по нему можно однозначно идентифицировать запись в базе данных. В форме редактирования строки документа всегда выводятся 2 идентификатора, заглавной записи и самой строки.
Табличная часть всегда на основной закладке. На дополнительных закладках могут располагаться какие-то дополнительные реквизиты заголовка документа.
В нижнем левом углу кнопки переоткрытия документа в отдельном потоке и поиска документа в журнале. Я про них писал ранее. Стандартно во всех документах кнопка Печати с меню, часто кнопка Обработка с меню, кнопка Подбор в товарных документах. На тулбаре кнопки копирования, ввода на основании, перехода на связанные диалоги.
C6/C11, ШВС, tps/btrieve.