|
v7: 1С++ - .УложитьСписокОбъектов13 | ☑ | ||
---|---|---|---|---|
0
Владимир1С
06.04.17
✎
10:15
|
Пытаюсь применить вышеуказанную функцию. Не срабатывает. Вопрос к знатокам: Эта процедура, в принципе, работоспособна? Может быть, я в принципе напрасно трачу время в попытках её применить?
|
|||
1
vcv
06.04.17
✎
10:53
|
У нас работает. Для отбора по реквизиту документ неопределенного вида. А у вас?
|
|||
2
Владимир1С
06.04.17
✎
11:02
|
(1)Вход - список элементов и групп справочников. Для использования в условии - ограничении.
|
|||
3
vcv
06.04.17
✎
14:23
|
(2)
ODBCRecordSet :: УложитьСписокОбъектов13 / PutObjectList13 Синтаксис: УложитьСписокОбъектов13(Список, ИмяТаблицы) Параметры: Список - тип: СписокЗначений, Справочник, Счет. Объект, содержание которого будет отправляться на сервер. Если передан список значений, во врем. таблицу попадает содержимое списка. ИмяТаблицы - тип: Строка. Имя временной таблицы. Описание: сохраняет список объектов во временной таблице MS SQL. Идентификаторы объектов из списка сохраняются во временной таблице. Таблица имеет единственное поле val char(13). Имя таблицы должно начинаться с символа "#". В описании нет ни слова про иерархическое включение дочерних элементов групп справочников подобно УложитьСписокОбъектов. |
|||
4
Это_mike
06.04.17
✎
14:26
|
(0) что значит "не срабатывает"?
(3) угу. укладывает только объекты, без иерархии. |
|||
5
Владимир1С
06.04.17
✎
16:25
|
(3) Иерархически нижние группы включил программным перебором подчинённых.
Проблему решил так: Заработало как часы. Процедура УложитьТаблицу_л(пТЗ, ИмяТаб, Колонки="") Перем ТЗ,Запрос; Запрос = СоздатьОбъект("ODBCRecordSet"); Если ПустаяСтрока(Колонки)=1 Тогда // все колонки типВхода = типЗначенияСтр(пТЗ); попытка Если типВхода = "ТаблицаЗначений" тогда ТЗ=пТЗ; ИначеЕсли типВхода = "СписокЗначения" тогда ТЗ = СоздатьОбъект("ТаблицаЗначений"); пТЗ.Выгрузить(ТЗ); КонецЕсли; исключение КонецПопытки; Иначе Попытка // для таблицы пТЗ.Выгрузить(ТЗ,,,Колонки); исключение // для списка ТЗ = СоздатьОбъект("ТаблицаЗначений"); пТЗ.Выгрузить(ТЗ); КонецПопытки; КонецЕсли; СтрCreate="create table %Имя% (/*column_definition*/)"; СтрInsert="insert into %Имя% values(/*?*/)"; Тип=""; Длина=""; Точность=""; ФорматнаяСтрока=""; КолонкиЕсть=0; Для Тек=1 По ТЗ.КоличествоКолонок() Цикл Идентификатор = ТЗ.ПолучитьПараметрыКолонки(Тек,Тип,Длина,Точность,,,ФорматнаяСтрока); Если ((ПустаяСтрока(Колонки)=0) И (Найти(Колонки,Идентификатор)=0)) Тогда Продолжить; КонецЕсли; КолонкиЕсть=1; Если ПустаяСтрока(ФорматнаяСтрока)=0 Тогда SQL_тип=ФорматнаяСтрока; Запрос.ДобПараметр(1,); ИначеЕсли ПустаяСтрока(Тип)=1 Тогда SQL_тип="char(9)"; Запрос.ДобПараметр(1,14,9,0); ИначеЕсли Тип="Число" Тогда Если Длина=0 Тогда Длина=38; Точность=10; КонецЕсли; SQL_тип="numeric(%p%,%s%)"; SQL_тип=СтрЗаменить(SQL_тип,"%p%",Длина); SQL_тип=СтрЗаменить(SQL_тип,"%s%",Точность); Запрос.ДобПараметр(1,11,Длина,Точность); ИначеЕсли Тип="Строка" Тогда Если Длина=0 Тогда SQL_тип="varchar(%n%)"; SQL_тип=СтрЗаменить(SQL_тип,"%n%",255); Запрос.ДобПараметр(1,15,255,0); Иначе SQL_тип="char(%n%)"; SQL_тип=СтрЗаменить(SQL_тип,"%n%",Длина); Запрос.ДобПараметр(1,14,Длина,0); КонецЕсли; ИначеЕсли Тип="Дата" Тогда SQL_тип="datetime"; Запрос.ДобПараметр(1,8,0,0); ИначеЕсли Найти(Тип,".")>0 Тогда SQL_тип="char(9)"; Запрос.ДобПараметр(1,14,9,0); Иначе SQL_тип="char(13)"; Запрос.ДобПараметр(1,14,13,0); ТЗ.УстановитьПараметрыКолонки(Идентификатор,,,,"?2"); КонецЕсли; СтрCreate=СтрЗаменить(СтрCreate,"/*,*/",", "); Если Тек = ТЗ.КоличествоКолонок() тогда СтрCreate=СтрЗаменить(СтрCreate,"/*column_definition*/",Идентификатор+" "+SQL_тип+"/*,*/"); иначе СтрCreate=СтрЗаменить(СтрCreate,"/*column_definition*/",Идентификатор+" "+SQL_тип+"/*,*//*column_definition*/"); конецЕсли; СтрInsert=СтрЗаменить(СтрInsert,"/*,*/",", "); СтрInsert=СтрЗаменить(СтрInsert,"/*?*/","?/*,*//*?*/"); КонецЦикла; Если КолонкиЕсть=1 Тогда ТекстЗапроса=" |set nocount on |if exists (select * from tempdb..sysobjects where id=object_id('tempdb..%Имя%') and sysstat & 0xf = 3 ) | drop table %Имя%; |"+СтрCreate+" |set nocount off |"; рс_=СоздатьОбъект("ODBCRecordset"); // удаление старой временной таблицы ЗапросУдаления = "set nocount on if exists (select * from tempdb..sysobjects where id=object_id('tempdb..%Имя%') and sysstat & 0xf = 3 ) drop table %Имя%;"; рс_.ВыполнитьИнструкцию(СтрЗаменить(ЗапросУдаления,"%Имя%",ИмяТаб)); ЗапросСоздания = СтрCreate+"set nocount off"; рс_.ВыполнитьИнструкцию(СтрЗаменить(ЗапросСоздания,"%Имя%",ИмяТаб)); Запрос.Подготовить(СтрЗаменить(СтрInsert,"%Имя%",ИмяТаб)); Запрос.ВыполнитьSQL_ИзТЗ(ТЗ,100); КонецЕсли; КонецПроцедуры // УложитьТаблицу() |
|||
6
Владимир1С
06.04.17
✎
16:28
|
(4)
в условиях | AND (Журнал.$ОбщийРеквизит.Склад IN (SELECT VAL FROM #SpisSklad) ) | AND (Товары.PARENTID IN (SELECT VAL FROM #SpisRod) ) всегда ложь. В общем, задача решена. А с УложитьСписокОбъектов13 буду разбираться на досуге. |
|||
7
Это_mike
06.04.17
✎
16:28
|
жуть какая.
а нельзя было УложитьСписокОбъектов, а затем select $ВидСправочника36+val into ##### from ИмяТаблицы ? |
|||
8
Владимир1С
06.04.17
✎
16:32
|
(7) А можно код поподробнее чуть чуть?
|
|||
9
Это_mike
06.04.17
✎
16:35
|
(8) ну а что подробнее? укладываеть все по иерархии в таблицу через УложитьСписокЗначений.
Укладываешь одно значение любое через УложитьСписок13 (чтоб таблицу чар13 не руками делать). а потом запросом переливаешь из таблицы 9 в таблицу 13 с добавлением типа. можешь еще для гарантии "дистинкт" поставить, чтоб не дублировались. хотя для фильтра пофиг |
|||
10
Владимир1С
06.04.17
✎
16:41
|
(9) для больших справочников обычно делают список родителей, в сравнении пишут ааа.Родитель N (SELECT VAL FROM #SpisRod) )
Спасибо за совет. |
|||
11
Это_mike
06.04.17
✎
16:43
|
(10) фи. зачем???
серверу может самую чуточку быстрее по маленькому списку, но зато ему придется доставать родителя. но главное - писать больше. а оно мне надо? :-) |
|||
12
Владимир1С
06.04.17
✎
16:47
|
(11) Элемент.Родитель из базы всё равно выбирать, а вот размер фильтра влияет на скорость.
|
|||
13
Владимир1С
06.04.17
✎
16:48
|
(11) Да и время заполнения фильтра тоже никуда не улетучивается.
|
|||
14
Это_mike
06.04.17
✎
16:52
|
(12) не факт, что нужно выбирать родителя.
а влияние размера фильтра на скорость нужно смотреть в конкретном плане запроса. |
|||
15
Владимир1С
06.04.17
✎
16:53
|
(14) До такой необходимости ещё не дошли. К счастью.
|
|||
16
Это_mike
06.04.17
✎
16:55
|
(15) ну а если "до такой необходимости не дошли" - значит, пока выгоднее экономить на написании, чем на выполнении....
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |