Хранилище 1С. Просмотр истории хранилища обработкой


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

Адрес проекта на GitHub: https://github.com/BlizD/HistoryStorage

Выгрузка таблиц из хранилища выполняется программой Tool_ 1 C D (автор Валерий Агеев дал разрешение на использование). 

 

Спасибо, Александру за доп сведения:

на версии платформы 8.3.5.1383 у меня не заработало правильно. Файл читался, но типы "дата",

"булево" загружались строкой. Пришлось сделать парсинг строк.

UPDATE 270118:  

* Исправил ошибку при получении строки родителя по OBJID. Оказывается он может повторяться, если старый объект был удален, то для нового может будет этот же OBJID.

UPDATE 241217:  

* В макет классов добавлены объекты: HTTPСервис

UPDATE 081217:  

* В макет классов добавлены объекты: общие реквизиты.

UPDATE 090817:  

* В обработку добавлена колонка "Версия конфигурации".
* В макет классов добавлены объекты: РегистрРасчета, Форма списка регистра расчета, Перерасчет регистра расчета, 
Форма регистра бухгалтерии, НумераторДокументов.
* Добавлен реквизит "Вывести служебную таблицу" по этой таблице, можно определить класс объекта.
* Убраны лишние закомментированные блоки.

 

UPDATE 070717:  

Можно использовать и без копирования файла хранилища, это безопасно, по заверению тех кто уже давно использует Tool_1CD:

Артур Аюханов (artbear): А почему не пользоваться не монопольным доступом утилиты? 
я лично уже несколько лет юзаю этот режим с боевыми хранилищами для gitsync, проблем ни разу не было 🙂

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

 

Пример работы:

В публикации файл выгрузки базы DT.

 

 

Старое описание

ВНИМАНИЕ! Используйте данную обработку в качестве эксперимента. 

ВНИМАНИЕ! Из за того, что выгрузка таблиц происходит не в монопольном режиме, поэтому лучше копируйте файл хранилище 1cv8ddb.1CD в другое место и просматривайте его. 

Из справки к Tool_1 C D
.

d:CloudDevTasksTool_1CD>ctool_1cd /?
cTool_1CD (с) 2009-2024 awa

-ne
-NotExclusively
открыть базу не монопольно (Это небезопасно, возможны ошибки!).

 

 

 

 

