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

05.11.19

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

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

Скачать файл

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

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

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

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    161296    893    399    

872

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

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

8400 руб.

20.08.2024    8571    66    29    

76

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

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

22200 руб.

06.10.2023    15686    39    8    

73

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

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

9360 руб.

17.05.2024    23842    70    45    

119

SALE! %

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

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

15000 10000 руб.

10.11.2023    10664    38    27    

63

SALE! %

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

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

4800 3840 руб.

14.01.2013    188494    1142    0    

913

SALE! %

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

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

20000 15000 руб.

07.10.2021    17556    6    32    

42

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

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7832    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 27 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 2022 28.10.21 18:33 Сейчас в теме
Судя по количеству скачиваний, поделка полезная. Но я вот ЗУПом занимаюсь давно... и ни разу такая штука не требовалась.

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

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

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

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

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