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

Публикация № 1385677

Разработка - Конфигурирование 1С - Структура метаданных

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

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

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

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

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

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

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

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

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

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

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

Добавлено описание методики исследования файлов объектов метаданных на GitHub.

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

Добавлена поддержка PostgreSQL.

 

Специальные предложения

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


Статья 1280 п1 пп1 "если иное не предусмотрено договором с правообладателем"
21. zhichkin 934 18.02.21 12:12 Сейчас в теме
(20) Спасибо за предупреждение.
22. YanTsys 12 18.02.21 13:14 Сейчас в теме
(21) И вам спасибо за полезную публикацию, очень интересно как 1с на самом деле устроена. :)
2. Cерый 16 16.02.21 13:57 Сейчас в теме
Благодарю Вас, считаю эту информацию ценной.
Обращаю Ваше внимание: можно из 1С выполнять внешние запросы и т.о. продублировать Ваш код на 1С,
предполагаю, востребованность этого языкового варианта выше.
3. zhichkin 934 16.02.21 14:01 Сейчас в теме
(2) Спасибо за отзыв.
На 1С лучше использовать функцию ПолучитьСтруктуруХраненияБазыДанных и внешнее соединение для внешних баз.
5. Yashazz 3740 16.02.21 14:44 Сейчас в теме
(3) Она тоже не всё и не полно даёт. Можно ещё внешние источники прикручивать на это дело.
zhichkin; +1 Ответить
7. user612295_death4321 16.02.21 20:42 Сейчас в теме
(3) Согласен с предыдущим комментарием. Готов накинуть стартмани, если обернете во внешнюю компоненту 1С, которая позволит читать метаданные из внешней базы :)
8. zhichkin 934 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-компоненту). Пожалуй это может стать моей следующей публикацией =)
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 934 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 934 22.02.21 23:50 Сейчас в теме
4. DennyPhilord 60 16.02.21 14:21 Сейчас в теме
В какой момент возникает - Ошибка при выполнении файловой операции 'v8srvr://.../Params/DBNames' ?
6. zhichkin 934 16.02.21 15:11 Сейчас в теме
(4) Не знаю. Честно говоря, ни разу не видел такой.
10. triviumfan 24 17.02.21 00:26 Сейчас в теме
Ужасное оформление. Невозможно читать - глаза сломаешь.
11. serega_sw 17.02.21 08:27 Сейчас в теме
Подобное хорошо, когда клиента снимаешь с иглы использования 1С платформы в организации. Пока создается своё ПО для работы, все параллельно работают в 1С какие-то отделы переводишь на своё ПО. Приходит момент и избавляешься от 1С.
14. RocKeR_13 907 17.02.21 12:33 Сейчас в теме
(11) а потом уходят авторы "своего ПО", приходит, например, маркировка и вкладываются миллионы на возврат к 1С, пока свой штат не допилит новый функционал))
SirStefan; lan21; LelikOFF; firma_unix; randomus; +5 Ответить
15. zhichkin 934 17.02.21 12:57 Сейчас в теме
(14) Ситуация, подобная той, которую Вы описываете, похожа на обыкновенную истерику =)

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

Нет, не может. С чего бы это? Можете привести пример?
Загрузка дт вообще никаких данных не изменяет. Тупая заливка как есть, со всеми ошибками в данных и метаданных.
29. zhichkin 934 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 934 22.02.21 23:47 Сейчас в теме
(30).Так бывает. Конкретную методику воспроизведения не подскажу. Если удалять объекты метаданных, создавать заново, сохранять конфигурацию и перезагружать через dt, то в какой-то момент это может произойти. Если не имена таблиц, то полей. Я уже натыкался на это раньше. По этому бэкапы только средствами SQL Server делаю, тем более что это рекомендация самой 1С.
33. nvv1970 23.02.21 08:39 Сейчас в теме
(31) в ДТ сохраняется все, кроме индексов. При загрузке выполняется просто балкинсерт данных как есть. Не проверяются связи таблиц, метаданные, имена и прочие метаперестроения, которые выполняет реструктуризация.
Вы сейчас на ходу придумываете что-то. А удаление/добавление таблиц с ДТ не имеет отношения. Это из другой оперы.
ПС: конечно дт - это не бэкап. В бэкапе то же состояние статистики, фрагментации таблиц, расположение страниц в файлах.
34. zhichkin 934 23.02.21 13:38 Сейчас в теме
(33) Не возражаю. Спасибо за замечание.
Оставьте свое сообщение

См. также

DaJet Studio: расширенный язык запросов 1С, очереди сообщений и web сервисы Промо

Прочие инструменты разработчика Администрирование СУБД v8 Бесплатно (free)

DaJet Studio - разработка и управление скриптами, хранимыми процедурами и функциями, написанными на расширенном языке запросов 1С, а также очередями сообщений и web сервисами, основанными на использовании Microsoft SQL Server.

10.11.2020    3836    60    zhichkin    13    

Метаданные и их идентификаторы

Структура метаданных БСП (Библиотека стандартных подсистем) v8 Бесплатно (free)

Идентификаторы (GUID'ы) метаданных конфигурации. Немного о том, как их получить.

05.12.2020    6160    YPermitin    26    

Выявляем и оптимизируем ресурсоемкие запросы 1С:Предприятия

Производительность и оптимизация (HighLoad) Администрирование СУБД Технологический журнал Структура метаданных v8::Запросы Бесплатно (free)

Обычно предметом оптимизации являются заранее определенные ключевые операции, т.е. действия, время выполнения которых значимо для пользователей. Причиной недостаточно быстрого выполнения ключевых операций может быть неоптимальный код, неоптимальные запросы либо же проблемы параллельности. Если выясняется, что основная доля времени выполнения ключевой операции приходится на запросы, то осуществляется оптимизация этих запросов. При высоких нагрузках на сервер СУБД в оптимизации нуждаются и те запросы, которые потребляют наибольшие ресурсы. Такие запросы не обязательно связаны с ключевыми операциями и заранее неизвестны. Но их также легко выявить и определить контекст их выполнения, чтобы оптимизировать стандартными методами.

24.05.2020    9276    DataReducer    22    

Об общих реквизитах

Практика программирования Структура метаданных v8 1cv8.cf Бесплатно (free)

Общие реквизиты. Что за ними скрывается?

28.10.2019    16188    YPermitin    30