Имя: Пароль:
1C
1С v8
файловая база, запросы и ошибка "недостаточно памяти"
,
0 vasbur
 
07.11.13
07:07
Ситуация: у одного из клиентов стоит УТ 10.3, платформа - 8.3.18
база файловая, ежемесячно заводится порядка 5000 РТУ, всего в базе порядка 90 000 РТУ.

Столкнулся с проблемой - часть запросов в моей обработке (нетиповой) вылетает с ошибкой "недостаточно памяти". При этом резальтат запроса должен быть небольшой. Подозреваю, что связано это с тем, что файловая версия 1С делает неоптимальные планы выполнения запросов.

Возникли следующие вопросы:
1. Насколько типично использование файловой версии для подобных объемов данных? Считать ли ситуацию с данным клиентом частным случаем, или симптомом проблемы (разрабатываемая мной обработка - тиражная, будет использоваться несколькими сотнями разных клиентов).
2. Есть ли дельные статьи и рекомендации по этой проблеме?
3. Возникают ли подобные проблемы в SQL-версиях 1С? С како-нибудь Postgree, например?

отдельный вопрос -есть ли у кого базы данных (тестовые или реальные) с подобным объемом данным, которыми вы можете поделиться? Клиент свою БД отдавать не хочет, подготовка стенда - это отдельное развлечение на пару дней.

буду признателен за любые дельные комментарии
1 vasbur
 
07.11.13
07:07
upd: Платформа 8.2.18, выше была опечатка.
2 Гефест
 
07.11.13
07:13
Ну показывай свои запросы
3 Jonny_Khomich
 
07.11.13
07:16
(0) обычно вылетает из-за большого количества или корявых группировок по строкам и полям.
4 vasbur
 
07.11.13
07:18
(2) Запросов дофига, когда смотришь на конкретный запрос - вроде примерно понятно куда копать.
Хочется в принципе понять, насколько нужно этим заморачиваться. Может, такие ситуации редки и проще убедить клиента перейти на сиквел или самому переписать запросы.

Щас пару запросов покажу.
5 vasbur
 
07.11.13
07:22
ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Объект КАК Организация,
    ЗначенияСвойствОбъектов.Значение КАК ИдентификаторОрганизации,
    НастройкиПФДляТоваров.Значение КАК ПечатнаяФормаДляТоваров,
    НастройкиПФДляУслуг.Значение КАК ПечатнаяФормаДляУслуг
ПОМЕСТИТЬ ТаблицаДанныхОрганизаций
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК НастройкиПФДляТоваров
        ПО ЗначенияСвойствОбъектов.Объект = НастройкиПФДляТоваров.Объект
            И (НастройкиПФДляТоваров.Объект ССЫЛКА Справочник.Организации)
            И (НастройкиПФДляТоваров.Свойство.Наименование = &ПечатнаяФормаДляТоваров)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК НастройкиПФДляУслуг
        ПО ЗначенияСвойствОбъектов.Объект = НастройкиПФДляУслуг.Объект
            И (НастройкиПФДляУслуг.Объект ССЫЛКА Справочник.Организации)
            И (НастройкиПФДляУслуг.Свойство.Наименование = &ПечатнаяФормаДляУслуг)
ГДЕ
    ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Организации
    И ЗначенияСвойствОбъектов.Свойство.Наименование = &ИдентификаторОрганизации
    И ЗначенияСвойствОбъектов.Значение <> ""
6 vasbur
 
07.11.13
07:24
ВЫБРАТЬ
    ТЗ.Организация,
    ТЗ.ОтпрНеПроведенные,
    ТЗ.ПечатьСчетаПоРТУ,
    ТЗ.ПечатьСчетаПоСчету ,
    ТЗ.ПечатьСчетаПоЗаказу
ПОМЕСТИТЬ фильтрПоОрганизациям
ИЗ
    &ТЗ КАК ТЗ
;
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    подзапрос.*,
    ЕСТЬNULL(подзапрос.ID_, &ПустоеСвойствоОбъекта) ID
