Чтение метаданных 1С из SQL Server и PostgreSQL

12.02.24

Разработка - Инструментарий разработчика

Описание файла DBNames таблицы Params и файлов объектов метаданных таблицы Config.

Исходный код C# на GitHub: dajet-metadata

Код используется проектом DaJet Studio

Проверялось на версиях платформы 1С:Предприятие от 8.3.10 до 8.3.20.

 
Описание файла DBNames таблицы Params.
 
Описание файла объекта метаданных таблицы Config.
 
Пример кода C# для чтения файла метаданных 1С. 
 
Утилита для быстрого чтения свойств конфигурации

Алгоритм чтения метаданных (см. исходный код на GitHub):

1. Читаем файл DBNames из таблицы Params.

2. Используя файл DBNames, читаем файлы объектов метаданных из таблицы Config.

3. Дополняем объекты метаданных недостающими стандартными реквизитами (их нет в файлах объектов метаданных). Это можно сделать, например, выполняя чтение полей таблиц SQL Server (INFORMATION_SCHEMA.COLUMNS). Эти поля имеют стандартные и достаточно понятные имена. Как они называются в 1С мы тоже знаем. Например, "_Description" это "Наименование" справочника.

 
Обновление от 12.02.2024

Более подробная версия статьи доступна по ссылке:

https://github.com/zhichkin/dajet/blob/main/doc/metadata-internals/README.md

Пример чтения метаданных 1С, например, для генерации представлений (view) базы данных можно посмотреть в проекте dajet-dbview-generator репозитория платформы DaJet на GitHub.

 
Обновление от 16.09.2022
 
Обновление от 10.07.2022
 
Обновление от 26.01.2022 Новая версия проекта DaJet.Metadata
 
Обновление от 12.07.2021
 
Обновление от 08.07.2021 : Алгоритм загрузки конфигурации.
 
Обновление от 22.03.2021
 
Обновление от 09.03.2021 

 

DBNames Config Params SQL метаданные C#

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159445    872    399    

861

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7775    55    22    

66

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

9360 руб.

17.05.2024    23438    68    45    

117

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8500 руб.

10.11.2023    10431    36    24    

61

SALE! 15%

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 19980 руб.

06.10.2023    15401    35    7    

70

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

4800 3120 руб.

14.01.2013    187987    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17303    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7696    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Cyberhawk 135 16.02.21 09:56 Сейчас в теме
Испанский стыд за фирму 1С от того, что сообщество этим ковырянием занимается, а не сам вендор (в своей документации)...
user1927014; MadB111; torbeev; DiGri; portwein; webandroid; zakiap; Hatson; chg; YPermitin; Yashazz; DennyPhilord; artbear; zhichkin; +14 Ответить
18. YanTsys 12 17.02.21 18:06 Сейчас в теме
(1) Вообще-то это ковыряние незаконная деятельность... :)
Painted; powerpc; +2 Ответить
19. zhichkin 1524 17.02.21 18:17 Сейчас в теме
(18) Всё законно.
ГК РФ, часть 4, статья 1280 "Право пользователя программы для ЭВМ и базы данных"
Мы тут исследованиями занимаемся. А Вы что подумали ?
20. YanTsys 12 18.02.21 10:33 Сейчас в теме
(19)
ГК РФ, часть 4, статья 1280 "Право пользователя программы для ЭВМ и базы данных"


Статья 1280 п1 пп1 "если иное не предусмотрено договором с правообладателем"
lunjio; Serj1C; +2 Ответить
21. zhichkin 1524 18.02.21 12:12 Сейчас в теме
(20) Спасибо за предупреждение.
22. YanTsys 12 18.02.21 13:14 Сейчас в теме
(21) И вам спасибо за полезную публикацию, очень интересно как 1с на самом деле устроена. :)
2. Cерый 26 16.02.21 13:57 Сейчас в теме
Благодарю Вас, считаю эту информацию ценной.
Обращаю Ваше внимание: можно из 1С выполнять внешние запросы и т.о. продублировать Ваш код на 1С,
предполагаю, востребованность этого языкового варианта выше.
3. zhichkin 1524 16.02.21 14:01 Сейчас в теме
(2) Спасибо за отзыв.
На 1С лучше использовать функцию ПолучитьСтруктуруХраненияБазыДанных и внешнее соединение для внешних баз.
5. Yashazz 4790 16.02.21 14:44 Сейчас в теме
(3) Она тоже не всё и не полно даёт. Можно ещё внешние источники прикручивать на это дело.
zhichkin; +1 Ответить
7. user612295_death4321 16.02.21 20:42 Сейчас в теме
(3) Согласен с предыдущим комментарием. Готов накинуть стартмани, если обернете во внешнюю компоненту 1С, которая позволит читать метаданные из внешней базы :)
8. zhichkin 1524 16.02.21 21:26 Сейчас в теме
(7) Native API компоненту не осилю - не умею C++. Во всяком случае у меня под Visual Studio 2019 шаблон проекта от 1С не взлетел. Под Windows на C# могу запилить, но не считаю это удачной идеей. Объясню почему.
Загрузка полной конфигурации, например, БП или УТ это примерно +300 Мб в памяти. На мой взгляд это много, особенно если нужно загрузить пару-тройку конфигураций одновременно.
В связи с этим считаю более перспективным использование web-сервиса, который бы загружал нужные конфигурации и размещал у себя в кэше. Делать это можно по команде или из файла настроек при старте службы (так, в частности, работает DaJet Studio). Периодчиески кэш можно обновлять, проверяя не изменилась ли целевая конфигурация.
Другое возможное решение это загружать метаданные 1С в базу данных со специльной структурой для удобного чтения при помощи запросов SQL. Это решение можно комбинировать с web-сервисом. Более того при таком варианте решения возможно также реализовать стратегию lazy load (ленивая загрузка) когда в память подгружаются только запрашиваемые данные. Данный вариант решения был использован в моём старом проекте 1C#, который является предшественником DaJet Studio.
Я готов в принципе реализовать какой-то из выше описанных вариантов (не COM-компоненту). Пожалуй это может стать моей следующей публикацией =)
mefalcon; +1 Ответить
9. user612295_death4321 16.02.21 21:55 Сейчас в теме
(8)
zy load (ленивая загрузка) когда в память подгружаются только запрашиваемые данные. Данный вариант решения был использован в моём старом проекте 1C#, который является предшественником DaJet Studio.
Я готов в принципе реализовать какой-то из выше описанных вариантов (не COM-компоненту). Пожалуй это может стать моей следующей публикацией =)


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

