|   |   | 
| 
 | 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) ну а если "до такой необходимости не дошли" - значит, пока выгоднее экономить на написании, чем на выполнении....     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |