Генератор схемы компоновки данных (СКД), написание кода схемы программно

05.07.24

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

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Генератор схемы компоновки данных (СКД), написание кода схемы программно (версия 001):
.epf 31,28Kb
15
15 Скачать (3 SM) Купить за 2 450 руб.
Генератор схемы компоновки данных (СКД), написание кода схемы программно (версия 002):
.epf 33,73Kb
41
41 Скачать (3 SM) Купить за 2 450 руб.

Волею судеб пришлось глубоко менять СКД программно. В попытках глубже разобраться в вопросе обратился к чужим наработкам. Но по факту не нашел ни одной достаточно полной, а некоторые были с откровенными ошибками (если кто знает хорошие примеры, сообщите в комментариях). Пришлось делать самому. На мой взгляд получилось неплохо, посему и решил поделиться. Уверен, что многим пригодится.

Обработка очень даже рабочая, использовалась на практике, но это не гарантирует её 100% полноту. Могут найтись типы, до которых я не дотянулся. Но код открыт и достаточно прост, и для генерации кода используется всего 6 процедур + вызов.

 

 

Так что дополнить по аналогии, при желании, будет несложно.

На момент создания публикации уже описана генерация кода для данных более 100 типов:

 
 Типы, доступные для генерации кода

Из минусов: обработку лучше использовать на толстом клиенте - так доступен конструктор СКД, но можно и обойтись тонким, если заранее заготовить схемы в конфигураторе.

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

 

Источники СКД

 

Выбор источника СКД

 

Самый простой и естественный способ получить схему - воспользоваться конструктором (п 1) (если текст XML заполнен, то подхватит соответствующую схему), если Вы на толстом клиенте. Если клиент тонкий или есть заготовка в виде внешнего отчета или сохраненной схемы, то через выбор файла (п 2). И 1й и 2й способ приведет к генерации текста XML (п 3), но текст можно и просто вставить. Правильный текст XML будет преобразован в дерево (п 4), что намного удобней для просмотра. Атрибуты и значения будут видны в окнах (п 5) и (п 6). Дерево (п 4) может быть заполнено по любому XML файлу, так что обработку можно использовать просто для просмотра XML.

Если текст XML соответствует СКД, то можно переходить на вторую закладку для генерации кода. 

 

Генерация кода

 

Генерация кода

 

После генерации кода (п 1) формируется список разделов (п 2) и сам текст (п 3). Так как код формируется избыточно, список разделов призван упростить нахождение фрагмента, отвечающего за формирование соответствующего раздела. При выборе пункта из списка (п 2), курсор установится в начало фрагмента кода (п 3).

 

Дополнительные функции

 

Дополнительные функции

 

Если открыт толстый клиент, сгенерированный текст кода можно проверить, открыв конструктор СКД (п 1) при этом схема генерируется из кода. Изменив схему, можно сохранить новый текст XML и снова сгенерировать код (пригодится для сравнения кода). Если схема Вас устраивает, то можно сравнить XML исходной схемы и схемы сгенерированной по коду (п 2). Сравнение доступно и на тонком клиенте. Запомнить текущий код (п 3) следует ДО изменения схемы и новой генерации кода. Если Вы ранее сохраняли код, то можно текущий код из окна сравнить с ранее сохраненным кодом (п 4) и быстрее найти измененные места. Сравнение также доступно на тонком клиенте.

 

Сравнение

 

Процесс сравнения несколько "творческий". Некоторые изменения, которых нет, придется увидеть.

В основном это другое представление текста:

 

 

или отсутствие настроек, которые могут присутствовать в исходной схеме, но отсутствовать в созданном объекте схема или отсеяны генератором кода (например для ЗначениеПараметраНастроекКомпоновкиДанных) по Использованию. Ещё бывает вариант, когда свойства читаются и устанавливаются методом (например ПараметрСхемыКомпоновкиДанных, методы ПолучитьДоступныеЗначения и УстановитьДоступныеЗначения) - мог упустить.

 

 

Но все равно это проще, чем выискивать разницы через конструктор СКД глазками.

При сравнении кода тоже есть "творческий" момент. После нахождения разницы Вам все-таки придется понять, как "докопаться" до конкретного свойства схемы:

 

 

Но наличие кода это сильно упрощает.

