8.х Таблица значений: индексация

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем MyNameNoName, 19 июл 2013.

  1. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Подскажите, а если я копирую таблицу значений:
    Код:
    //конструктор запроса
    Таблица = Запрос.Выполнить().Выгрузить();
    ТабЗнач = Таблица.Скопировать();
    
    то ее можно как-нибудь проиндексировать?
    Если создаю новую таблицу значений то там индексация работает, а когда копирую готовую таблицу из конструктора запроса то не могу понять не работает и все.
  2. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Что в Вашем понимании индексация? Обращение к строкам таблицы по индексам что ли? Типа ТабЗнач[0]?
  3. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Да. Как я понимаю это должно поднять скорость работы.
  4. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Но пр копировании таблицы почему то индексация не работает.
  5. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Чушь
    Чушь

    Если в таблице значений есть элементы, то у них есть индекс. А значит и обращаться к нему можно. Значит что-то не правильно делаете...
  6. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Код:
    ТабЗнач.Индексы.Добавить("Наименование");
    Как обратиться к этому значению теперь?
    До этого было так:
    Код:
    Для Каждого Элемент ИЗ ТабЗнач Цикл
    Элемент.Знач1 = Элемент.Наименование;
    КонецЦикла;
    
  7. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    что-то вы намудрили. Давайте начнем с подробного писания задачи, которую надо организовть. По идее к любому полю таблицы значений в любой момент можно обратиться, зачем городить дополнительные индексы?
  8. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    У меня медленно обработка работает, прочитал в интернете статью:
    Таблица значений 1С. Оптимизация скорости в 100 раз
    думал поможет, оказалось нет.
    Буду значит в коде искать проблемы.
  9. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    возможно и в коде проблемы, может где то лишние циклы идут или еще что, произведите замер производительности - может натолкнет на какие мысли
  10. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    А можете эту обработку сюда кидануть и кто-нибудь острым взглядом Вам скажет в чем дело. Ну или код вашей обработки.
  11. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    да тоже вариант
  12. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Вот фрагмент. Начал переписывать выкидывать лишнее.
    Код:
    Функция ПолучитьАналогНаименование(Код, Номер) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    АналогиНоменклатуры.Аналог.Наименование КАК АналогНаименование,
    |    СправочникНоменклатура.Код КАК НоменклатураКод,
    |    АналогиНоменклатуры.Аналог.Артикул КАК АналогАртикул,
    |    АналогиНоменклатуры.Аналог.Код КАК АналогКод
    |ИЗ
    |    РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
    |        ПО АналогиНоменклатуры.Номенклатура = СправочникНоменклатура.Ссылка
    |ГДЕ
    |    СправочникНоменклатура.Код = &Код
    |
    |СГРУППИРОВАТЬ ПО
    |    АналогиНоменклатуры.Аналог.Наименование,
    |    СправочникНоменклатура.Код,
    |    АналогиНоменклатуры.Аналог.Артикул,
    |    АналогиНоменклатуры.Аналог.Код";
    Запрос.УстановитьПараметр("Код",Код);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Для Значения = 1 По (Выборка.Количество() - Номер) Цикл
    Выборка.Следующий();
    КонецЦикла;
    Возврат Выборка.АналогНаименование;
    КонецФункции
    
    Функция ПолучитьАналогКод(Код, Номер) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    АналогиНоменклатуры.Аналог.Наименование КАК АналогНаименование,
    |    СправочникНоменклатура.Код КАК НоменклатураКод,
    |    АналогиНоменклатуры.Аналог.Артикул КАК АналогАртикул,
    |    АналогиНоменклатуры.Аналог.Код КАК АналогКод
    |ИЗ
    |    РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
    |        ПО АналогиНоменклатуры.Номенклатура = СправочникНоменклатура.Ссылка
    |ГДЕ
    |    СправочникНоменклатура.Код = &Код
    |
    |СГРУППИРОВАТЬ ПО
    |    АналогиНоменклатуры.Аналог.Наименование,
    |    СправочникНоменклатура.Код,
    |    АналогиНоменклатуры.Аналог.Артикул,
    |    АналогиНоменклатуры.Аналог.Код";
    Запрос.УстановитьПараметр("Код",Код);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Для Значения = 1 По (Выборка.Количество() - Номер) Цикл
    Выборка.Следующий();
    КонецЦикла;
    Возврат Выборка.АналогКод;
    КонецФункции
    
    Функция ПолучитьАналогКоличество(Код) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    АналогиНоменклатуры.Аналог.Наименование КАК АналогНаименование,
    |    СправочникНоменклатура.Код КАК НоменклатураКод,
    |    АналогиНоменклатуры.Аналог.Артикул КАК АналогАртикул,
    |    АналогиНоменклатуры.Аналог.Код КАК АналогКод
    |ИЗ
    |    РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
    |        ПО АналогиНоменклатуры.Номенклатура = СправочникНоменклатура.Ссылка
    |ГДЕ
    |    СправочникНоменклатура.Код = &Код
    |
    |СГРУППИРОВАТЬ ПО
    |    АналогиНоменклатуры.Аналог.Наименование,
    |    СправочникНоменклатура.Код,
    |    АналогиНоменклатуры.Аналог.Артикул,
    |    АналогиНоменклатуры.Аналог.Код";
    Запрос.УстановитьПараметр("Код",Код);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    //Для Значения = 1 По (Выборка.Количество() - Номер) Цикл
    //Выборка.Следующий();
    //КонецЦикла;
    //    //Возврат Выборка.АналогНаименование;
    Возврат (Выборка.Количество());
    КонецФункции
    
    Функция ПолучитьКоличество(Код) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СписанныеТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
    |    СписанныеТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    |    СУММА(СписанныеТовары.Количество) КАК Количество,
    |    СписанныеТовары.Номенклатура.Код КАК НоменклатураКод
    |ИЗ
    |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |ГДЕ
    |    СписанныеТовары.Номенклатура.Код = &Код
    |
    |СГРУППИРОВАТЬ ПО
    |    СписанныеТовары.Номенклатура.Артикул,
    |    СписанныеТовары.Номенклатура.Код,
    |    СписанныеТовары.Номенклатура.Наименование";
    Запрос.УстановитьПараметр("Код",Код);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Если Код = NULL ТОГДА
    Возврат NULL;
    ИНАЧЕ
    Возврат Выборка.Количество;
    КонецЕсли;
    КонецФункции
    
    Процедура КнопкаСформироватьНажатие(Кнопка)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    
    "ВЫБРАТЬ
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование КАК НоменклатураНаименование,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул КАК НоменклатураАртикул,
    |    СУММА(ПотребностиЗаказовНаПроизводство.Количество) КАК КоличествоЗаказы,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Код КАК НоменклатураКод
    |ИЗ
    |    РегистрНакопления.ПотребностиЗаказовНаПроизводство КАК ПотребностиЗаказовНаПроизводство
    |ГДЕ
    |    ПотребностиЗаказовНаПроизводство.ВидВоспроизводства = &Закупка
    |
    |СГРУППИРОВАТЬ ПО
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Код";
    
    Запрос.УстановитьПараметр("Закупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка);
    Таблица = Запрос.Выполнить().Выгрузить();
    
    ТабЗнач = Новый ТаблицаЗначений;
    ТабЗнач = Таблица.Скопировать();
    ТабЗнач.Колонки.Добавить("Код1");
    ТабЗнач.Колонки.Добавить("Код2");
    ТабЗнач.Колонки.Добавить("Код3");
    ТабЗнач.Колонки.Добавить("Код4");
    ТабЗнач.Колонки.Добавить("Наименование1");
    ТабЗнач.Колонки.Добавить("Наименование2");
    ТабЗнач.Колонки.Добавить("Наименование3");
    ТабЗнач.Колонки.Добавить("Наименование4");
    ТабЗнач.Колонки.Добавить("Количество1");
    ТабЗнач.Колонки.Добавить("Количество2");
    ТабЗнач.Колонки.Добавить("Количество3");
    ТабЗнач.Колонки.Добавить("Количество4");
    
    
    
    Для Каждого Элемент ИЗ ТабЗнач Цикл
    Элемент.Код1 = ПолучитьАналогКод((Элемент.НоменклатураКод),0);
    Элемент.Код2 = ПолучитьАналогКод((Элемент.НоменклатураКод),1);
    Элемент.Код3 = ПолучитьАналогКод((Элемент.НоменклатураКод),2);
    Элемент.Код4 = ПолучитьАналогКод((Элемент.НоменклатураКод),3);
    Элемент.Наименование1 = ПолучитьАналогНаименование((Элемент.НоменклатураКод),0);
    Элемент.Наименование2 = ПолучитьАналогНаименование((Элемент.НоменклатураКод),1);
    Элемент.Наименование3 = ПолучитьАналогНаименование((Элемент.НоменклатураКод),2);
    Элемент.Наименование4 = ПолучитьАналогНаименование((Элемент.НоменклатураКод),3);
    Элемент.Количество1 = ПолучитьКоличество(Элемент.Код1);
    Элемент.Количество2 = ПолучитьКоличество(Элемент.Код2);
    Элемент.Количество3 = ПолучитьКоличество(Элемент.Код3);
    Элемент.Количество4 = ПолучитьКоличество(Элемент.Код4);
    КонецЦикла;
    
    Максимальное падение скорости при вызове функции
    Код:
    ПолучитьКоличество()
    Все в один цикл не могу загнать из-за раздвоения номенклатуры в этом случае.
    А мне нужно именно в одной строке основная номенклатура, а далее 4 аналога.
  13. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    12 запросов в теле цикла - это сурово :)

    сделайте все одним запросом - жить легче станет
  14. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    1) Циклы странные.
    Обход выборки осуществляется так:
    Код:
    Пока Выборка.Следующий() Цикл
    2) Не нужно самостоятельно создавать таблицу значений. При копировании она будет скопирована со всеми колонками.
    3) Покажите структуру этого регистра сведений "Списанные товары"
  15. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Полностью согласен. Но как все в один запрос объединить? Начинается размножение номенклатуры тогда.
  16. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Используйет виртуальные таблицы. Они для этого и предназначены. И да, сделайте все в одном запросе.

    Какая конфа? И что конкретно нужно получить?
  17. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    [​IMG]

    УПП
    Нужно увидеть закрытые позиции по заказам на производство. Но по аналагам. У каждой позиции по 2-3 аналога. Соответственно строка: наименование, аналог 1, аналог2, аналог3, аналог4. Я смог это реализовать только внешней функцией. Сколько не пробовал в одном запросе строки дублируются.
  18. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Мне это кажется или у Вас реально столько ресурсов?

    И одно измерение?
  19. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    может я чего не понимаю, но по мне так первые 2 функции - одно и тоже делают, нет?

    и еще, мне помниться вы поднимали тему про аналоги и там был поднят вопрос пакетных запросов. У вас так и не получилось их организовать?
  20. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Поднимал, реализовал именно этими функциями. А при пакетном запросе получается если у позиции 3 аналога то создается 3 строки, а мне нужна одна строка с разнесением по разным колонкам аналогов. Пакетный запрос это не умеет.
    Я сейчас сижу и думаю. Может сделать нужный пакетный запрос, пусть двоятся троятся строки а затем циклом разложить все по полочкам...

    Код:
    	|	СписанныеТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
    |	СписанныеТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    |	СУММА(СписанныеТовары.Количество) КАК Количество,

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