Слишком сложный поисковый запрос 1с ошибка

Обновлено: 30.01.2023

У меня есть восемь таблиц, которые содержат информацию об изменениях, вносимых в приложения по всей компании. Я только хочу запросить и объединить строки для подмножества более 200 приложений. Для этого я запрашиваю каждую таблицу по коду приложения (AAA, BBB и т. Д.) И хочу объединить результаты. Когда я использую более 5 кодов приложения, я получаю ошибку «Запрос к комплексу».

Я знаю, что есть более эффективный способ сделать это, но нижеприведенное — лучшее, что я смог сделать с моими ограниченными знаниями.

Я хотел бы иметь возможность запрашивать все 200+ кодов приложений одновременно и более эффективно, чем вводить одну и ту же строку 8 раз для каждого кода.

3 ответа

Более простой подход мог бы заключаться в том, что union данные таблицы перед применяют критерии выбора, поэтому вам нужно указывать критерии только в одном месте, например:

Если вы не используете подстановочные операторы в рамках критериев для like , вы можете альтернативно использовать in и предоставить список кодов приложений:

Кроме того, вы можете создать таблицу, содержащую все коды приложений, которые вы хотите вернуть (в следующем примере я назвал такую таблицу ApplicationCodes , содержащую одно поле с именем Code ), а затем использовать простое объединение для неявного применения фильтрации, например:

Я бы порекомендовал вам создать таблицу, в которой есть все приложения, тогда вы могли бы сделать всего 8 запросов

Если вам это не нравится, вы можете попробовать предложение IN

Имена таблиц, которые содержат даты или порядковые номера и одни и те же поля, обычно должны сочетаться с именем таблицы в качестве дополнительного свойства.

Создайте таблицу (например, ApplicationChanges) с полями объединенных таблиц и добавьте дополнительное поле ChangedAt , которое будет содержать старое имя таблицы. Возможно, старые таблицы содержат поле даты, которое показывает дату ChangedAt, тогда вы можете опустить имя таблицы и запрос, какие даты принадлежат этой таблице.

Затем используйте запрос @LeeMacs для заполнения новой таблицы:

Если вам нужна старая структура данных, создайте запросы для каждой предыдущей таблицы с критерием ChangedAt. Например. Таблица [2019-07-A July 5 to 7]

Алексей Чужов

Алексей Чужов

Возьмите др клиентов,вычтите из этих дат сутки.Затем можно например передать в переменные ДеньВчерРожд=день(ДатаРождМинусОдин);
МесяцВчерРожд=месяц(датаРождМинусОдин);
У вас получиться номер месяца вчерашнего дня рождения и дюномер дня вчерашнего др.А затем сравните их с номером дня и номером месяца текущей даты.Вообщем если не понятно или еще не сделали пишите,не мложно это.Единственный шаткий момент это високосные года.

Юрий Чернов

Где именно хотите получить — в запросе, в СКД, в отчете?
Вообще, чем не устраивает задать дату рождения между:
конечная дата -конец дня текущей даты,
начальная дата — начало дня текущей даты — 24 часа.
В отбор попадут нужные клиенты.
Или у вас дата разбита — отдельно день, отдельно месяц, отдельно год?

Валентина Ивановна

Юрий, СКД. Дата разбита: отдельно День, Месяц. И когда задала Дату рождения Между (ДеньГода) — получила. что-то непонятное.

Юрий Чернов

Вот как—то так: ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, 1984 — 1), МЕСЯЦ, 12 — 1), ДЕНЬ, 31 — 1) КАК Поле1 . Только вместо цифр года, месяца и дня подставить свои данные из запроса. Суть, берем дату 01.01.0001 и прибавляем день месяц и год. Если год не нужен, его можно опустить. Ну, тем более, имея уже собранную дату, вроде бы не сложно придумать нужное сравнение.

Дмитрий Сметанин

Дмитрий Сметанин запись закреплена

Необходимо создать обработку позволяющую загрузить содержимое файла Excel (в ячейках примитивные типы: строка, число) с любым количеством колонок и строк в таблицу значений на форму обработки.
Таблицу значений на форме нужно создавать программно.
В первой строке файла будут содержатся названия колонок, названия колонок в таблице на форме должны им соответствовать.
Пустые ячейки в таблице на форме нужно выделить красным цветом.

Данислав Мингалёв

Здарова. Я сам когда-то только начинал работать с 1С. И тоже начинал с экселя. Я бы помог, но времени совсем щас нет. У меня осталась обработка на которой я тренировался. Там и загрузка написана и выгрузка. Может поможет.

Читайте также:

  • Как связаны объекты конфигурации и объекты базы данных 1с
  • Программа в топе как работает
  • Как прошить asus zc500tg
  • Как выйти в интернет без браузера на андроид
  • Как в фотошопе сделать 3д обложку

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

1

«Слишком сложный запрос»?

17.09.2015, 09:36. Показов 5559. Ответов 26


Студворк — интернет-сервис помощи студентам

Доброго дня, кто подскажет почему при создании нового запроса выскакивает «слишком сложный запрос»?? такое происходит даже если в запрос добавить просто вывести запись из существующей таблицы.



0



Эксперт MS Access

17238 / 7083 / 1589

Регистрация: 21.06.2012

Сообщений: 13,288

17.09.2015, 09:41

2

Не наблюдается, возможно проблемы с Вашей версией Аксесса.



0



Модератор

Эксперт MS Access

11395 / 4705 / 759

Регистрация: 07.08.2010

Сообщений: 13,655

Записей в блоге: 4

17.09.2015, 10:54

3

в вашей таблице заказ
-11 подстановок непонятного формата —берется только код без наименования

  RowSource: SELECT [бумага].[id бум] FROM бумага;
  RowSource: SELECT [вес бумаги м кв].[Код] FROM [вес бумаги м кв];
  RowSource: SELECT [длина бумаги].[Код] FROM [длина бумаги];
  RowSource: SELECT [Заказчик].[Id зак-к] FROM Заказчик;
  RowSource: SELECT [красочность лицо].[id кр л] FROM [красочность лицо];
  RowSource: SELECT [красочность оборот].[id кр оборот] FROM [красочность оборот];
  RowSource: SELECT [нумерация].[id №№] FROM нумерация;
  RowSource: SELECT [тираж].[Id тир] FROM тираж;
  RowSource: SELECT [формат длина].[id формат дл] FROM [формат длина];
  RowSource: SELECT [формат ширина].[id формат ш] FROM [формат ширина];
  RowSource: SELECT [ширина бумаги].[Код] FROM [ширина бумаги];
  RowSourceType: Таблица или запрос

