Ведение лога изменений документов: структура справочников   

Очень часто бывает необходимо вести логи изменения документов. Кто когда и что правил в документе? С какого компьютера и т.д. Я много раз сталкивался с такой необходимостью, и, в результате был создан почти универсальный алгоритм.

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

После того, как документ был открыт - при записи или при проведении устанавливается флаг.

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

Лог представлен в виде трех справочников: Лог (в него заносятся документы), История (подчиненный справочник: в него заносится кто и когда правил), Запись (подчиненный справочник: хранит сами изменения).

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

Теперь рассмотрим непосредственно все вышеперечисленые моменты.

Для начала - структура справочников:

А теперь я приведу кусок описания структуры метаданных, который касается этих справочников (для краткости ненужные свойства вырезаны):

	- Справочник
		- Идентификатор	"Лог"
		- Синоним
		- Комментарий	"Изменяемые документы"
		- Владелец
		- КоличествоУровней	"1"
		- ДлинаКода	"0"
		- ДлинаНаименования	"0"
		- СерииКодов	"ВПределахПодчинения"
		- ТипКода	"Текстовый"
		- ОсновноеПредставление	"ВВидеНаименования"
		- КонтрольУникальности	"0"
		- АвтоНумерация	"1"
		- ГруппыВпереди	"1"
		- Реквизит
			- Идентификатор	"Док"
			- Синоним
			- Комментарий	"Документ"
			- Тип	"Документ"
			- Вид
			- Длина	"0"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"1"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"НомерДок"
			- Синоним
			- Комментарий
			- Тип	"Число"
			- Вид
			- Длина	"6"
			- Точность	"0"
			- НеОтрицательный	"1"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"ДатаДок"
			- Синоним
			- Комментарий
			- Тип	"Дата"
			- Вид
			- Длина	"0"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"ВремяДок"
			- Синоним
			- Комментарий
			- Тип	"Строка"
			- Вид
			- Длина	"10"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"ВидДок"
			- Синоним
			- Комментарий
			- Тип	"Строка"
			- Вид
			- Длина	"30"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"Автор"
			- Синоним
			- Комментарий
			- Тип	"Справочник"
			- Вид	"Пользователи"
			- Длина	"0"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"Удален"
			- Синоним
			- Комментарий
			- Тип	"Число"
			- Вид
			- Длина	"1"
			- Точность	"0"
			- НеОтрицательный	"1"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
	- Справочник
		- Идентификатор	"История"
		- Синоним
		- Комментарий
		- Владелец	"Справочник.Лог"
		- КоличествоУровней	"1"
		- ДлинаКода	"6"
		- ДлинаНаименования	"0"
		- СерииКодов	"ВПределахПодчинения"
		- ТипКода	"Числовой"
		- ОсновноеПредставление	"ВВидеКода"
		- КонтрольУникальности	"1"
		- АвтоНумерация	"2"
		- ГруппыВпереди	"1"
		- Реквизит
			- Идентификатор	"ДатаПравки"
			- Синоним
			- Комментарий
			- Тип	"Дата"
			- Вид
			- Длина	"0"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"ВремяПравки"
			- Синоним
			- Комментарий
			- Тип	"Строка"
			- Вид
			- Длина	"10"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"АвторИзменений"
			- Синоним
			- Комментарий
			- Тип	"Справочник"
			- Вид	"Пользователи"
			- Длина	"0"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"ПК"
			- Синоним
			- Комментарий
			- Тип	"Строка"
			- Вид
			- Длина	"30"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"Права"
			- Синоним
			- Комментарий
			- Тип	"Строка"
			- Вид
			- Длина	"30"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
	- Справочник
		- Идентификатор	"Запись"
		- Синоним
		- Комментарий
		- Владелец	"Справочник.История"
		- КоличествоУровней	"1"
		- ДлинаКода	"0"
		- ДлинаНаименования	"0"
		- СерииКодов	"ВПределахПодчинения"
		- ТипКода	"Числовой"
		- ОсновноеПредставление	"ВВидеКода"
		- КонтрольУникальности	"1"
		- АвтоНумерация	"2"
		- ГруппыВпереди	"1"
		- Реквизит
			- Идентификатор	"Показатель"
			- Синоним
			- Комментарий
			- Тип	"Строка"
			- Вид
			- Длина	"30"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"Было"
			- Синоним
			- Комментарий
			- Тип	"Строка"
			- Вид
			- Длина	"30"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"
		- Реквизит
			- Идентификатор	"Стало"
			- Синоним
			- Комментарий
			- Тип	"Строка"
			- Вид
			- Длина	"30"
			- Точность	"0"
			- НеОтрицательный	"0"
			- РазделятьТриады	"0"
			- Периодический	"0"
			- Сортировка	"0"
			- Отбор	"0"
			- РучноеИзменение	"1"
			- ИзменяетсяДокументами	"0"
			- Использование	"ДляЭлемента"

 

[1]-[2]-[3]