1С 8. СКД: смена типа «набор данных – запрос» на «набор данных – объект» с сохранением полей

06.10.15

Разработка - СКД

Возникла у меня необходимость в существующем отчете на СКД, имеющем набор данных - запрос, изменить тип набора данных с запроса на объект - таблицу значений. Но при смене типа набора данных слетели все поля, роли, ресурсы, оформление – в общем, все слетело. Погуглил и нашел способ – редактирование xml- файла схемы компоновки данных в текстовом редакторе. А почему бы не написать обработку для 1С, которая все сделает сама? Предлагаю вместе создать такую обработку. На примере обработки рассмотрим, как в 1С реализовать: Чтение и запись XML, использование СериализаторXDTO; Программное изменение схемы компоновки данных; Рекурсивное построение дерева значений; Изменение вида элемента управления (флажок вместо поля ввода); Работа с файлами диалог открытия, сохранения; Управление видимостью строк/колонок и отдельных ячеек дерева значений.

Файлы

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

Наименование Скачано Купить файл
Обработка для смены типа набора данных СКД с сохранением полей
.epf 8,27Kb
7 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

Нашел способ - //infostart.ru/public/285576/ (хочу выразить свое уважение 1cKiller Alexey - респект) - редактирование xml- файла схемы компоновки данных в текстовом редакторе. А почему бы не написать обработку для 1С, которая все сделает сама?

Предлагаю вместе создать такую обработку.

Итак, у нас xml – файл СКД,  в котором присутствует набор данных – запрос (учтем, что в данном файле наборы данных могут быть не только на основании запросов, но и объектов, а также объединения). Файл получен, нажатием в конфигураторе кнопки «Сохранить схему в файл»:

Предлагаю на форме разместить два поля: первое для отображения наборов данных (тип ДеревоЗначений, т.к. объединение тоже может содержать различные наборы данных, то использование таблицы значений нам не подойдет), второе для отображения текста запроса набора данных-запрос(строка неограниченной длины, на форме многострочная):

 

Теперь организуем выбор и обработку файла исходной схемы компоновки данных. Для этого создадим кнопку «Заполнить из файла», назначим ей событие при нажатии:

Процедура КоманднаяПанель1ЗаполнитьИзФайла(Кнопка)

    //Открытие диалога выбора файла
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.ПолноеИмяФайла = "";
    Диалог.Фильтр = "файлы СКД *.xml|*.xml";
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Заголовок = "Выберите файл СКД - ресурс";
    Если Диалог.Выбрать() Тогда
        МассивФайлов = Диалог.ВыбранныеФайлы;
        Для Каждого ИмяФайла Из МассивФайлов Цикл
            ИсходныйФайл = ИмяФайла;
        КонецЦикла;

        Файл = Новый Файл(ИсходныйФайл);
        Если Файл.Существует() Тогда
            ЗаполнитьТЧ(ИсходныйФайл); //Чтение XML-файла и заполнение дерева наборов
        Иначе
            Сообщить("Не найден файл " + ИсходныйФайл);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Процедура ЗаполнитьТЧ() рекурсивно формирует дерево наборов данных и создает колонки соответствующего элемента формы:

Процедура ЗаполнитьДерево(Позиция, НаборыДанных)
    Сч = 0;
    Для Каждого НаборДанных Из НаборыДанных Цикл
        Сч = Сч + 1;
        НовСтр = Позиция.Строки.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтр, НаборДанных);
        НовСтр.Номер = Сч;
        Если ЗначениеЗаполнено(НовСтр.Запрос) Тогда
            НовСтр.ТипНабора = "Запрос";
        ИначеЕсли ЗначениеЗаполнено(НовСтр.ИсточникДанных) Тогда
            НовСтр.ТипНабора = "Объект";
        Иначе
            НовСтр.ТипНабора = "Объединение";
            //Т.к. объединение может содержать различные наборы,
            //то разберем набор-объединение по наборам данных
            ЗаполнитьДерево(НовСтр, НаборДанных.Элементы);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Для того, чтобы в нижней части обработки в поле РасшифровкаСтроки отображался текст запроса текущего набора данных (если, конечно, этот набор даных-запрос) используем событие ПриАктивацииСтроки нашего дерева:

Процедура ДеревоНаборовПриАктивизацииСтроки(Элемент)
    ТекДанные = Элемент.ТекущиеДанные;
    Если ТекДанные.ТипНабора = "Запрос" Тогда
        РасшифровкаСтроки = ТекДанные.Запрос;
    ИначеЕсли ТекДанные.ТипНабора = "Объект" Тогда
        РасшифровкаСтроки = ТекДанные.ИмяОбъекта;
    Иначе
        РасшифровкаСтроки = "";
    КонецЕсли;
КонецПроцедуры

 