а в каждом запросе по 11 inner join для прицепки этого самого наименования



0



Эксперт MS Access

2833 / 1375 / 215

Регистрация: 13.05.2011

Сообщений: 4,213

17.09.2015, 10:54

4

Цитата
Сообщение от hrutsik
Посмотреть сообщение

такое происходит даже если в запрос добавить просто вывести запись из существующей таблицы

При создании нового запроса всё работает. Если имеете в виду редактирование существующего запроса, то укажите какого?



0



0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 12:20

 [ТС]

5

приложила архив, где не работает вродебы простой запрос.



0



0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 12:31

 [ТС]

6

Цитата
Сообщение от shanemac51
Посмотреть сообщение

в вашей таблице заказ
-11 подстановок непонятного формата —берется только код без наименования

а как правильно сделать??

Добавлено через 10 минут
может быть лучше вообще уйти от подстановок?



0



Эксперт MS Access

17238 / 7083 / 1589

Регистрация: 21.06.2012

Сообщений: 13,288

17.09.2015, 12:32

7

Цитата
Сообщение от hrutsik
Посмотреть сообщение

где не работает вродебы простой запрос.

Из спецификации Аксесс 2010

Number of joins in a query 16*

Может дело в количестве связей. Разбейте запрос на два, связывая в каждом с частью остальных таблиц, о потом соберите эти два в один.



1



0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 12:38

 [ТС]

8

тут дело дошло до того что если я просто запросом этим вызываю любую запись из существующих таблиц, то уже » запрос слишком сложный»…пробовала на 2 компах тоже думала что чтото с версией аксесса…



0



Эксперт MS Access

17238 / 7083 / 1589

Регистрация: 21.06.2012

Сообщений: 13,288

17.09.2015, 12:48

9

К чему там почти все таблицы (да и в Красочность). Оставьте только нужные … (в Красочность это красочность лицо, красочность оборот, нумерация).



0



0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 12:55

 [ТС]

10

бывает что нужно отдельно кр лица и кр оборота…по моему они все нужные, может их связывать лучше не подстановкой???



0



ltv_1953

Эксперт MS Access

17238 / 7083 / 1589

Регистрация: 21.06.2012

Сообщений: 13,288

17.09.2015, 13:08

11

Еще раз: запрос красочность

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT [красочность лицо]![красочность лицо]
+[красочность оборот]![красочтость оборота]
+[нумерация]![нумерация] AS [красочность бланка], заказ.[id зак]
FROM [ширина бумаги] INNER JOIN ([формат ширина] 
INNER JOIN ([формат длина] INNER JOIN (тираж 
INNER JOIN (нумерация INNER JOIN ([красочность оборот] 
INNER JOIN ([красочность лицо] INNER JOIN (Заказчик 
INNER JOIN ([длина бумаги] INNER JOIN (([вес бумаги м кв] 
INNER JOIN бумага ON [вес бумаги м кв].Код = бумага.вес) 
INNER JOIN заказ ON бумага.[id бум] = заказ.бумага) 
ON [длина бумаги].Код = заказ.[длина бумаги]) ON Заказчик.[Id зак-к] = заказ.заказчик) 
ON [красочность лицо].[id кр л] = заказ.[красочность л]) 
ON [красочность оборот].[id кр оборот] = заказ.[красочность о]) 
ON нумерация.[id №№] = заказ.нумерация) ON тираж.[Id тир] = заказ.тираж) 
ON [формат длина].[id формат дл] = заказ.[длина бланка]) 
ON [формат ширина].[id формат ш] = заказ.[ширина бланка]) 
ON [ширина бумаги].Код = заказ.[ширина бумаги];

Для вычисления [красочность бланка] нужны только три таблицы, зачем все остальные? В запросах должны быть только те таблицы, которые нужны.



0



0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 14:44

 [ТС]

12

делала в режиме конструктора, там этого не видно

Добавлено через 1 час 31 минуту
может такая проблема выскочить из-за использования подстановок???



0



Эксперт MS Access

7334 / 4475 / 288

Регистрация: 12.08.2011

Сообщений: 13,550

18.09.2015, 05:19

13

Лучший ответ Сообщение было отмечено VinniPuh как решение

Решение

Поля подстановок в таблицах недопустимы.



1



hrutsik

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

18.09.2015, 09:31

 [ТС]

14

сделала без подстановок, все равно если через конструктор делать join-ит все теблицы! отсюда и перегрузка видимо.
поубирала лишние, вроде работатет:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT IIf(INT([ширина бумаги]![ширина]/[формат ширина]![ширина])*INT([длина бумаги]![длина]/[формат длина]![длина])>(INT([ширина бумаги]![ширина]/[формат длина]![длина])*INT([длина бумаги]![длина]/[формат ширина]![ширина])),
INT([ширина бумаги]![ширина]/[формат ширина]![ширина])*INT([длина бумаги]![длина]/[формат длина]![длина]),
INT([ширина бумаги]![ширина]/[формат длина]![длина])*INT([длина бумаги]![длина]/[формат ширина]![ширина]))
 AS [оптимальное количество бланков на листе]
FROM [ширина бумаги] 
INNER JOIN ([формат ширина] 
INNER JOIN ([формат длина] 
INNER JOIN ([длина бумаги] 
INNER JOIN заказ 
ON [длина бумаги].Код = заказ.[id длина бумаги]) 
ON [формат длина].[id формат дл] = заказ.[id длина бланка]) 
ON [формат ширина].[id формат ш] = заказ.[id ширина бланка]) 
ON [ширина бумаги].Код = заказ.[id ширина бумаги];

нет ли ошибок?



0



8762 / 5614 / 576

Регистрация: 27.03.2013

Сообщений: 19,052

18.09.2015, 09:58

15

Цитата
Сообщение от hrutsik
Посмотреть сообщение

нет ли ошибок?

Если это не БД на 10000 уже забитых ральных данных, типа тестовая, то я что бы перепровериться открываю табличку, удаляю ВСЁ.
Жму в меню
Сжать и восстановить.
Закрываю БД, Открываю БД и начинаю вводить всё по новой.
Обычно это очень даже хорошо помогает и ошибки уже не присутствуют.



0



0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

18.09.2015, 12:21

 [ТС]

16

PuhKMV, не помогло…
поменяла связи убрала подстановки, 2 запроса написала работают, новый выдает «введите параметр»..
даже если просто запись из таблицы вызываешь…



0



8762 / 5614 / 576

Регистрация: 27.03.2013

Сообщений: 19,052

18.09.2015, 12:28

17

Цитата
Сообщение от hrutsik
Посмотреть сообщение

…убрала подстановки,…

ну это в таблицах. а в формах перепроверились.
Как часто бывало в детстве
Создал форму по таблице. затем 8 раз всё поменял, а в форме позабыл, и целую неделю репу чешешь, типа где ошибка.
Явно же аксик не всегда указывает где несоответствие.
Я обычно в таких случаях лезу сразу в-
— Источник записей
— Списки
— Поля со списком
— Подчиненные формы



0



hrutsik

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

18.09.2015, 12:58

 [ТС]

18

там нет форм…только таблицы…может связи не верно установлены??? запуталась совсем…

п.с. почему если через конструктор запросов пишу, то лишние таблицы join-тся??

Добавлено через 22 минуты
подскажите как исправить?! н срочно работу сдать.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 SELECT 35*([красочность лицо]![красочность лицо]+[красочность оборот]![красочтость оборота])+
([тираж]![тираж]/(IIf(INT([ширина бумаги]![ширина]/[формат ширина]![ширина])*INT([длина бумаги]![длина]/[формат длина]![длина])>(INT([ширина бумаги]![ширина]/[формат длина]![длина])*INT([длина бумаги]![длина]/[формат ширина]![ширина])),INT([ширина бумаги]![ширина]/[формат ширина]![ширина])*INT([длина бумаги]![длина]/[формат длина]![длина]),INT([ширина бумаги]![ширина]/[формат длина]![длина])*INT([длина бумаги]![длина]/[формат ширина]![ширина]))))*(IIf([тираж]![тираж]<=100,0.07,IIf(Eval([тираж]![тираж]>100 AND [тираж]![тираж]<=200),0.05,IIf(Eval([тираж]![тираж]>200 AND [тираж]![тираж]<=1000),0.03,IIf(Eval([тираж]![тираж]>1000 AND [тираж]![тираж]<=2000),0.02,IIf(Eval([тираж]![тираж]>2000),0.01,0)))))) AS техотходы
FROM [ширина бумаги] 
INNER JOIN ([формат ширина] 
INNER JOIN ([формат длина] 
INNER JOIN (тираж 
INNER JOIN (нумерация 
INNER JOIN ([красочность оборот] 
INNER JOIN ([красочность лицо] 
INNER JOIN ([длина бумаги] 
INNER JOIN заказ 
ON [длина бумаги].Код = заказ.[длина бумаги])  
ON [красочность лицо].[id кр л] = заказ.[красочность л]) 
ON [красочность оборот].[id кр оборот] = заказ.[красочность о]) 
ON нумерация.[id №№] = заказ.нумерация) 
ON тираж.[Id тир] = заказ.тираж) 
ON [формат длина].[id формат дл] = заказ.[длина бланка]) 
ON [формат ширина].[id формат ш] = заказ.[ширина бланка]) 
ON [ширина бумаги].Код = заказ.[ширина бумаги];

не срабатывает, просит параметр…



0



Эксперт MS Access

17238 / 7083 / 1589

Регистрация: 21.06.2012

Сообщений: 13,288

18.09.2015, 13:12

19

Какой? Ищите по имени параметра, поля какой таблицы не хватает в запросе. И добавьте ее в запрос.



0



8762 / 5614 / 576

Регистрация: 27.03.2013

Сообщений: 19,052

18.09.2015, 13:23

20

ой, вспомнил случаи из жизни, часио бывает. чтьо если не через форму. а просто в таблице или запросе данные наобум вводятся. то такое тоже бывает, еще если в самой таблице — значение по умолчанию прописано.
не факт. что это именно ваш случай, но провериться стоит.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

18.09.2015, 13:23

20

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

ВЫБРАТЬ

       ЗначенияСвойствОбъектов.Объект КАК Объект,

       ЗначенияСвойствОбъектов.Свойство КАК Свойство,

       ВЫБОР

           КОГДА ЗначенияСвойствОбъектов.Значение.Код = 211

                   ИЛИ ЗначенияСвойствОбъектов.Значение.Код = 212

               ТОГДА «Ликероводочные изделия в т.ч.:»

           ИНАЧЕ ВЫБОР

                   КОГДА ЗначенияСвойствОбъектов.Значение.Код = 250

                           ИЛИ ЗначенияСвойствОбъектов.Значение.Код = 251

                       ТОГДА «Напитки винные в т.ч.:»

                   ИНАЧЕ ВЫБОР

                           КОГДА ЗначенияСвойствОбъектов.Значение.Код = 400

                                   ИЛИ ЗначенияСвойствОбъектов.Значение.Код = 410

                               ТОГДА «Вина в т.ч.:»

                           ИНАЧЕ ЗначенияСвойствОбъектов.Значение

                       КОНЕЦ

               КОНЕЦ

       КОНЕЦ КАК Значение1,

       ЗначенияСвойствОбъектов.Значение КАК Значение

   ИЗ

       РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов

   ГДЕ

       ЗначенияСвойствОбъектов.Свойство = &КОДПр

Причем если выкинуть хоть какое-нибудь условие (одно) то все работает.

Обновлено: 30.01.2023

У меня есть восемь таблиц, которые содержат информацию об изменениях, вносимых в приложения по всей компании. Я только хочу запросить и объединить строки для подмножества более 200 приложений. Для этого я запрашиваю каждую таблицу по коду приложения (AAA, BBB и т. Д.) И хочу объединить результаты. Когда я использую более 5 кодов приложения, я получаю ошибку «Запрос к комплексу».

Я знаю, что есть более эффективный способ сделать это, но нижеприведенное — лучшее, что я смог сделать с моими ограниченными знаниями.

Я хотел бы иметь возможность запрашивать все 200+ кодов приложений одновременно и более эффективно, чем вводить одну и ту же строку 8 раз для каждого кода.

3 ответа

Более простой подход мог бы заключаться в том, что union данные таблицы перед применяют критерии выбора, поэтому вам нужно указывать критерии только в одном месте, например:

Если вы не используете подстановочные операторы в рамках критериев для like , вы можете альтернативно использовать in и предоставить список кодов приложений:

Кроме того, вы можете создать таблицу, содержащую все коды приложений, которые вы хотите вернуть (в следующем примере я назвал такую таблицу ApplicationCodes , содержащую одно поле с именем Code ), а затем использовать простое объединение для неявного применения фильтрации, например:

Я бы порекомендовал вам создать таблицу, в которой есть все приложения, тогда вы могли бы сделать всего 8 запросов

