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

05.07.24

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Генератор схемы компоновки данных (СКД), написание кода схемы программно (версия 001):
.epf 31,28Kb
14
14 Скачать (3 SM) Купить за 2 450 руб.
Генератор схемы компоновки данных (СКД), написание кода схемы программно (версия 002):
.epf 33,73Kb
34
34 Скачать (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) то будет попытка отсеять генерацию срок с значениями, которые совпадают с значения по-умолчанию. Поэтому строго говоря название не точное, но короткое. На моём тестовом примере без потери полноты генерации удалось сократить число строк примерно вдвое. Впрочем вариант без отсева тоже имеет смысл для изменения вручную, чтоб не искать доступные поля в конфигураторе. Ну и для дополнительного контроля качества генерации.

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

См. также

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

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

10000 руб.

02.09.2020    151387    833    397    

841

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

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

9360 руб.

17.05.2024    20304    58    42    

106

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

OneRPA - платформа роботизации рутинных операций, в основе которой лежит платформа 1С:Предприятие. Данная платформа позволяет использовать современные технологии роботизации, не теряя при этом наработки, которые были созданы в ходе автоматизации. При этом платформа роботизации сохраняет все преимущества платформы 1С: гибкость, кроссплатформенность, мобильный и Web доступ, простоту расширения. Ну и конечно же роботы создаются и сопровождаются простыми специалистами 1С, при этом не обязательно программистами. Self hosted версия

300000 руб.

03.03.2021    14165    12    27    

36

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

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

6900 руб.

20.08.2024    3804    22    6    

36

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

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

18000 руб.

06.10.2023    13964    35    7    

69

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

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

10000 руб.

10.11.2023    9049    32    10    

56

SALE! %

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

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

4800 3840 руб.

14.01.2013    185287    1126    0    

899

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

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

15000 руб.

07.10.2021    16728    6    29    

42
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 6895 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 50 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 3779 07.02.24 16:25 Сейчас в теме
Я как-то пользовался этой https://infostart.ru/1c/tools/1376937/ это какое-то развитие или отдельное решение?
12. obmailok 190 08.02.24 08:09 Сейчас в теме
(11)Это отдельное решение. В указанной Вами обработке реализована генерация для ограниченного количества типов (например совсем не генерируются макеты, вложенные схемы). На примерах, которые я проверял, были ошибки с генерацией вложенных группировок и некоторых значений. Хотя это одна из лучших обработок, которые я смотрел. В итоге написал свою.
rpgshnik; +1 Ответить
13. rpgshnik 3779 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 544 07.04.24 14:26 Сейчас в теме
(3) Очень интересно, спасибо
19. Светлый ум 407 12.04.24 08:16 Сейчас в теме
20. redtram 53 24.05.24 23:22 Сейчас в теме
Гениально :) намного быстрее чем лазить по всем примерам и смотреть как там что вставляется программно.
21. obmailok 190 05.07.24 10:46 Сейчас в теме
Дополнение к коду Функция ПисательЗначения:

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


Дополнить:

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