39 Comments

  1. JohnyDeath

    А почему штатными средствами не обошлись?

    Например вот так: https://github.com/Stepa86/1C-Gitter/blob/master/src/CommonModules/ПакетныйРежим/Ext/Modul­e.bsl#L2

    Reply
  2. BlizD

    (1)

    А почему штатными средствами не обошлись?

    Например вот так: https://github.com/Stepa86/1C-Gitter/blob/master/src/CommonModules/ПакетныйРежим/Ext/Modul­­e.bsl#L2

    До этого и обходился штатными средствами, но для конфигураций в которых указан режим совместимости 8.2.13 и ниже

    отчет выдается в другом формате он мне не подходил в нем нет нужных мне сведений:

    нет версии, нет пользователя, нет даты версии, нет признака (добавлен, изменен, удален) или не было комментария.

    + сведений группируются по объектам метаданных.

    Возможно, что то делал не так, но не получилось сформировать нужный мне отчет.

    Reply
  3. artbear

    А почему не пользоваться не монопольным доступом утилиты?

    я лично уже несколько лет юзаю этот режим с боевыми хранилищами для gitsync, проблем ни разу не было 🙂

    Reply
  4. BlizD

    (3)

    А почему не пользоваться не монопольным доступом утилиты?

    я лично уже несколько лет юзаю этот режим с боевыми хранилищами для gitsync, проблем ни разу не было 🙂

    Должен был предупредить, тех кто собирается использовать.

    У меня просто такой практики еще нет, поэтому доверяюсь описанию к Tool_1CD.

    Reply
  5. artbear

    Да и не я один юзаю gitsync в течение нескольких лет,

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

    Reply
  6. BlizD

    (5)

    Да и не я один юзаю gitsync в течение нескольких лет,

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

    Спасибо, поправил описание.

    Reply
  7. JohnyDeath

    Соглашусь с artbear: Tool_1CD корректно работает с файлом боевого хранилища уже давно и не на одном проекте.

    Можно и не заморачиваться на постоянное копирование

    Reply
  8. gubanoff

    (0) Работает. К тому же быстро работает. Очень крутая вещь. По задумке 1С, это можно получить парсингом файла по истории хранилища, который формируется при пакетном запуске конфигуратора:

    /ConfigurationRepositoryReport <имя файла> [-NBegin <номер версии>] [-NEnd <номер версии>] [-GroupByObject] [-GroupByComment] — построение отчета по истории хранилища.
    

    но беда в том, что этот отчет формируется некорректно — всегда с группировкой по объектам, а не по комментариям (если я правильно помню, я даже посылал такую ошибку в 1С).

    Не знал, что Tool_1CD умеет работать в командной строке, это тоже полезно было. Будем брать на вооружение.

    Reply
  9. BlizD

    (8)

    Александр, спасибо за отзыв.

    но беда в том, что этот отчет формируется некорректно — всегда с группировкой по объектам, а не по комментариям (если я правильно помню, я даже посылал такую ошибку в 1С).

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

    А вот для тех, что в режиме совместимости 8.2.13 и ниже то там да беда.

    Reply
  10. artbear

    (8)

    Не знал, что Tool_1CD умеет работать в командной строке, это тоже полезно было. Будем брать на вооружение.

    Эту возможность @awa (Валерий Агеев) по нашим просьбам давно добавил, сначала даже в GUI-версию

    Reply
  11. Fatov_DI

    (10) Извиняюсь за оффтоп, а эта программка случайно не может захватывать объекты в хранилище под определенным пользователем?

    Reply
  12. BlizD

    (11)

    Добрый день, Дмитрий.

    Извиняюсь за оффтоп, а эта программка случайно не может захватывать объекты в хранилище под определенным пользователем?

    Нет, такого функционала в ней не заложено.

    Reply
  13. Tavalik

    Спасибо. Возникла подобная задача, очень кстати подвернулась ваша конфигурация. С некоторыми допилами обработка заработала на нашем проекте.

    Что хотелось бы добавить:

    1. Почему-то вы не считываете версию конфигурации и метку из истории хранилища.

    2. Если решение в виде конфигурации, то разумно было бы добавить подсистему, роль (не «ПолныеПрава», а на запуск обработки). В общем оформить в виде готового к объединению и внедрению решения. Я добавлял еще регистр сведений для хранения истории, регламентное задание для обновления регистра сведений по истории хранилища, подсистему, константы, роли.

    3. Ловлю ошибки вида:

    Ошибка! Не найдена строка в «мТЗИменаКлассов» для CLASSID = a2cb086c-db98-43e4-a1a9-0760ab048f8d

    Ошибка! Не найдена строка в «мТЗИменаКлассов» для CLASSID = f2de87a8-64e5-45eb-a22d-b3aedab050e7

    Ошибка! Не найдена строка в «мТЗИменаКлассов» для CLASSID = 274bf899-db0e-4df6-8ab5-67bf6371ec0b

    Ошибка! Не найдена строка в «мТЗИменаКлассов» для CLASSID = d3b5d6eb-4ea2-4610-a3e2-624d4e815934

    4. Уж извините, что придираюсь, но хотелось бы некой чистоты кода. Я имею в виду удаление отладочных комментариев, описание к экспортным процедурам и т. д. Например, вот это:

        #Если Тромбон тогда
    ТЗИзФайла = Новый ТаблицаЗначений;
    #Конецесли

    Что за тромбон, простите? Я что-то не знаю в синтаксисе 1С? 🙂

    Но в целом, все работает. Конечно, ставлю звездочку.

    Reply
  14. BlizD

    (13)

    Добрый день, Виталий.

    Спасибо за отзыв.

    1. Почему-то вы не считываете версию конфигурации и метку из истории хранилища.

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

    2. Если решение в виде конфигурации, то разумно было бы добавить подсистему, роль (не «ПолныеПрава», а на запуск обработки). В общем оформить в виде готового к объединению и внедрению решения. Я добавлял еще регистр сведений для хранения истории, регламентное задание для обновления регистра сведений по истории хранилища, подсистему, константы, роли.

    Согласен с Вами, но данное решение не планировалось как готовое к объединению с чем то. Данная загрузка используется в конфигурации «Управление задачами» https://infostart.ru/public/552480/

    3. Ловлю ошибки вида:

    Это ошибки означают, что в макете «ИменаКлассов» нет записи для CLASSID.

    Можете сказать из какой конфигурации такие ошибки появляются?

    Если есть возможность, то скиньте конфигурацию и добавлю запись в макет.

    4. Уж извините, что придираюсь, но хотелось бы некой чистоты кода. Я имею в виду удаление отладочных комментариев, описание к экспортным процедурам и т. д. Например, вот это:

    Как вариант, могу выложить на Github данную разработку и там через Pull request исправите то, о чем описываете.

    Что за тромбон, простите? Я что-то не знаю в синтаксисе 1С? 🙂

    Но в целом, все работает. Конечно, ставлю звездочку.

    Что касается Тромбон, данный подход был взять из мастер группы профессионального программирования от Евгения Гилева и Насипова Фарита.

    Данной инструкции препроцессора в 1с точно нет, поэтому весь код который обрамлен этой конструкцией будет удален в режиме исполнения. Но при написании кода, данный подход позволяет избежать ошибок синтаксических, т.к. становятся доступны методы вызываемые через точку. Чаще всего данную конструкцию удобно использовать в подписках на событиях, там есть Источник, чтобы обратиться к его методам или свойствам достаточно вставить такую конструкцию:

    #Если Тромбон Тогда
    Источник = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    #Конецесли
    Reply
  15. kiruha

    (14)


    Что касается Тромбон, данный подход был взять из мастер группы профессионального программирования от Евгения Гилева и Насипова Фарита.

    Данной инструкции препроцессора в 1с точно нет, поэтому весь код который обрамлен этой конструкцией будет удален в режиме исполнения. Но при написании кода, данный подход позволяет избежать ошибок синтаксических

    Мы пишем

    Если Ложь Тогда
    Источник = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    Конецесли

    Без Тромбона ) и сворачивается

    Reply
  16. BlizD

    (15)

    С тромбоном всегда веселее 🙂

    Reply
  17. Tavalik

    (14)

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

    Я имею в виду версию конфигурации поставщика. Она есть в истории хранилища, но нет в обработке.

    Можете сказать из какой конфигурации такие ошибки появляются?

    УПП с большим числом доработок. Но я так понимаю, сама конфигурация не обязательна. Можно добавить новые объекты во все возможные ветки конфигурации и поместить в хранилище.

    Данной инструкции препроцессора в 1с точно нет, поэтому весь код который обрамлен этой конструкцией будет удален в режиме исполнения

    Интересный метод. Спасибо. Я обычно скрываю подобный код под комментарием.

    Reply
  18. BlizD

    UPDATE 090817:

    * В обработку добавлена колонка «Версия конфигурации».

    * В макет классов добавлены объекты: РегистрРасчета, Форма списка регистра расчета, Перерасчет регистра расчета,

    Форма регистра бухгалтерии, НумераторДокументов.

    * Добавлен реквизит «Вывести служебную таблицу» по этой таблице, можно определить класс объекта.

    * Убраны лишние закомментированные блоки.

    Reply
  19. BlizD

    (13)

    1. Почему-то вы не считываете версию конфигурации и метку из истории хранилища.

    Добавил.

    3. Ловлю ошибки вида:

    Добавил в макет классов новые классы, теперь ошибки должны уйти.

    4. Уж извините, что придираюсь, но хотелось бы некой чистоты кода. Я имею в виду удаление отладочных комментариев, описание к экспортным процедурам и т. д. Например, вот это:

    Убрал часть закомментированных блоков, теперь должно быть чище немного.

    Reply
  20. AKnyazkov

    (14)

    Добрый день, вместо Тромбон (что режет глаз) лучше писать:

    #Если Клиент И Не Клиент Тогда



    #КонецЕсли

    Reply
  21. BlizD

    (20)

    Добрый день, вместо Тромбон (что режет глаз) лучше писать:

    #Если Клиент И Не Клиент Тогда



    #КонецЕсли

    Добрый день, Алексей.

    Тут дело привычки, просто тромбон это гарантированное имя, по которому код точно не выполнится.

    А вот инструкция препроцессора:

    #Если Клиент И Не Клиент Тогда 

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

    Reply
  22. AKnyazkov

    (21)

    Добрый день!

    У меня такая конструкция даже добавлена в шаблон под названием «Заглушка», чтобы никто глазами не спотыкался, можно добавить комментарий ), а по поводу несуществующих команд препроцессору, вдруг их перестанут поддерживать и они станут вызывать ошибку (гипотетически) ?

    Про привычки — согласен, люди ко всему привыкают )

    Reply
  23. BlizD

    (22)

    Добрый день, Алексей.

    по поводу:

    вдруг их перестанут поддерживать и они станут вызывать ошибку (гипотетически) ?

    Сомневаюсь, что такое случиться, это будет означать, что могут быть проблемы и по другим конструкция препроцессора (если кто то в коде указал неправильное имя конструкции например &НаКлиенте1), что повлечет проблемы. Думаю вряд ли фирма 1с, пойдет на такой шаг.

    Но даже если такое случиться, слово Тромбон отлично подходит для глобальной замены во всей конфигурации =)

    Reply
  24. gubanoff
    Reply
  25. BlizD

    UPDATE 081217:

    * В макет классов добавлены объекты: общие реквизиты.

    Reply
  26. BlizD

    (24)

    Добрый день, Александр.

    Спасибо за отзыв, приятно, что обработка Вам пригодилась.

    1. Добавил имя класса HTTPСервис

    0fffc09c-8f4c-47cc-b41c-8d5c5a221d79 HTTPСервис

    Подскажите как точно называется HTTPСервис? Он также проходит и при типовой выгрузке 1с?

    2. Не хватает имени класса ОбщийРеквизит, но у меня такого пока нет, поэтому и проблем нет.

    Да, с этим уже столкнулся где то 2-3 недели назад, все некогда было обновить обработку. Спасибо.

    что сделал — добавил параметры

    -BlobToFile yes

    и

    -ParseBlob no

    Подскажите, куда Вы их добавили? Тоже добавлю в основную версию.

    6. Для хранилища с числом версий около 3000 выгрузка-загрузка истории с выделением BLOB файлов занимает около 5 минут. Без выделения blob будет быстрее, но нужно следить, чтобы памяти хватало на сервере 1С. В связи с этим самый печальный вывод — для оперативной работы в онлайн-режиме это медленно (даже для маленьких хранилищ). Поэтому ряд бонусов от истории хранилища невозможно использовать. Остается вариант с регламентной загрузкой по расписанию, но это не онлайн-режим.

    Самое правильное было ускорение, это если бы утилита Tool_1CD могла накладывать отбор на версии, которые надо выгружать.

    У нас более 9000 версий, загружается через регл. задание, но для нас 5-10 минут это не проблема.

    на версии платформы 8.3.5.1383 у меня не заработало правильно. Файл читался, но типы «дата», «булево» загружались строкой. Пришлось сделать парсинг строк.

    Добавлю в описании.

    Reply
  27. BlizD

    (24) Александр,

    выложил на Github конфигурацию: https://github.com/BlizD/HistoryStorage

    Reply
  28. gubanoff

    (26)

    Подскажите как точно называется HTTPСервис? Он также проходит и при типовой выгрузке 1с?

    — не понял вопрос, это объект в ветке Общие — HTTP-сервисы, появились в платформе 8.3.

    Подскажите, куда Вы их добавили? Тоже добавлю в основную версию.

    добавил в функцию ВыгрузитьТаблицыХранилищаВФайлы, получилось вот так:

      ДобавитьВКомандуКлючЗначение(ТекстКоманды,,ИмяФайлаХранилища);
    ДобавитьВКомандуКлючЗначение(ТекстКоманды,»-ne»);
    ДобавитьВКомандуКлючЗначение(ТекстКоманды,»-ex»,КаталогВыгрузкиФайлов);
    ДобавитьВКомандуКлючЗначение(ТекстКоманды,»USERS,HISTORY,VERSIONS,OBJECTS»);
    Если ОбщиеПараметры.мХранилищеКонфигурации.ВыгружатьBLOBОтдельно Тогда
    ДобавитьВКомандуКлючЗначение(ТекстКоманды,»-BlobToFile yes»);
    ДобавитьВКомандуКлючЗначение(ТекстКоманды,»-ParseBlob no»);
    КонецЕсли;
    

    Показать

    Самое правильное было ускорение, это если бы утилита Tool_1CD могла накладывать отбор на версии, которые надо выгружать.

    согласен, но думаю, навряд ли автор это доработает.

    Reply
  29. gubanoff

    (26)

    У нас более 9000 версий, загружается через регл. задание, но для нас 5-10 минут это не проблема.

    подскажите, для чего используете историю? При регламентной загрузке у меня только такие идеи к использованию:

    1. самые часто/редко меняемые объекты — определять, нужен ли рефакторинг.

    2. количество версий за период по программистам — для определения тренда скорости.

    В онлайн-режиме можно было это дело связать с системой учета задач и ошибок.

    Reply
  30. BlizD

    (28)

    Александр,

    — не понял вопрос, это объект в ветке Общие — HTTP-сервисы, появились в платформе 8.3.

    Есть типовая (платформенная) выгрузка истории изменений из хранилища. И есть вот эта альтернативная выгрузка.

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

    Типовая выгрузка это примерно вот такая строка запуска конфигуратора с ключами:

    «C:Program Files (x86)1cv88.3.9.2170in1cv8.exe» DESIGNER  /F «D:Storage_transitKons» /N «UserStorage» /P «123» /ConfigurationRepositoryF «D:StorageKons» /ConfigurationRepositoryN «UserStorage» /ConfigurationRepositoryP «123» /ConfigurationRepositoryReport «C:\TempStorageHistory_08122017_114726.mxl» -NBegin «183»
    Reply
  31. BlizD

    (29)

    подскажите, для чего используете историю? При регламентной загрузке у меня только такие идеи к использованию:

    1. самые часто/редко меняемые объекты — определять, нужен ли рефакторинг.

    2. количество версий за период по программистам — для определения тренда скорости.

    Это используется в конфигурации Управление задачами https://infostart.ru/public/552480/

    Если в двух словах, то измененные метаданные связываются с конкретными задачами.

    А задачи в свою очередь собираются в релиз, в документ выпуск релиза.

    В котором уже видно, какие метаданные необходимо перенести в рабочую базу по этому релизу.

    Вот пример видео на эту тему:

    https://www.youtube.com/watch?v=XzWCFyrIPcI

    Reply
  32. gubanoff

    (30)

    Есть типовая (платформенная) выгрузка истории изменений из хранилища. И есть вот эта альтернативная выгрузка.

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

    как использовать типовую выгрузку? Я не в курсе этого. Если речь об отчете по истории хранилища, так в нем нет идентификаторов.

    Reply
  33. BlizD

    (32)

    как использовать типовую выгрузку? Я не в курсе этого. Если речь об отчете по истории хранилища, так в нем нет идентификаторов.

    Да, речь об отчете.

    Неправильно выразился, да там нет идентификаторов.

    Скажу по другому, важно, чтобы в альтернативной выгрузке было ровно такое же имя для метаданных, что и в типовой.

    Чтобы не получилось так, что в типовой объект называется «HTTP-Сервис», а в альтернативной «HTTPСервис» т.е. без дефиса.

    Reply
  34. gubanoff

    (33) да, так и называется HTTPСервис 🙂

    Reply
  35. BlizD

    (34)

    Спасибо добавлю в обработку чуть позже

    Reply
  36. BlizD

    UPDATE 241217:

    * В макет классов добавлены объекты: HTTPСервис

    Reply
  37. BlizD

    UPDATE 270118:

    * Исправил ошибку при получении строки родителя по OBJID. Оказывается он может повторяться, если старый объект был удален, то для нового может быть этот же OBJID.

    Reply
  38. zekrus

    Доброе утро!

    Тема весьма актуальная.

    Нужно кое-что поправить:

    1. Фильтрация нужна по дате.

    2. Отчет о проделанной работе сотрудника

    (выводить комментарии и метки за период).

    3. Необходима кнопка «Печать».

    4. Множественный выбор каталогов хранилищ.

    С уважением

    Reply
  39. BlizD

    (38)

    Доброе утро, Николай.

    По поводу пожеланий к обработке.

    Большую часть описанных вещей можно получить в конфигурации:

    * Управление задачами: Канбан доска (https://infostart.ru/public/552480/)

    В данной конфигурации необходимо открыть справочник «История конфигурации».

    Там можно и отфильтровать по дате и вывести список и отфильтровать по конфигурациям.

    Если все же кто то хочет доработать именно эту обработку то тоже не против.

    Обработка выложена на Github любой желающий может ее доработать.

    * Адрес проекта на GitHub: https://github.com/BlizD/HistoryStorage

    Как доработать обработку, можно почитать вот тут:

    * Github и 1С. Пошаговая инструкция на конкретном примере (https://infostart.ru/public/691382/)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *