Имя: Пароль:
1C
1C 7.7
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) ну а если "до такой необходимости не дошли" - значит, пока выгоднее экономить на написании, чем на выполнении....