Консоль запросов для ЗУП 3.х

05.11.19

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

Доработка стандартной консоли запросов для работы с механизмом представлений из ЗУП 3.х.

Скачать файл

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

Наименование По подписке [?] Купить один файл
Консоль запросов для ЗУП 3.х:
.epf 98,52Kb
90
90 Скачать (1 SM) Купить за 1 850 руб.

За основу взята стандартная консоль для управляемого приложения с https://its.1c.ru/db/metod8dev/content/4500/hdoc для версии 8.3. Цель доработки - возможность редактирования (создания) отчетов из ЗУП 3.х с использованием механизма представлений в консоли.

Для примера стандартный отчет График Отпусков,  в запросе 3 пакета. При попытке выполнить данный запрос в консоли, он возвратит пустой результат, т.к. механизм представлений ЗУП 3.х преобразует временную таблицу Представления_КадровыеДанныеСотрудников в несколько таблиц. Идея доработки - при обращении к конструктору консоли передать текст запроса в ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапросаВФорме);

Собственно на этом все :). Ниже детали моей реализации:

В консоли запросов добавил реквизит УчестьПредставленияЗУП(булево) и табличную часть ПараметрыЗУП(реквизиты Ключ и Значение)

 

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

 

&НаКлиенте
////
Процедура ОткрытьКонструкторЗапроса(Команда)

   
ИндексТекущегоЗапроса = ИндексТекущегоВопроса();
    Если
ИндексТекущегоЗапроса = Неопределено Тогда
       
ТекстСообщения = НСтр("ru = 'Выберите запрос.'");
       
СообщитьПользователю(ТекстСообщения, "Объект");
        Возврат;
    КонецЕсли;

   
ТекстЗапросаВФорме = СокрЛП(ТекстЗапроса.ПолучитьТекст());
   
//// + Механизм представлений
   
Если УчестьПредставленияЗУП И СтрНайти(ТекстЗапросаВФорме, "Представления_") > 0 Тогда
       
ТекстЗапросаВФорме = ПолучитьТекстНаСервере(ТекстЗапросаВФорме);
    КонецЕсли;
   
//// - Механизм представлений
   
КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме);
   
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияКонструктораЗапроса", ЭтотОбъект, ИндексТекущегоЗапроса);
   
КонструкторЗапроса.Показать(Оповещение);

КонецПроцедуры

 

 

 

#Область ДляОбработкиПредставленийЗУП
&НаСервере

Функция ПолучитьТекстНаСервере(ТекстЗапросаВФорме)
   
//ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапросаВФорме);
   
ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапросаВФорме);
    Возврат
ТекстЗапросаВФорме;
КонецФункции


&НаСервере
Процедура ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапросаПриемник, СхемаКомпоновкиДанных = Неопределено) Экспорт

   
СоответствиеПараметров = Новый Структура;

   
МассивЗапросов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекстЗапросаПриемник, ";");


    Для Каждого
ТекстЗапроса1 Из МассивЗапросов Цикл

       
ТекстЗапросаВРег = ВРег(ТекстЗапроса1);

       
ПозицияСловаПоместить = СтрНайти(ТекстЗапросаВРег, "ПОМЕСТИТЬ ");

        Если
ПозицияСловаПоместить > 0 Тогда

           
ПозицияСловаПредставления = СтрНайти(ТекстЗапросаВРег, "ПРЕДСТАВЛЕНИЯ_");

           
ЭтоОписаниеПредставления = Ложь;

            Если
ПозицияСловаПредставления > 0
               
И ПозицияСловаПредставления > ПозицияСловаПоместить Тогда

               
ЭтоОписаниеПредставления = ПустаяСтрока(Сред(ТекстЗапросаВРег, ПозицияСловаПоместить + СтрДлина("ПОМЕСТИТЬ"), ПозицияСловаПредставления - ПозицияСловаПоместить - СтрДлина("ПОМЕСТИТЬ")));

            КонецЕсли;

            Если
ЭтоОписаниеПредставления Тогда

               
//Запрос = ПолучитьЗапросПоПредставлению(ТекстЗапроса1, СоответствиеПараметров);
               
Запрос = ЗарплатаКадрыОбщиеНаборыДанных.ПолучитьЗапросПоПредставлению(ТекстЗапроса1, СоответствиеПараметров);

                Если
