ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар")
Программирование - Практика программирования
Идея в общем-то простая. В чистом SQL есть запросы типа INSERT, UPDATE, DELETE. А в языке запросов 1С таких запросов нет. Ну вернее не было ) Вашему вниманию предлагается расширение языка запросов, которое предоставляет возможность писать запросы типа ИЗМЕНИТЬ, УДАЛИТЬ и ВСТАВИТЬ. Для скачивания доступна консоль запросов, реализующая это расширение (так же работает и обычный ВЫБРАТЬ). Запросы могут быть например, такие:
|ИЗМЕНИТЬ Справочник.Номенклатура
|УСТАНОВИТЬ ЕдиницаИзмерения = &МояЕдиница, Наименование = НаименованиеПолное
|ГДЕ ВидНоменклатуры = &МойВид
|;
|УДАЛИТЬ ИЗ Справочник.Номенклатура
|ГДЕ ВидНоменклатуры = &МойВид
|;
|ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование, ВидНоменклатуры)
|Значения (68549, &НаименованиеНовых, &МойВид)
Работает все это исключительно в рамках встроенного языка платформы и ни в какие внешние среды (типа прямого доступа к SQL) не лезет. Фразы ИЗМЕНИТЬ, УСТАНОВИТЬ, УДАЛИТЬ ИЗ и ВСТАВИТЬ В для языка запросов новые. Все остальное (ВЫБРАТЬ, ГДЕ, ПОМЕСТИТЬ и т.п.) подчиняется тем же правилам, что и в "обычном" запросе, т.е. эти части запроса могут быть сколь угодно сложными: включать вложенные запросы, формироваться временные таблицы и так далее. Поддерживается редактирование всех первичных таблиц:
- таблицы ссылочных типов (документов, справочников...)
- табличные части ссылочных типов
- регистры подчиненные и не подчиненные регистратору
Если интересно подробнее - есть длинный и занудный текст о том как это работает.
Обработку можно использовать через пользовательский интерфейс как консоль запросов для аналитических целей или через программный интерфейс. Все процедуры для программного использования изолированы в модуле объекта, работа с ними максимально приближена к тому, как работает обычный объект Запрос. Сама форма консоли будет примером того как использовать программный интерфейс.
Последние изменения:
- добавлена поддержка запроса ВСТАВИТЬ
- изменен пользовательский интерфейс:основное место теперь отведено тексту запроса, а результат запроса можно развернуть на полный экран
- добавлено редактирование параметров запроса табличного типа, т.е. теперь исходные данные для запроса на изменение можно вводить в Excel-стиле (в табличный документ)
Платформа 8.3.9.2233. Навскидку, единственное, что мешает даунгрейду до 8.2 - процедуры типа СтрСоединить, если их дописать - все должно заработать. Код полностью открыт, запароленных и/или обфусцированных участков нет. Удачи!
Скачать файлы
Наименование | Файл | Версия | Размер | |||
---|---|---|---|---|---|---|
Консоль расширенных запросов
.epf 21,74Kb
14.08.18
32
|
.epf | 1.2 | 21,74Kb | 32 | Скачать |
См. также
Специальные предложения
простой запрос
типа
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
ЗаказПоставщикуТовары.Номенклатура,
ЗаказПоставщикуТовары.Количество,
ЗаказПоставщикуТовары.Заявка,
ЗаказПоставщикуТовары.Проект
ИЗ
Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
ГДЕ
ЗаказПоставщикуТовары.Проект = &Проект
отрабатывает нормально
Функция СтрНайти (ИсходнаяСтрока, ИскомаяСтрока, НаправлениеПоиска = "СНачала", НачальнаяПозиция = Неопределено, НомерВхождения = 1) Экспорт
Если СтрДлина(ИскомаяСтрока)>СтрДлина(ИсходнаяСтрока) ИЛИ СтрДлина(ИсходнаяСтрока) = 0 Тогда
Возврат 0;
КонецЕсли;
Если НаправлениеПоиска = "СНачала" ИЛИ НаправлениеПоиска = Неопределено Тогда
Если НачальнаяПозиция = Неопределено Тогда
НачальнаяПозиция = 1;
ИначеЕсли НачальнаяПозиция > СтрДлина(ИсходнаяСтрока) Тогда
ВызватьИсключение ("Неправильный параметр: Начальная позиция");
КонецЕсли;
//Выполнить Поиск
Результат = 0;
ВременнаяСтрока = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока)-(НачальнаяПозиция-1));
Для Индекс = 1 По НомерВхождения Цикл
ВременныйРезультат = Найти(ВременнаяСтрока, ИскомаяСтрока);
Если ВременныйРезультат Тогда
Результат = Результат + ВременныйРезультат ;
ВременнаяСтрока = Прав(ВременнаяСтрока, (СтрДлина(ВременнаяСтрока) - ВременныйРезультат - (СтрДлина(ИскомаяСтрока)-1)));
//Сообщить ("Вхождение " + Индекс + ": " + (Результат));
Иначе
//Сообщить("Требуемое вхождение не найдено");
Возврат 0;
КонецЕсли;
Если Индекс < НомерВхождения Тогда
Результат = Результат + СтрДлина(ИскомаяСтрока)-1;
КонецЕсли;
КонецЦикла;
Возврат Результат+НачальнаяПозиция-1;
ИначеЕсли НаправлениеПоиска = "СКонца" Тогда //Ищем с конца
Если НачальнаяПозиция = Неопределено Тогда
НачальнаяПозиция = СтрДлина(ИсходнаяСтрока);
ИначеЕсли НачальнаяПозиция > СтрДлина(ИсходнаяСтрока) ИЛИ НачальнаяПозиция < 1 Тогда
ВызватьИсключение("Неправильный параметр: НачальнаяПозиция");
КонецЕсли;
//ВыполнитьПоиск
Результат = 0;
ВременнаяСтрока = Лев(ИсходнаяСтрока, НачальнаяПозиция +1);
Вхождения = Новый Массив;
Пока Истина Цикл
ВременныйРезультат = Найти(ВременнаяСтрока, ИскомаяСтрока);
Если ВременныйРезультат Тогда
Результат = Результат + ВременныйРезультат;
Вхождения.Добавить(Результат);
ВременнаяСтрока = Прав(ВременнаяСтрока, (СтрДлина(ВременнаяСтрока) - ВременныйРезультат - (СтрДлина(ИскомаяСтрока)-1)));
//Сообщить ("Вхождение " + Индекс + ": " + (Результат));
Результат = Результат + СтрДлина(ИскомаяСтрока)-1;
Иначе
//Сообщить("Требуемое вхождение не найдено");
Прервать;
КонецЕсли;
КонецЦикла;
Если Вхождения.Количество()<НомерВхождения Тогда
//Вхождение не найдено
Возврат 0;
Иначе
Возврат Вхождения[(Вхождения.Количество()-НомерВхождения)]
КонецЕсли;
Иначе
ВызватьИсключение("Неправильный параметр: НаправлениеПоиска. Опции: ""СНачала"", ""СКонца""");
КонецЕсли;
КонецФункции
Функция СтрНачинаетсяС(Знач Строка, Знач СтрокаПоиска)
если Найти(Строка, СтрокаПоиска)=1 тогда
Возврат Истина;
иначе
Возврат Ложь;
конецесли;
КонецФункции
Функция СтрЗаканчиваетсяНа (Знач Строка, Знач СтрокаПоиска)
если Найти(Строка, СтрокаПоиска)=1 тогда
Возврат Истина;
иначе
Возврат Ложь;
конецесли;
КонецФункции
Функция СтрСоединить(Массив, Разделитель="")
Строка = "";
Для каждого Элемент Из Массив Цикл
Строка = Строка + СокрЛП(Элемент) + Разделитель;
КонецЦикла;
Возврат Строка;
КонецФункции
Функция стрРазделить(Знач Строка, Знач Разделитель = ",",
Знач ПропускатьПустыеСтроки = Неопределено)
Результат = Новый Массив;
// для обеспечения обратной совместимости
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Строка) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Результат.Добавить(Подстрока);
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
Результат.Добавить(Строка);
КонецЕсли;
Возврат Результат;
КонецФункции
ПоказатьИнициализироватьПараметрыРасширенногоЗапроса(РасширенныйЗапрос, Ложь);
Запрос = ИнициализироватьЗапросПолученияДанных(РасширенныйЗапрос);
МассивРезультатов = Запрос.ВыполнитьПакет();
ВыполнитьИзменениеДанных(РасширенныйЗапрос, МассивРезультатов);
Возврат МассивРезультатов;
КонецФункции
На ВыполнитьИзменениеДанных выносит
Лучше бы изменяемую схему СКД + групповое изменение, насколько помню уже давно есть такие консоли.
это альтернативный инструмент. смотришь, сравниваешь, выбираешь какой подходит в твоей ситуации. в моем понимании, основными (но не факт что единственными) плюсами запроса на изменение является его предельная простота в сравнении с "наколеночной" обработкой и крайне широкие возможности в сравнении с обработкой группового изменения данных.
соответственно, аналитики и консультанты теперь имеют альтернативный инструмент массового изменения данных. да и программисту по-короче набросать две строчки запроса, чем писать "запрос = новый запрос();...".
Я и спрашиваю преимущества в чем? В том, что есть люди которым удобнее писать запрос вручную наизусть зная структуру имен полей? Чем перетащить из таблички? И по вашему ответу тоже не вижу ни одного реального примера. Представите хоть один реальный, значимый?
Чем кстати этот инструмент шире по сравнению с хорошей групповой обработкой?
"да и программисту по-короче набросать две строчки запроса", я тоже могу придираться к словам, а не вычленять их смысл. Запрос написанный в 2 стандартных коротких строчки запроса не задача для написания такого инструмента и даже изучения такого инструмента не стоит, имхо.
"Поддерживается редактирование всех первичных таблиц:
таблицы ссылочных типов (документов, справочников...)
табличные части ссылочных типов
регистры подчиненные и не подчиненные регистратору"
и вспоминаю, что иногда возникают задачи больших корректировок регистров, приходится делать обработку, которая формирует набор(ы) записей регистров, на основании существующей в ИБ информации, и привязывает их к "ручной операции/корректировке". Попробую делать это в запросе, не открывая конфигуратора, вдруг будет удобнее. Получается более универсальный инструмент чем типовая обработка изменения реквизитов - может менять ещё и регистры.
Конечно идея хорошая, но к таким вещам необходимо ограничивать доступ.
Фирма 1С сколько ее не ругай сделала очень грамотный ход - она просто отказалась от реализации подобных возможностей из режима предприятия.

Просмотры 13342
Загрузки 66
Комментарии 49
Создание 01.06.18 10:00
Обновление 01.06.18 10:00
№ Публикации 838790
Рубрики Практика программирования
Кому Программист
Тип файла Внешняя обработка (ert,epf)
Платформа
Платформа 1С v8.x (все механизмы) ,
Запросы
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Раздел учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Да
