Написание запросов в 1С

1. Alexponenta 25.03.21 13:58 Сейчас в теме
Решить вспомнить SQL запросы. Но судя по всему в 1С запросы формируются как-то по своим правилам.
В общем возникла потребность из справочника вытащить данные, у справочника имеется табличная часть.
и вот проблема возникает на этапе вытаскивания данных из табличной части справочника.

В табличной части имеется список лиц. Мне нужно вытащить количество этих лиц, пытаюсь использовать COUNT, возвращается таблица значений с одним значением. А нужно чтобы возвращало именно число.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. spacecraft 25.03.21 14:26 Сейчас в теме
(1) тогда вспоминайте что такое связь один ко многим. Справочник это одна таблица. Каждая табличная часть справочника это отдельная таблица (всего справочника, а не каждого элемента) со связью по идентификатору Ссылка основной таблицы.
10. spacecraft 25.03.21 16:06 Сейчас в теме
(1)
Мне нужно вытащить количество этих лиц, пытаюсь использовать COUNT, возвращается таблица значений с одним значением. А нужно чтобы возвращало именно число.

Вот это уже не имеет непосредственного отношения к тексту запроса. Выполнение запроса возвращает результат запроса. Чтобы из него получить значения есть 2 пути.
1. Это использовать выборку. Запрос.Выполнить().Выбрать(). Но ее нужно впоследствии обходить, чтобы получить данные.
2. Это использовать выгрузку в таблицу значений. Что я так понимаю у вас и было сделано. Запрос.Выполнить().Выгрузить(). В этой ТЗ и будут данные.

А вот чтобы сразу получить результат число (любые данные результата выполнения запроса), так не бывает.
11. tolyan_ekb 80 26.03.21 07:42 Сейчас в теме
(1) воспользуйтесь конструктором запроса, там видно доступные объекты справочника и его табличных частей. Соединения там же можно настроить. Также хороший тоном считается прикладывать результаты (код, запрос) к теме для проверки форумом.
18. herfis 516 29.03.21 15:47 Сейчас в теме
(1)
решить вспомнить SQL запросы. Но судя по всему в 1С запросы формируются как-то по своим правилам

По таким же. В 1С не более чем диалект.
2. DenisCh 25.03.21 14:01 Сейчас в теме
выбрать тч.Ссылка, КОЛИЧЕСТВО(тч.Лицо)
из Справочник.МойСправочник.ТабличнаяЧасть как тч
сгруппировать по тч.ссылка
Alexponenta; vadim.semyonov.rzn; starik-2005; +3 Ответить
3. Alexponenta 25.03.21 14:19 Сейчас в теме
(2) Окей. А если надо одновременно чтобы участвовали и данные из Реквизитов и данные из Табличной части?
4. oleg-x 23 25.03.21 14:22 Сейчас в теме
(3) Не проблема, все реквизиты доступны через тч.Ссылка.Реквизит
5. Alexponenta 25.03.21 14:24 Сейчас в теме
(4) Реквизиты не табличной части, а реквизиты самого справочника.
7. FatPanzer 25.03.21 14:29 Сейчас в теме
8. DenisCh 25.03.21 14:34 Сейчас в теме
(4) Как и в простом SQL - left join шапки и тч
9. oleg-x 23 25.03.21 15:10 Сейчас в теме
(5) Именно про них и говорим, они доступны через ссылку.
тч.Ссылка.Организация
тч.Ссылка.КодСправочника
тч.Ссылка.ЛюбойДругойРеквизитШапки
Alexponenta; +1 Ответить
12. DenisCh 26.03.21 08:06 Сейчас в теме
(9) Не надо плохому стилю учить...
13. oleg-x 23 26.03.21 09:07 Сейчас в теме
(12) Что криминального в данном случае?
А что бы рекомендовать оптимальный вариант, нужно знать цель задачи.
14. DenisCh 26.03.21 09:11 Сейчас в теме
(13) Криминального - ничего. Просто стиль не очень.
Сегодня он к шапке справочника обратится, а завтра в регистре Регистратор.Дата напишет...
15. oleg-x 23 26.03.21 09:20 Сейчас в теме
(14) Если человек действительно знает SQL запросы, то будет проще. Можно сложные или критические запросы посмотреть в SQL и решить корректно это или нет. И если надо поправить.
16. Alexponenta 29.03.21 14:14 Сейчас в теме
(9) проблема решилась. Как оказалось я плох в сложные запросы )
17. oleg-x 23 29.03.21 15:31 Сейчас в теме
(16) Ничего страшного, практика и опыт все решает :-)
19. Alexponenta 30.03.21 08:43 Сейчас в теме
(17) Да там выяснилось что табличные части нужно кидать в конструктор отдельно, а не в составе справочника ну и связи прописывать (хотя как выяснилось и сам конструктор неплохо справляется). правда что плохо - не проконтролировать, а все ли необходимые поля были изъяты.

Просто когда мы изучали реляционные базы - нас заставляли делать уникальные числовые поля (int ID), чтобы при составлении сложного запроса не возникало проблем с поиском поля для связи.

А в базе 1с с которой сейчас работаю этим несколько пренебрегли(я так понимаю это норма). в результате чего приходится прошаривать все справочники документы и регистры на предмет полей по которым их можно между с собой сцепить. а это отдельный вид искусства.
20. Alexponenta 30.03.21 08:44 Сейчас в теме
(19) сцепить по ссылке не всегда работает, поскольку ссылка - не всегда однозначно определена. А это тоже вызывает ряд вопросов
21. spacecraft 30.03.21 08:55 Сейчас в теме
(19)
Просто когда мы изучали реляционные базы - нас заставляли делать уникальные числовые поля (int ID), чтобы при составлении сложного запроса не возникало проблем с поиском поля для связи.

Это на каких базах так учили? mysql, sqlite ? Там да, это нормально, так как не подразумевает очень большие объемы данных. В "серьезных" sql использовать int в качестве идентификатора считается моветон. Он ограничивает количество записей в таблице разрядностью. Обычно используют guid или как в 1С - Ссылку, что в свою очередь является разновидностью guid в двоичном формате.

(19)
А в базе 1с с которой сейчас работаю этим несколько пренебрегли(я так понимаю это норма). в результате чего приходится прошаривать все справочники документы и регистры на предмет полей по которым их можно между с собой сцепить. а это отдельный вид искусства.

(20)
сцепить по ссылке не всегда работает, поскольку ссылка - не всегда однозначно определена. А это тоже вызывает ряд вопросов

Я сразу указывал, "вспоминайте" что такое связь "Один ко многим". Как вас учили делать несколько таблиц связанных с одной по связи "один ко многим"? Вот "вспомните", тогда и в 1С поймете как устроено.
22. Alexponenta 31.03.21 15:05 Сейчас в теме
Вопрос еще один.
имеется два аналогичных запроса с разницей в одну строку условия (дата равна параметру).
Запрос идет к табличной части справочника.
Справочник и табличная часть сцеплены левым соединением
В первом запросе выводит строки с нулевым значением. (всего строк 800)
Во втором запросе отлетела все строки где количество записей равно 0.
т.е. Вместо Ссылка/Количество(ТЧ.Ссылка) Выдает Null/Null

первый запрос ГДЕ
ГДЕ
НЕ ЛицевыеСчета.ЭтоГруппа
И НЕ ЛицевыеСчета.ПометкаУдаления
Второй запрос
ГДЕ
НЕ ЛицевыеСчета.ЭтоГруппа
И НЕ ЛицевыеСчета.ПометкаУдаления
И ЛицевыеСчетаСписокЖильцов.ДатаОкончания = &ПустаяДата
23. Alexponenta 31.03.21 15:09 Сейчас в теме
(22) Во втором запросе отлетела все строки где количество записей равно 0. (Строк стало 640)

Соответственно при соединении двух результатов выдает Нулы в тех местах,где во второй таблицы нет записей с ссылкой из первой.
24. Alexponenta 31.03.21 15:13 Сейчас в теме
(23)
Прикрепленные файлы:
25. SlavaKron 31.03.21 15:20 Сейчас в теме
(22) При левом соединении, условие на присоединяемую таблицу (ЛицевыеСчетаСписокЖильцов) следует писать в условиях связи, а не в секции ГДЕ. Иначе левое соединение превращается во внутреннее, так как сравнение с NULL всегда возвращает ложь.
26. nomad_irk 81 31.03.21 15:22 Сейчас в теме
Тему уже давно можно переименовать в "Написание запросов", т.к. к 1С это имеет ну ОЧЕНЬ посредственное отношение
27. Alexponenta 31.03.21 15:54 Сейчас в теме
28. Alexponenta 05.04.21 10:34 Сейчас в теме
(25) Обе таблицы помещаются во временные таблицы. А потом третим пакетом запросов две таблицы сцепляются по ссылке.
29. Alexponenta 05.04.21 16:34 Сейчас в теме
(25)

Нет. Первым запросом формируется одна таблица помещается во временную.(828 записей)
Вторым запросов из этого же регистра формируется вторая временная таблица.(620 записей)
Далее две таблицы третьим запросом сцепляются по ссылке левым соединением.
и соответственно где во второй таблице записей нет для первой, там прописывает Null и в ссылку и в значение. А нужно чтобы была ссылка и "0". Я хотел чтобы во втором запросе было тоже 828 записей но видно из-за условия часть строк убирается.
30. SlavaKron 05.04.21 17:05 Сейчас в теме
(29) Мой комментарий касался только второго запроса, псевдо-схему которого вы привели:
Второй запрос
ГДЕ
НЕ ЛицевыеСчета.ЭтоГруппа
И НЕ ЛицевыеСчета.ПометкаУдаления
И ЛицевыеСчетаСписокЖильцов.ДатаОкончания = &ПустаяДата

Учитывая, что в тексте фигурируют имена 2-х таблиц (ЛицевыеСчета и ЛицевыеСчетаСписокЖильцов), я предположил, что второй запрос строится левым соединением ТЧ СписокЖильцов к справочнику ЛицевыеСчета, поэтому и проблему я предложил решить на уровне 2-го запроса.
31. Alexponenta 06.04.21 09:41 Сейчас в теме
(30) а если относительно ситуации с тремя запросами?
Как бы костыль ситуации я нашел:
Ссылка из первой таблицы, столбец с данными первого запроса, ЕстьNull( столбец с данными второго запроса)

Но... требуется 4-й столбец где будет сумма. и вот тут уже проблема. поскольку что угодно + нулл = нулл
32. FatPanzer 06.04.21 09:43 Сейчас в теме
(31)
ЧтоУгодно + ЕСТЬNULL(ДругоеЧтоУгодно, 0)
Alexponenta; +1 Ответить
33. Alexponenta 06.04.21 09:44 Сейчас в теме
(32) Ммм... а вот об этом я чет не подумал.
34. UtSpar 137 11.04.21 02:10 Сейчас в теме
Правила запросов те же, разве что некоторые моменты в SQL конвертируются в три этажа. например ГДЕ А,Б в (ВЫБРАТЬ А, Б из Таблица).

Можно прямо в базе SQL по соответствующим таблицам пособирать запросы. А потом консоль запросов ( на сайте ИТС да и здесь можно любую).
Раз есть опыт SQL можно писать на 1С, потом смотреть как запрос конвертируется в SQL)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот