Имя: Пароль:
1C
1С v8
падает 1С "Недостаточно памяти"
0 Sasha_H
 
20.06.12
15:15
Работаю с внешним источником данных, необходимо загружать товары, так вот на входе 165 000 строк, но все мне они не нужны а нужны лишь только по определенным условиям, а понять я могу какие нужны только соединив со своим справочником товаров.

Так вот первый запрос берет весь товар:


ТекстЗапроса = "ВЫБРАТЬ
   |    НоменклатураЛЦ.NOMEN_ID                        КАК ЛЦ_NOMEN_ID,
   |    НоменклатураЛЦ.NAME                            КАК Наименование,
   |    ТоварнаяМатрица.IS_ACTIVE                        КАК ЛЦ_Активный,
   |    ТоварнаяМатрица.IS_VISIBLE                        КАК ЛЦ_Видимый
   |ИЗ
   |    ВнешнийИсточникДанных."+СтруктураОбмена.НастройкаОбмена.ЛЦ_ВнешнийИсточникДанных+".Таблица.dbo_t_nomens КАК НоменклатураЛЦ
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_nom_objects КАК ТоварнаяМатрица
   |        ПО НоменклатураЛЦ.NOMEN_ID = ТоварнаяМатрица.NOMEN_ID
   |            И (ТоварнаяМатрица.OBJECT_ID = &ИДСклад)";
   
   Запрос.УстановитьПараметр("ИДСклад",СтруктураОбмена.НастройкаОбмена.ЛЦ_ИдентификаторСклада);
   Запрос.Текст = ТекстЗапроса;
   
   РезЗапр = Запрос.Выполнить();
   ВнешниеДанные = РезЗапр.Выгрузить();
Все отлично данные в таблице значений. Далее я этут ТЗ хочу обойти в другом запросе и при этом уже соеденить со своим справочником:

Запрос = Новый Запрос("ВЫБРАТЬ
   |    ВнешниеДанные.ЛЦ_NOMEN_ID,
   |    ВнешниеДанные.Наименование,
   |    ВнешниеДанные.ЛЦ_Активный,
   |    ВнешниеДанные.ЛЦ_Видимый
   
   |ПОМЕСТИТЬ ВремТабл
   |ИЗ
   |    &ВнешниеДанные КАК ВнешниеДанные
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ВремТабл.ЛЦ_NOMEN_ID,
   |    ВремТабл.Наименование,
   |    ВремТабл.ЛЦ_Активный,
   |    ВремТабл.ЛЦ_Видимый
   
   |ИЗ
   |    ВремТабл КАК ВремТабл
   |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
   |        ПО ВремТабл.ЛЦ_NOMEN_ID = СпрНоменклатура.ЛЦ_NOMEN_ID
   |ГДЕ
   |    ВЫБОР
   |            КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
   |                        И ВремТабл.ЛЦ_Видимый = 0
   |                    ИЛИ СпрНоменклатура.ЛЦ_TS = ВремТабл.ЛЦ_TS
   |                ТОГДА ЛОЖЬ
   |            ИНАЧЕ ИСТИНА
   |        КОНЕЦ");
   
   Запрос.УстановитьПараметр("ВнешниеДанные",ВнешниеДанные);
   РезЗапрТовары = Запрос.Выполнить();
Вот при выполнении этого запроса и падает 1С с ошибкой на недостаточно памяти.

Пробовал с запроса выкинуть соединение со справочником номенклатура, ошибка осталась.

Если это никак не излечить придется тупо в обходе запроса искать ненужные товары и отсекать, а выполнение это увеличится раз в 10 как минимум :(
1 kosts
 
20.06.12
15:21
(0) Попробуй вместо ВнешниеДанные = РезЗапр.Выгрузить(); сам создать ТЗ с конкретными типами. и заполнить ее.
2 Sasha_H
 
20.06.12
15:24
(1) тут интересней намного все :). Итак запрос, что я скинул я поля обрезал чтобы на форуме особо не сорить, так вот убрав поля, хотя многие из них мне нужны, запрос начал работать. Начинаю отслежовать какое поле ему мешает.
3 Fragster
 
гуру
20.06.12
15:24
Не(СпрНоменклатура.Ссылка ЕСТЬ NULL И ВремТабл.ЛЦ_Видимый = 0 ИЛИ СпрНоменклатура.ЛЦ_TS = ВремТабл.ЛЦ_TS)
4 Fragster
 
гуру
20.06.12
15:25
но вообще сдается мне, что ЛЦ_TS сильно неуникально
5 Fragster
 
гуру
20.06.12
15:25
вернее ЛЦ_NOMEN_ID
6 H A D G E H O G s
 
20.06.12
15:26
Сделать по частям.
7 Sasha_H
 
20.06.12
15:27
(4) - это поле ДАТА
8 Sasha_H
 
20.06.12
15:27
(6) вот щас и пробую
9 Sasha_H
 
20.06.12
15:28
(5) уникально - это тебе только здается
10 Sasha_H
 
20.06.12
15:28
(9) там на базе скула пишет даже, что это ключ!
11 Sasha_H
 
20.06.12
15:41
Падает на поле "ЕдИзм" и "Производитель"

Первый запрос!

|НоменклатураЛЦ.MAKER_ID.NAME    КАК Производитель,
|ЕСТЬNULL(НоменклатураЛЦ.SI_ID.si_name,"""") КАК ЕдИзм,

Тут 1С связала таблицы "dbo_t_sis по ключу SI_ID" и "dbo_t_makers по ключу MAKER_ID" сама в конфигураторе.

Может можно как-то это обойти и через соединения получить данные!?

в этих таблица по одному товару даные 1 к 1 не 1 ко многим.
12 Sasha_H
 
20.06.12
15:42
то есть я первым запросом данные вытянул, а вот при работе с врем таблами падает иммено на поле связанном с другой таблицей.
13 Fragster
 
гуру
20.06.12
15:43
(11)(12) а зачем ты нас обманывал в (0), что первый запрос работает?
14 Sasha_H
 
20.06.12
15:48
(13) запрос работает. Он вытянул эти данные а падает на получении этих же данных по этим полям на запросе по временым таблицам.

А дело как оказывается в том. что 1С связала эти поля с другими таблицами, щас я на уровне конфигуратора делаю поле MAKER_ID просто Число 10 как и другие ключи и пробую через соединение получить данные. Результат сообщу.
15 Fragster
 
гуру
20.06.12
15:52
(14) я не вижу куска (11) в (0)
16 Sasha_H
 
20.06.12
16:01
(15) весь код:


//Помещаем все товары по складу во временную таблицу
   Запрос = Новый Запрос;
   ТекстЗапроса = "ВЫБРАТЬ
   |    НоменклатураЛЦ.NOMEN_ID                КАК ЛЦ_NOMEN_ID,
   |    НоменклатураЛЦ.NAME                    КАК Наименование,
   |    НоменклатураЛЦ.IS_DIVIDEND                КАК Весовой,
   |    НоменклатураЛЦ.FULL_NAME                КАК НаименованиеПолное,
   |    НоменклатураЛЦ.EKKA_NAME                КАК НаименованиеСокращенное,
   |    НоменклатураЛЦ.TYPEPDV_ID                КАК СтавкаНДС,
   |    НоменклатураЛЦ.TS                        КАК ЛЦ_TS,
   |    НоменклатураЛЦ.IS_SOCIAL                КАК СоциальнаяГруппа,
   |    НоменклатураЛЦ.UKTZ                    КАК КодУКТВЭД,
   |    ТоварнаяМатрица.IS_ACTIVE                КАК ЛЦ_Активный,
   |    ТоварнаяМатрица.IS_VISIBLE                КАК ЛЦ_Видимый,
   |    ТоварнаяМатрица.RECOM_MARKUP            КАК ЛЦ_ПроцентНаценки,
   |    ТоварнаяМатрица.IS_DISCOUNT_BLOCKED    КАК ЛЦ_БлокироватьСкидку,
   |    ТоварнаяМатрица.RECOM_OUT_PRICE        КАК ЛЦ_ЦенаПродажи,
   |    ТоварнаяМатрица.IS_OUT_PRICE_BLOCKED    КАК ЛЦ_БлокироватьЦенуПродажи,
   |    ТоварнаяМатрица.IS_MARKUP_BLOCKED        КАК ЛЦ_БлокироватьНаценку,
   |    НоменклатураЛЦ.BRUTTO                    КАК ВесБРУТТО,
   |НоменклатураЛЦ.SIZE_WIDTH КАК п1,
   |    ЕСТЬNULL(ЕдиницыИзмерения.si_name, """") КАК ЕдИзм,
   |    ЕСТЬNULL(Производители.NAME, """")        КАК Производитель
   |ИЗ
   |    ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_nomens КАК НоменклатураЛЦ
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_nom_objects КАК ТоварнаяМатрица
   |        ПО НоменклатураЛЦ.NOMEN_ID = ТоварнаяМатрица.NOMEN_ID
   |            И (ТоварнаяМатрица.OBJECT_ID = &ИДСклад)
   |        ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_sis КАК ЕдиницыИзмерения
   |        ПО НоменклатураЛЦ.SI_ID = ЕдиницыИзмерения.si_id
   |        ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_makers КАК Производители
   |        ПО НоменклатураЛЦ.MAKER_ID = Производители.MAKER_ID";


//обрабатываем из временной таблицы все товары и ищем только измененные
   //и отсекаем не видимые когда те еще не были в нашей базе
   Запрос = Новый Запрос("ВЫБРАТЬ
   |    ВнешниеДанные.п1,
   |    ВнешниеДанные.ЛЦ_NOMEN_ID,
   |    ВнешниеДанные.Наименование,
   //|    ВнешниеДанные.ЕдИзм,
   |    ВнешниеДанные.Весовой,
   |    ВнешниеДанные.НаименованиеПолное,
   |    ВнешниеДанные.НаименованиеСокращенное,
   |    ВнешниеДанные.СтавкаНДС,
   |    ВнешниеДанные.ЛЦ_TS,
   |    ВнешниеДанные.СоциальнаяГруппа,
   |    ВнешниеДанные.КодУКТВЭД,
   |    ВнешниеДанные.ЛЦ_Активный,
   |    ВнешниеДанные.ЛЦ_Видимый,
   |    ВнешниеДанные.ЛЦ_ПроцентНаценки,
   |    ВнешниеДанные.ЛЦ_БлокироватьСкидку,
   |    ВнешниеДанные.ЛЦ_ЦенаПродажи,
   |    ВнешниеДанные.ЛЦ_БлокироватьЦенуПродажи,
   |    ВнешниеДанные.ЛЦ_БлокироватьНаценку,
   //|    ВнешниеДанные.Производитель,
   |    ВнешниеДанные.ВесБРУТТО
   |ПОМЕСТИТЬ ВремТабл
   |ИЗ
   |    &ВнешниеДанные КАК ВнешниеДанные
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ВремТабл.п1,
   |    ВремТабл.ЛЦ_NOMEN_ID,
   |    ВремТабл.Наименование,
   //|    ВремТабл.ЕдИзм,
   |    ВремТабл.Весовой,
   |    ВремТабл.НаименованиеПолное,
   |    ВремТабл.НаименованиеСокращенное,
   |    ВремТабл.СтавкаНДС,
   |    ВремТабл.ЛЦ_TS,
   |    ВремТабл.СоциальнаяГруппа,
   |    ВремТабл.КодУКТВЭД,
   |    ВремТабл.ЛЦ_Активный,
   |    ВремТабл.ЛЦ_Видимый,
   |    ВремТабл.ЛЦ_ПроцентНаценки,
   |    ВремТабл.ЛЦ_БлокироватьСкидку,
   |    ВремТабл.ЛЦ_ЦенаПродажи,
   |    ВремТабл.ЛЦ_БлокироватьЦенуПродажи,
   |    ВремТабл.ЛЦ_БлокироватьНаценку,
   //|    ВремТабл.Производитель,
   |    ВремТабл.ВесБРУТТО,
   |    ЕСТЬNULL(СпрНоменклатура.Ссылка, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура,
   |    ВЫБОР
   |        КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
   |            ТОГДА ИСТИНА
   |        ИНАЧЕ ЛОЖЬ
   |    КОНЕЦ КАК ПустаяСсылка
   |ИЗ
   |    ВремТабл КАК ВремТабл
   |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
   |        ПО ВремТабл.ЛЦ_NOMEN_ID = СпрНоменклатура.ЛЦ_NOMEN_ID
   |ГДЕ
   |    ВЫБОР
   |            КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
   |                        И ВремТабл.ЛЦ_Видимый = 0
   |                    ИЛИ СпрНоменклатура.ЛЦ_TS = ВремТабл.ЛЦ_TS
   |                ТОГДА ЛОЖЬ
   |            ИНАЧЕ ИСТИНА
   |        КОНЕЦ");
17 Sasha_H
 
20.06.12
16:02
так вот ребят не помогло то что я сменил тип в таблицах на уровне конфигуратора, всеравно падает.

Добавояю на верхнем запросе колонку "п1" и все падает. по ходу ограничение какое-то есть :(
18 Vosmerkin
 
20.06.12
16:04
попробуй интереса ради тоже самое, но на исходной табличке обрежь количество строк, до 10ти например. Посмотри как с мелкой табличкой работает
19 Sasha_H
 
20.06.12
16:06
падает из-за падает цу... когда я поместил во временную таблицу ЕдИзм или Производителя
20 Fragster
 
гуру
20.06.12
16:08
я фиг знает, но всё равно не вижу (11), даже в (15)
21 Sasha_H
 
20.06.12
16:09
(20) 11 я уже переделал на ЛЕВОЕ СОЕДИНЕНИЕ
22 Fragster
 
гуру
20.06.12
16:15
по условию какая доля отсекается?
23 Fragster
 
гуру
20.06.12
16:16
и точно ли нету номенклатуры с пустым ЛЦ_NOMEN_ID (типа 0) и в dbo_t_nomens тоже пустым?
24 Sasha_H
 
20.06.12
16:20
(22) замер размер таблица до соединения и после, количество строк одинаковое 165874
25 Sasha_H
 
20.06.12
16:21
(23) ЛЦ_NOMEN_ID (типа 0) да есть такой ЛЦ_NOMEN_ID=0
26 Fragster
 
гуру
20.06.12
16:21
попробуй убери из результата все поля кроме тех, на которых "падает" тогда
27 Fragster
 
гуру
20.06.12
16:22
|        ПО ВремТабл.ЛЦ_NOMEN_ID = СпрНоменклатура.ЛЦ_NOMEN_ID
|        И СпрНоменклатура.ЛЦ_NOMEN_ID <> 0
28 Sasha_H
 
20.06.12
16:26
где убрать? на верхнем запросе?
29 Fragster
 
гуру
20.06.12
16:29
(28) в обоих
30 Sasha_H
 
20.06.12
16:32
ПЕРВЫЙ ЗАПРОС

ВЫБРАТЬ
   НоменклатураЛЦ.NOMEN_ID                КАК ЛЦ_NOMEN_ID,
   НоменклатураЛЦ.TS                        КАК ЛЦ_TS,
   ТоварнаяМатрица.IS_VISIBLE                КАК ЛЦ_Видимый,
   ЕСТЬNULL(ЕдиницыИзмерения.si_name, "") КАК ЕдИзм,
   ЕСТЬNULL(Производители.NAME, "")        КАК Производитель
ИЗ
   ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_nomens КАК НоменклатураЛЦ
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_nom_objects КАК ТоварнаяМатрица
       ПО НоменклатураЛЦ.NOMEN_ID = ТоварнаяМатрица.NOMEN_ID
           И (ТоварнаяМатрица.OBJECT_ID = &ИДСклад)
       ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_sis КАК ЕдиницыИзмерения
       ПО НоменклатураЛЦ.SI_ID = ЕдиницыИзмерения.si_id
       ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.dt_LC.Таблица.dbo_t_makers КАК Производители
       ПО НоменклатураЛЦ.MAKER_ID = Производители.MAKER_ID
ГДЕ
   НоменклатураЛЦ.NOMEN_ID > 0


ВТОРОЙ ЗАПРОС

ВЫБРАТЬ
   ВнешниеДанные.ЛЦ_NOMEN_ID,
   ВнешниеДанные.ЕдИзм,
   ВнешниеДанные.ЛЦ_TS,
   ВнешниеДанные.ЛЦ_Видимый,
   ВнешниеДанные.Производитель
ПОМЕСТИТЬ ВремТабл
ИЗ
   &ВнешниеДанные КАК ВнешниеДанные
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВремТабл.ЛЦ_NOMEN_ID,
   ВремТабл.ЕдИзм,
   ВремТабл.ЛЦ_TS,
   ВремТабл.ЛЦ_Видимый,
   ВремТабл.Производитель,
   ЕСТЬNULL(СпрНоменклатура.Ссылка, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура,
   ВЫБОР
       КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
           ТОГДА ИСТИНА
       ИНАЧЕ ЛОЖЬ
   КОНЕЦ КАК ПустаяСсылка
ИЗ
   ВремТабл КАК ВремТабл
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
       ПО ВремТабл.ЛЦ_NOMEN_ID = СпрНоменклатура.ЛЦ_NOMEN_ID
ГДЕ
   ВЫБОР
           КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
                       И ВремТабл.ЛЦ_Видимый = 0
                   ИЛИ СпрНоменклатура.ЛЦ_TS = ВремТабл.ЛЦ_TS
               ТОГДА ЛОЖЬ
           ИНАЧЕ ИСТИНА
       КОНЕЦ

ТАК работает.

Как только я подключаю поля, все нафик валится :(
31 Sasha_H
 
20.06.12
16:38
самое больное то, что на выходе ждет меня только 6000 товаров которые мне нужны. Но к ним не могу никак добратся
32 Sasha_H
 
20.06.12
16:42
Прошло. пришлось отрубить Наименование полное "СТРОКА 255"
33 Sasha_H
 
20.06.12
16:42
видимо все же есть ограниченеи к данным
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан