История изменений документа 1С. История табличной части документа.

10530
9

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

В сети существует интересный продукт, предназначеный для фиксации изменений в программе «Бизнес-Плюс:Журнал изменений», который стоит на момент написания статьи 12 000 рублей. Любой уважающий себя 1С-ник должен для начала самостоятельно попробовать написать что то подобное :)

Вы можете сказать, а чем меня не устраивает встроенный журнал регистрации, который по одному документу формируется 5 минут :) Этим и не устраивает. регистрация изменений в шапке документов, думаю, понятна каждому, а вот регистрация изменений в табличных частях различных документов немного сложнее. задача состояла в том, чтобы зафиксировать всю историю изменений в произвольной табличной части произвольного документа или справочника 1С версии 8.

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

Создаем справочник «История изменений»

Для начала создал элементарный справочник «ИсторияИзменений»:

Справочник история изменений
Справочник история изменений

Реквизиты:
Объект — ДокументСсылка, СправочникСсылка (По этому объекту в элементе справочника будет хранится история)

Табличная часть — изменения:
ДатаЗаписи — Дата (дата и время записи изменения)
НазваниеТабличнойЧасти — Строка (длина 50, Название табличной части по которой требуется фиксировать изменения)
ТаблицаИзменений — Строка (длина неограничена, тут будет хранится наша таблица значений)
Автор — Пользователь (кто сделал изменения)

Справочник готов, теперь необходимо поработать с его модулем, а именно:
1. Создать процедуру, которая будет фиксировать изменения в элементе справочника
2. Создать функции для получения предыдущего состояния табличной части, функцию для проверки изменилась ли табличная часть или нет, функцию для записи изменений
3. Создать интерфейсную часть, то есть форму списка и форму элемента справочника

Весь код модуля объекта справочника «ИсторияИзменений» приведен ниже с комментариями. Смысл обработки будет заключаться в следующем: При записи объекта мы будем фиксировать табличную часть, преобразовывать ее в таблицу значений, преобразовывать таблицу значений в строку и хранить в справочнике.

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

Код функции указанной ниже размещаем в любом общем модуле. именно эта функция будет вызываться из модуля формы любого документа или справочника, из процедуры «ПослеЗаписи» с требуемыми параметрами.

Создаем форму элемента справочника «История изменений»

Рисуем форму элемента:

История изменений 1С
История изменений 1С

Форма элемента справочника история изменений выглядит в начальном виде именно так. В поле старые значения будут показываться предыдущие значения, а в поле новые значения… ну вы догадались. В эти поля являются табличным полями с названиями соответственно «ТаблицаСтароеЗначение» и «ТаблицаНовоеЗначение».

А теперь код формы:

Вот и все. Теперь для фиксации изменений любой табличной части, любого документа или элемента справочника достаточно вставить функцию «ЗафиксироватьИзмененияТабличнойЧасти» с необходимыми параметрами.

Пример фиксации изменений табличной части для любого документа в котором есть табличная часть «Работы»:

Этот код вставляется в процедуру модуля формы «ПослеЗаписи()» документа или элемента справочника как показано выше.
Для просмотра изменений в табличных частях документа — этого достаточно. На каждый объект будет создаваться один отдельный элемент справочника, в котором и хранятся изменения.

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

9 КОММЕНТАРИИ

  1. Добрый день.
    Я начинающий пользователь. Просмотрел Вашу тему История изменений документа 1С. История табличной части документа. Но никак не могу поставить к себе в конфигурацию. Документ в справочнике создается, но он пустой, содержит только ссылку на объект. Вы не могли бы помочь? Не могли бы Вы вставить верные данные в Ваш код, т.е. в самом низу Вы написали ЗафиксироватьИзмененияТабличнойЧасти(Работы, «Работы», ЭтотОбъект.Ссылка);
    но в остальных кодах значния не заполнены.
    Мне необходимо фиксировать изменения табличной части «Товары» документа «ЗаказПокупателя»

  2. Все сделали как написано. История изменения документа где смотреть? в форме элемента? Как? Может поделитесь готовой рабочей cf? Заранее спасибо

  3. красным выводятся строки удаленные из табличной части, серым отображаются ячейки реквизитов строки измененные в табличной части.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here