PS: Последние доработки обработки велись на платформе 1С:Предприятие 8.3 (8.3.24.1342), но это не должно быть ограничение и обработка должна работать и на более ранних версиях. Проверить конкретный предел возможности нет, но и какие-то специфические методы не использовались.

 

Версия 002:

 

Добавлена генерация кода для типов:

 
 Добавленные типы
  1. ИспользуемаяКопияБазыДанных
  2. ИспользуемыеКопииБазыДанных
  3. ПолосаИзмерительнойДиаграммы
  4. ПолосыИзмерительнойДиаграммы

Добавлены новые возможности:

По кнопке "Сравнить СКД по кодам" (п. 1) можно сравнить между собой схемы, которые получаются после выполнения сохраненного кода и текущего кода из окна.

Если при генерации кода включена настройка "Проверять пустые значения" (п. 2) то будет попытка отсеять генерацию срок с значениями, которые совпадают с значения по-умолчанию. Поэтому строго говоря название не точное, но короткое. На моём тестовом примере без потери полноты генерации удалось сократить число строк примерно вдвое. Впрочем вариант без отсева тоже имеет смысл для изменения вручную, чтоб не искать доступные поля в конфигураторе. Ну и для дополнительного контроля качества генерации.

Конструктор генератор кода СКД схема компоновки данных сравнение программно

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159290    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    7724    55    22    

66

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

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

9360 руб.

17.05.2024    23394    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10398    36    20    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15374    35    7    

70

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    187951    1138    0    

912

SALE! 15%

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

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

15000 12750 руб.

07.10.2021    17295    6    32    

42

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

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

1800 руб.

21.02.2023    7683    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 6912 06.02.24 12:30 Сейчас в теме
Читаю интересно, но с практической точки зрения, пока не понимаю как это использовать (не сталкивался)
Можете, пожалуйста, описать несколько ситуаций, где в реальных проектах это пригодилось?
2. obmailok 190 06.02.24 14:22 Сейчас в теме
(1)Ситуация действительно редкая, но на практике, например, пришлось реализовывать не стандартную расшифровку СКД. Стандартно если расшифровываешь сотрудником, то и видишь список сотрудников, расшифровываешь регистратором, то список регистраторов. А вот чтоб сотрудники по регистраторам или таблицей с колонками ещё чего-нибудь - надо писать код, формировать дерево или таблицу с описаниями, а может вообще диаграмму. Вот тут может и пригодится.
sapervodichka; +1 Ответить
3. ktb 629 06.02.24 20:23 Сейчас в теме
Посмотрите https://github.com/arkuznetsov/SerLib1C.
Там есть преобразование СКД в/из массивы и структуры. А далее в/из JSON.
В JSON сравнивать удобнее.
tango; nikolav; +2 Ответить
4. obmailok 190 07.02.24 08:05 Сейчас в теме
6. obmailok 190 07.02.24 11:54 Сейчас в теме
(3)Не понял прелесть промежуточного преобразования. Для тех же параметров значение сравнивается как "Значение": "/UnknownType({\"#\",fe368b30-a819-45c2-886d-759dc2d83a58})/" и совсем не понятно, что там с его свойствами. Уж лучше сразу схему в JSON сериализовать, но какого-то плюса я не увидел. Кстати в обработке это можно сделать, правда программно. Функция есть, а настройки нет, но при желании попробовать можно.
7. ktb 629 07.02.24 11:59 Сейчас в теме
(6) Хм, для ссылок не должно быть "UnknowType" в значениях, должно быть развернутое представление ссылки. А можно мне куда-нить кинуть пример СКД, с которым такое получается?
Промежуточное преобразование нужно было изначально для других целей.
9. obmailok 190 07.02.24 12:13 Сейчас в теме
(7)Сразу уточняю речь идет о

__Тип": "ЗначениеПараметраКомпоновкиДанных" из "__Тип": ПараметрыРедактированияКомпоновкиДанных", "Элементы"

И ссылки тут не могут быть.

А взял первый попавшийся отчет из типовой ЗУП (конкретно "Аккредитации специалистов")
Подозреваю, что это будет для любой СКД.

А еще меня смущают вложенные схемы. Там рекурсия напрашивается, а я её не увидел.
14. ktb 629 08.02.24 15:12 Сейчас в теме
(9) Я понял в чем косяк, это системные типы в таком виде пишутся, подпилю на днях, чтобы в человеко читаемом виде писались в JSON.

Спасибо!

