[РЕШЕНО] Как лучше из таблицы значений удалить лишние строки?

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Ivan2014, 18 фев 2016.

  1. TopicStarter Overlay
    Ivan2014
    Offline

    Ivan2014 Опытный в 1С

    Регистрация:
    10 апр 2014
    Сообщения:
    384
    Симпатии:
    2
    Баллы:
    29
    Добрый вечер.
    Имеется таблица значений. Часть имен колонок предопределенных, часть - создаются в зависимости от других данных.
    Необходимо удалить те строки из таблицы значений, когда в одной из предопределенных колонок значение = 0.
    Как лучше данную задачу решать? Анализировать колонки, создавать запрос и отбором удалять не нужные колонки или в цикле обходить все колонки, те строки которые подлежать удалению - в массив, потом удалить эти строчки?
    Вторая задача намного проще, но боюсь что на производительность может отрицательно повлиять. С другой стороны для чего обрабатывать всю таблицу (передавать ее в запрос), если можно в строке один раз массив пробежать? В перспективе будет > 100.000 строк, поэтому производительность важна.
    Спасибо Вам.
  2. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    Произвольный запрос с выборкой данных из таблицы значений. Накладывайте нужные условия, потом результат выгружаете в новую таблицу значений. Делов то...
    Ivan2014 нравится это.
  3. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Метод НайтиСтроки() либо запросом объединять результаты строк со значениями <> 0
    Ivan2014 нравится это.
  4. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    Ему же производительность важна. А ведь потом в цикле придется удалять найденные строки :)
    Ivan2014 нравится это.
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    ну значит куча таблиц и их объединение в запросе :)
    Ivan2014 нравится это.
  6. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.443
    Симпатии:
    375
    Баллы:
    104
    у него условие "Необходимо удалить те строки из таблицы значений, когда в одной из предопределенных колонок значение = 0.".
    по идее, если свернуть ТЗ по нужной колонке , где "=0" - то потом надо будет удалить всего одну строку, которую можно найти через поиск по значению в нужной колонке
    Ivan2014 нравится это.
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    А кто сказал, что ТЗ может быть свернута? :)
    Ivan2014 нравится это.
  8. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.443
    Симпатии:
    375
    Баллы:
    104
    ну тогда по старинке, "обратным" циклом.
    т.е. в обход в цикле от последней строки к первой с проверкой и удалением
    Ivan2014 нравится это.
  9. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    Решается так
    Код:
    МенеджерВремТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВремТаблиц;
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Загружено.ПредопределеннаяКолонка1,
    |    Загружено.ПредопределеннаяКолонка2,
    |    Загружено.ПредопределеннаяКолонка3,
    |    Загружено.ПредопределеннаяКолонка4
    |ПОМЕСТИТЬ ВТ_Загружено
    |ИЗ
    |    &ЗагруженоТЗ КАК Загружено
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТ_Загружено.ПредопределеннаяКолонка1,
    |    ВТ_Загружено.ПредопределеннаяКолонка2,
    |    ВТ_Загружено.ПредопределеннаяКолонка3,
    |    ВТ_Загружено.ПредопределеннаяКолонка4
    |ИЗ
    |    ВТ_Загружено КАК ВТ_Загружено
    |ГДЕ
    |    ВТ_Загружено.ПредопределеннаяКолонка3 = 0";
    Запрос.УстановитьПараметр("ЗагруженоТЗ", // Ваша таблица значений);
    НоваяТаблица = Запрос.Выполнить().Выгрузить();
    
    Только условия нормальные прописать, какие Вам нужны и все. Все отработает быстро. Запрос можно строить динамически, если нужны колонки, которые формируются в коде.
    Ivan2014 нравится это.
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Тогда уж

    НЕ ВТ_Загружено.ПредопределеннаяКолонка3 = 0

    :)
    Ivan2014 нравится это.
  11. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    Ну да. Машинально условия написал. И менеджер временных таблиц естественно по нужде. А то ведь он память будет засирать.
    Ivan2014 нравится это.
  12. TopicStarter Overlay
    Ivan2014
    Offline

    Ivan2014 Опытный в 1С

    Регистрация:
    10 апр 2014
    Сообщения:
    384
    Симпатии:
    2
    Баллы:
    29
    Спасибо за ответы. Задача решена.

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