Если вам это не нравится, вы можете попробовать предложение IN

Имена таблиц, которые содержат даты или порядковые номера и одни и те же поля, обычно должны сочетаться с именем таблицы в качестве дополнительного свойства.

Создайте таблицу (например, ApplicationChanges) с полями объединенных таблиц и добавьте дополнительное поле ChangedAt , которое будет содержать старое имя таблицы. Возможно, старые таблицы содержат поле даты, которое показывает дату ChangedAt, тогда вы можете опустить имя таблицы и запрос, какие даты принадлежат этой таблице.

Затем используйте запрос @LeeMacs для заполнения новой таблицы:

Если вам нужна старая структура данных, создайте запросы для каждой предыдущей таблицы с критерием ChangedAt. Например. Таблица [2019-07-A July 5 to 7]

Алексей Чужов

Алексей Чужов

Возьмите др клиентов,вычтите из этих дат сутки.Затем можно например передать в переменные ДеньВчерРожд=день(ДатаРождМинусОдин);
МесяцВчерРожд=месяц(датаРождМинусОдин);
У вас получиться номер месяца вчерашнего дня рождения и дюномер дня вчерашнего др.А затем сравните их с номером дня и номером месяца текущей даты.Вообщем если не понятно или еще не сделали пишите,не мложно это.Единственный шаткий момент это високосные года.

Юрий Чернов

Где именно хотите получить — в запросе, в СКД, в отчете?
Вообще, чем не устраивает задать дату рождения между:
конечная дата -конец дня текущей даты,
начальная дата — начало дня текущей даты — 24 часа.
В отбор попадут нужные клиенты.
Или у вас дата разбита — отдельно день, отдельно месяц, отдельно год?

Валентина Ивановна

Юрий, СКД. Дата разбита: отдельно День, Месяц. И когда задала Дату рождения Между (ДеньГода) — получила. что-то непонятное.

Юрий Чернов

Вот как—то так: ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, 1984 — 1), МЕСЯЦ, 12 — 1), ДЕНЬ, 31 — 1) КАК Поле1 . Только вместо цифр года, месяца и дня подставить свои данные из запроса. Суть, берем дату 01.01.0001 и прибавляем день месяц и год. Если год не нужен, его можно опустить. Ну, тем более, имея уже собранную дату, вроде бы не сложно придумать нужное сравнение.

Дмитрий Сметанин

Дмитрий Сметанин запись закреплена

Необходимо создать обработку позволяющую загрузить содержимое файла Excel (в ячейках примитивные типы: строка, число) с любым количеством колонок и строк в таблицу значений на форму обработки.
Таблицу значений на форме нужно создавать программно.
В первой строке файла будут содержатся названия колонок, названия колонок в таблице на форме должны им соответствовать.
Пустые ячейки в таблице на форме нужно выделить красным цветом.

Данислав Мингалёв

Здарова. Я сам когда-то только начинал работать с 1С. И тоже начинал с экселя. Я бы помог, но времени совсем щас нет. У меня осталась обработка на которой я тренировался. Там и загрузка написана и выгрузка. Может поможет.

Читайте также:

  • Как связаны объекты конфигурации и объекты базы данных 1с
  • Программа в топе как работает
  • Как прошить asus zc500tg
  • Как выйти в интернет без браузера на андроид
  • Как в фотошопе сделать 3д обложку

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

1

«Слишком сложный запрос»?

17.09.2015, 09:36. Показов 5451. Ответов 26


Студворк — интернет-сервис помощи студентам

Доброго дня, кто подскажет почему при создании нового запроса выскакивает «слишком сложный запрос»?? такое происходит даже если в запрос добавить просто вывести запись из существующей таблицы.

0

Эксперт MS Access

17139 / 7005 / 1567

Регистрация: 21.06.2012

Сообщений: 13,110

17.09.2015, 09:41

2

Не наблюдается, возможно проблемы с Вашей версией Аксесса.

0

Модератор

Эксперт MS Access

11335 / 4654 / 748

Регистрация: 07.08.2010

Сообщений: 13,484

Записей в блоге: 4

17.09.2015, 10:54

3

в вашей таблице заказ
-11 подстановок непонятного формата —берется только код без наименования

  RowSource: SELECT [бумага].[id бум] FROM бумага;
  RowSource: SELECT [вес бумаги м кв].[Код] FROM [вес бумаги м кв];
  RowSource: SELECT [длина бумаги].[Код] FROM [длина бумаги];
  RowSource: SELECT [Заказчик].[Id зак-к] FROM Заказчик;
  RowSource: SELECT [красочность лицо].[id кр л] FROM [красочность лицо];
  RowSource: SELECT [красочность оборот].[id кр оборот] FROM [красочность оборот];
  RowSource: SELECT [нумерация].[id №№] FROM нумерация;
  RowSource: SELECT [тираж].[Id тир] FROM тираж;
  RowSource: SELECT [формат длина].[id формат дл] FROM [формат длина];
  RowSource: SELECT [формат ширина].[id формат ш] FROM [формат ширина];
  RowSource: SELECT [ширина бумаги].[Код] FROM [ширина бумаги];
  RowSourceType: Таблица или запрос

а в каждом запросе по 11 inner join для прицепки этого самого наименования

0

Эксперт MS Access

2832 / 1374 / 215

Регистрация: 13.05.2011

Сообщений: 4,208

17.09.2015, 10:54

4

Цитата
Сообщение от hrutsik
Посмотреть сообщение

такое происходит даже если в запрос добавить просто вывести запись из существующей таблицы

При создании нового запроса всё работает. Если имеете в виду редактирование существующего запроса, то укажите какого?

0

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 12:20

 [ТС]

5

приложила архив, где не работает вродебы простой запрос.

0

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 12:31

 [ТС]

6

Цитата
Сообщение от shanemac51
Посмотреть сообщение

в вашей таблице заказ
-11 подстановок непонятного формата —берется только код без наименования

а как правильно сделать??

Добавлено через 10 минут
может быть лучше вообще уйти от подстановок?

0

Эксперт MS Access

17139 / 7005 / 1567

Регистрация: 21.06.2012

Сообщений: 13,110

17.09.2015, 12:32

7

Цитата
Сообщение от hrutsik
Посмотреть сообщение

где не работает вродебы простой запрос.

Из спецификации Аксесс 2010

Number of joins in a query 16*

Может дело в количестве связей. Разбейте запрос на два, связывая в каждом с частью остальных таблиц, о потом соберите эти два в один.

1

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 12:38

 [ТС]

8

