1С 8. Часть 2 - Управляемые формы. СКД: смена типа «набор данных – запрос» на «набор данных – объект» с сохранением полей

08.10.15

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

Продолжение публикации "1С 8. СКД: смена типа «набор данных – запрос» на «набор данных – объект» с сохранением полей" http://infostart.ru/public/405762/ . Теперь напишем обработку под управляемые формы. Мы узнаем как в управляемой форме (под тонкий-клиент и web-клиент) реализовать: Открытие диалога выбора файла с выделением в асинхронную процедуру; Открытие диалога сохранения файла с выделением в асинхронную процедуру; Передача файла с клиента на сервер; Заполнение дерева значений (оперирование с ДанныеФормыДерево, ДанныеФормыКоллекцияЭлементовДерева, ДанныеФормыЭлементДерева); Передача файла с сервера на клиент.

Файлы

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

Наименование Скачано Купить файл
Обработка: Управляемые формы. СКД: смена типа «набор данных – запрос» на «набор данных – объект» с сохранением полей
.epf 9,10Kb
6 2 500 руб. Купить

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

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

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

Создадим управляемую форму обработки, со следующими реквизитами:

  • Адрес – строка неограниченная
  • ДеревоНаборов – ДеревоЗначений (и колонки к нему)
  • РасшифровкаСтроки – Строка, на форме многострочная

 

 

Добавим команды формы и соответствующие клиентские процедуры к ним

 

 

 Процедура для кнопки «Заполнить из файла»:

//--Открытие диалога выбора файла с выделением в асинхронную процедуру

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

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

&НаКлиенте
Процедура ЗаполнитьИзФайлаЗавершение1(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    Диалог = ДополнительныеПараметры.Диалог;
    
    Если (ВыбранныеФайлы <> Неопределено) Тогда   
        МассивФайлов = Диалог.ВыбранныеФайлы;
        Для Каждого ИмяФайла Из МассивФайлов Цикл  
            ИсходныйФайл = ИмяФайла; 
        КонецЦикла;
        
        Файл = Новый Файл(ИсходныйФайл);
        Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("ЗаполнитьИзФайлаЗавершение", ЭтаФорма, Новый Структура("ИсходныйФайл", ИсходныйФайл)));
        
    КонецЕсли;
    
КонецПроцедуры

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

{Замечание! Хочу обратить внимание, что данный код можно создать при помощи такой удобной возможности, как рефакторинг кода:

Выделяем процедуру диалога выбора файла

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

И воспользовавшись пунктом меню «Текст -> Рефакторинг -> Нерекомендуемые синхронное вызовы -> Выделить в асинхронную процедуру» получаем асинхронный код

 

 

Конец замечания}

В неуправляемых формах, чтобы очистить строки дерева, мы использовали

ДеревоНаборов.Строки.Очистить();

В управляемых формах это будет выглядеть следующим образом:

ЭлементыДанныеФормыДерево = ДеревоНаборов.ПолучитьЭлементы();
ЭлементыДанныеФормыДерево.Очистить();

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

&НаКлиенте
Процедура ЗаполнитьТЧ(ИсходныйФайл)
    
    //Очистим строки и колонки дерева наборов
    ЭлементыДанныеФормыДерево = ДеревоНаборов.ПолучитьЭлементы();
    ЭлементыДанныеФормыДерево.Очистить();
    
    ДвоичДанные = Новый ДвоичныеДанные(ИсходныйФайл);
    Адрес = ПоместитьВоВременноеХранилище(ДвоичДанные, УникальныйИдентификатор);
    ЗаполнитьДеревоИзФайлаНаСервере(Адрес);
    
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДеревоИзФайлаНаСервере(Адрес)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременногоФайлаXML = ПолучитьИмяВременногоФайла("xml");
    ДвоичныеДанные.Записать(ИмяВременногоФайлаXML);
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяВременногоФайлаXML);
    ЧтениеXML.Прочитать();
    СКД = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); //Производит чтение значения в формате XML
    ЗаполнитьДерево(ДеревоНаборов.ПолучитьЭлементы(), СКД.НаборыДанных); //Рекурсивное построение дерева значений