25. user612295_death4321 18.02.21 19:52 Сейчас в теме
(8) Кстати, может быть хотя бы консольную утилиту соберете и выложите за условные 1 SM ?)
26. zhichkin 1524 21.02.21 17:07 Сейчас в теме
(25) Сделаю. Вопрос: что будет результатом работы утилиты ?
Прошу писать в личку или в канал Телеграмм https://t.me/dajet_studio
27. user612295_death4321 21.02.21 17:52 Сейчас в теме
(26) Указанный Вами канал является только для чтения. Описал предложение в https://t.me/dajet_studio_group , это же тоже Ваш канал ?
32. zhichkin 1524 22.02.21 23:50 Сейчас в теме
(27) Да, это чат для канала.
4. DennyPhilord 65 16.02.21 14:21 Сейчас в теме
В какой момент возникает - Ошибка при выполнении файловой операции 'v8srvr://.../Params/DBNames' ?
6. zhichkin 1524 16.02.21 15:11 Сейчас в теме
(4) Не знаю. Честно говоря, ни разу не видел такой.
10. triviumfan 97 17.02.21 00:26 Сейчас в теме
Ужасное оформление. Невозможно читать - глаза сломаешь.
11. serega_sw 17.02.21 08:27 Сейчас в теме
Подобное хорошо, когда клиента снимаешь с иглы использования 1С платформы в организации. Пока создается своё ПО для работы, все параллельно работают в 1С какие-то отделы переводишь на своё ПО. Приходит момент и избавляешься от 1С.
14. RocKeR_13 1366 17.02.21 12:33 Сейчас в теме
(11) а потом уходят авторы "своего ПО", приходит, например, маркировка и вкладываются миллионы на возврат к 1С, пока свой штат не допилит новый функционал))
chemezov; Sedaiko; ubnkfl; SiAl; SirStefan; lan21; LelikOFF; firma_unix; randomus; +9 Ответить
15. zhichkin 1524 17.02.21 12:57 Сейчас в теме
(14) Ситуация, подобная той, которую Вы описываете, похожа на обыкновенную истерику =)

Внедрение любой маркировки анонсируется минимум за год. Я внедрял типовую библиотеку интеграции МДЛП от 1С. Что там под капотом знаю очень хорошо. Там нет ничего, чего нельзя в разумные сроки написать на любом другом языке программирования.
Например, основные процессы МДЛП (приёмка, реализация, получение списков входящих и исходящих документов) я сделал на C# в свободное время по вечерам где-то за месяц. Согласен - прототип и всё такое. Но ясно одно: "Разруха не в клозетах, а в головах людей" (с)
16. zhichkin 1524 17.02.21 13:00 Сейчас в теме
(14) Когда дорабатывают 1С конфигурацию "под себя" тоже пишут "своё ПО", между прочим.
12. John_d 5891 17.02.21 09:09 Сейчас в теме
Как-то делал Кастомизированная обработка Структура хранения
https://infostart.ru/public/968058/
13. setrak 154 17.02.21 11:16 Сейчас в теме
Интересная статья. Было бы хорошо, если в коде на GitHub было побольше комментариев)
Для прямых запросов к скулю очень полезная информация. Одна московская компания в своих разработках создает таблицу соответствия на скуле, куда можно налету обращаться и динамически формировать запросы. Но у них код закрытый.
Очень удобно и быстро работает, когда расшифрованная структура хранится в таблице, но есть важный момент, при восстановлении базы с .dt, редактировании метаданных (добавление/удаление полей и таблиц), эту таблицу соответствия нужно переформировывать.
По сути если реализовать инструмент (регламент), который будет проверять изменение конфигурации и формировать таблицу соответствия, то это было бы идеально.
17. zhichkin 1524 17.02.21 13:20 Сейчас в теме
(13) Согласен: код на GitHub не "причёсан". В процессе ... =)
Хочу ещё оптимизировать производительность и подумаю на тему кэширования.
Сейчас, на холодный кэш SQL Server, конфа БП или УТ без метаданных SQL Server грузится где-то за 7 секунд.
На горячий кэш - 1 секунду.
23. lan21 18.02.21 15:41 Сейчас в теме
А почему не с DBSchema начали?
24. zhichkin 1524 18.02.21 17:41 Сейчас в теме
(23) Честно говоря, я сейчас не вспомню причину отказа от DBSchema. Чего-то мне там не хватило. Надо взглянуть на него ещё раз =)
28. nvv1970 22.02.21 08:10 Сейчас в теме
В случае выгрузки и загрузки конфигурации при помощи файла дт значения этих идентификаторов могут быть пересчитаны и изменены.

Нет, не может. С чего бы это? Можете привести пример?
Загрузка дт вообще никаких данных не изменяет. Тупая заливка как есть, со всеми ошибками в данных и метаданных.
29. zhichkin 1524 22.02.21 13:22 Сейчас в теме
(28) Речь была только про целочисленные идентификаторы в файле DBNames таблицы Params:
{f47b419b-4aed-4975-83d8-978c710710d1,"Reference",39}
В данном случае это число 39 в конце строки.
30. nvv1970 22.02.21 21:31 Сейчас в теме
(29) это разве не номера таблиц в имени? Не встречал ни одного примера, чтобы имена таблиц менялись.
31. zhichkin 1524 22.02.21 23:47 Сейчас в теме
(30).Так бывает. Конкретную методику воспроизведения не подскажу. Если удалять объекты метаданных, создавать заново, сохранять конфигурацию и перезагружать через dt, то в какой-то момент это может произойти. Если не имена таблиц, то полей. Я уже натыкался на это раньше. По этому бэкапы только средствами SQL Server делаю, тем более что это рекомендация самой 1С.
33. nvv1970 23.02.21 08:39 Сейчас в теме
(31) в ДТ сохраняется все, кроме индексов. При загрузке выполняется просто балкинсерт данных как есть. Не проверяются связи таблиц, метаданные, имена и прочие метаперестроения, которые выполняет реструктуризация.
Вы сейчас на ходу придумываете что-то. А удаление/добавление таблиц с ДТ не имеет отношения. Это из другой оперы.
ПС: конечно дт - это не бэкап. В бэкапе то же состояние статистики, фрагментации таблиц, расположение страниц в файлах.
34. zhichkin 1524 23.02.21 13:38 Сейчас в теме
(33) Не возражаю. Спасибо за замечание.
35. YA_24763472 25.05.21 22:00 Сейчас в теме
А что по скорости получается, если взять конфигурацию, на 3000 объектов и закешировать все, с реквизитами, табличными частями и прочим в 3000 json файлов? В таком примерно виде:
{
"id" : "7aadbb67-f93e-43bb-9f53-f14d2c2a347a",
"name" : "Валюты",
"title" : "Валюты",
"type" : "Reference",
"localId" : "61",
"nameTable" : "_reference61",
"attributeList" : {
"ФормулаРасчетаКурса" : {
"id" : "5a088468-4065-4e0c-9b84-1162de8d3fdd",
"localId" : "20646",
"type" : "S",
"title" : "Формула расчета курса",
"nameField" : "_fld20646"
},
"СпособУстановкиКурса" : {
"id" : "dbdf3ae7-a0af-44b9-8e3d-c402d98cda03",
"localId" : "20647",
"type" : "#",
"title" : "Способ установки курса",
"nameField" : "_fld20647rref"
}
}
}
36. zhichkin 1524 26.05.21 02:17 Сейчас в теме
(35) Общий ответ будет таким: на скорости близкой к скорости копирования файлов с жёсткого диска в память программы. Думаю вполне можно уложиться в 1 секунду.
37. YA_24763472 26.05.21 11:06 Сейчас в теме
(36) 1 секунду, это очень быстро! Не плохо да! Спасибо, очень помог твой пост! У меня выходит на 3000 объектов примерно 50 секунд, то есть создаю 3000 файлов json, но да 45 сек из них на чтение исходных данных из БД, сколько еще на запись и распаковку Deflate не проверял. А еще может подскажешь, смог найти где в исходной структуре информация по таблицам "Изменения" и "Предопределенные"?
38. zhichkin 1524 26.05.21 12:09 Сейчас в теме
(37) Предопределённые "сидят" в основной таблице объекта - у них поле _PredefinedID не равно нулевому GUID'у.
Таблицы изменений имеют постфикс ChngR, например _ReferenceChngR80. Подробнее про таблицы изменений можно почитать в моей статье про планы обмена.
В своей утилите я кажется не добавлял загрузку метаданных по таблицам изменений - такой необходимости не было.
Информация об этих таблицах есть в файле DBNames таблицы Params СУБД.
39. YA_24763472 26.05.21 15:07 Сейчас в теме
С предопределенными, понял, спасибо! Изменения получается отдельно описаны, то есть в Params находим ChrcChngR и по ее ИД ищем файл в Config, где уже узнаем для какого он Reference? Думал как со табличными частями, находим в Params нужный Reference, парсим получаем ИД и тогда уже в Params ищем таблицу и получаем ее числовой код. За статью про планы обмена отдельное спасибо, все очень подробно расписано.
40. zhichkin 1524 26.05.21 15:18 Сейчас в теме
(39) В таблице Params ищем файл DBNames, в файле DBNames есть идентификатор для основной таблицы, например, Reference123. Этот идентификатор (uuid) будет таким же в этом же файле DBNames для соответствующей таблицы изменений ChngR справочника Reference123. Числовой идентификатор типа integer у них будет разным. Отдельного файла для описания таблиц изменений в конфигурации нет. Возможно оно есть в таблице DBSchema, но по факту это не нужно, так как алгоритм формирования таблиц изменений известен. Он описан в официальной докуменации 1С. Коротко: обязательные поля таблицы изменений + поля кластерного индекса основной таблицы объекта метаданных.

Примерно вот так это будет выглядеть в файле DBNames таблицы Params:
{cf336ad9-35bb-4f54-8979-05e900d44956,"Reference",36}
{cf336ad9-35bb-4f54-8979-05e900d44956,"ReferenceChngR",1356}
41. YA_24763472 26.05.21 21:43 Сейчас в теме
(40) Понял, спасибо! Могли бы и более понятную структуру сделать для хранения метаданных, в том плане, что так запутано, должно на быстродействие влиять.
42. YA_24763472 28.05.21 11:23 Сейчас в теме
(40) Видел, писал про расширения для 1С, не вышло собрать на С++. Коллеги говорят, можно на C# расширения писать, точно можно, но сам не пробовал, на Java пишу. Думаю ради этого посмотреть C# они сильно так то похожи.
57. zhichkin 1524 27.06.21 12:28 Сейчас в теме
(42) C# и Java похожи, но не настлоько, чтобы за месяц полноценно "пересесть" с одного языка на другой в смысле разработки. Я думаю месяца три надо не меньше. 1С основана на технологии COM. Java с COM по нормальному дружит только через коммерческие решения. Всё равно не вижу смысла писать внешние компоненты для 1С - всё или почти всё можно решить по http. На мой взгляд 1С это больше UI фреймворк, чем что-то ещё.
43. YA_24763472 26.06.21 05:14 Сейчас в теме
Добавлю, может пригодится, запись params, filename=fe8acd6a-22c9-4b5a-aeae-232a1c8324cb.si содержит описания ОпределяемыйТип и перечисления ссылок для общих типов данных (ЛюбаяСсылка, СсылкаСправочник и т.п.) меняется или нет имя файл от версии платформы, еще не проверял, на 3 конфигурациях проверил, filename то же
44. zhichkin 1524 26.06.21 14:02 Сейчас в теме
(43) Спасибо за комментарий! Интересное наблюдение.
Я тоже исследовал проблему загрузки общих реквизитов и определяемых типов в последней версии DaJet.Metadata.
Посмотрите процедуру ConfigureCommonObjects в файле InfoBaseEnricher.cs, возможно, что найдёте ещё что-нибудь полезное.
45. YA_24763472 26.06.21 15:41 Сейчас в теме
(44) Спасибо! А не подскажешь, откуда это данные функция разбирает, это же не "1a621f0f-5568-4183-bd9f-f6ef670e7090.si" там реквизиты и типы есть но все общим списком. Не смог найти, общие реквизиты отдельно, не в куче.
47. zhichkin 1524 26.06.21 16:48 Сейчас в теме
(45) Сначала использую класс Configurator.
В нём вызываю метод OpenInfoBase.
В этом методе получаю ссылку на класс InfoBaseEnricher и "обогащаю" объект InfoBase данными из файла "root":
GetEnricher<InfoBase>().Enrich(InfoBase);

Файл "root" содержит ссылку на файл с описанием основных объектов дерева метаданных конфигурации 1С.
Каждый общий тип объекта метаданных (типа абстрактный класс) имеет свой uuid. Эти uuid'ы были вычислены опытным путём при помощи добавления одного объекта в пустую конфигурацию и сравнения что изменилось.
Для анализа изменений конфигурации используется сервис MetadataCompareAndMergeService.
Использование этого сервиса можно посмотреть в проекте тестирования, например, файл NewParser.cs. См. вызов CompareWithDatabase - внутри этот метод использует метод Compare сервиса сравнения конфигураций.
46. YA_24763472 26.06.21 15:51 Сейчас в теме
(44) заметил класс ConfigObject свойство List<ob ject> постоянно надо делать явное приведение типов, сначала тоже пошел по такому пути. Потом все таки сделал 2 свойства String и List<Но уже этого же класса> по типу как XML парсер есть текстовая область и список подчиненных и вместо проверки Length == 1 проверка !=null. Приведения типов не надо делать, и в моем случае производительность выше стала. Но, тут однозначно не скажу может на C# не как на Java на такое отреагирует.
48. zhichkin 1524 26.06.21 17:08 Сейчас в теме
(46) Класс ConfigObject реализует структуру файлов конфигурации 1С. Структура файлов 1С это по сути массивы массивов - дерево. В каких-то случаях это коллекции, в каких-то случаях это ассоциативные массивы по типу объектов JavaScript. Суть в том, что, да, при парсинге файла 1С в объект класса ConfigObject можно сразу пытаться привести значение листового элемента дерева к некоторым известным примитивным типам данных. Объекты являются узлами дерева. В частности это могут быть uuid, string, int32 или какой-то объект (уже не листовое значение, а узел дерева). Парсингом файла 1С занимается класс ConfigFileParser. Он очень простой. Можно прямо в нём сделать приведение листовых значений дерева файла 1С к нужным типам. Для этого класс ConfigObject можно расширить дополнительными свойствами вышеуказанных типов: uuid, int32, string. Была такая мысль, но руки не дошли =) И конечно же производительность можно улучшить таким образом и в C# тоже.
Я думал отдельную статью написать про структуру файла 1С с описанием алгоритма парсинга, но опять же руки не дошли.
53. YA_24763472 27.06.21 04:34 Сейчас в теме
(48)
Для этого класс ConfigObject можно расширить дополнительными свойствами вышеуказанных типов: uuid, int32, string
тоже про это думал, мне кажется это более оптимально чем
сразу пытаться привести значение листового элемента дерева к некоторым известным примитивным типам данных
так нам придется конвертировать все значения, которые могут и не пригодится, и получить значение скорее всего один раз надо будет, тогда и конвертировать. Выше писал про другое, у себя отказался от тип "Object" и приведения типов в коде когда строка когда список, для этого сделал два свойства String и List<ConfigObject > и убрал все приведения типов в коде, проверяю какое свойств не null и так понятно это значение или подчиненный список
56. zhichkin 1524 27.06.21 12:21 Сейчас в теме
(53) Спасибо. Теперь дошло. Может быть есть ссылка на Ваш проект ?
49. zhichkin 1524 26.06.21 17:23 Сейчас в теме
(46) Если прочитать файл "root" и записать полученный ConfigObject в файл, то можно получить примерно вот такую структуру:
[0] (0) "2"
[0] (1) DaJet.Metadata.Model.ConfigObject
----[1] (1.0) "977dd4c3-3e84-4487-a75a-2ac42ba3df15"
[0] (2) "7"
[0] (3) DaJet.Metadata.Model.ConfigObject
----[1] (3.0) "9cd510cd-abfc-11d4-9434-004095e12fc7"
----[1] (3.1) DaJet.Metadata.Model.ConfigObject
--------[2] (3.1.0) "1"
--------[2] (3.1.1) DaJet.Metadata.Model.ConfigObject
------------[3] (3.1.1.0) "62"
------------[3] (3.1.1.1) DaJet.Metadata.Model.ConfigObject
----------------[4] (3.1.1.1.0) "0"
----------------[4] (3.1.1.1.1) DaJet.Metadata.Model.ConfigObject
--------------------[5] (3.1.1.1.1.0) "3"
--------------------[5] (3.1.1.1.1.1) DaJet.Metadata.Model.ConfigObject
------------------------[6] (3.1.1.1.1.1.0) "1"
------------------------[6] (3.1.1.1.1.1.1) "0"
------------------------[6] (3.1.1.1.1.1.2) "a2001e99-0af7-44e7-8bfa-6014e7ff6e1f"
--------------------[5] (3.1.1.1.1.2) "УправлениеТорговлей"
--------------------[5] (3.1.1.1.1.3) DaJet.Metadata.Model.ConfigObject
------------------------[6] (3.1.1.1.1.3.0) "1"
------------------------[6] (3.1.1.1.1.3.1) "ru"
------------------------[6] (3.1.1.1.1.3.2) "УправлениеТорговлей"
--------------------[5] (3.1.1.1.1.4) ""
--------------------[5] (3.1.1.1.1.5) "0"
--------------------[5] (3.1.1.1.1.6) "0"
--------------------[5] (3.1.1.1.1.7) "00000000-0000-0000-0000-000000000000"
--------------------[5] (3.1.1.1.1.8) "0"
Показать

