Выгрузка только измененых файлов из хранилища конфигурации

Как и просили меня Артур, Женя и Андрей, я добавил в Tool_1CD новый ключ -dpc. Он позволяет выгрузить в каталог только измененные файлы заданной версии или диапазона версий из хранилища конфигураций. Файлы выгружаются в распакованном виде (так же, как это делает v8Unpack). Заданный каталог не очищается, но, при необходимости, создается. Файлы root, version и versions не создаются, так как, фактически, они не хранятся в хранилище. Функционал не проверен, гарантировать, что выгружаются только измененные файлы, а также, что выгружаются все измененные файлы, не могу.
Взять можно тут bitbucket.org/awa15/tool_1cd/
Подозреваю, что там же можно создать тикет при желании.

Да, вошли, конечно же.

А как определяется что именно было изменено? Данные берутся из таблицы изменений или с кэша хранилища 1с? Если первый вариант, то откуда именно берутся данные для выгрузки, ведь они там в цельном cf-ке лежат? В общем очень интересны подробности

Для того, чтобы определить, что изменилось, пробегаемся по таблице HISTORY, для каждого OBJID рассматриваем только записи с максимальным VERNUM, попадающие в заданный диапазон версий.

  • Если стоит флажок REMOVED, то смотрим, существует ли запись с тем же OBJID и VERNUM меньше, чем нужный диапазон. Если такая запись есть, добавляем OBJID в файл “deleted” и ищем в таблице EXTERNALS записи с тем же самым OBJID и VERNUM, для каждой найденной записи добавляем в файл “deleted” EXTNAME.
  • Если флажок REMOVED не стоит, то:
  1. Смотрим флажок DATAPACKED. Если DATAPACKED истина, то ищем запись с тем же OBJID и VERNUM меньше, чем нужный диапазон. Если такая запись не найдена, распаковываем в файл с именем OBJID содержимое текущей записи. Если такая запись найдена, сравниваем содержимое двух записей, если содержимое разное, распаковываем в файл с именем OBJID содержимое текущей записи.
  2. Ищем в таблице EXTERNALS записи с тем же самым OBJID и VERNUM, если флаг DATAPACKED ложь, пытаемся найти запись с теми же OBJID, EXTNAME и EXTVERID, но, чтобы VERNUM был в пределах заданного диапазона. Если есть запись с DATAPACKED истина, распаковываем в файл с именем EXTNAME содержимое записи.

Собственно всё. Никакие снэпшоты не используются. При сравнении содержимого двух записей в хранилище версии до 5 включительно (8.0-8.2) сравниваются реальное содержание файлов (поля OBJDATA). В хранилище версии 6 (8.3) сравниваются хэши (поле DATAHASH).

3 Симпатий

Скорость конечно отменная по сравнению с текущим положением дел.
Другое дело, что теперь этот формат по-хорошему надо как-то в формат выгрузки 1С сконвертировать. Как я понимаю, такого еще никто не делал?

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

Ну теже формы 1С не в таком формате выгружает

У меня кстати немного доделанная Бухгалтерия 3.0 синхронизируется ровно час (всего одно изменение!). Это очень печалит

Ну вот это как раз (надеемся) поможет несколько ускорить процесс, т.к. подавляющее большинство изменений - это модули. Их можно как раз с помощью сабжа быстро обновлять.

Все отлично видно, чуть исследовал выгрузку и данные. Для тех же форм в описании xml есть uuid формы и toolc_cd с этим uuid-ом и выгружает форму, аналогично и для модуля объекта.
Для обычных форм и модулей объектов это подходит без проблем, для управляемых форм, еще необходимо смотреть, т.к. пока невозможно определить изменилась форма или нет, т.к. с хранилища она выгружается во внутреннем формате, а при выгрузке 8.3 преобразуется в чистый xml, модуль формы можно достать, а саму форму к сожалению пока нет.

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

У Вики Дорохиной есть код разбора упр. формы на модуль и элементы. Я его портировал потом к себе в V8Viewer, он надежный.

Это разбор управляемой формы, как делает 8.3
Это пример управляемой формы, которую мы получаем из хранилища

со 100% вероятностью, я пока не вижу варианта узнать, был ли только изменен модуль формы или же еще была изменена и сама форма…

А если взять код из V8Reader, который выделяет модуль из формы и перенести в v83unpack?

[quote=“EvilBeaver, post:16, topic:90”]
выделяет модуль из формы
[/quote] то мы получим только изменение модуля, но никак не формы.