тут дело дошло до того что если я просто запросом этим вызываю любую запись из существующих таблиц, то уже » запрос слишком сложный»…пробовала на 2 компах тоже думала что чтото с версией аксесса…

0

Эксперт MS Access

17139 / 7005 / 1567

Регистрация: 21.06.2012

Сообщений: 13,110

17.09.2015, 12:48

9

К чему там почти все таблицы (да и в Красочность). Оставьте только нужные … (в Красочность это красочность лицо, красочность оборот, нумерация).

0

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 12:55

 [ТС]

10

бывает что нужно отдельно кр лица и кр оборота…по моему они все нужные, может их связывать лучше не подстановкой???

0

ltv_1953

Эксперт MS Access

17139 / 7005 / 1567

Регистрация: 21.06.2012

Сообщений: 13,110

17.09.2015, 13:08

11

Еще раз: запрос красочность

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT [красочность лицо]![красочность лицо]
+[красочность оборот]![красочтость оборота]
+[нумерация]![нумерация] AS [красочность бланка], заказ.[id зак]
FROM [ширина бумаги] INNER JOIN ([формат ширина] 
INNER JOIN ([формат длина] INNER JOIN (тираж 
INNER JOIN (нумерация INNER JOIN ([красочность оборот] 
INNER JOIN ([красочность лицо] INNER JOIN (Заказчик 
INNER JOIN ([длина бумаги] INNER JOIN (([вес бумаги м кв] 
INNER JOIN бумага ON [вес бумаги м кв].Код = бумага.вес) 
INNER JOIN заказ ON бумага.[id бум] = заказ.бумага) 
ON [длина бумаги].Код = заказ.[длина бумаги]) ON Заказчик.[Id зак-к] = заказ.заказчик) 
ON [красочность лицо].[id кр л] = заказ.[красочность л]) 
ON [красочность оборот].[id кр оборот] = заказ.[красочность о]) 
ON нумерация.[id №№] = заказ.нумерация) ON тираж.[Id тир] = заказ.тираж) 
ON [формат длина].[id формат дл] = заказ.[длина бланка]) 
ON [формат ширина].[id формат ш] = заказ.[ширина бланка]) 
ON [ширина бумаги].Код = заказ.[ширина бумаги];

Для вычисления [красочность бланка] нужны только три таблицы, зачем все остальные? В запросах должны быть только те таблицы, которые нужны.

0

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

17.09.2015, 14:44

 [ТС]

12

делала в режиме конструктора, там этого не видно

Добавлено через 1 час 31 минуту
может такая проблема выскочить из-за использования подстановок???

0

Эксперт MS Access

7267 / 4469 / 288

Регистрация: 12.08.2011

Сообщений: 13,513

18.09.2015, 05:19

13

Лучший ответ Сообщение было отмечено VinniPuh как решение

Решение

Поля подстановок в таблицах недопустимы.

1

hrutsik

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

18.09.2015, 09:31

 [ТС]

14

сделала без подстановок, все равно если через конструктор делать join-ит все теблицы! отсюда и перегрузка видимо.
поубирала лишние, вроде работатет:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT IIf(INT([ширина бумаги]![ширина]/[формат ширина]![ширина])*INT([длина бумаги]![длина]/[формат длина]![длина])>(INT([ширина бумаги]![ширина]/[формат длина]![длина])*INT([длина бумаги]![длина]/[формат ширина]![ширина])),
INT([ширина бумаги]![ширина]/[формат ширина]![ширина])*INT([длина бумаги]![длина]/[формат длина]![длина]),
INT([ширина бумаги]![ширина]/[формат длина]![длина])*INT([длина бумаги]![длина]/[формат ширина]![ширина]))
 AS [оптимальное количество бланков на листе]
FROM [ширина бумаги] 
INNER JOIN ([формат ширина] 
INNER JOIN ([формат длина] 
INNER JOIN ([длина бумаги] 
INNER JOIN заказ 
ON [длина бумаги].Код = заказ.[id длина бумаги]) 
ON [формат длина].[id формат дл] = заказ.[id длина бланка]) 
ON [формат ширина].[id формат ш] = заказ.[id ширина бланка]) 
ON [ширина бумаги].Код = заказ.[id ширина бумаги];

нет ли ошибок?

0

8704 / 5476 / 571

Регистрация: 27.03.2013

Сообщений: 18,806

18.09.2015, 09:58

15

Цитата
Сообщение от hrutsik
Посмотреть сообщение

нет ли ошибок?

Если это не БД на 10000 уже забитых ральных данных, типа тестовая, то я что бы перепровериться открываю табличку, удаляю ВСЁ.
Жму в меню
Сжать и восстановить.
Закрываю БД, Открываю БД и начинаю вводить всё по новой.
Обычно это очень даже хорошо помогает и ошибки уже не присутствуют.

0

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

18.09.2015, 12:21

 [ТС]

16

PuhKMV, не помогло…
поменяла связи убрала подстановки, 2 запроса написала работают, новый выдает «введите параметр»..
даже если просто запись из таблицы вызываешь…

0

8704 / 5476 / 571

Регистрация: 27.03.2013

Сообщений: 18,806

18.09.2015, 12:28

17

Цитата
Сообщение от hrutsik
Посмотреть сообщение

…убрала подстановки,…

ну это в таблицах. а в формах перепроверились.
Как часто бывало в детстве
Создал форму по таблице. затем 8 раз всё поменял, а в форме позабыл, и целую неделю репу чешешь, типа где ошибка.
Явно же аксик не всегда указывает где несоответствие.
Я обычно в таких случаях лезу сразу в-
— Источник записей
— Списки
— Поля со списком
— Подчиненные формы

0

hrutsik

0 / 0 / 0

Регистрация: 08.01.2015

Сообщений: 62

18.09.2015, 12:58

 [ТС]

18

там нет форм…только таблицы…может связи не верно установлены??? запуталась совсем…

п.с. почему если через конструктор запросов пишу, то лишние таблицы join-тся??