Как записать ConfigObject в таком формате можно найти в проекте для тестов.
51. YA_24763472 27.06.21 04:23 Сейчас в теме
(49) Это же файл 1a621f0f-5568-4183-bd9f-f6ef670e7090.si? "root" в моих конфигурациях есть не во вех и в нем, нет таких данных. А если это 1a621f0f-5568-4183-bd9f-f6ef670e7090.si этот файл в нем все типы идут списком, а не деревом, нельзя точно определить, что это Общий реквизит или Определяемый тип или Справочник
54. zhichkin 1524 27.06.21 12:14 Сейчас в теме
(51) Интересно что это за конфигурации, у которых нет файла "root". Можете рассказать ?
58. YA_24763472 28.06.21 08:18 Сейчас в теме
(54) может я не про тот "root" думаю, файл такой есть но он всегда пустой, 212 байт, независимо от размера конфигурации. В нем только одно значение.
50. zhichkin 1524 26.06.21 17:31 Сейчас в теме
(46) Что интересно ещё отметить, структура файлов конфигурации 1С фактически гарантируется тем, что 1С написана на C++. Все структуры ConfigObject имеют какой-то тип в C++. Часто это могут быть структуры и перечисления, иногда классы с определённым порядком следования их свойств. Другими словами структура файлов конфигурации 1С гарантируется исходным кодом 1С =) Вероятность его изменения достаточно низка, это я говорю, исходя из своего опыта разработки больших проектов. Рефакторить системные куски кода, которые влияют на всю систему в целом, вряд ли кто-то будет часто или вообще будет делать в обозримом будущем. Проще платформу переписать наверное будет с нуля =)

Определение некоторых структур и классов C++ можно подсмотреть в проекте Снегопат
52. YA_24763472 27.06.21 04:25 Сейчас в теме
(50) Скорее всего вы правы, но кто их 1С знает. Я все таки настройки путей 1,2,5,0 типа такого вынес в файлы настройки и разбил по версиям платформы (да, версия пока одна) но кто знает поменяет хотя бы один номер, добавят что то, и все перестанет работать. Это мы смотрит как не понятную структуру, а у 1С это же да объекты нормальные, добавят свойств в какой то объект и все порядок сменится
55. zhichkin 1524 27.06.21 12:19 Сейчас в теме
(52) Про настройки это правильная мысль на мой взгляд.
По поводу изменят чего-нибудь - ну вот Снегопат живёт как-то уже много лет.
Каждый раз адаптируется к новой версии платформы 1С.
Да, с этим есть определённые проблемы, но как-то справляются с ними.
59. YA_24763472 28.06.21 08:24 Сейчас в теме
(55) Каждый раз адаптировать понятно, но хочется, что бы сразу работало с любой (хотя бы известно версией платформы), сделал вот такую структуру файлов, где верхняя папка это версия платформы. В файлах структура основных данных, что читаем (JSON намеренно сделал, что бы можно было по возможности редактировать вне системы), это же используется для проверки корректности (совместимости текущей версии файла) и этот же каталог идет как список типов данных (могут в новой платформе добавить какой то новый тип, кроме справочника и т.п.)
Прикрепленные файлы:
60. zhichkin 1524 28.06.21 12:03 Сейчас в теме
(58) В таблице СУБД "Config" есть файл "root". Он выглядит примерно таким образом:
{2,684c8f2b-d93f-49cc-b766-b3cc3896b047,rh3YNJD ... 8YF0=}

В данном примере это массив из двух элементов. Первый элемент этого массива uuid, который и является именем файла с полным описанием дерева конфигурации.
Вот так чтение этих файлов выглядит у меня в коде на C#:
IConfigFileReader fileReader = new ConfigFileReader();
fileReader.UseDatabaseProvider(DatabaseProvider.SQLServer);
fileReader.UseConnectionString("Data Source=MyServer;Initial Catalog=MyDatabase;Integrated Security=True");

