ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар")

Программирование - Практика программирования

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

Идея в общем-то простая. В чистом SQL есть запросы типа INSERT, UPDATE, DELETE. А в языке запросов 1С таких запросов нет. Ну вернее не было ) Вашему вниманию предлагается расширение языка запросов, которое предоставляет возможность писать запросы типа ИЗМЕНИТЬ, УДАЛИТЬ и ВСТАВИТЬ. Для скачивания доступна консоль запросов, реализующая это расширение (так же работает и обычный ВЫБРАТЬ). Запросы могут быть например, такие:

|ИЗМЕНИТЬ Справочник.Номенклатура
|УСТАНОВИТЬ ЕдиницаИзмерения = &МояЕдиница, Наименование = НаименованиеПолное
|ГДЕ ВидНоменклатуры = &МойВид
|;
|УДАЛИТЬ ИЗ Справочник.Номенклатура
|ГДЕ ВидНоменклатуры = &МойВид
|;
|ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование, ВидНоменклатуры)
|Значения (68549, &НаименованиеНовых, &МойВид)

Работает все это исключительно в рамках встроенного языка платформы и ни в какие внешние среды (типа прямого доступа к SQL) не лезет. Фразы ИЗМЕНИТЬ, УСТАНОВИТЬ, УДАЛИТЬ ИЗ и ВСТАВИТЬ В для языка запросов новые. Все остальное (ВЫБРАТЬ, ГДЕ, ПОМЕСТИТЬ и т.п.) подчиняется тем же правилам, что и в "обычном" запросе, т.е. эти части запроса могут быть сколь угодно сложными: включать вложенные запросы, формироваться временные таблицы и так далее. Поддерживается редактирование всех первичных таблиц:

  • таблицы ссылочных типов (документов, справочников...)
  • табличные части ссылочных типов
  • регистры подчиненные и не подчиненные регистратору

Если интересно подробнее - есть длинный и занудный текст о том как это работает.

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

Платформа 8.3.9.2233. Навскидку, единственное, что мешает даунгрейду до 8.2 - процедуры типа СтрСоединить, если их дописать - все должно заработать. Код полностью открыт, запароленных и/или обфусцированных участков нет. Удачи!

Скачать файлы

Наименование Файл Версия Размер
Консоль расширенных запросов
.epf 17,19Kb
16.06.18
0
.epf 17,19Kb Скачать

См. также

Лучшие комментарии
6. uri1978 uri1978 (uri1978) 119 01.06.18 18:04 Сейчас в теме
С нетерпением ждем DROP TABLE, CREATE TABLE, ALTER TABLE и особенно DROP DATABASE
корум; suarez55; veyron21; babys; creatermc; and03122008@gmail.com; Gang031; cleaner_it; al_zzz; sCHTASS; IssakN; Gluk_1C; dabu-dabu; Serj1C; user612295_death4321; Dozkni; allgorhythm; DrAku1a; check2; +19 Ответить
Остальные комментарии
1. Николай Васильев (vasilev2015) 615 01.06.18 10:19 Сейчас в теме
Перед исполнением запроса таблицы блокируются также, как бы это сделала СУБД ?
2. Роман М (m-rv) 451 01.06.18 10:52 Сейчас в теме
(1) никаких специальных блокировок не накладывается, но цикл изменений происходит в одной транзакции.
3. Виктор Третьяков (t.v.s.) 77 01.06.18 12:44 Сейчас в теме
Идея отличнейшая!
Для полного счастья не хватает конструкции
ВСТАВИТЬ [ИЛИ ИЗМЕНИТЬ] <Имя таблицы> ВЫБРАТЬ ИЗ...
4. Роман М (m-rv) 451 01.06.18 13:35 Сейчас в теме
(3) Запрос ВСТАВИТЬ (INSERT) ожидается, следите за обновлениями
fav@2ncom.ru; +1 Ответить
5. Ivan Khorkov (vano-ekt) 1101 01.06.18 17:43 Сейчас в теме
6. uri1978 uri1978 (uri1978) 119 01.06.18 18:04 Сейчас в теме
С нетерпением ждем DROP TABLE, CREATE TABLE, ALTER TABLE и особенно DROP DATABASE
корум; suarez55; veyron21; babys; creatermc; and03122008@gmail.com; Gang031; cleaner_it; al_zzz; sCHTASS; IssakN; Gluk_1C; dabu-dabu; Serj1C; user612295_death4321; Dozkni; allgorhythm; DrAku1a; check2; +19 Ответить
10. Котэ Пруидзе (kote) 474 02.06.18 19:47 Сейчас в теме
(6) это невозможно по определению - объекты и регистры создаются исключительно только через конфигуратор..
11. Сергѣй Батанов (baton_pk) 345 02.06.18 20:12 Сейчас в теме
(10)
это невозможно по определению

