Имя: Пароль:
1C
1С v8
В настройке истории данных не отображаются метаданные реквизитов
0 sdemon72
 
30.06.25
20:42
Добрый вечер! Используем платформенный механизм "История данных" (не БСП "Версионирование").
По одному из объектов (документ "ИзменениеШтатногоРасписания", это ЗУП КОРП) при вызове метода "Получить метаданные()" в составе полей отображаются только "Проведен", "ПометкаУдаления", "ОбластьДанныхОсновныеДанные" и табличная часть "ДополнительныеРеквизиты" (со всеми полями).
В конфигураторе реквизиты в историю данных включены, программно тоже принудительно попробовал один реквизит включить - ничего не помогает.
Изза этого и в историю пишутся только эти поля.
Метод "ОбновитьИсторию()" запускал, не помогает.
Платформа 8.3.24.1764, конфигурация ЗУП КОРП 3.1.30.197, пиленная (добавлены реквизиты).
Да, кстати: попробовал типовую демку той же версии - там  метаданные отображаются корректно, и история пишется корректно.
Подскажите, куда копать?
1 Мультук
 
гуру
01.07.25
09:11
(0)


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

<Шутки юмора удалены>
2 Волшебник
 
30.06.25
21:16
(1) Жертва БСП
3 rozer76
 
30.06.25
21:36
(0) недавно с аналогичным столкнулся в КА 2.5 на 21-ой платформе в самописном справочнике. Все перепробовал. Есть куча других самописных справочников и документов - там все ок. Включал и кодом и через ИР.
4 timurhv
 
30.06.25
23:48
(0) Что за метод такой, еще и с пробелами в кавычках? "Получить метаданные()"
Откуда выводы что из-за вызова непонятного метода - ошибки в версионировании платформы 1С?

>Метод "ОбновитьИсторию()" запускал, не помогает.
Так он вроде финализирует запись изменений реквизитов в основную таблицу версионирования, в пользовательском режиме никак это не видно, как будто и не произошло.

По теме - больше похоже на проблемы расширения и все версионирование накручено там.
5 timurhv
 
30.06.25
23:54
(1) Версионирование БСП работает раз так в 100 медленнее.
Условно документ без версионирования проводится 0.1 сек, с БСП = 1.3 сек, с платформенным версионированием 0.12 сек
Но есть проблемы в части сокращения объемов версионирования данных, которые сделаны платформой. В части БСП это делается намного проще, т.к. хранит весь слепок если было изменение. Если не было - только хеш. В платформе 1С хранит изменение конкретного реквизита (ов), либо строк ТЧ без контроля их перемещения номеров, полного слепка нет, нужно все отслеживать от первого слепка.
6 sdemon72
 
01.07.25
09:29
(4)> Что за метод такой, еще и с пробелами в кавычках? "Получить метаданные()"
ИсторияДанных.ПолучитьМетаданные(). Прошу прощения за неточность.
>Откуда выводы что из-за вызова непонятного метода - ошибки в версионировании платформы 1С?
Не "из-за", а является индикатором, что что-то не так с таблицей _DataHistoryMetadata. История данных "не видит" метаданные объекта и, соответственно, не пишет по ним данные.
>Так он вроде финализирует запись
Да, в т.ч. информацию по структуре метаданных. Вот тут написано подробно: https://kostyanetsky.ru/notes/metadata-not-found/
>больше похоже на проблемы расширения
В первую очередь об этом подумал и удалил все расширения - не помогло.
7 sdemon72
 
01.07.25
09:31
Хочу поковырять таблицы СУБД. Кто-то знает, как декодировать информацию в полях "_Content"?
8 sdemon72
 
01.07.25
10:54
Так, вроде нашел причину. В таблице "_DataHistoryMetadata" обнаружил следующее (отобрано по нужному объекту МД, и это после сброса, т.е. по факту, отключения настроек истории):
            _metadataid             | _issettings | _isactual | _metadataversionnumber
------------------------------------+-------------+-----------+------------------------
\x9df11f1fa836fabf4e63247590d31026 | t           | t         |                      1
\x9df11f1fa836fabf4e63247590d31026 | t           | t         |                      2
\x9df11f1fa836fabf4e63247590d31026 | t           | t         |                      3
\x9df11f1fa836fabf4e63247590d31026 | t           | t         |                      4

Баг с неудалением строк этой таблицы при отключении истории был упомянут здесь: https://infostart.ru/1c/articles/1803149/

Но обратите внимание, все версии метаданных помечены, как актуальные (в статье на скриншоте такого не было). Скорее всего, дело именно в этом.

Сейчас в песочнице просто очистил эту таблицу (после сброса всех настроек истории), и включил историю заново, и все заработало корректно.

Сейчас восстановлю еще раз копию продуктива и попробую сбросить лишние флаги актуальности...
9 sdemon72
 
01.07.25
16:28
Сбросил лишние флаги - помогло, но отчасти. Новая версия метаданных сохранилась "правильная", и новые события пишутся в историю корректно. А вот старые версии данных остались "голыми". Но, оказывается, это поправимо - после замены значения поля "_Content" в таблице "_DataHistoryMetadata" значением из последней версии, предыдущие версии данных также стали открываться корректно. Понимаю, что решение не идеальное, но в моем случае сойдет.

Запрос для сброса лишних флагов (исправляет все обнаруженные случаи, это не выглядит опасным):

UPDATE _datahistorymetadata AS dh
SET _isactual = false
WHERE _isactual
  AND EXISTS (
    SELECT 1
    FROM (
      SELECT _metadataid, MAX(_metadataversionnumber) AS maxnumber
      FROM _datahistorymetadata
      GROUP BY _metadataid
    ) AS t
    WHERE t._metadataid = dh._metadataid
      AND dh._metadataversionnumber < t.maxnumber
  );

Запрос для перезаписи истории метаданных (только для выбранного объекта метаданных):

WITH last_versions AS (
    SELECT DISTINCT ON (_metadataid)
        _metadataid,
        _metadataversionnumber,
        _content
    FROM _datahistorymetadata
    WHERE _metadataid = decode('9df11f1fa836fabf4e63247590d31026', 'hex')
    ORDER BY _metadataid, _metadataversionnumber DESC
)
UPDATE _datahistorymetadata AS dh
SET _content = lv._content
FROM last_versions AS lv
WHERE dh._metadataid = lv._metadataid
  AND dh._metadataversionnumber < lv._metadataversionnumber;

СУБД PostgreSQL, с запросами помог ИИ, за что ему спасибочки.

Но проблема флагов актуальности повторяется именно на этом объекте метаданных после выключения и включения истории (на этом объекте). На других объектах не воспроизводится. Причины пока остались непонятны, ну хот как лечить теперь знаю, не так уж часто там настройки будут меняться.
10 sdemon72
 
01.07.25
16:31
А, да. Как узнать ИД метаданных. Через выгрузку конфигурации в файлы, вот тут написано, как: https://infostart.ru/1c/articles/1168375/

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