ConfigObject root = fileReader.ReadConfigObject("root");
ConfigObject config = fileReader.ReadConfigObject(root.GetString(new int[] { 1 }));
61. YA_24763472 29.06.21 04:22 Сейчас в теме
(60)
684c8f2b-d93f-49cc-b766-b3cc3896b047
да такой видел, файл такой есть, смотрел его, что то мне там не понравилось. На сколько помню там нельзя было однозначно определить, что вот это "Общие реквизиты", а вот это "Определяемые типы", то есть если конфигурация полная есть все типы объектов то это видно, а если конфигурация не использует Общие реквизиты или Определяемые типы, то порядок сдвигается. Или я ошибаюсь?
62. zhichkin 1524 29.06.21 11:50 Сейчас в теме
(61) Нет, порядок там зависит от версии платформы 1С. Например, если запускать на 8.3.15, то "порядок", как Вы говорите и если я правильно понял о чём речь, будет один, а если запустить на 8.3.18, то другой. Причём это абсолютно не зависит от версии совместимости, с которой вы запускаете прикладное решение. Это происходит из-за того, что в версии 8.3.15 в отличии от 8.3.18 не было общего объекта "Боты" или "Сервисы интеграции". Из-за этого "порядок" следования общих объектов в файле, который описывает дерево конфигурации может меняться.
Поэтому лучше искать нужные ветки дерева конфигурации по uuid'ам. Об этом я писал в одном из предыдущих комментариев. Я так и делаю: просто пробегаюсь по всему дереву конфигурации в поиске известных uuid и нахожу списки других uuid, которые являются файлами с описанием конкретных объектов конфигурации.
63. YA_24763472 29.06.21 15:20 Сейчас в теме
(62) Спасибо, посмотрю внимательнее, на первый взгляд показалось порядок меняется даже из за отсутствия объектов. Если только от версии это не страшно. Еще смотри, в статье пишешь, что идентификатор объекта это первый гуид, но если выгрузить конфигурацию штатно в XML, там идентификатор объект совпадает с файлом, а первый гуид получаем это ид "Object" данного типа, далее идут "Ref" и прочие. Мы в одном направлении работаем, может перейдем в мессаджер? Опытом обменяемся, я не так давно этим занялся, но может тоже, что то замечу.
Прикрепленные файлы:
64. Batman1978 10.01.22 10:46 Сейчас в теме
Добрый день. Подскажите, столкнулся с проблемой что нарушились связи между реквизитами и таблицами. Т.е. при запуске 1с пишет что для Регистра не найдена таблица, она есть но нет сопоставления. Подскажите как восстановить правильные соответствия в DBNames? База большая 19 гигов выгрузить ее в ДТ и поработать 1с тулс не возможно. Как на уровне скуля исправить ?
65. zhichkin 1524 10.01.22 13:48 Сейчас в теме
(64) Нужно больше информации: точное сообщение об ошибке, версия платформы, какая СУБД используется. Почему Вы решили, что именно в DBNames не хватает нужных сопоставлений ? Кроме этого ещё существует таблица DBSchema. Там тоже есть кое какая инфа по соответствию объектов и их таблиц в СУБД - его структуру не изучал особо.
1С тулз, насколько я понимаю, может работать с cf-ником. Если побились метаданные, то их и надо изучать - dt-шник при этом можно не трогать пока.
66. Batman1978 12.01.22 12:07 Сейчас в теме
Платформа последняя 19 кажется для бухгалтерии 3.0 всегда нужна самая последняя что бы обновы и т.д. накатывать. Конфигурация на поддержке

Почему Вы решили, что именно в DBNames не хватает нужных сопоставлений ? Кроме этого ещё существует таблица DBSchema.
что бы ответить вам - мне и нужно как раз посмотреть
Суть ошибки при запуске предприятия пишет не найдена таблица _infoReg147511 т.к. база не под рукой пишу цифры от головы но то что это регистр сведений я хорошо помню. Идем в SQL 19 стоит раскрываем таблицы - и там эта таблица есть она читается через sel ect * fr om т.е. она не битая. Но в предприятие я зайти не могу. На рабочем бекапе я сделал выгрузить сопоставление и посмотрел в итоге что это за таблица точно - но мне это не помогает - при падении базы выключили свет посыпалось очень много таблиц в скуле но в основном не самые важные - со стороны SQL я базу перешерстил - заливая заменяя таблицы битые из рабочего бекапа 3 месячной давности (заранее скажу - да я рабочий бэкап обновил до релиза конфигурации которая упала) в общем окно конфигурации у меня стало открываться но ТТИ проверка базы (ничего не исправляю просто проверяю логическую целостность базы) он у меня вылетает на этом сообщении. Даже пробывал перезолить DBconfig и DBparam из рабочего бэка в упавшую - да знаю что так нельзя но куда было деваться что были идеи то и делал конец года 2 дня до нового у бухов одно место горит (сдача отчетности). Ничего не помогло - как исправить незнаю. В Итоге они заново вносят доки, но спортивный интерес понять и как исправить остался все равно. Кстати рабочий бэкап тоже косячный вв плане конфигурации т.к. в dt не выгружается ошибка - какая не помню. В Итоге максиму что я смог - это предприятие открывается и любое действие база падает с ошибкой не могу найти таблицу
68. zhichkin 1524 12.01.22 14:33 Сейчас в теме
(66) Был похожий случай: в процессе бэкапа выключилось электричество. В итоге бэкап из 600 Гб превратился в 200 Гб. Затем этот урезанный бэкап как-то попал в рабочую базу. Странно, что при этом 1С запускалась и даже с какими-то объетами можно было работать. Ошибка была такая же: не найдена таблица и т.д. И таблиц в СУБД реально не было. Решили восстановиться из бэкапа в итоге, так как было очевидно, что если даже пересоздать таблицы, а сколько их - неизвестно, то данных в них не будет. Хорошо, что всего навсего два дня прошло как обнаружили проблему и некоторые данные были в центральной базе РИБ.

Перезаливка таблиц Config и Params, кстати, нормальная вполне операция. Некоторые админы их бэкапят перед динамическими обновлениями. Иногда это помогает восстановить работоспособность 1С в случае неудачного динамо.

По вашей ошибке: если 1С пишет, что она не может найти таблицу, то это значит, что она её ищет и где-то взяла название. Взяла она её из файла DBNames, который лежит в таблице Params. Можете прочитать этот файл и посмотреть что там внутри. Помочь восстановить работоспособность базы это не поможет, но так для себя поковыряться можно.
67. Batman1978 12.01.22 12:08 Сейчас в теме
Пишу с работы - база дома. Могу конечно все скриншоты повыкладывать вечером.
69. zhichkin 1524 12.01.22 17:33 Сейчас в теме
70. Batman1978 13.01.22 02:13 Сейчас в теме
Не пользуюсь телеграмм
увы :)
71. Serg2000mr 670 17.03.23 12:21 Сейчас в теме
(0) Можно ли как-то прочитать XML-файлы форм объектов конфигурации?
72. zhichkin 1524 17.03.23 12:55 Сейчас в теме
(71) Можно, но я не делал. В ближайшем будущем не планирую этого делать.
73. kyzma-kyzmi4 24 04.06.23 23:59 Сейчас в теме
(0) Спасибо за статью=)

Подскажите, а что за странный формат у этих файлов в config и params?

{106,
{100,
{00000000-0000-0000-0000-000000000000,"ODataSettings",1},
{00000000-0000-0000-0000-000000000000,"SystemSettings",2},
{00000000-0000-0000-0000-000000000000,"CommonSettings",3},
.....
74. zhichkin 1524 05.06.23 01:17 Сейчас в теме
(73) Добрый день! Пожалуйста. Ответ на Ваш вопрос и подробности здесь.
kyzma-kyzmi4; +1 Ответить
75. bananoed 20 12.02.24 11:32 Сейчас в теме
Добрый день, а нет готового скрипта/примера для Вашего инструмента чтоб получить структуру в виде
<имя метаданных> <таблица бд> <поля>?
База подпорчена шифровальщиком, но таблицы удалось восстановить в SQL. Хочу попробовать перетащить данные в пустую базу
76. zhichkin 1524 12.02.24 12:50 Сейчас в теме
(75) Добрый день! Готового скрипта нет. Есть примеры кода в репозитории на GitHub.

1. Можно посмотреть проект dajet-dbview-generator репозитория dajet. Там есть код генерации вьюх для объектов 1С. То есть перебор метаданных в цикле с именами таблиц и прочего.

2. Можно установить платформу DaJet из этого же репозитория и попробовать сгенерировать вьюхи "по кнопке". Далее работать уже с вьюхами, например.

3. Сгенерировать скрипт создания вьюх в базе данных и выгрузить его в файл - в платформе DaJet есть такая возможность. В этом файле будут все нужные Вам сопоставления.
77. zhichkin 1524 12.02.24 12:56 Сейчас в теме
(75) Для работы на более низком уровне можно попробовать использовать информацию отсюда
78. bananoed 20 12.02.24 16:06 Сейчас в теме
(76) В dajet-dbview-generator можно установить опцию, чтобы при ошибке продолжать обработку со следующим объектом, а не останавливать ее?
79. zhichkin 1524 12.02.24 18:40 Сейчас в теме
(78) Добрый вечер! Прошу прощения, но я точно уже не помню. Возможно, что и нет такой опции.
80. bananoed 20 16.02.24 23:04 Сейчас в теме
(79) Воспользовался dajet-dbview-generator , но при генерации скрипта даже на "здоровой" базе обрезаются имена полей таблиц, а часть из таких полей не включаются во view, если длина имени поля больше 15 символов. С чем может быть связана проблема?
Прикрепленные файлы:
81. zhichkin 1524 17.02.24 00:57 Сейчас в теме
(80) Добрый день! В данном конкретном случае это связанно с отсутствием поддержки в текущей версии DaJet.Metadata такого объекта метаданных как "План счетов". Более того, слева на Вашем скриншоте видно, что реквизиты "Субконто1", "Субконто2" и "Субконто3" имеют составной тип данных. Это тоже придётся учесть, доработав сгенерированный скрипт вручную.

Вопрос пользователя DaJet от 27.10.2023 года:
Всем привет
Для реалзизации задачи по BI и доступа к данным с помощью SQL в условно человеческом виде использовали dajet-gen-view 1.2.0, который поддерживает
Поддерживаемые типы объектов:
Документы
Справочники
Перечисления
Планы обмена
Регистры сведений
Регистры накопления
Планы видов характеристик
Табличные части

Сейчас нам необходимы РегистрыБухгалтерии, которые не поддерживаются dajet-gen-view, который, в свою очередь, больше не поддерживается и не дорабатывается.

Каким другим путем можно получить РегистрыБухгалтерии в "человеческом виде" ?

Мой ответ:
DaJet поддерживает следующие типы объектов:
0. Свойства конфигурации
1. Общие реквизиты
2. Определяемые типы
3. Справочники
4. Документы
5. Перечисления
6. Планы обмена
7. Планы видов характеристик (частично)
8. Регистры сведений
9. Регистры накопления
10. Расширения (частично)

Добрый день, Станислав! Хороший вопрос. 🤔 Рекомендую использовать "Коннектор ATK BIView к 1С" или подобный продукт. К сожалению, у меня пока что нет возможности добавить поддержку регистров бухгалтерии.
Оставьте свое сообщение