не, ну... выгрузить конфу в файлы, поменять/добавить/удалить, загрузить обратно и обновить.
13. Котэ Пруидзе (kote) 474 02.06.18 20:21 Сейчас в теме
(11) потом выгнать всех пользователей, применить изменения, загнать всех обратно.. и обязательно не забыть на каком месте остановились, чтоб с этого же места продолжить.
14. Сергѣй Батанов (baton_pk) 345 02.06.18 21:37 Сейчас в теме
(13) ну да. для этого ещё пара другая обработок. :)
7. Арман Б. (Dream_kz) 70 01.06.18 19:31 Сейчас в теме
1С-никам не просто так запретили запросы на запись)
shard; abadonna83; Gluk_1C; user612295_death4321; GROOVY; DrAku1a; akor77; +7 Ответить
12. Сергѣй Батанов (baton_pk) 345 02.06.18 20:13 Сейчас в теме
Идея - огонь! Сам ночами просыпался с мыслью сделать подобное!
16. Игорь Герман (German_Tagil) 6 08.06.18 05:53 Сейчас в теме
конфигурация КА 1.1 - не запустилось
18. Роман М (m-rv) 451 08.06.18 07:45 Сейчас в теме
(16) уж не обычные ли это формы?
17. Игорь Герман (German_Tagil) 6 08.06.18 05:57 Сейчас в теме
19. Игорь Герман (German_Tagil) 6 08.06.18 07:45 Сейчас в теме
пишу самый простой запрос

изменить Документ.ЗаказПоставщику.Товары
УСТАНОВИТЬ Проект = &ПроектН
где Проект = &Проект


вылетает по ошибке
20. Роман М (m-rv) 451 08.06.18 07:48 Сейчас в теме
21. Игорь Герман (German_Tagil) 6 08.06.18 07:50 Сейчас в теме
формы обычные запускаю из конфигуратора управляемое приложение
простой запрос
типа
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
ЗаказПоставщикуТовары.Номенклатура,
ЗаказПоставщикуТовары.Количество,
ЗаказПоставщикуТовары.Заявка,
ЗаказПоставщикуТовары.Проект
ИЗ
Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
ГДЕ
ЗаказПоставщикуТовары.Проект = &Проект
отрабатывает нормально
22. Игорь Герман (German_Tagil) 6 08.06.18 07:50 Сейчас в теме
23. Игорь Герман (German_Tagil) 6 08.06.18 07:54 Сейчас в теме
1CV8.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства.
24. Роман М (m-rv) 451 08.06.18 07:56 Сейчас в теме
(23) это что-то совсем страшное. а какая платформа?
25. Игорь Герман (German_Tagil) 6 08.06.18 08:02 Сейчас в теме
причем простой запрос
на изменение реквизитов документа работает

1С:Предприятие 8.2 (8.2.19.90)
27. Роман М (m-rv) 451 08.06.18 08:19 Сейчас в теме
(25) единственное что приходит в голову - начать построчную отладку и понять от какой конкретно инструкции платформа крашится.
26. Игорь Герман (German_Tagil) 6 08.06.18 08:14 Сейчас в теме
у меня как раз задачка достаточно простая есть под данную консоль
28. Игорь Герман (German_Tagil) 6 08.06.18 08:34 Сейчас в теме
может от того что с функциями что-то намудрил


