Исходные обработки скачать можно отсюда:
https://its.1c.ru/db/metod8dev/content/4500/hdoc
Все реквизиты/команды реализованы программным методом, поэтому теоретически можно добавить возможность в любую консоль запросов на управляемых формах.
Список изменений (добавления с префиксом "ЛС"):
1. В "модуль объекта" добавлены следующие процедуры/функции:
- ЛС_ВыгрузитьЗапросВФайл
- ЛС_ЗаполнитьПараметр
2. В модуль основной формы обработки добавлены следующие команды:
- ЛС_ПриСозданииНаСервере
- ЛС_ПоказатьМетодикуВнедрения
- ЛС_ЗагрузитьИзОтладки
- ЛС_ПолучитьФайлССервера
- ЛС_ВыбратьЗапросыИзФайла
- ЛС_ОбработкаЧтенияФайла
3. В модуле основной формы в конце процедуры "ПриСозданииНаСервере" добавлен вызов процедуры "ЛС_ПриСозданииНаСервере"
4. В модуле объекта закомментирована исходная функция "ИмяТипаИзЗначения" и задана обновленная(расширил ее)
Больше никаких изменений нет.
Проверялась на консолях запросов для управляемого приложения от 8.2 и 8.3 с сайта ИТС.
После вставки кода в обработки нужно в процедурах/функциях выбрать номер версии:
8.2: ЛС_Версия = 1
8.3: ЛС_Версия = 2
В модуль объекта вставляете вот этот код:
//++ ЛС Усольцев 25.09.2021
//Записываем Запрос во внешний файл временного хранилища с фиксированным названием
//"FileQueryExport.q1c". Сам файл удалится после прочтения (в модуле формы)
//
//Делаем 2 одинаковых запроса, чтобы можно было вернуться к исходному
//Запросы называются "ИсходныйЗапрос" и "ТекущийЗапрос"
//
//Если в запросе указан менеджер временных таблиц и в нем есть таблицы,
//к которым идет обращение - такие таблицы будут
//выгружены как внешние таблицы значений(добавлены в параметры),
//и в начало запроса будет добавлен код объявления временных таблиц
//Сам код будет обрамлен комментариями:
//АВТОМАТИЧЕСКИ_ФОРМИРУЕМАЯ_ЧАСТЬ_ЗАПРОСА_ИЗ_ВРЕМЕННЫХ_ТАБЛИЦ
//КОНЕЦ АВТОМАТИЧЕСКИ_ФОРМИРУЕМАЯ_ЧАСТЬ_ЗАПРОСА_ИЗ_ВРЕМЕННЫХ_ТАБЛИЦ
//
// Для разных версий консолей внедряется немного по-разному.
//Проверялась на обычных консолях запросов для управляемого приложения от 8.2 и 8.3(те что с сайта ИТС можно скачать)
// (8.2): ЛС_Версия = 1
// (8.3): ЛС_Версия = 2
// Параметры:
// ОбъектЗапроса - Запрос - Запрос, по который нужно сохрать в файл.
Функция ЛС_ВыгрузитьЗапросВФайл(знач ОбъектЗапроса) Экспорт
//В старой и новой версии консоли запросов
//разные процедуры загрузки из файла(различаются подходы)
ЛС_Версия = 2;
ПрефиксЗапроса = "";
ВременныеТаблицыТЗ = Новый Структура;
Если ОбъектЗапроса.МенеджерВременныхТаблиц <> Неопределено Тогда
ПрефиксЗапроса = ПрефиксЗапроса + "//АВТОМАТИЧЕСКИ_ФОРМИРУЕМАЯ_ЧАСТЬ_ЗАПРОСА_ИЗ_ВРЕМЕННЫХ_ТАБЛИЦ" + Символы.ПС+ Символы.ПС;
ЗапросБезПробелов = СтрЗаменить(ОбъектЗапроса.Текст, Символы.ПС, "");
ЗапросБезПробелов = СтрЗаменить(ЗапросБезПробелов, Символы.Таб, "");
ЗапросБезПробелов = СтрЗаменить(ЗапросБезПробелов, " ", "");
Для каждого Таблица Из ОбъектЗапроса.МенеджерВременныхТаблиц.Таблицы Цикл
//Проверка на то что временная таблица используется в текущем запросе
Если Найти(ЗапросБезПробелов, Таблица.ПолноеИмя+"КАК") = 0 Тогда
Продолжить;
КонецЕсли;
Данные = Новый ТаблицаЗначений;
РезультатЗапросаВТ = Таблица.ПолучитьДанные();
Для каждого Колонка Из РезультатЗапросаВТ.Колонки Цикл
Данные.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЦикла;
ВыборкаВТ = РезультатЗапросаВТ.Выбрать();
Пока ВыборкаВТ.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Данные.Добавить(), ВыборкаВТ);
КонецЦикла;
ИмяПараметраТЗ = "ЛСВР_" + Таблица.ПолноеИмя;
ВременныеТаблицыТЗ.Вставить(ИмяПараметраТЗ, Данные);
ПрефиксЗапроса = ПрефиксЗапроса + "ВЫБРАТЬ";
ПервыйПроход = Истина;
Для каждого Колонка Из Данные.Колонки Цикл
Если ПервыйПроход Тогда
ПервыйПроход = Ложь;
Иначе
ПрефиксЗапроса = ПрефиксЗапроса + ",";
КонецЕсли;
ПрефиксЗапроса = ПрефиксЗапроса + Символы.ПС + " Т." + Колонка.Имя + " КАК " + Колонка.Имя;
КонецЦикла;
ПрефиксЗапроса = ПрефиксЗапроса + Символы.ПС + "ПОМЕСТИТЬ " + Таблица.ПолноеИмя;
ПрефиксЗапроса = ПрефиксЗапроса + Символы.ПС + "ИЗ";
ПрефиксЗапроса = ПрефиксЗапроса + Символы.ПС + " &" + ИмяПараметраТЗ + " КАК Т" + Символы.ПС + ";" + Символы.ПС + Символы.ПС;
КонецЦикла;
ПрефиксЗапроса = ПрефиксЗапроса + "//КОНЕЦ АВТОМАТИЧЕСКИ_ФОРМИРУЕМАЯ_ЧАСТЬ_ЗАПРОСА_ИЗ_ВРЕМЕННЫХ_ТАБЛИЦ"+ Символы.ПС+ Символы.ПС;
КонецЕсли;
ТекстЗапроса = ПрефиксЗапроса + ОбъектЗапроса.Текст;
ДанныеПоЗапросу = Новый Структура;
ДанныеПоЗапросу.Вставить("Параметры", ЭтотОбъект.Параметры.ВыгрузитьКолонки());
ДанныеПоЗапросу.Вставить("Запросы", ЭтотОбъект.Запросы.ВыгрузитьКолонки());
Для НомерЗапроса = 1 По 2 Цикл
НовЗапрос = ДанныеПоЗапросу.Запросы.Добавить();
Если НомерЗапроса = 1 Тогда
НовЗапрос.Имя = "ТекущийЗапрос";
Иначе
НовЗапрос.Имя = "ИсходныйЗапрос";
КонецЕсли;
НовЗапрос.Текст = ТекстЗапроса;
НовЗапрос.Идентификатор = Новый УникальныйИдентификатор;
Если ЛС_Версия = 1 Тогда
//в старой версии нет реквизита "АдресХранилищаПланаЗапроса"
ИначеЕсли ЛС_Версия = 2 Тогда
НовЗапрос.АдресХранилищаПланаЗапроса = ПоместитьВоВременноеХранилище(Неопределено);
КонецЕсли;
Для каждого ТекПараметр Из ОбъектЗапроса.Параметры Цикл
ЛС_ЗаполнитьПараметр(ДанныеПоЗапросу, ТекПараметр, НовЗапрос.Идентификатор);
КонецЦикла;
Для каждого ВременнаяТаблицаТЗ Из ВременныеТаблицыТЗ Цикл
ЛС_ЗаполнитьПараметр(ДанныеПоЗапросу, ВременнаяТаблицаТЗ, НовЗапрос.Идентификатор);
КонецЦикла;
КонецЦикла;
ДД = ЗаписатьЗапросыВФайлXML(ДанныеПоЗапросу);
ИмяФайла = КаталогВременныхФайлов() + "FileQueryExport.q1c";
ДД.Записать(ИмяФайла);
Возврат СтрШаблон("Запрос успешно сохранен в файл.%1Теперь в консоли запросов нажмите кнопку ""Загрузить из отладки""", Символы.ПС);
КонецФункции // ЛС_ВыгрузитьЗапросВФайл()
// Параметры:
// ДанныеПоЗапросу - Структура - Структура, которая повторяет табличные
// части "Запросы", "Параметры"
// Параметр - КлючЗначение - текущий параметр из коллекции
// ИдентификаторЗапроса - УникальныйИдентификатор - Уникальный идентификатор текущего запроса
Процедура ЛС_ЗаполнитьПараметр(ДанныеПоЗапросу, Параметр, ИдентификаторЗапроса)
//приводим значение параметра к тому, которое может записываться обработкой
Если ТипЗнч(Параметр.Значение) = Тип("Массив") Тогда
ПараметрЗначение = Новый СписокЗначений;
ПараметрЗначение.ЗагрузитьЗначения(Параметр.Значение);
Иначе
ПараметрЗначение = Параметр.Значение;
КонецЕсли;
НовПараметр = ДанныеПоЗапросу.Параметры.Добавить();
НовПараметр.Значение = ЗначениеВСтрокуВнутр(ПараметрЗначение);
НовПараметр.Идентификатор = Новый УникальныйИдентификатор;
НовПараметр.ИдентификаторЗапроса = ИдентификаторЗапроса;
НовПараметр.Имя = Параметр.Ключ;
НовПараметр.Тип = ИмяТипаИзЗначения(ПараметрЗначение);
КонецПроцедуры // ЛС_ЗаполнитьПараметр()
//Переопределяемая функция
//исходную нужно закомментировать
Функция ИмяТипаИзЗначения(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Строка") Тогда
ИмяТипа = "Строка";
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
ИмяТипа = "Число";
ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
ИмяТипа = "Булево";
ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда
ИмяТипа = "Дата";
ИначеЕсли ТипЗнч(Значение) = Тип("МоментВремени") Тогда
ИмяТипа = "МоментВремени";
ИначеЕсли ТипЗнч(Значение) = Тип("Неопределено") Тогда
ИмяТипа = "Строка";
ИначеЕсли ТипЗнч(Значение) = Тип("ФиксированныйМассив") Тогда
ИмяТипа = "ФиксированныйМассив";
ИначеЕсли ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда
ИмяТипа = "ТаблицаЗначений";
ИначеЕсли ТипЗнч(Значение) = Тип("Граница") Тогда
ИмяТипа = "Граница";
ИначеЕсли ТипЗнч(Значение) = Тип("СписокЗначений") Тогда
ИмяТипа = "СписокЗначений";
ИначеЕсли ТипЗнч(Значение) = Тип("ВидДвиженияНакопления") Тогда
ИмяТипа = "ВидДвиженияНакопления";
ИначеЕсли ТипЗнч(Значение) = Тип("ВидДвиженияБухгалтерии") Тогда
ИмяТипа = "ВидДвиженияБухгалтерии";
Иначе
ИмяТипа = xmlТип(ТипЗнч(Значение)).ИмяТипа;
КонецЕсли;
Возврат ИмяТипа;
КонецФункции
//-- ЛС Усольцев 25.09.2021
В модуль основной формы вот этот код:
//++ ЛС Усольцев 25.09.2021
&НаСервере
Процедура ЛС_ПриСозданииНаСервере()
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЛС_ТекстДляВычисления", Новый ОписаниеТипов("Строка")));
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
ЛС_ИмяФайла = РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
ЭтаФорма.ЛС_ТекстДляВычисления = СтрШаблон("ВнешниеОбработки.Создать(""%1"",Ложь).ЛС_ВыгрузитьЗапросВФайл(Запрос)", ЛС_ИмяФайла);
ЛС_Группа1 = Элементы.Добавить("ЛС_Группа1", Тип("ГруппаФормы"));
ЛС_Группа1.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ЛС_Группа1.Заголовок = "(ЛС) Получение запроса из отладки";
ЛС_Группа1.Отображение = ОтображениеОбычнойГруппы.Нет;
ЛС_Группа1.ОтображениеУправления = ОтображениеУправленияОбычнойГруппы.Картинка;
ЛС_Группа1.Поведение = ПоведениеОбычнойГруппы.Свертываемая;
ЛС_Группа1.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
ЛС_Группа1.Скрыть();
ЛС_Надпись1 = Элементы.Добавить("ТА_Декорация1", Тип("ДекорацияФормы"), ЛС_Группа1);
ЛС_Надпись1.Вид = ВидДекорацииФормы.Надпись;
ЛС_Надпись1.Заголовок =
"1. Самое главное, чтобы обработка была доступна серверу 1С. Для этого нужно открывать ее либо на сервере 1С(как локальный файл),
|либо положить в общую папку. И только после этого переходить к следующим пунктам.
|2. Скопируйте текст справа(начинается ""ВнешниеОбработки.Создать("").
|3. Откройте конфигуратор. Запустите процедуру в отладке и поставьте точку останова на моменте выполнение запроса (Запрос.Выполнить())
|4. Убедитесь что у вас не работает ""Безопасный режим"". Для этого Нажмите Shift + F9, в поле ""Выражение"" введите текст ""БезопасныйРежим()"" и нажмите ""Рассчитать"".
|В таблице ""Результат"" в колонке ""Значение"" должно быть Ложь. Если у вас ""Значение"" = Истина, значит смотрите в интернете как
|отключить безопасный режим для вашего пользователя. Дальнейшие действия возможны только при отключенном безопасном режиме.
|5. Нажмите Shift + F9. Вставьте из буфера(Ctrl + V) в поле ""Выражение"", укажите переменную содержащую сам запрос(если у вас он называется
|Запрос1, то в поле выражение замените единственный параметр с ""Запрос"" на ""Запрос1"") и нажмите ""Рассчитать"".
|6. Вернитесь в консоль запросов и нажмите кнопку ""Загрузить из отладки""(при загрузке файл, содержащий выгрузку из запроса удалится из временных файлов)
|7. У вас заполнится консоль из выгруженного ранее файла.
|Временные таблицы, используемые этим запросом реализованы через таблицы значений
|и выделены специальным комментарием:
|//АВТОМАТИЧЕСКИ_ФОРМИРУЕМАЯ_ЧАСТЬ_ЗАПРОСА_ИЗ_ВРЕМЕННЫХ_ТАБЛИЦ
|//КОНЕЦ АВТОМАТИЧЕСКИ_ФОРМИРУЕМАЯ_ЧАСТЬ_ЗАПРОСА_ИЗ_ВРЕМЕННЫХ_ТАБЛИЦ";
ЛС_Группа2 = Элементы.Добавить("ЛС_Группа2", Тип("ГруппаФормы"), ЛС_Группа1);
ЛС_Группа2.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ЛС_Группа2.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
ЛС_Группа2.Отображение = ОтображениеОбычнойГруппы.Нет;
ЛС_ТекстДляВычисления = Элементы.Добавить("ЛС_ТекстДляВычисления", Тип("ПолеФормы"), ЛС_Группа2);
ЛС_ТекстДляВычисления.Вид = ВидПоляФормы.ПолеВвода;
ЛС_ТекстДляВычисления.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ЛС_ТекстДляВычисления.ПутьКДанным = "ЛС_ТекстДляВычисления";
ЛС_ТекстДляВычисления.ТолькоПросмотр = Истина;
ЛС_ЗагрузитьИзОтладки = ЭтаФорма.Команды.Добавить("ЛС_ЗагрузитьИзОтладки");
ЛС_ЗагрузитьИзОтладки.Действие = "ЛС_ЗагрузитьИзОтладки";
ЛС_ЗагрузитьИзОтладки.Заголовок = "Загрузить из отладки";
Элемент = ЭтаФорма.Элементы.Добавить("ЛС_ЗагрузитьИзОтладки", Тип("КнопкаФормы"), ЛС_Группа2);
Элемент.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
Элемент.ИмяКоманды = "ЛС_ЗагрузитьИзОтладки";
ЛС_ЗагрузитьИзОтладки = ЭтаФорма.Команды.Добавить("ЛС_ПоказатьМетодикуВнедрения");
ЛС_ЗагрузитьИзОтладки.Действие = "ЛС_ПоказатьМетодикуВнедрения";
ЛС_ЗагрузитьИзОтладки.Заголовок = "Показать методику внедрения";
Элемент = ЭтаФорма.Элементы.Добавить("ЛС_ПоказатьМетодикуВнедрения", Тип("КнопкаФормы"), ЛС_Группа2);
Элемент.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
Элемент.ИмяКоманды = "ЛС_ПоказатьМетодикуВнедрения";
КонецПроцедуры
&НаКлиенте
Процедура ЛС_ПоказатьМетодикуВнедрения(Команда)
ТекстСообщения = "
|Все реквизиты/команды реализованы программным методом, поэтому теоретически можно добавить возможность в любую консоль запросов на управляемых формах.
|
|Список изменений(добавления с префиксом ""ЛС""):
|1. В ""модуль объекта"" добавлены следующие процедуры/функции:
| - ЛС_ВыгрузитьЗапросВФайл
| - ЛС_ЗаполнитьПараметр
|2. В модуль основной формы обработки добавлены следующие команды:
| - ЛС_ПриСозданииНаСервере
| - ЛС_ПоказатьМетодикуВнедрения
| - ЛС_ЗагрузитьИзОтладки
| - ЛС_ПолучитьФайлССервера
| - ЛС_ВыбратьЗапросыИзФайла
| - ЛС_ОбработкаЧтенияФайла
|3. В модуле основной формы в конце процедуры ""ПриСозданииНаСервере"" добавлен вызов процедуры ""ЛС_ПриСозданииНаСервере""
|4. В модуле объекта закомментирована исходная функция ""ИмяТипаИзЗначения"" и задана обновленная(расширил ее)
|
|Больше никаких изменений нет
|
|Проверялась на консолях запросов для управляемого приложения от 8.2 и 8.3 с сайта ИТС.
|После вставки кода в обработки нужно в процедурах/функциях выбрать номер версии:
|
|8.2: ЛС_Версия = 1
|8.3: ЛС_Версия = 2";
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщения;
Сообщение.Сообщить();
КонецПроцедуры // ЛС_ПоказатьМетодикуВнедрения()
&НаКлиенте
Процедура ЛС_ЗагрузитьИзОтладки(Команда)
//В старой и новой версии консоли запросов
//разные процедуры загрузки из файла(различаются подходы)
ЛС_Версия = 2;
Если ЛС_Версия = 1 Тогда
ЛС_ВыбратьЗапросыИзФайла();
ИначеЕсли ЛС_Версия = 2 Тогда
ДанныеССевера = ЛС_ПолучитьФайлССервера();
Выполнить("ПомещениеФайловЗавершение(ДанныеССевера.Результат, ДанныеССевера.ДополнительныеПараметры)");
КонецЕсли;
КонецПроцедуры // ЛС_ЗагрузитьИзОтладки()
&НаСервереБезКонтекста
Функция ЛС_ПолучитьФайлССервера()
ЛС_КраткоеИмяФайла = "FileQueryExport.q1c";
ЛС_ИмяФайла = КаталогВременныхФайлов() + ЛС_КраткоеИмяФайла;
ДД = Новый ДвоичныеДанные(ЛС_ИмяФайла);
УдалитьФайлы(ЛС_ИмяФайла);
ЛС_ИдентификаторФайла = Новый УникальныйИдентификатор;
ЛС_АдресФайла = ПоместитьВоВременноеХранилище(ДД, ЛС_ИдентификаторФайла);
ЛС_ОписаниеФайла = Новый Структура;
ЛС_ОписаниеФайла.Вставить("Имя", ЛС_КраткоеИмяФайла);
ЛС_ОписаниеФайла.Вставить("ИдентификаторФайла", ЛС_ИдентификаторФайла);
ЛС_ОписаниеФайла.Вставить("ПолноеИмя", ЛС_ИмяФайла);
ЛС_ОписаниеФайла.Вставить("Хранение", ЛС_АдресФайла);
ЛС_Результат = Новый Массив;
ЛС_Результат.Добавить(ЛС_ОписаниеФайла);
ДанныеССевера = Новый Структура;
ДанныеССевера.Вставить("Результат", ЛС_Результат);
ДанныеССевера.Вставить("ДополнительныеПараметры", Новый Структура("Удалять",Истина));
Возврат ДанныеССевера;
КонецФункции // ЛС_ПолучитьФайлССервера()
&НаКлиенте
Процедура ЛС_ВыбратьЗапросыИзФайла()
ЛС_ОбработкаЧтенияФайла();
КоличествоЗапросов = Объект.Запросы.Количество();
Если КоличествоЗапросов > 0 Тогда
ИдентификаторТекущегоЗапроса = Объект.Запросы.Получить(0).Идентификатор;
Модифицированность = Ложь;
Иначе
Элемент = Объект.Запросы.Добавить();
ИдентификаторТекущегоЗапроса = Новый УникальныйИдентификатор;
Элемент.Идентификатор = ИдентификаторТекущегоЗапроса;
Элемент.Имя = ИмяЗапросаПоУмолчанию;
Результат = Новый ТабличныйДокумент;
КонецЕсли;
ОбновитьФормуКлиент();
КонецПроцедуры // ЛС_ВыбратьЗапросыИзФайла()
&НаКлиенте
Процедура ЛС_ОбработкаЧтенияФайла()
Объект.Запросы.Очистить();
Объект.Параметры.Очистить();
ДанныеССевера = ЛС_ПолучитьФайлССервера();
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеССевера.Результат[0].Хранение);
ЗагрузитьЗапросыИзФайла(ДвоичныеДанные);
Объект.ИмяФайла = ДанныеССевера.Результат[0].ПолноеИмя;
КонецПроцедуры // ЛС_ОбработкаЧтенияФайла()
//-- ЛС Усольцев 25.09.2021
И в модуле объекта и в модуле формы есть объявление переменной:
ЛС_Версия = 2;
Вот с этим очень внимательно!
Повторюсь, что:
ЛС_Версия = 1 это для консоли 8.2
ЛС_Версия = 2 это для консоли 8.3
Прилагаю обработки, в коде мои вставки обрамляются комментариями:
//++ ЛС Усольцев
//-- ЛС Усольцев
Дополнение от 06.10.2021:
- В "Консоль запросов управляемого приложения 8.3" в модуле объекта обработки в функции "ВывестиРезультатОдногоЗапроса" закомментировал строчку:
//КоличествоСтрок = РезультатЗапроса.Количество(); // ЛС Усольцев 06.10.2021 "ошибка при выполнении Итоги ПО"
Причина: ошибка при работе конструкции "ИТОГИ ПО".
Описание ошибки:
Метод объекта не обнаружен (Количество)
P.S. ошибка не связана с моими доработками.
Можно скачать с сайта ИТС чистую консоль и выполнить в ней такой запрос:
ВЫБРАТЬ
Валюты.Ссылка КАК Ссылка
ИЗ
Справочник.Валюты КАК Валюты
ИТОГИ ПО
Ссылка
В результате получить соответствующую ошибку.
Это актуально на 06.10.2021