А с рекурсией там все в порядке, тесты сохранения восстановления я на всех отчетах ERP гонял. :-)
obmailok; +1 Ответить
5. nikolav 51 07.02.24 11:53 Сейчас в теме
Отличная обработка, уже применил на практике, нужно было программно модифицировать схему отчета, чтобы сохранить его в таблицу значений. Обработка сэкономила несколько часов, не пришлось продираться через справку и тратить время на проверку предположений.

Пожелания
1. не генерировать код для значений, которые уже установлены по-умолчанию конструктором объекта (краткий режим)
2. сделать что-то с выравниванием пробелами, бесяче это. Для себя конечно исправил автозаменой по исходникам
3. разделять строки на группы, например строки добавления отбора отделять пустой строкой, иначе сливается в цельную простыню.
8. obmailok 190 07.02.24 12:05 Сейчас в теме
(5)Спасибо за оценку.

1. У самого была такая мысль, но для этого нужно знать значения по умолчанию для каждого типа, а с этим проблемы. Может есть какие-то мысли? Но с другой стороны видно что и где можно изменить, так что есть и плюсы.

2. Справились же, тем более, что код открыт. А вот обратное преобразование было бы проблематичней. Каждый волен выбирать.

3. Поиграйтесь с "ВывестиРаздел" при ЭтоКомментарий = Итина или добавьте _СледующаяСтрокаКодаСКД() в желаемое место (добавит пустую строку для разделения).
10. obmailok 190 07.02.24 12:58 Сейчас в теме
(5)На всякий случай моя методика правки генерируемого текста:

В процедуре _СледующаяСтрокаКодаСКД по ТекстСтроки = "текст кода, который хотим подправить" ставим точку останова с условием. Далее находим откуда вызывается и в найденном фрагменте для типа можем менять прядок вывода, добавляем разделы, комментарии, пустые строки и любое форматирование... И... наслаждаемся.
15. obmailok 190 12.02.24 13:36 Сейчас в теме
(5)Смог убрать бОльшую часть генерации строк со значением по-умолчанию. Есть нюансы, но все-равно на тестовой СКД-шке код уменьшился на 50%.
11. rpgshnik 3795 07.02.24 16:25 Сейчас в теме
Я как-то пользовался этой https://infostart.ru/1c/tools/1376937/ это какое-то развитие или отдельное решение?
12. obmailok 190 08.02.24 08:09 Сейчас в теме
(11)Это отдельное решение. В указанной Вами обработке реализована генерация для ограниченного количества типов (например совсем не генерируются макеты, вложенные схемы). На примерах, которые я проверял, были ошибки с генерацией вложенных группировок и некоторых значений. Хотя это одна из лучших обработок, которые я смотрел. В итоге написал свою.
rpgshnik; +1 Ответить
13. rpgshnik 3795 08.02.24 08:18 Сейчас в теме
16. webester 26 21.02.24 07:22 Сейчас в теме
Рабочий день можно сказать сэкономлен. Просто взял кусок кода из обработки и вставил в общий модуль. Не надо разбираться, где какие типы, поля, как добавлять и прочее. Очень полезно, очень удобно. Автор пиши еще.
2ncom; obmailok; +2 Ответить
17. obmailok 190 22.02.24 07:21 Сейчас в теме
(16)Спасибо за оценку. Наработки то есть, но обычно это рабочие инструменты, которые постоянно дорабатываются под себя по ситуации. Не все выложишь.
18. tango 545 07.04.24 14:26 Сейчас в теме
(3) Очень интересно, спасибо
19. Светлый ум 415 12.04.24 08:16 Сейчас в теме
20. redtram 53 24.05.24 23:22 Сейчас в теме
Гениально :) намного быстрее чем лазить по всем примерам и смотреть как там что вставляется программно.
21. obmailok 190 05.07.24 10:46 Сейчас в теме
Дополнение к коду Функция ПисательЗначения:

	Иначе
		
		ОбъектМетаданных = Метаданные.НайтиПоТипу(ПроверяемыйТип);


Дополнить:

	ИначеЕсли ПроверяемыйТип = Тип("ТаблицаЗначений") Тогда
		ЗначениеСтрокой = "Новый ТаблицаЗначений";
	Иначе
		
		ОбъектМетаданных = Метаданные.НайтиПоТипу(ПроверяемыйТип);
Оставьте свое сообщение