Функция СтрНайти (ИсходнаяСтрока, ИскомаяСтрока, НаправлениеПоиска = "СНачала", НачальнаяПозиция = Неопределено, НомерВхождения = 1) Экспорт
    Если СтрДлина(ИскомаяСтрока)>СтрДлина(ИсходнаяСтрока) ИЛИ СтрДлина(ИсходнаяСтрока) = 0 Тогда
        Возврат 0;
    КонецЕсли;    
    Если НаправлениеПоиска = "СНачала" ИЛИ НаправлениеПоиска = Неопределено Тогда
        Если НачальнаяПозиция = Неопределено Тогда
            НачальнаяПозиция = 1;
        ИначеЕсли НачальнаяПозиция > СтрДлина(ИсходнаяСтрока) Тогда
            ВызватьИсключение ("Неправильный параметр: Начальная позиция");
        КонецЕсли;
        //Выполнить Поиск
        Результат = 0;
        ВременнаяСтрока = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока)-(НачальнаяПозиция-1));
        Для Индекс = 1 По НомерВхождения Цикл
             ВременныйРезультат = Найти(ВременнаяСтрока, ИскомаяСтрока);
             Если ВременныйРезультат Тогда
                 Результат = Результат  + ВременныйРезультат ;
                ВременнаяСтрока = Прав(ВременнаяСтрока, (СтрДлина(ВременнаяСтрока) - ВременныйРезультат - (СтрДлина(ИскомаяСтрока)-1)));
                //Сообщить ("Вхождение " + Индекс + ": " + (Результат));
            Иначе
                //Сообщить("Требуемое вхождение не найдено");
                  Возврат 0;
            КонецЕсли;            
            Если Индекс < НомерВхождения Тогда
                Результат = Результат + СтрДлина(ИскомаяСтрока)-1;
            КонецЕсли;
        КонецЦикла;
        Возврат Результат+НачальнаяПозиция-1;    
    ИначеЕсли НаправлениеПоиска = "СКонца" Тогда //Ищем с конца
        Если НачальнаяПозиция = Неопределено Тогда
            НачальнаяПозиция = СтрДлина(ИсходнаяСтрока);
        ИначеЕсли НачальнаяПозиция > СтрДлина(ИсходнаяСтрока) ИЛИ НачальнаяПозиция < 1 Тогда
            ВызватьИсключение("Неправильный параметр: НачальнаяПозиция");            
        КонецЕсли;
        //ВыполнитьПоиск
        Результат = 0; 
        ВременнаяСтрока =  Лев(ИсходнаяСтрока, НачальнаяПозиция +1); 
        Вхождения = Новый Массив;
        Пока Истина Цикл
            ВременныйРезультат = Найти(ВременнаяСтрока, ИскомаяСтрока);
             Если ВременныйРезультат Тогда
                 Результат = Результат  + ВременныйРезультат;
                Вхождения.Добавить(Результат);
                ВременнаяСтрока = Прав(ВременнаяСтрока, (СтрДлина(ВременнаяСтрока) - ВременныйРезультат - (СтрДлина(ИскомаяСтрока)-1)));
                //Сообщить ("Вхождение " + Индекс + ": " + (Результат));
                Результат = Результат + СтрДлина(ИскомаяСтрока)-1;
            Иначе
                //Сообщить("Требуемое вхождение не найдено");
                  Прервать;
            КонецЕсли;                    
        КонецЦикла;
        Если Вхождения.Количество()<НомерВхождения Тогда
            //Вхождение не найдено
            Возврат 0;
        Иначе
            Возврат Вхождения[(Вхождения.Количество()-НомерВхождения)]
        КонецЕсли;        
    Иначе
        ВызватьИсключение("Неправильный параметр: НаправлениеПоиска. Опции: ""СНачала"", ""СКонца""");
    КонецЕсли;        
КонецФункции

