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

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

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

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

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

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

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

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

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

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

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

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

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

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

Начал работу над проектом генерации JSON Schema для конфигураций на платформе 1С:Предприятие 8.

Полезно для интеграции с внешними не-1С системами.

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

 
Обновление от 08.07.2021 : Алгоритм загрузки конфигурации.
 
Обновление от 22.03.2021

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

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

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

 

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

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


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

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

Нет, не может. С чего бы это? Можете привести пример?
Загрузка дт вообще никаких данных не изменяет. Тупая заливка как есть, со всеми ошибками в данных и метаданных.
29. zhichkin 1111 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 1111 22.02.21 23:47 Сейчас в теме
(30).Так бывает. Конкретную методику воспроизведения не подскажу. Если удалять объекты метаданных, создавать заново, сохранять конфигурацию и перезагружать через dt, то в какой-то момент это может произойти. Если не имена таблиц, то полей. Я уже натыкался на это раньше. По этому бэкапы только средствами SQL Server делаю, тем более что это рекомендация самой 1С.
33. nvv1970 23.02.21 08:39 Сейчас в теме
(31) в ДТ сохраняется все, кроме индексов. При загрузке выполняется просто балкинсерт данных как есть. Не проверяются связи таблиц, метаданные, имена и прочие метаперестроения, которые выполняет реструктуризация.
Вы сейчас на ходу придумываете что-то. А удаление/добавление таблиц с ДТ не имеет отношения. Это из другой оперы.
ПС: конечно дт - это не бэкап. В бэкапе то же состояние статистики, фрагментации таблиц, расположение страниц в файлах.
34. zhichkin 1111 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 1111 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 1111 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 1111 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 1111 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 1111 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 1111 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 1111 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 1111 27.06.21 12:21 Сейчас в теме
(53) Спасибо. Теперь дошло. Может быть есть ссылка на Ваш проект ?
49. zhichkin 1111 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 1111 27.06.21 12:14 Сейчас в теме
(51) Интересно что это за конфигурации, у которых нет файла "root". Можете рассказать ?
58. YA_24763472 28.06.21 08:18 Сейчас в теме
(54) может я не про тот "root" думаю, файл такой есть но он всегда пустой, 212 байт, независимо от размера конфигурации. В нем только одно значение.
50. zhichkin 1111 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 1111 27.06.21 12:19 Сейчас в теме
(52) Про настройки это правильная мысль на мой взгляд.
По поводу изменят чего-нибудь - ну вот Снегопат живёт как-то уже много лет.
Каждый раз адаптируется к новой версии платформы 1С.
Да, с этим есть определённые проблемы, но как-то справляются с ними.
59. YA_24763472 28.06.21 08:24 Сейчас в теме
(55) Каждый раз адаптировать понятно, но хочется, что бы сразу работало с любой (хотя бы известно версией платформы), сделал вот такую структуру файлов, где верхняя папка это версия платформы. В файлах структура основных данных, что читаем (JSON намеренно сделал, что бы можно было по возможности редактировать вне системы), это же используется для проверки корректности (совместимости текущей версии файла) и этот же каталог идет как список типов данных (могут в новой платформе добавить какой то новый тип, кроме справочника и т.п.)
Прикрепленные файлы:
60. zhichkin 1111 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 1111 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" и прочие. Мы в одном направлении работаем, может перейдем в мессаджер? Опытом обменяемся, я не так давно этим занялся, но может тоже, что то замечу.
Прикрепленные файлы:
Оставьте свое сообщение

См. также

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

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

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

10.11.2020    6794    82    zhichkin    13    

Своя форма выбора типа, метаданных (Infostart Toolkit)

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

Зачем своя форма выбора? Полезные функции и особенности работы.

26.07.2021    2307    Evg-Lylyk    17    

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

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

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

05.12.2020    11710    YPermitin    27    

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

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

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

24.05.2020    11152    DataReducer    22    

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

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

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

28.10.2019    18498    YPermitin    31