Добавлено через 22 минуты
подскажите как исправить?! н срочно работу сдать.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 SELECT 35*([красочность лицо]![красочность лицо]+[красочность оборот]![красочтость оборота])+
([тираж]![тираж]/(IIf(INT([ширина бумаги]![ширина]/[формат ширина]![ширина])*INT([длина бумаги]![длина]/[формат длина]![длина])>(INT([ширина бумаги]![ширина]/[формат длина]![длина])*INT([длина бумаги]![длина]/[формат ширина]![ширина])),INT([ширина бумаги]![ширина]/[формат ширина]![ширина])*INT([длина бумаги]![длина]/[формат длина]![длина]),INT([ширина бумаги]![ширина]/[формат длина]![длина])*INT([длина бумаги]![длина]/[формат ширина]![ширина]))))*(IIf([тираж]![тираж]<=100,0.07,IIf(Eval([тираж]![тираж]>100 AND [тираж]![тираж]<=200),0.05,IIf(Eval([тираж]![тираж]>200 AND [тираж]![тираж]<=1000),0.03,IIf(Eval([тираж]![тираж]>1000 AND [тираж]![тираж]<=2000),0.02,IIf(Eval([тираж]![тираж]>2000),0.01,0)))))) AS техотходы
FROM [ширина бумаги] 
INNER JOIN ([формат ширина] 
INNER JOIN ([формат длина] 
INNER JOIN (тираж 
INNER JOIN (нумерация 
INNER JOIN ([красочность оборот] 
INNER JOIN ([красочность лицо] 
INNER JOIN ([длина бумаги] 
INNER JOIN заказ 
ON [длина бумаги].Код = заказ.[длина бумаги])  
ON [красочность лицо].[id кр л] = заказ.[красочность л]) 
ON [красочность оборот].[id кр оборот] = заказ.[красочность о]) 
ON нумерация.[id №№] = заказ.нумерация) 
ON тираж.[Id тир] = заказ.тираж) 
ON [формат длина].[id формат дл] = заказ.[длина бланка]) 
ON [формат ширина].[id формат ш] = заказ.[ширина бланка]) 
ON [ширина бумаги].Код = заказ.[ширина бумаги];

не срабатывает, просит параметр…

0

Эксперт MS Access

17139 / 7005 / 1567

Регистрация: 21.06.2012

Сообщений: 13,110

18.09.2015, 13:12

19

Какой? Ищите по имени параметра, поля какой таблицы не хватает в запросе. И добавьте ее в запрос.

0

8704 / 5476 / 571

Регистрация: 27.03.2013

Сообщений: 18,806

18.09.2015, 13:23

20

ой, вспомнил случаи из жизни, часио бывает. чтьо если не через форму. а просто в таблице или запросе данные наобум вводятся. то такое тоже бывает, еще если в самой таблице — значение по умолчанию прописано.
не факт. что это именно ваш случай, но провериться стоит.

0

IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

18.09.2015, 13:23

20

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

ВЫБРАТЬ

       ЗначенияСвойствОбъектов.Объект КАК Объект,

       ЗначенияСвойствОбъектов.Свойство КАК Свойство,

       ВЫБОР

           КОГДА ЗначенияСвойствОбъектов.Значение.Код = 211

                   ИЛИ ЗначенияСвойствОбъектов.Значение.Код = 212

               ТОГДА «Ликероводочные изделия в т.ч.:»

           ИНАЧЕ ВЫБОР

                   КОГДА ЗначенияСвойствОбъектов.Значение.Код = 250

                           ИЛИ ЗначенияСвойствОбъектов.Значение.Код = 251

                       ТОГДА «Напитки винные в т.ч.:»

                   ИНАЧЕ ВЫБОР

                           КОГДА ЗначенияСвойствОбъектов.Значение.Код = 400

                                   ИЛИ ЗначенияСвойствОбъектов.Значение.Код = 410

                               ТОГДА «Вина в т.ч.:»

                           ИНАЧЕ ЗначенияСвойствОбъектов.Значение

                       КОНЕЦ

               КОНЕЦ

       КОНЕЦ КАК Значение1,

       ЗначенияСвойствОбъектов.Значение КАК Значение

   ИЗ

       РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов

   ГДЕ

       ЗначенияСвойствОбъектов.Свойство = &КОДПр

Причем если выкинуть хоть какое-нибудь условие (одно) то все работает.

полнотекстовый поиск или запрос

Автор denis-moscow1987, 19 июл 2014, 10:18

0 Пользователей и 1 гость просматривают эту тему.

СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(«», 20);
СписокПоиска.ПолучатьОписание = Истина;
МассивМД = Новый Массив();
МассивМД.Добавить(Метаданные.сПРАВОЧНИКИ.ДоговорыКонтрагентов);
СписокПоиска.ОбластьПоиска = МассивМД;
СписокПоиска.СтрокаПоиска = «КЛЦ»;
СписокПоиска.РазмерПорции = «20»;
СписокПоиска.ПерваяЧасть();
Если СписокПоиска.ПолноеКоличество() = 0 Тогда
   Если СписокПоиска.СлишкомМногоРезультатов() Тогда
      Сообщить(«Слишком много результатов, уточните запрос.»);
   КонецЕсли;
   Возврат;
КонецЕсли;
Колво = СписокПоиска.ПолноеКоличество();
Реквизит1 = СписокПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.HTMLТекст);
Сообщить(Реквизит1);
вот код, поиск идет по всем реквизитам справочника, а как сделать чтобы
1.поиск шел только по наименованию?
2. пометить на удаление выдачу поиска.
спасибо


Чем вам не нравится НайтиПоНаименованию() или запрос??
К чему такая экзотика?

Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.


Цитата: cska-fanat-kz от 21 июл 2014, 15:20
Чем вам не нравится НайтиПоНаименованию() или запрос??
К чему такая экзотика?

:D Видать человек не знает что в запросе можно искать по «Подобно» , а найти по наименованию возвращает 1 элемент)
В данном случае надо использовать запрос в условии Где пишем Контрагенты.Наименование Подобно &СтрокаПоиска.
Устанавливаем в параметр СтрокаПоиска шаблон поиска, далее в выборке если надо получаем объекты и делаем с ними что хотим.


Обновлено: 11.04.2023

У меня есть восемь таблиц, которые содержат информацию об изменениях, вносимых в приложения по всей компании. Я только хочу запросить и объединить строки для подмножества более 200 приложений. Для этого я запрашиваю каждую таблицу по коду приложения (AAA, BBB и т. Д.) И хочу объединить результаты. Когда я использую более 5 кодов приложения, я получаю ошибку «Запрос к комплексу».

Я знаю, что есть более эффективный способ сделать это, но нижеприведенное — лучшее, что я смог сделать с моими ограниченными знаниями.

Я хотел бы иметь возможность запрашивать все 200+ кодов приложений одновременно и более эффективно, чем вводить одну и ту же строку 8 раз для каждого кода.

3 ответа

Более простой подход мог бы заключаться в том, что union данные таблицы перед применяют критерии выбора, поэтому вам нужно указывать критерии только в одном месте, например:

Если вы не используете подстановочные операторы в рамках критериев для like , вы можете альтернативно использовать in и предоставить список кодов приложений:

Кроме того, вы можете создать таблицу, содержащую все коды приложений, которые вы хотите вернуть (в следующем примере я назвал такую таблицу ApplicationCodes , содержащую одно поле с именем Code ), а затем использовать простое объединение для неявного применения фильтрации, например:

Я бы порекомендовал вам создать таблицу, в которой есть все приложения, тогда вы могли бы сделать всего 8 запросов

Если вам это не нравится, вы можете попробовать предложение IN

Имена таблиц, которые содержат даты или порядковые номера и одни и те же поля, обычно должны сочетаться с именем таблицы в качестве дополнительного свойства.

Создайте таблицу (например, ApplicationChanges) с полями объединенных таблиц и добавьте дополнительное поле ChangedAt , которое будет содержать старое имя таблицы. Возможно, старые таблицы содержат поле даты, которое показывает дату ChangedAt, тогда вы можете опустить имя таблицы и запрос, какие даты принадлежат этой таблице.

Затем используйте запрос @LeeMacs для заполнения новой таблицы:

Если вам нужна старая структура данных, создайте запросы для каждой предыдущей таблицы с критерием ChangedAt. Например. Таблица [2019-07-A July 5 to 7]

Алексей Чужов

Алексей Чужов

Возьмите др клиентов,вычтите из этих дат сутки.Затем можно например передать в переменные ДеньВчерРожд=день(ДатаРождМинусОдин);
МесяцВчерРожд=месяц(датаРождМинусОдин);
У вас получиться номер месяца вчерашнего дня рождения и дюномер дня вчерашнего др.А затем сравните их с номером дня и номером месяца текущей даты.Вообщем если не понятно или еще не сделали пишите,не мложно это.Единственный шаткий момент это високосные года.

Юрий Чернов

Где именно хотите получить — в запросе, в СКД, в отчете?
Вообще, чем не устраивает задать дату рождения между:
конечная дата -конец дня текущей даты,
начальная дата — начало дня текущей даты — 24 часа.
В отбор попадут нужные клиенты.
Или у вас дата разбита — отдельно день, отдельно месяц, отдельно год?

Валентина Ивановна

Юрий, СКД. Дата разбита: отдельно День, Месяц. И когда задала Дату рождения Между (ДеньГода) — получила. что-то непонятное.

Юрий Чернов

Вот как—то так: ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, 1984 — 1), МЕСЯЦ, 12 — 1), ДЕНЬ, 31 — 1) КАК Поле1 . Только вместо цифр года, месяца и дня подставить свои данные из запроса. Суть, берем дату 01.01.0001 и прибавляем день месяц и год. Если год не нужен, его можно опустить. Ну, тем более, имея уже собранную дату, вроде бы не сложно придумать нужное сравнение.

Дмитрий Сметанин

Дмитрий Сметанин запись закреплена

Необходимо создать обработку позволяющую загрузить содержимое файла Excel (в ячейках примитивные типы: строка, число) с любым количеством колонок и строк в таблицу значений на форму обработки.
Таблицу значений на форме нужно создавать программно.
В первой строке файла будут содержатся названия колонок, названия колонок в таблице на форме должны им соответствовать.
Пустые ячейки в таблице на форме нужно выделить красным цветом.

Данислав Мингалёв

Здарова. Я сам когда-то только начинал работать с 1С. И тоже начинал с экселя. Я бы помог, но времени совсем щас нет. У меня осталась обработка на которой я тренировался. Там и загрузка написана и выгрузка. Может поможет.

Читайте также:

  • Как связаны объекты конфигурации и объекты базы данных 1с
  • Программа в топе как работает
  • Как прошить asus zc500tg
  • Как выйти в интернет без браузера на андроид
  • Как в фотошопе сделать 3д обложку

Почему возникает Ошибка чтения значений?

В консоле запрос работает, а вот в коде выдаёт ошибку.
5cfdf9004b119862880174.png5cfdf906a71bf049978238.png


  • Вопрос задан

    более трёх лет назад

  • 1647 просмотров

В коде напиши Запрос.Выполнить().Выгрузить() вместо Запрос.Выполнить().Выбрать()
Метод выгрузить возвращает тебе таблицу значений как в консоли, выбрать подходит для поочередного обхода значений таблицы в цикле.

Пригласить эксперта


  • Показать ещё
    Загружается…

06 июн. 2023, в 21:13

3000 руб./за проект

06 июн. 2023, в 21:12

3000 руб./за проект

06 июн. 2023, в 21:09

3000 руб./за проект

Минуточку внимания

Другие статьи по оптимизации 1С:

«Оптимизация 1С – Проблемы производительности»

«Как ускорить 1С – Многопоточная обработка данных»

«Анализ запросов с помощью SQL Profiler»

Что Вы узнаете из этой статьи?

  • Одну из основных причин медленной работы запросов
  • Анализ возможных методов ускорения запросов
  • Эффективный способ ускорения запросов, в которых происходит обращение через «2 точки»

Часто при внедрении программ «1С: Предприятие 8» возникают ситуации, в которых простые запросы работают достаточно медленно.

Покажем варианты оптимизации таких запросов.

Для примера рассмотрим запрос из реального проекта (в базе клиента он выполнялся более 6 секунд)

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

СГРУППИРОВАТЬ ПО
ДенежныеСредстваКПоступлениюБезналичныеОбороты.Документ.Контрагент.Партнер,
МЕСЯЦ(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период),
ГОД(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период)

C первого взгляда все хорошо, но опытный программист увидит неоптимальный код в запросе.

Источником проблем выступает параметр виртуальной таблицы, а точнее – обращение через «две точки» в фильтре.

В общем случае такой подход допустим, но есть одна проблема: поле «Документ» имеет составной тип, и при получении реквизитов данного поля выполняется соединение с каждой таблицей, входящей в составной тип этого поля.

Самым первым вариантом решения в голову приходит использовать конструкцию языка запросов «ВЫРАЗИТЬ», чтобы привести поле «Документ» к некоторому определенному типу. Это позволит избежать соединений с лишними таблицами.

Но по ряду ограничений данный вариант не подходит:

  1. Нам нужны все документы, содержащиеся в составном типе. Таковы условия постановки задачи. Получается, что необходимо фильтровать все типы документов, входящие в составной тип.
  2. Даже если бы не было предыдущего ограничения, то обращение через «две точки» никуда не делось.
  3. Если бы можно было использовать «ВЫРАЗИТЬ», то это не спасало бы ситуацию: в параметрах виртуальной таблицы «ВЫРАЗИТЬ» не дает прироста производительности.

Оптимизация

Исходя из вышесказанного, прежде всего необходимо избавиться от обращения через «две точки» и при этом не испортить саму логику нашего запроса.
Из нескольких способов решения задачи предлагаем два следующих варианта:

Вариант 1

В регистр «ДенежныеСредстваКПоступлениюБезналичные» добавить новое измерение «Партнер», заполняя его при записи движений документов. Ввиду использования условия по данному измерению его необходимо проиндексировать.

После внесенных нами изменений у нас достаточно легко получится наложение фильтра на новое измерение в параметрах виртуальной таблицы:

РегистрНакопления.ДенежныеСредстваКПоступлениюБезналичные.Обороты(, , Месяц, Партнер = &Партнер) КАК ДенежныеСредстваКПоступлениюБезналичныеОбороты

Что мы видим? Этот запрос начинает работать моментально.

И это, к сожалению, единственный положительный момент, минусов наблюдается существенно больше.

Главный минус – изменение структуры конфигурации, возникают проблемы при последующих обновлениях, использовании типовых обменов и т.д.

К тому же у нас хранится дублируемая информация, что приводит к увеличению размера таблицы, а установка признака индексирования повышает скорость чтения, но при этом замедляет запись в регистр.

Поэтому рассмотрим второй вариант.

Вариант 2

Можно попробовать изменить запрос так, чтобы фильтр по полю «Документ» накладывался примерно следующим образом:

РегистрНакопления.ДенежныеСредстваКПоступлениюБезналичные.Обороты(, , Месяц, Документ В (ВЫБРАТЬ Ссылка ИЗ ВТ_ДокументыСПартнером)) КАК ДенежныеСредстваКПоступлениюБезналичныеОбороты

Что необходимо сделать, чтобы наш запрос пришел к подобному виду?
Вначале соберем все документы, входящие в составной тип поля «Документы». Для них должно соблюдаться условие:

Контрагент.Партнер = &Партнер

В нашем составном типе определены 5 документов, причем искомый реквизит «Контрагент» присутствует только в документах:

  • ПоступлениеБезналичныхДенежныхСредств
  • СписаниеБезналичныхДенежныхСредств
  • РасходныйКассовыйОрдер
  • ОперацияПоПлатежнойКарте

Далее сформируем временную таблицу для фильтрации. В ней будут документы, у которых реквизит «Партнер» равен нужному значению. Применим полученный фильтр по документам в нашем запросе:

ВЫБРАТЬ ОперацияПоПлатежнойКарте.Ссылка
ПОМЕСТИТЬ ВТ_ДокументыСПартнером
ИЗ Документ.ОперацияПоПлатежнойКарте КАК ОперацияПоПлатежнойКарте
ГДЕ ОперацияПоПлатежнойКарте.Контрагент.Партнер = &Партнер

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

ВЫБРАТЬ ПоступлениеБезналичныхДенежныхСредств.Ссылка
ИЗ Документ.ПоступлениеБезналичныхДенежныхСредств КАК ПоступлениеБезналичныхДенежныхСредств
ГДЕ ПоступлениеБезналичныхДенежныхСредств.Контрагент.Партнер = &Партнер

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

ВЫБРАТЬ РасходныйКассовыйОрдер.Ссылка
ИЗ Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер
ГДЕ РасходныйКассовыйОрдер.Контрагент.Партнер = &Партнер

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

ВЫБРАТЬ СписаниеБезналичныхДенежныхСредств.Ссылка
ИЗ Документ.СписаниеБезналичныхДенежныхСредств КАК СписаниеБезналичныхДенежныхСредств
ГДЕ СписаниеБезналичныхДенежныхСредств.Контрагент.Партнер = &Партнер
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
&Партнер,
МЕСЯЦ(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период) КАК Месяц,
ГОД(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период) КАК Год,
ДенежныеСредстваКПоступлениюБезналичныеОбороты.СуммаПриход КАК СуммаПриход
ИЗ
РегистрНакопления.ДенежныеСредстваКПоступлениюБезналичные.Обороты(,, Месяц, Документ В
(ВЫБРАТЬ
ВТ_ДокументыСПартнером.Ссылка
ИЗ
ВТ_ДокументыСПартнером)) КАК ДенежныеСредстваКПоступлениюБезналичныеОбороты

С другой стороны, можно сначала получить контрагентов с данным партнером и затем искать документы с фильтром по контрагенту, но особой разницы в скорости не наблюдается.

После проведенной оптимизации запрос стал выполняться менее одной секунды!

Да, при этом он стал сложнее, но нет необходимости в изменении структуры метаданных, как в первом варианте.

Резюме

Вам представлен вариант решения оптимизации достаточно простого запроса, при котором не возникло необходимости в перестройке метаданных, создании дополнительных индексов.

Рекомендуем оптимизировать запросы посредством изменения текста самого запроса.

Бурмистров Андрей

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.

Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кеш браузера или подписаться через другой браузер.

Превышено допустимое количество слов поиска. Уточните поисковое выражение это почему? на строку: «*ад* И *яр* И *обл*»

как это описание «ошибки» перевести на язык понятный человеку? что хочет платформа для осуществления поиска? слова более чем из 3 букв? что вывести пользователю в случае возникновения такой ошибки?

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

ага значит вчд экс — он ищет запросом на подобно — и находит только 5 вариантов а если в полнотекстовый передать строку: *вчд* И *экс* И *1* — вариантов сразу становится больше?

да, потому что полнотекстовый поиск ищет не запросом по базе по собственным идексам, которые заранее подготавливает.

и? в полнотекстовый поиск в базе включен только справочник конрагенты и только два поля в нем — наименование и полное наименование Наименование ПОДОБНО ИЛИ НаименованиеПолное Подобно находит 5 записей а полнотекстовый — больше чем может?

полнотекстовый ищет по всем полям

даже по тем которрые не включены в индекс?

Дело в том что ПП ищет сначала все что подходит на первое слово, потом из найденного отбирает что подходит для второго и т.д. Инфа 140%. Я сам был в шоке от такого подхода к поиску.

И если он найдет слишком много подходящего для первого слова, то он перестает искать дальше

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Понравилась статья? Поделить с друзьями:
  • Слишком длинное предложение какая ошибка
  • Слишком обогащенная смесь ошибка
  • Следственные органы расследовали лексическая ошибка
  • Слишком большое предложение какая ошибка
  • Слить воду со стиральной машины lg при ошибке