ИЗ (
ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка КАК Документ,
    РеализацияТоваровУслуг.Организация КАК Продавец,
    РеализацияТоваровУслуг.Контрагент КАК Покупатель,
    РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокументаЗначение,
    ЕСТЬNULL(СУММА(ТоварныеСтроки.СуммаНДС), 0) КАК СуммаНДСЗначение,
    МАКСИМУМ(ЗначенияСвойствОбъектов.Значение) КАК ID_,
    ЛОЖЬ КАК ЭтоСчет
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО РеализацияТоваровУслуг.Ссылка = ЗначенияСвойствОбъектов.Объект
            И (ЗначенияСвойствОбъектов.Свойство.Наименование = &наименованиеСвойства)
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ТоварыТЧ.Ссылка КАК Ссылка,
            ТоварыТЧ.СуммаНДС КАК СуммаНДС
        ИЗ
            Документ.РеализацияТоваровУслуг.Товары КАК ТоварыТЧ
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            УслугиТЧ.Ссылка,
            УслугиТЧ.СуммаНДС
        ИЗ
            Документ.РеализацияТоваровУслуг.Услуги КАК УслугиТЧ) КАК ТоварныеСтроки
        ПО (ТоварныеСтроки.Ссылка = РеализацияТоваровУслуг.Ссылка)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ фильтрПоОрганизациям КАК фильтрПоОрганизациям
        ПО РеализацияТоваровУслуг.Организация = фильтрПоОрганизациям.Организация
ГДЕ
    (фильтрПоОрганизациям.ОтпрНеПроведенные
                И РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ
            ИЛИ НЕ фильтрПоОрганизациям.ОтпрНеПроведенные
                И РеализацияТоваровУслуг.Проведен)
    И РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &Датаокончания
    И РеализацияТоваровУслуг.Контрагент В(&Контрагент)

СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслуг.Ссылка,
    РеализацияТоваровУслуг.Организация,
    РеализацияТоваровУслуг.Контрагент,
    РеализацияТоваровУслуг.СуммаДокумента

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    КорректировкаРеализации.Ссылка,
    КорректировкаРеализации.Организация,
    КорректировкаРеализации.Контрагент,
    КорректировкаРеализации.СуммаДокумента,
    ЕСТЬNULL(СУММА(ТоварныеСтроки.СуммаНДС), 0),
    МАКСИМУМ(ЗначенияСвойствОбъектов.Значение),
    ЛОЖЬ
ИЗ
    Документ.КорректировкаРеализации КАК КорректировкаРеализации
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО КорректировкаРеализации.Ссылка = ЗначенияСвойствОбъектов.Объект
            И (ЗначенияСвойствОбъектов.Свойство.Наименование = &наименованиеСвойства)
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ТоварыТЧ.Ссылка КАК Ссылка,
            ТоварыТЧ.СуммаНДС КАК СуммаНДС
        ИЗ
            Документ.КорректировкаРеализации.Товары КАК ТоварыТЧ
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            УслугиТЧ.Ссылка,
            УслугиТЧ.СуммаНДС
        ИЗ
            Документ.КорректировкаРеализации.Услуги КАК УслугиТЧ) КАК ТоварныеСтроки
        ПО (ТоварныеСтроки.Ссылка = КорректировкаРеализации.Ссылка)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ фильтрПоОрганизациям КАК фильтрПоОрганизациям
        ПО КорректировкаРеализации.Организация = фильтрПоОрганизациям.Организация
ГДЕ
    (фильтрПоОрганизациям.ОтпрНеПроведенные
                И КорректировкаРеализации.ПометкаУдаления = ЛОЖЬ
            ИЛИ НЕ фильтрПоОрганизациям.ОтпрНеПроведенные
                И КорректировкаРеализации.Проведен)
    И КорректировкаРеализации.Дата МЕЖДУ &ДатаНачала И &Датаокончания
    И КорректировкаРеализации.Контрагент В(&Контрагент)
    И КорректировкаРеализации.ВидОперации = ЗНАЧЕНИЕ(перечисление.ВидыОперацийИсправленияПоступленияРеализации.ИсправлениеОшибки)

СГРУППИРОВАТЬ ПО
    КорректировкаРеализации.Ссылка,
    КорректировкаРеализации.Организация,
    КорректировкаРеализации.Контрагент,
    КорректировкаРеализации.СуммаДокумента

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВозвратТоваровПоставщику.Ссылка,
    ВозвратТоваровПоставщику.Организация,
    ВозвратТоваровПоставщику.Контрагент,
    ВозвратТоваровПоставщику.СуммаДокумента,
    ЕСТЬNULL(СУММА(ТоварыТЧ.СуммаНДС), 0),
    МАКСИМУМ(ЗначенияСвойствОбъектов.Значение),
    ЛОЖЬ
ИЗ
    Документ.ВозвратТоваровПоставщику КАК ВозвратТоваровПоставщику
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО ВозвратТоваровПоставщику.Ссылка = ЗначенияСвойствОбъектов.Объект
            И (ЗначенияСвойствОбъектов.Свойство.Наименование = &наименованиеСвойства)
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровПоставщику.Товары КАК ТоварыТЧ
        ПО (ТоварыТЧ.Ссылка = ВозвратТоваровПоставщику.Ссылка)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ фильтрПоОрганизациям КАК фильтрПоОрганизациям
        ПО ВозвратТоваровПоставщику.Организация = фильтрПоОрганизациям.Организация
ГДЕ
    (фильтрПоОрганизациям.ОтпрНеПроведенные
                И ВозвратТоваровПоставщику.ПометкаУдаления = ЛОЖЬ
            ИЛИ НЕ фильтрПоОрганизациям.ОтпрНеПроведенные
                И ВозвратТоваровПоставщику.Проведен)
    И ВозвратТоваровПоставщику.Дата МЕЖДУ &ДатаНачала И &Датаокончания
    И ВозвратТоваровПоставщику.Контрагент В(&Контрагент)

СГРУППИРОВАТЬ ПО
    ВозвратТоваровПоставщику.Ссылка,
    ВозвратТоваровПоставщику.Организация,
    ВозвратТоваровПоставщику.Контрагент,
    ВозвратТоваровПоставщику.СуммаДокумента

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ОтчетКомитентуОПродажах.Ссылка,
    ОтчетКомитентуОПродажах.Организация,
    ОтчетКомитентуОПродажах.Контрагент,
    ОтчетКомитентуОПродажах.СуммаВознаграждения,
    ЕСТЬNULL(СУММА(ТоварыТЧ.СуммаНДСВознаграждения), 0),
    МАКСИМУМ(ЗначенияСвойствОбъектов.Значение),
    ЛОЖЬ
ИЗ
    Документ.ОтчетКомитентуОПродажах КАК ОтчетКомитентуОПродажах
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО ОтчетКомитентуОПродажах.Ссылка = ЗначенияСвойствОбъектов.Объект
            И (ЗначенияСвойствОбъектов.Свойство.Наименование = &наименованиеСвойства)
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетКомитентуОПродажах.Товары КАК ТоварыТЧ
        ПО (ТоварыТЧ.Ссылка = ОтчетКомитентуОПродажах.Ссылка)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ фильтрПоОрганизациям КАК фильтрПоОрганизациям
        ПО ОтчетКомитентуОПродажах.Организация = фильтрПоОрганизациям.Организация
ГДЕ
    (фильтрПоОрганизациям.ОтпрНеПроведенные
                И ОтчетКомитентуОПродажах.ПометкаУдаления = ЛОЖЬ
            ИЛИ НЕ фильтрПоОрганизациям.ОтпрНеПроведенные
                И ОтчетКомитентуОПродажах.Проведен)
    И ОтчетКомитентуОПродажах.Дата МЕЖДУ &ДатаНачала И &Датаокончания
    И ОтчетКомитентуОПродажах.Контрагент В(&Контрагент)

СГРУППИРОВАТЬ ПО
    ОтчетКомитентуОПродажах.Ссылка,
    ОтчетКомитентуОПродажах.Организация,
    ОтчетКомитентуОПродажах.Контрагент,
    ОтчетКомитентуОПродажах.СуммаВознаграждения


) как подзапрос
ГДЕ
    (ЕСТЬNULL(подзапрос.ID_, &ПустоеСвойствоОбъекта) = &ПустоеСвойствоОбъекта
        ИЛИ подзапрос.ID_ = "")
Упорядочить по подзапрос.Документ.моментвремени
7 Feunoir
 
07.11.13
07:37
Во всех запросах крайне не нравится конструкция:

(НастройкиПФДляУслуг.Свойство.Наименование = &ПечатнаяФормаДляУслуг)

Переделать на

(НастройкиПФДляУслуг.Свойство = &ПечатнаяФормаДляУслуг)

И в параметр передавать не наименование свойства, а само свойство
8 vasbur
 
07.11.13
07:52
(7) Это вчера стало понятно.

Просто запросов много, и сейчас их придется искать экспериментально. Может быть, есть рекомендации, какие запросы точно "плохике"?
9 kosts
 
07.11.13
08:12
Пиши запросы правильно. Конечно не хватит памяти если тягать все данные без отборов...
Файловые конечно не серверные, но сотни народа на них работают без таких проблем...

ВЫБРАТЬ
            ТоварыТЧ.Ссылка КАК Ссылка,
            ТоварыТЧ.СуммаНДС КАК СуммаНДС
        ИЗ
            Документ.КорректировкаРеализации.Товары КАК ТоварыТЧ

10 vasbur
 
07.11.13
08:18
а базой ут никто поделиться не может?
11 vasbur
 
07.11.13
10:03
Возникает ли такая ошибка в SQL-версиях, или это исключительно особенность файловой версии?

P.s. Доброго утра и вкусного кофе Москвичам.
12 kosts
 
07.11.13
10:24
(11) Сервер вроде пыхтит, но справляется. В трудных случаях будет увеличиваться время запроса.
Было падение клиента, если клиент получает обратно много данных.
Бухгалтер формировала крупный отчет за 9 месяцев, падает. Но там действительно много данных.
Десятки тысяч наименований с расшифровками по счетам и пр.
13 mistеr
 
07.11.13
10:33
(11) Может тупо в темпе места не хватает?
14 vasbur
 
07.11.13
11:31
(13) дак по сути запрос простой, и должен вернуть несколько документов.
Но в процессе выполнения запроса 1с видимо гору всего перелопачивает. что плохо и неправильно
15 H A D G E H O G s
 
07.11.13
11:33
Запрос ужасен.
16 H A D G E H O G s
 
07.11.13
11:34
На SQL он не упадет, SQL его отлопатит, че ему.
Сервер 1С получит небольшой результат и радостно вернет выборку клиенту.
17 vasbur
 
07.11.13
11:50
(15) Есть критерии, позволяющие быстро понять, ужасен запрос или нет?
18 H A D G E H O G s
 
07.11.13
11:56
(17) Угу. Например, его текст не нравится H A D G E H O G s

"Хорошо летают только красивые самолёты" ©Туполев
19 vasbur
 
07.11.13
12:05
(17) если я вам дам всю обработку - вы напишете, какие запросы вам не нравятся? :)
20 H A D G E H O G s
 
07.11.13
12:10
(19)
1) Могу еще и написать правильно.
2) После работы.
3) За деньги.
21 kosts
 
07.11.13
12:23
(17) Несколько принципов
Отборы нужно делать как можно раньше.
Тем более в виртуальных таблицах
Не таскать лишние колонки.
Индексировать временные таблицы.
В некоторых случаях ИЛИ в отборе будет тормозить.

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

Это то, что сходу вспомнил...
22 kosts
 
07.11.13
12:27
Стараться в отборах в запросах использовать проиндексированные реквизиты. И соответственно, индексировать реквизиты, если по ним будет отбор в запросах.

В часто используемых запросах не использовать данные документов и табличные части, а использовать движения документов.
23 vasbur
 
07.11.13
21:51
(22) понятно. Рецепт один - арбайтен