Запрос <> Неопределено Тогда

                   
ТекстЗапросаИсточник = Запрос.Текст;

                   
ИмяИсточникаДанных = ЗарплатаКадрыОбщиеНаборыДанных.ПервоеСловоНачинаяСПозицииВТексте(ТекстЗапроса1, ПозицияСловаПоместить + СтрДлина("ПОМЕСТИТЬ "));
                   
ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьИмяСоздаваемойВременнойТаблицы(ТекстЗапросаИсточник, ИмяИсточникаДанных, СтрЗаменить(ИмяИсточникаДанных, "Представления_", "Представления"));

                   
//ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапросаИсточник, СхемаКомпоновкиДанных);
                   
ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапросаИсточник, СхемаКомпоновкиДанных);

                   
ТекстЗапросаПриемник = СтрЗаменить(ТекстЗапросаПриемник, ТекстЗапроса1, ТекстЗапросаИсточник);

                    Если
СхемаКомпоновкиДанных <> Неопределено И Запрос.Параметры.Количество() > 0 Тогда

                       
УдаляемыеПараметры = Новый Массив;
                        Для Каждого
КлючИЗначение Из Запрос.Параметры Цикл
                           
ИмяПараметра = КлючИЗначение.Ключ;
                            Если
СтрНайти(ИмяПараметра, "Представления_") = 0 Тогда
                                Продолжить;
                            КонецЕсли;
                           
НовоеИмяПараметра = СтрЗаменить(ИмяПараметра, "Представления_", "Представления");
                           
Запрос.Параметры.Вставить(НовоеИмяПараметра, КлючИЗначение.Значение);
                           
УдаляемыеПараметры.Добавить(ИмяПараметра);
                        КонецЦикла;

                        Для Каждого
УдаляемыйПараметр Из УдаляемыеПараметры Цикл
                           
Запрос.Параметры.Удалить(УдаляемыйПараметр);
                        КонецЦикла;

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

                    КонецЕсли;

                КонецЕсли;

            Иначе

               
ИмяИсточникаДанных = ЗарплатаКадрыОбщиеНаборыДанных.ПервоеСловоНачинаяСПозицииВТексте(ТекстЗапроса1, ПозицияСловаПоместить + СтрДлина("ПОМЕСТИТЬ "));
               
СоответствиеПараметров.Вставить(ИмяИсточникаДанных, Лев(ТекстЗапроса1, ПозицияСловаПоместить - 1));

            КонецЕсли;

        КонецЕсли;

    КонецЦикла;

   
ТекстЗапросаПриемник = СтрЗаменить(ТекстЗапросаПриемник, "Представления_", "Представления");

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

           
ТекЭлемент = Объект.ПараметрыЗУП.Добавить();
           
ТекЭлемент.Ключ = Стр.Ключ;
           
ТекЭлемент.Значение = Стр.Значение;

        КонецЦикла;
    КонецЕсли;

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

КонецПроцедуры



#КонецОбласти

 

Процедура ДобавитьПараметрВФорму(ПараметрыВФорме, ПараметрСтруктуры)
   
Значение    = ПараметрСтруктуры.Значение;
   
Тип         = ОбъектОбработки().ИмяТипаИзЗначения(Значение);

   
// Основные реквизиты.
   
Элемент                         = ПараметрыВФорме.Добавить();
   
Элемент.Идентификатор           = Новый УникальныйИдентификатор;
   
Элемент.ИдентификаторЗапроса    = ПараметрСтруктуры.ИдентификаторЗапроса;
   
Элемент.Имя                     = ПараметрСтруктуры.Имя;
   
Элемент.Тип                     = Тип;
   
//////
   
Если УчестьПредставленияЗУП И СтрНайти(ПараметрСтруктуры.Имя, "Периоды") <> 0 Тогда
       
Значение = "{""D"",00010101000000}";
    КонецЕсли;
   
//////
   
Элемент.Значение                = Значение;

   
Значение = ЗначениеИзСтрокиВнутр(Значение);

   
// Форменные реквизиты.
   
Элемент.ТипВФорме               = Строка(ТипЗнч(Значение));
   
//Элемент.ЗначениеВФорме            = Значение;
    ////
   
Если УчестьПредставленияЗУП Тогда
       
ОбъектФормы = РеквизитФормыВЗначение("Объект");
       
НайденнаяСтрока = ОбъектФормы.ПараметрыЗУП.Найти(Элемент.Имя, "Ключ");
        Если
НайденнаяСтрока <> Неопределено Тогда
           
Элемент.ЗначениеВФорме = НайденнаяСтрока.Значение;
        Иначе
           
Элемент.ЗначениеВФорме = Значение;
        КонецЕсли;
    Иначе
       
Элемент.ЗначениеВФорме = Значение;
    КонецЕсли;
   
////

КонецПроцедуры

 

 

Вернемся к запросу из отчета График отпусков. На рисунке ниже запрос до и после обработки представлений:

 

