четверг, 10 декабря 2009 г.

Версионирование в УПП

При выпуске 22 релиза УПП, 1С сообщила нам следующую новость:
Добавлен механизм "Версионирование"
  • Механизм версионирования объектов используется для аудита изменений объектов информационной базы в разрезе времени и позволяет ответить на вопросы КТО, КОГДА и ЧТО изменил. В качестве версионируемых объектов могут выступать справочники и документы
  • Добавлен отчет "История изменения объектов".С помощью отчета можно сравнить любые две версии объекта друг с другом, а так же открыть любую версию объекта
в принципе такого "шага" навстречу "пользователю" я не ожидал. До этого приходилось обходится исключительно журналом регистрации и бекапами, хотя и существовали отдельные подсистемы версионирования. Вот некоторые из них:
  1. Бизнес-Плюс:Журнал изменений ($);
  2. Подсистема регистрации изменений;
  3. Журнал регистрации изменений;
  4. Подсистема восставноления и регистрации изменени данных;
Конечно же все существующие подсистемы значительно превосходят по функциональности и юзабилити типовую. В типовой ставка сделана на скорость эффективность (как консоль запросов, кому нужно тот допилит напильником). Давай те же посмотрим на типовую подсистему.
Ну в принципе все сделано через подписки на события. При записи документа или справочника (в 1С наверно забыли что к ссылочным типам могут относится ПВХ,ПС,ПВР,БизнесОбъекты и Задачи) определяем из регистра "Настройка версионирования объекта" необходимо ли  данный тип версионировать или нет. Если да тогда:
ЗаписьXML = Новый ЗаписьXML;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписатьXML(ЗаписьXML, Источник, НазначениеТипаXML.Явное);
ЗаписьXML.Закрыть();
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные);
Ну и полученное хранилище отправляется в регистр сведений ВерсииОбъектов.  Конечно все эти действия многократно увеличивают размер базы данных (особенно если использовать повсеместно групповые обработки). Поэтому в 24 релизе  у нас появилось регламентное задание  "СжатиеДанныхВерсионирования".   Где уже происходит сжатие записей ХранилищеДанныхFastInfoSet = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); 
Ну будем считать данные мы собрали.
Теперь стоит их показать.  Однако по идеологии 1С это должен делать только пользователь с административными правами, простые "смертные" не допускаются (видимо не заслужили). Вот с этим я категорически не согласен, поскольку в большинстве случаев инициатором подобного рода разбирательств являются недовольные пользователи, а не администратор. 
Зачем пользователям кого-то умолять просить, когда можно получить информацию самостоятельно?  
Да все очень просто. Интерфейс отчета "ИсторияИзмененийОбъектов" очень недружественный и действительно в нем может разобраться только администратор.
Поэтому мы берем напильник и получаем вот такой отчет.  Снабжаем его соответствующей инструкцией и.....  под шумные аплодисменты отдаем пользователям.

P.S. Весь фокус в кнопке "Восстановление"


UPD: Изменена обработка с учетом изменений конфигурации (см. комментарии). Скачать измененную обработку для 1С 8.1 можно здесь

7 комментариев:

  1. Спасибо огромное за статью!
    Она очень и очень полезна!
    Хотелось, чтоб и обработка History.erf тоже работала, но увы, при сравнении объектов выходит такая ошибка:
    {ВнешнийОтчет.ИсторияИзмененийОбъектов(1375)}: Ошибка при вызове метода контекста (Прочитать): Ошибка разбора XML: - [1,1]
    Фатальная ошибка:
    Invalid document structure
    Пока ЧтениеXML.Прочитать() Цикл
    по причине:
    Ошибка разбора XML: - [1,1]
    Фатальная ошибка:
    Invalid document structure

    Как можно это исправить?

    ОтветитьУдалить
  2. Возможно ли тот ресурс(путь к нему храниться в СтрокаXML), к которому обращается 1С в ЧтениеXML.Прочитать() просто сохранить в файл? Если да, то как получить это файл?

    ОтветитьУдалить
  3. Проблемы происходят после обновления конфигурации. Видимо изменился состав объектов конфигурации. Сейчас доработаем.

    ОтветитьУдалить
  4. В общем проблема в следующем, при записи в переменную СтрокаXML записывает данные в таком формате, что потом невозможно прочитать ЧтениеXML.Прочитать()

    При открытии временного файла (если его в xml сохранять) ругается на символы, которые невозможно прочитать.

    Если надо могу скинуть срин, того, что передается в переменную СтрокаXML ;)

    ОтветитьУдалить
  5. АААА, это я сама ступила, простите, пожалуйста, я перенесла весь блок версионности из УПП в УТ и все было замечательно, кроме одного: я не обратила внимания на один момент, в УПП типовой работа с хранилищем идет через FastInfoSet, а в Вашем варианте через XML, все исправила, и все заработало!!!
    Еще раз приношу извинения за свою глупость.

    ОтветитьУдалить
  6. После изменения конфигурации может быть изменен порядок реквизитов объекта, или вообще изменен состав, поэтому метод ПрочитатьXML() не работал.

    Внесены изменения теперь, версию можно будет восстановить даже если исходный объект не соответствует сохраненному, по структуре реквизитов

    Скачать обработку для 8.1 можно тут http://code.google.com/p/1c-epf/downloads/detail?name=History2.erf&can=2&q=#makechanges

    ОтветитьУдалить
  7. Кстати, после инсталляции системы версионирования в какую-либо конфигурацию, неплохо было бы провести предварительную инициализацию. А именно - зафиксировать текущие версии всех объектов, чтобы было с чем, впоследствии, сравнивать новые версии. Надо такую обработочку прикрутить.

    ОтветитьУдалить