Функция СтрНачинаетсяС(Знач Строка, Знач СтрокаПоиска)
 
    если Найти(Строка, СтрокаПоиска)=1 тогда 
		Возврат Истина;
	иначе 
		Возврат Ложь;
	конецесли;	
		
		
    КонецФункции   

	
	Функция СтрЗаканчиваетсяНа (Знач Строка, Знач СтрокаПоиска)
 
    если Найти(Строка, СтрокаПоиска)=1 тогда 
		Возврат Истина;
	иначе 
		Возврат Ложь;
	конецесли;	
		
		
    КонецФункции   

	
	
	Функция СтрСоединить(Массив, Разделитель="")
    Строка = "";
    Для каждого Элемент Из Массив Цикл
        Строка = Строка + СокрЛП(Элемент) + Разделитель;
    КонецЦикла;
    
    Возврат Строка;
КонецФункции
	
	


Функция стрРазделить(Знач Строка, Знач Разделитель = ",",
    Знач ПропускатьПустыеСтроки = Неопределено)
 
    Результат = Новый Массив;
 
    // для обеспечения обратной совместимости
    Если ПропускатьПустыеСтроки = Неопределено Тогда
        ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
        Если ПустаяСтрока(Строка) Тогда 
            Если Разделитель = " " Тогда
                Результат.Добавить("");
            КонецЕсли;
            Возврат Результат;
        КонецЕсли;
    КонецЕсли;
    //
 
    Позиция = Найти(Строка, Разделитель);
    Пока Позиция > 0 Цикл
        Подстрока = Лев(Строка, Позиция - 1);
        Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
            Результат.Добавить(Подстрока);
        КонецЕсли;
        Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
        Позиция = Найти(Строка, Разделитель);
    КонецЦикла;
 
    Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
        Результат.Добавить(Строка);
    КонецЕсли;
 
    Возврат Результат;
 
КонецФункции
Показать
29. Игорь Герман (German_Tagil) 6 08.06.18 08:41 Сейчас в теме
Функция СтрЗаканчиваетсяНа не нашел
30. Роман М (m-rv) 451 08.06.18 08:48 Сейчас в теме
(29) это функции 8.3, в 8.2 их нет. недавно выкладывали их реализацию для подобных случаев.
31. Игорь Герман (German_Tagil) 6 08.06.18 09:20 Сейчас в теме
неправильно сформулировал извиняюсь - я понял что эти функции для 8.3
а ссылку можете указать? подправлю - может взлетит
32. Игорь Герман (German_Tagil) 6 08.06.18 10:10 Сейчас в теме
Функция ВыполнитьПакет(РасширенныйЗапрос) Экспорт

ИнициализироватьПараметрыРасширенногоЗапроса(РасширенныйЗапрос, Ложь);

Запрос = ИнициализироватьЗапросПолученияДанных(РасширенныйЗапрос);

МассивРезультатов = Запрос.ВыполнитьПакет();

ВыполнитьИзменениеДанных(РасширенныйЗапрос, МассивРезультатов);

Возврат МассивРезультатов;

КонецФункции

На ВыполнитьИзменениеДанных выносит
33. Игорь Герман (German_Tagil) 6 08.06.18 11:19 Сейчас в теме
посмотрел отладчиком
ОбъектРедактирования.Записать();

на этом ее и выносит
34. Игорь Герман (German_Tagil) 6 09.06.18 05:59 Сейчас в теме
функции СтрНайти,стрРазделить,СтрСоединить,СтрЗаканчиваетсяНа,СтрНачинаетсяС
проверил в ка 2.4 - рабочие

не вылетает
35. Роман М (m-rv) 451 09.06.18 07:58 Сейчас в теме
(34)
ошибка на строке
ОбъектРедактирования.Записать();
говорит о том, что проблема с записью самого объекта, при чем характер ошибки намекает на ее платформенную природу. попробуйде провалиться в обработчики/подписки перед/при записи.
36. Игорь Герман (German_Tagil) 6 09.06.18 09:09 Сейчас в теме
в общем похоже у меня база тестовая с ошибками была
на другой заработало
Оставьте свое сообщение