Теперь можно в дереве указать, какие наборы заменять (установка флажка в колонке «Пометка» и имя объекта, содержащего данные в колонке «Имя объекта»), например, так:

Создадим кнопку «Сохранить СКД в файл как…», процедура, вызываемая по нажатию этой кнопки:

Процедура КоманднаяПанель1СохранитьВФайл(Кнопка)
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.ПолноеИмяФайла = "";
    Диалог.Фильтр = "файлы СКД *.xml|*.xml";
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Заголовок = "Файл СКД исправленный";
    Если Диалог.Выбрать() Тогда
        
        МассивФайлов = Диалог.ВыбранныеФайлы;
        Для Каждого ИмяФайла Из МассивФайлов Цикл
            КоррФайл = ИмяФайла;
        КонецЦикла;
        
        НовСКД = Новый СхемаКомпоновкиДанных;
        НовСКД = СКД;
        
        ВыполнитьЗамену(ДеревоНаборов.Строки, НовСКД.НаборыДанных);
        
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.ОткрытьФайл(КоррФайл);
        СериализаторXDTO.ЗаписатьXML(ЗаписьXML, НовСКД);
        
    КонецЕсли;
    
КонецПроцедуры

А вот и сама, так сказать, процедура-гвоздь программы ВыполнитьЗамену(), рекурсивно:

Процедура ВыполнитьЗамену(ДеревоНаборовСтроки, НовСКДНаборыДанных)
     
    Для Каждого Стр Из ДеревоНаборовСтроки Цикл    
        Если Стр.Отметка Тогда
            
            НовыйНабор = НовСКДНаборыДанных.Вставить(Стр.Номер - 1, Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
            
            СтарыйНабор = НовСКДНаборыДанных[Стр.Номер];
            
            ЗаполнитьЗначенияСвойств(НовыйНабор, СтарыйНабор);
            НовыйНабор.ИмяОбъекта = Стр.ИмяОбъекта;
            Для Каждого СтарыйНаборПоле ИЗ СтарыйНабор.Поля Цикл
                НовПоле = НовыйНабор.Поля.Добавить(ТипЗнч(СтарыйНаборПоле));
                ЗаполнитьЗначенияСвойств(НовПоле, СтарыйНаборПоле);
            КонецЦикла;
            НовСКДНаборыДанных.Удалить(СтарыйНабор);
            
        Иначе
            Если Стр.ТипНабора = "Объединение" Тогда   
                ВыполнитьЗамену(Стр.Строки, НовСКДНаборыДанных[Стр.Номер - 1].Элементы);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Все очень просто, обработка (неуправляемые формы) прилагается – используйте.

При необходимости, не против добавить и на управляемых формах. Удачи…

Вступайте в нашу телеграмм-группу Инфостарт

СКД система компоновки данных служебные разработчику

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    247135    1359    421    

1132

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    5218    293    shapa_pro    25    

66

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    16072    ovetgana    112    

105

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

01.07.2025    9349    krasnoshchekovpavel    5    

67

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    8515    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    15631    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    13209    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    9714    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. nixel 1469 07.10.15 11:18 Сейчас в теме
Я боюсь, что открою Америку, но смена типа набора данных проводится в блокноте за... пару секунд =/
Сохраняем схему в xml, открываем блокнотом, находим тег dataSet, меняем атрибут xsi:type="DataSetQuery" на xsi:type="DataSetObject", удаляем вложенный тег query целиком
....
PROFIT!

Update:
Пардон, читал статью по диагонали, вы указали способ через текстовый редактор. На мой взгляд в блокноте все же проще и быстрее, но спасибо вам за обработку :)
maxchaos; mi1man; slax; zqzq; Luchik; +5 Ответить
2. Luchik 686 07.10.15 11:43 Сейчас в теме
(1) nixel, (1) nixel, да, я же об этом написал
(хочу выразить свое уважение 1cKiller Alexey - респект) - редактирование xml- файла схемы компоновки данных в текстовом редакторе
. Эта публикация - возможность поделиться своими навыками, что и как можно реализовать в 1С.
Более того, оказывается, аналогичная обработка есть (infostart.ru)
dimaster; +1 Ответить
3. Luchik 686 08.10.15 10:05 Сейчас в теме
Добавил для управляемой формы http://infostart.ru/public/406318/
dimaster; +1 Ответить
4. isn 17 30.06.17 13:44 Сейчас в теме
(3) Ставлю лайк (скачали на работе). Просто и действенно. Как пожелание - добавить выбор имен объекта (из списка загруженных) для подмены / замены и оставить ручной ввод.
5. VID1234 148 06.12.21 14:57 Сейчас в теме
А наоборот можно с объекта на запрос?
Для отправки сообщения требуется регистрация/авторизация