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

05.11.19

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Консоль запросов для ЗУП 3.х:
.epf 98,52Kb
89
89 Скачать (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    168193    929    403    

900

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

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

8400 руб.

20.08.2024    11450    91    38    

98

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

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

9360 руб.

17.05.2024    26124    88    48    

131

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

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

22200 руб.

06.10.2023    16670    41    9    

75

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

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

15000 руб.

10.11.2023    11320    40    27    

66

SALE! %

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

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

4800 3840 руб.

14.01.2013    190302    1148    0    

917

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    103838    244    100    

306

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

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

3600 руб.

27.12.2024    525    1    0    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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);

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