8.х УТ Недостаточно памяти при создании правила обмена ККМ Offline

Тема в разделе ""1С:Управление торговлей УТ"", создана пользователем MrShvets, 11 авг 2015.

  1. TopicStarter Overlay
    MrShvets
    Offline

    MrShvets Опытный в 1С

    Регистрация:
    3 апр 2012
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Добрый день!
    Народ, подскажите как быть. Есть УТ 11.1.10.153, есть платформа 8.3.6.2041.
    Создаю правило обмена с ККМ Offline, меняю реквизит "Максимальное количество товаров", срабатывает событие при изменении и 1С виснет, по диспетчеру задач что то активно считает и потихоньку кушает память. Спустя минут 10 и откушанных 2,5 ГБ оперативы вываливается с ошибкой "Недостаточно памяти".
    [​IMG]
    После прохода отладчиком, нашел место зависания, это попытка выполнить запрос, на формирование таблицы товаров для загрузки.
    Код:
    ВЫБРАТЬ
        &ПравилоОбмена КАК ПравилоОбмена,
        КодыТоваров.Код КАК Код,
        КодыТоваров.Используется КАК Используется,
        КодыТоваров.Номенклатура КАК Номенклатура,
        КодыТоваров.Характеристика КАК Характеристика,
        КодыТоваров.Упаковка КАК Упаковка
    ПОМЕСТИТЬ КодыТоваров
    ИЗ
        &ТаблицаЗначений КАК КодыТоваров
    
    ИНДЕКСИРОВАТЬ ПО
        Номенклатура,
        Характеристика,
        Упаковка;ВЫБРАТЬ
        Номенклатура.Ссылка КАК Номенклатура,
        Номенклатура.НаборУпаковок КАК НаборУпаковок,
        ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
        ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка) КАК Упаковка
    ПОМЕСТИТЬ НоменклатураИХарактеристики
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
    ГДЕ
        НЕ Номенклатура.ЭтоГруппа
        И Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        Номенклатура.Ссылка,
        Номенклатура.НаборУпаковок,
        ХарактеристикиНоменклатуры.Ссылка,
        ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
            ПО Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец
    ГДЕ
        Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры)
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        Номенклатура.Ссылка,
        Номенклатура.НаборУпаковок,
        ХарактеристикиНоменклатуры.Ссылка,
        ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
            ПО Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.Владелец
    ГДЕ
        Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры)
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        НоменклатураИХарактеристики.Номенклатура КАК Номенклатура,
        НоменклатураИХарактеристики.Характеристика КАК Характеристика,
        НоменклатураИХарактеристики.Упаковка КАК Упаковка
    ПОМЕСТИТЬ ИсходныеДанные
    ИЗ
        НоменклатураИХарактеристики КАК НоменклатураИХарактеристики
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        НоменклатураИХарактеристики.Номенклатура,
        НоменклатураИХарактеристики.Характеристика,
        УпаковкиНоменклатуры.Ссылка
    ИЗ
        Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ НоменклатураИХарактеристики КАК НоменклатураИХарактеристики
            ПО (УпаковкиНоменклатуры.Владелец = НоменклатураИХарактеристики.Номенклатура
                    ИЛИ УпаковкиНоменклатуры.Владелец = НоменклатураИХарактеристики.НаборУпаковок)
    
    ИНДЕКСИРОВАТЬ ПО
        Номенклатура,
        Характеристика,
        Упаковка
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
        ИсходныеДанныеПоследнийЗапрос.Номенклатура КАК Номенклатура,
        ИсходныеДанныеПоследнийЗапрос.Характеристика КАК Характеристика,
        ИсходныеДанныеПоследнийЗапрос.Упаковка КАК Упаковка,
        ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Код, 0) КАК Код,
        ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Используется, ЛОЖЬ) КАК Используется
    ПОМЕСТИТЬ ТаблицаДанных
    ИЗ
        ИсходныеДанные КАК ИсходныеДанныеПоследнийЗапрос
            ЛЕВОЕ СОЕДИНЕНИЕ КодыТоваров КАК КодыТоваровПодключаемогоОборудованияOffline
            ПО ИсходныеДанныеПоследнийЗапрос.Номенклатура = КодыТоваровПодключаемогоОборудованияOffline.Номенклатура
                И ИсходныеДанныеПоследнийЗапрос.Характеристика = КодыТоваровПодключаемогоОборудованияOffline.Характеристика
                И ИсходныеДанныеПоследнийЗапрос.Упаковка = КодыТоваровПодключаемогоОборудованияOffline.Упаковка
                И (КодыТоваровПодключаемогоОборудованияOffline.ПравилоОбмена = &ПравилоОбмена)
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ИСТИНА КАК СоответствуетОтбору,
        ТаблицаДанных.Номенклатура КАК Номенклатура,
        ТаблицаДанных.Характеристика КАК Характеристика,
        ТаблицаДанных.Код КАК Код,
        ТаблицаДанных.Используется КАК Используется,
        ВЫБОР
            КОГДА ТаблицаДанных.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
                ТОГДА ВЫБОР
                        КОГДА ТаблицаДанных.Номенклатура.ЕдиницаИзмерения.ТипЕдиницыИзмерения = ЗНАЧЕНИЕ(Перечисление.ТипыЕдиницИзмерения.Весовая)
                            ТОГДА ИСТИНА
                        ИНАЧЕ ЛОЖЬ
                    КОНЕЦ
            ИНАЧЕ ВЫБОР
                    КОГДА ТаблицаДанных.Упаковка.ЕдиницаИзмерения.ТипЕдиницыИзмерения = ЗНАЧЕНИЕ(Перечисление.ТипыЕдиницИзмерения.Весовая)
                        ТОГДА ИСТИНА
                    ИНАЧЕ ЛОЖЬ
                КОНЕЦ
        КОНЕЦ КАК Весовой
    ИЗ
        ТаблицаДанных КАК ТаблицаДанных
    ГДЕ
        (ТаблицаДанных.Код = 0
                ИЛИ НЕ ТаблицаДанных.Используется)
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ЛОЖЬ,
        КодыТоваровПодключаемогоОборудованияOffline.Номенклатура,
        КодыТоваровПодключаемогоОборудованияOffline.Характеристика,
        КодыТоваровПодключаемогоОборудованияOffline.Код,
        КодыТоваровПодключаемогоОборудованияOffline.Используется,
        ВЫБОР
            КОГДА КодыТоваровПодключаемогоОборудованияOffline.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
                ТОГДА ВЫБОР
                        КОГДА КодыТоваровПодключаемогоОборудованияOffline.Номенклатура.ЕдиницаИзмерения.ТипЕдиницыИзмерения = ЗНАЧЕНИЕ(Перечисление.ТипыЕдиницИзмерения.Весовая)
                            ТОГДА ИСТИНА
                        ИНАЧЕ ЛОЖЬ
                    КОНЕЦ
            ИНАЧЕ ВЫБОР
                    КОГДА КодыТоваровПодключаемогоОборудованияOffline.Упаковка.ЕдиницаИзмерения.ТипЕдиницыИзмерения = ЗНАЧЕНИЕ(Перечисление.ТипыЕдиницИзмерения.Весовая)
                        ТОГДА ИСТИНА
                    ИНАЧЕ ЛОЖЬ
                КОНЕЦ
        КОНЕЦ
    ИЗ
        КодыТоваров КАК КодыТоваровПодключаемогоОборудованияOffline
    ГДЕ
        НЕ (КодыТоваровПодключаемогоОборудованияOffline.Номенклатура, КодыТоваровПодключаемогоОборудованияOffline.Характеристика, КодыТоваровПодключаемогоОборудованияOffline.Упаковка) В
                    (ВЫБРАТЬ
                        Т.Номенклатура,
                        Т.Характеристика,
                        Т.Упаковка
                    ИЗ
                        ТаблицаДанных КАК Т)
        И КодыТоваровПодключаемогоОборудованияOffline.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
        И КодыТоваровПодключаемогоОборудованияOffline.ПравилоОбмена = &ПравилоОбмена
        И КодыТоваровПодключаемогоОборудованияOffline.Используется
    
    УПОРЯДОЧИТЬ ПО
        Код
    
    Что с этим запросом не так? Как можно исправить ситуацию?
    Пробовал также на УТ 11.1.10.173 и на платформе 8.3.6.2152 - результат такой же.
    Если предварительно поставить отбор, а потом менять реквизит, то с ошибкой не падает, но отбор мне не нужен.

    Номенклатуры 29 630 шт.
    Характеристик 1 481 шт.
    Характеристики используются Общие для вида характеристик, поэтому меня терзают смутные сомнения, а не получается ли тогда, что запрос хочет выбрать 29 630 * 1 481 = 43 882 030 позиций?
  2. TopicStarter Overlay
    MrShvets
    Offline

    MrShvets Опытный в 1С

    Регистрация:
    3 апр 2012
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Народ, у кого какие мысли то хоть есть в чем проблема?
  3. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Проблемы из-за временных таблиц. Либо переписывайте запрос, либо грузите порциями.
  4. TopicStarter Overlay
    MrShvets
    Offline

    MrShvets Опытный в 1С

    Регистрация:
    3 апр 2012
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Можете подсказать как переделать, чтоб порциями выбиралось?
  5. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Это довольно сложный процесс. Нужно обмен запускать как-бы несколько раз (это простым языком), и все это делать программно.
  6. TopicStarter Overlay
    MrShvets
    Offline

    MrShvets Опытный в 1С

    Регистрация:
    3 апр 2012
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Это понятно. Для первых записей будет например "Выбрать Первые 10000". А как для следующих организовать?
  7. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Общую переменную заводить, для счетчика. Вот отбрали вы 1000 записей, счетчик инкриментируете (увеличиваете), потом отбираете еще 1000 записей, опять увеличиваете. Только как запросом это сделать, в этом проблема. Тут обработку нужно пилить, весь алгоритм перестраивать. Вы где взяли эту обработку обслуживания ?
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Задавать отборы и так же использовать Выбрать Первые N
  9. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Да, но в запрос же нельзя передать параметр с какой позиции нужно отбирать, по этому, да, отборами как-то выкручиваться.
  10. TopicStarter Overlay
    MrShvets
    Offline

    MrShvets Опытный в 1С

    Регистрация:
    3 апр 2012
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Это типовая обработка загрузки ККМ Offline в Управлении торговлей.

    Про какие, например, отборы идет речь? Делать выгрузку по каждой папке в отдельности?
  11. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Да, можно устанавливать по группе, например :). В цикле обходите справочник номенклатуры, и передаете отбор по группе :)
  12. TopicStarter Overlay
    MrShvets
    Offline

    MrShvets Опытный в 1С

    Регистрация:
    3 апр 2012
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Не особо удобно конечно, но похоже альтернатив то и нет, разве что написать новую обработку.
  13. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Отборы по комбинациям значений предыдущих итераций выгрузки

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