Параметры подхватываются автоматически:

 

Получившийся результат в консоли:

 

В заключение: тестировал в Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.9.159), тонкий клиент.  К сожалению, формат публикации не позволяет выложить бесплатно. Надеюсь, приведенное описание позволит легко повторить идею. 

Консоль запросов ЗУП Представления

См. также

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

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

12000 руб.

02.09.2020    171834    962    403    

924

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

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

8400 руб.

20.08.2024    14338    109    46    

108

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

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

22200 руб.

06.10.2023    17301    43    15    

75

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

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

9360 руб.

17.05.2024    27291    96    48    

138

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

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

15000 руб.

10.11.2023    11909    45    27    

67

SALE! %

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

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

4800 3840 руб.

14.01.2013    191255    1152    0    

920

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

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

20000 руб.

07.10.2021    18095    7    32    

42

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1121    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 06.11.19 10:30
Сообщение было скрыто модератором.
...
2. пользователь 07.11.19 07:39
Сообщение было скрыто модератором.
...
3. пользователь 07.11.19 08:46
Сообщение было скрыто модератором.
...
4. пользователь 07.11.19 10:51
Сообщение было скрыто модератором.
...
5. пользователь 21.11.19 10:25
Сообщение было скрыто модератором.
...
7. пользователь 21.12.19 18:53
Сообщение было скрыто модератором.
...
10. пользователь 03.10.20 11:41
Сообщение было скрыто модератором.
...
9. пользователь 17.08.20 15:14
Сообщение было скрыто модератором.
...
6. пользователь 06.12.19 11:29
Сообщение было скрыто модератором.
...
8. Muhin555 28 24.07.20 18:02 Сейчас в теме
Спасибо. Хорошая подсказка для трансформации запросов!!!
Только реквизит УчестьПредставленияЗУП(булево) судя по тексту Процедур расположен на форме а не в реквизитах обработки.
И в самом описании как-то не четко описано, что данная функция меняет текст самого запроса заменяя одну ВТ Представления_КадровыеДанныеСотрудников на несколько Временных таблиц.
Вернее даже описать, что данная примочка дополняет запрос временными таблицами для дальнейшего заполнения таблицы "Представления"
11. alon 171 27.10.20 16:55 Сейчас в теме
12. German_Tagil 43 11.11.20 11:25 Сейчас в теме
скачал попытался выполнить простой запрос с представлениями
и ничего не получилось - хотелось бы разобраться в чем причина
Зарплата и управление персоналом, редакция 3.1 (3.1.15.67)
1С:Предприятие 8.3 (8.3.15.1830)
Alien_RS_Forever; +1 Ответить
13. Alien_RS_Forever 434 10.06.21 15:45 Сейчас в теме
Разработчик, ау, не работает ваша консолька.
14. biimmap 2024 28.10.21 18:33 Сейчас в теме
Судя по количеству скачиваний, поделка полезная. Но я вот ЗУПом занимаюсь давно... и ни разу такая штука не требовалась.

Все данные в ЗУП можно получить через программный интерфейс, а он представления не использует!
Успехов автору.
15. belov-k 04.07.22 13:54 Сейчас в теме
По-прежнему актуально, искал долго что-то подобное для простой отладки запросов с представлениями, спасибо. Правда параметры иногда попадают в стандартную ТЧ Параметры, а иногда в ТЧ ПараметрыЗУП. Но может я что-то не так сделал, дорабатывал сам по вашей инструкции, обработку не качал.
16. Artyom_Potapov 25.07.24 14:35 Сейчас в теме
У меня заработало. Создавать обязательный УчестьПредставленияЗУП(булево) нужно реквизитом именно формы, а ТЧ - как обычно (там уже две есть, добавил третью ТЧ), реквизиты этой ТЧ код и значение - строки, я их сделал по 150 знаков.
Скачал на ИТСе по ссылке исходную консоль, внёс внимательно все изменения из статьи. Потом, правда, удалил пару сбоев, слегка поменяв код в строках ниже, и отлично. Автору спасибо!

&НаКлиенте
Процедура ПослеЗакрытияКонструктораЗапроса(ТекстЗапросаВФорме, СтруктураПараметров) Экспорт

Если ТекстЗапросаВФорме <> Неопределено Тогда

ТекущийЗапрос = Объект.Запросы.Получить(СтруктураПараметров-1); //вот тут //.ИндексТекущегоЗапроса - 1);

Если Истина Тогда // и ещё вот тут ///ТекстЗапросаВФорме <> СтруктураПараметров.ИсходныйТекстЗапроса Тогда ... далее по тексту
Оставьте свое сообщение