8.х Количество строк в таблице значений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Sergey-911, 4 окт 2010.

  1. TopicStarter Overlay
    Sergey-911
    Offline

    Sergey-911

    Регистрация:
    1 авг 2007
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте уважаемые.
    Выполняю запрос из БД Access. Затем заполняю ТаблицуЗначений:
    Код:
    // Выполнение и получение набора данных
    RS = Command.Execute();
    
    //Коолонки таблицы значений
    ТаблицаЗначений = Новый ТаблицаЗначений;
    Для НомерКолонки = 0 По RS.Fields.Count-1 Цикл
    НазваниеКолонки = RS.Fields.Item(НомерКолонки).Name;
    ТаблицаЗначений.Колонки.Добавить(НазваниеКолонки);
    КонецЦикла;
    
    //Строки таблицы значений
    Пока RS.EOF() = 0 Цикл 
    НоваяСтрока = ТаблицаЗначений.Добавить();
    Для НомерКолонки = 0 По RS.Fields.Count-1 Цикл
    НазваниеКолонки = RS.Fields.Item(НомерКолонки).Name;
    Значение = RS.Fields(НазваниеКолонки).Value;
    НоваяСтрока[НазваниеКолонки] = Значение;
    RS.MoveNext(); 
    КонецЦикла; 
    КонецЦикла;		
    
    
    Как только запрос возвращает число строк больше 4788 - то получаю ошибку:
    , если меньше - то все нормально.
    Скажите уважаемые, есть ли в таблице значений ограничение числа строк?

    И еще уважаемые, чтобы заполнить таблицу данными запроса пишу следующее:
    Код:
    ЭлементыФормы.ТабличноеПоле1.Значение = ТаблицаЗначений;
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();	
    
    
    Почему нельзя сразу написать:
    Код:
    ЭлементыФормы.ТабличноеПоле1.Значение = RS;
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
    
    
    Зачем перебирать в цикле лишний раз теряя время на его выполнение? Ведь результатзапроса (RS) - это таже виртуальтая таблица...
    Можно ли заполнить таблицу без перебора цикла?
  2. lazy
    Offline

    lazy Модераторы Команда форума Модератор

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Ответ на первый вопрос - это ограничение не ТЗ в платформе, а какая то проблема получения значения из Access. Разбирайтесь с тем, какое значение приобретает НазваниеКолонки при попадании в исключение.

    В самом простом варианте это будет нечто вроде:
    Код:
    Для НомерКолонки = 0 По RS.Fields.Count-1 Цикл
    НазваниеКолонки = RS.Fields.Item(НомерКолонки).Name;
    
    Попытка
    Значение = RS.Fields(НазваниеКолонки).Value;
    Исключение
    Сообщить("Проблемное название колонки: "+НазваниеКолонки+" Номер колонки: "+НомерКолонки);
    RS.MoveNext();
    Продолжить;
    КонецПопытки;
    
    НоваяСтрока[НазваниеКолонки] = Значение;
    RS.MoveNext(); 
    КонецЦикла; 
    
    
    
    
    

    По поводу второго вопроса - нельзя, т.к. для Платформы1С RS - это чужеродный объект. В платформе нет методов непосредственной конвертации из виртуальной таблицы формируемой Command.Execute() в свою ТЗ. Поэтому и приходится прибегать к методам извлечения из этого объекта данных которые предоставляет соединение с Access и использовать методы платформы для добавления этих данных в ТЗ. С этим приходится сталкиваться при работе с любыми внешними для платформы объектами.
  3. TopicStarter Overlay
    Sergey-911
    Offline

    Sergey-911

    Регистрация:
    1 авг 2007
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Не lazy, дело как раз в ограничении ТЗ, ведь код:
    Код:
    // Создание объекта набора записей
    RS = Новый COMОбъект("ADODB.RecordSet");
    Попытка    
    // Выполнение и получение набора данных
    RS = Command.Execute();        
    ТабличноеПоле1.Колонки.Очистить();
    Для НомерКолонки = 0 По RS.Fields.Count-1 Цикл
    НазваниеКолонки = RS.Fields.Item(НомерКолонки).Name;
    //ТаблицаЗначений.Колонки.Добавить(НазваниеКолонки);
    ТабличноеПоле1.Колонки.Добавить(НазваниеКолонки);
    КонецЦикла;
    строка = 0;
    Пока RS.EOF() = 0 Цикл     
    строка = строка + 1;
    Если  строка < 4788 Тогда
    НоваяСтрока = ТабличноеПоле1.Добавить();                 
    Для НомерКолонки = 0 По RS.Fields.Count-1 Цикл        
    НазваниеКолонки = RS.Fields.Item(НомерКолонки).Name;            
    Значение = RS.Fields(НазваниеКолонки).Value;            
    НоваяСтрока[НазваниеКолонки] = Значение;            
    RS.MoveNext();              
    КонецЦикла;
    Иначе 
    Прервать;
    КонецЕсли;
    КонецЦикла;            
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();        
    Исключение
    Предупреждение(строка);
    Предупреждение(ОписаниеОшибки());
    КонецПопытки;    
    RS.Close();    
    Connection.Close();   
    
    
    
    выполняется без ошибок, только возвращает не все данные.
    Какие еще есть предположения уважаемые форумчане? :angry:
  4. lazy
    Offline

    lazy Модераторы Команда форума Модератор

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Проведите простейший эксперимент, чтобы убедится, что в ТЗ возможно очень большое количество строк.
    Код:
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Колонка");
    
    Счетчик = 1;
    Пока Истина Цикл
    ОбработкаПрерыванияПользователя();
    Стр = ТЗ.Добавить();
    Если (Счетчик % 1000) = 0 Тогда
    Сообщить("Число строк ТЗ :"+Счетчик);
    КонецЕсли;
    Счетчик = Счетчик + 1;
    КонецЦикла;
    
    
    
    
    Т.е. 4788 это не ограничение Таблицы Значений, а косяк в получении данных из аксеса.

    В конце концов, можете просто не складывая значения в ТЗ попробовать их все вывести через Сообщить(); или в файл и посмотреть, возникнет ли ошибка.
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Sergey-911, я думаю тут дело не в ТЗ.
    Вопрос по следующему участку кода:
    Код:
        //Строки таблицы значений
    Пока RS.EOF() = 0 Цикл 
    НоваяСтрока = ТаблицаЗначений.Добавить();
    Для НомерКолонки = 0 По RS.Fields.Count-1 Цикл
    НазваниеКолонки = RS.Fields.Item(НомерКолонки).Name;
    Значение = RS.Fields(НазваниеКолонки).Value;
    НоваяСтрока[НазваниеКолонки] = Значение;
    RS.MoveNext(); 
    КонецЦикла; 
    КонецЦикла;        
    
    
    почему вы RS двигаете в цикле по колонкам? Должно быть наверно вот так:
    Код:
        //Строки таблицы значений
    Пока RS.EOF() = 0 Цикл 
    НоваяСтрока = ТаблицаЗначений.Добавить();
    Для НомерКолонки = 0 По RS.Fields.Count-1 Цикл
    НазваниеКолонки = RS.Fields.Item(НомерКолонки).Name;
    Значение = RS.Fields(НазваниеКолонки).Value;
    НоваяСтрока[НазваниеКолонки] = Значение;
    КонецЦикла; 
    RS.MoveNext(); 
    КонецЦикла;        
    
    
  6. TopicStarter Overlay
    Sergey-911
    Offline

    Sergey-911

    Регистрация:
    1 авг 2007
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Вы правы. Огромное спасибо! :angry:

Поделиться этой страницей