КонецПроцедуры

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

Для передачи файла с клиента на сервер используем временное хранилище. На клиенте:

ДвоичДанные = Новый ДвоичныеДанные(ИсходныйФайл);
Адрес = ПоместитьВоВременноеХранилище(ДвоичДанные, УникальныйИдентификатор);
ЗаполнитьДеревоИзФайлаНаСервере(Адрес);

На сервере:

ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайлаXML = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные.Записать(ИмяВременногоФайлаXML);

Для вывода текста запроса в поле Расшифровка строки в управляемой форме изменим путь к данным элемента «РасшифровкаСтроки»:

 

 

Процедура для ранее созданной кнопке «Сохранить файл…»

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

&НаКлиенте
Процедура СохранитьВФайлЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    Диалог = ДополнительныеПараметры.Диалог;
    
    Если (ВыбранныеФайлы <> Неопределено) Тогда    
        
        МассивФайлов = Диалог.ВыбранныеФайлы;
        Для Каждого ИмяФайла Из МассивФайлов Цикл
            КоррФайл = ИмяФайла;
        КонецЦикла;
        
        НовыйАдрес = ВыполнитьЗаменуНаСервере();
        
        ДвоичныеДанные = ПолучитьИзВременногоХранилища(НовыйАдрес);
        ДвоичныеДанные.Записать(КоррФайл);
        
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция ВыполнитьЗаменуНаСервере()
    
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременногоФайлаXML = ПолучитьИмяВременногоФайла("xml");
    ДвоичныеДанные.Записать(ИмяВременногоФайлаXML);
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяВременногоФайлаXML);
    ЧтениеXML.Прочитать();
    СКД = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); //Производит чтение значения в формате XML
    
    НовСКД = Новый СхемаКомпоновкиДанных;
    НовСКД = СКД;
    
    ВыполнитьЗамену(ДеревоНаборов.ПолучитьЭлементы(), НовСКД.НаборыДанных);
    
    НовыйФайл = ПолучитьИмяВременногоФайла("xml");
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(НовыйФайл);
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, НовСКД);
    ЗаписьXML.Закрыть();
    
    ДвоичДанные = Новый ДвоичныеДанные(НовыйФайл);
    АдресВозвр = ПоместитьВоВременноеХранилище(ДвоичДанные, УникальныйИдентификатор);
    
    Возврат АдресВозвр;
    
КонецФункции

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

Обработка прилагается. Надеюсь, что материал кому-то будет полезен. Всего хорошего…

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

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

См. также

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

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

16500 руб.

02.09.2020    244661    1341    419    

1122

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

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

29.01.2026    4686    262    shapa_pro    25    

63

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

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

29.10.2025    15219    ovetgana    112    

105

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

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

01.07.2025    8957    krasnoshchekovpavel    5    

66

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

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

10.04.2025    8172    Neti    0    

41

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

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

27.02.2025    15377    ovetgana    50    

93

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

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

24.12.2024    12992    Akcium    17    

46

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

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

20.08.2024    9395    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. echo77 1937 16.06.22 14:13 Сейчас в теме
А есть такая же, но чтобы еще порядок полей в наборе данных можно было менять?
2. echo77 1937 16.06.22 15:23 Сейчас в теме
(0) К сожалению, при использовании этой обработки все свойства полей конвертируемого набора данных очищаются
Прикрепленные файлы:
3. echo77 1937 30.06.22 19:55 Сейчас в теме
Сделал обработку (УФ) которая может изменить тип набора данных, изменять порядок полей https://infostart.ru/public/1679241/
Для отправки сообщения требуется регистрация/авторизация