Некоторые полезные новичкам платформы 1С8.х приёмы работы с запросами

Опубликовал RealEscander в раздел Программирование - Практика программирования

В статье приведено несколько приёмов работы с запросами повышающие эффективность работы программиста

 

Как известно основой работы по отбору данных на платформе 1С-Предприятие 8.х являются запросы, в этом кратком материале, не претендующем на полноту, приводится несколько простых приёмов работы с запросами на мой взгляд, представляющих интерес для новичков. Все приёмы будут приводиться в тексте запросов, после кода будет даваться краткое пояснение. Большинство приёмов рассчитаны на традиционную парадигму кодирования на 1С8.Х, а именно: вынесение многократно используемого кода в общие модули, стремление к написанию более компактного и более читаемого кода, написание универсальных процедур и функций. Запросы выбраны для примеров самые простые, что-бы лучше был виден сам приём а не терялся в глубине кода.

 

1.       1.Обработка  пустого результата в самом запросе.

Запрос.Текст = "ВЫБРАТЬ
|    Номенклатура.Ссылка,
|      ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток,0)
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, )
|    КАК ОстаткиНоменклатурыОстатки
|        ПО ОстаткиНоменклатурыОстатки.Номенклатура = Номенклатура.Ссылка"

 

  Что это даёт: в результате работы запрос может возвращать значение типа «Null». В этом случае работа с результатом запроса выдаст ошибку, т.к. значение типа "Null" не может быть преоблазовано к значению другого вида (число, строка и др.). Функция ЕСТЬNULL() прямо в запросе произведёт проверку возвращаемого результата. Такой приём позволяет несколько разгрузить клиентскую часть, в случае многократного использования запроса вынесенного в общий модуль позволит сократить строки кода.

 

2.Построение многовариантного запроса.

Процедура ОбщийОтбор(Тип, МоментВремени)
Запрос.Текст ="ВЫБРАТЬ
|             ОстаткиНоменклатурыОстатки.КоличествоОстаток
|ИЗ
|             РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, ) КАК |ОстаткиНоменклатурыОстатки"
Если Тип=1 Тогда
 СтрЗаменить(Запрос.Текст," .ОстаткиНоменклатуры.", ".ОстаткиИмущества.");

КонецЕсли;

Результат = Запрос.Выполнить();

 

  Что это даёт: выполнение над текстом запроса операции «СтрЗаменить» до команды «Запрос.Выполнить()» позволяет сделать универсальный  и легко читаемый запрос над разными схожими по структуре регистрами.  Конечно, можно было вынести имя регистра в переменную ну например «ИмяРегистра»  тогда-бы запрос имел вид :

"ВЫБРАТЬ
|             ОстаткиНоменклатурыОстатки.КоличествоОстаток
|ИЗ
|             РегистрНакопления. "+ИмяРегистра+".Остатки(&МоментВремени, ) КАК |ОстаткиНоменклатурыОстатки"
 

Но в этом случае мы теряем возможность правки текста запроса посредством конструктора запросов, что в случае сложных запросов является серьёзным недостатком

3.       Использование функции Значение.

 

"ВЫБРАТЬ
             КонтактСКлиентом.Контрагент,
             КонтактСКлиентом.ВидКонтакта,
             КонтактСКлиентом.Заголовок,
             КонтактСКлиентом.Тема,
             КонтактСКлиентом.МоментВремени
ИЗ
             Документ.КонтактСКлиентом КАК КонтактСКлиентом
ГДЕ
             КонтактСКлиентом.ВидКонтакта = ЗНАЧЕНИЕ(Перечисление.ВидыКонтактов.Звонок)"


Что это даёт: если этот запрос отбирает только один вид контакта, то нет необходимости передавать вид контакта в качестве параметра в запрос.

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

 

4.       Выгрузка результатов запроса в табличную часть.

 

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

ТаблицаЗакупок = Запрос.Выполнить().Выгрузить();
Движения.Закупки.Загрузить(ТаблицаЗакупки);


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

 

5.       Добавление необходимых значений в результат запроса.

 

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

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

                Запрос.УстановитьПараметр("ДатаПриобретения", ДатаОтбора);
               Запрос.УстановитьПараметр("Поставщик",ВыбраныйПоставщик);

ТаблицаЗакупок = Запрос.Выполнить().Выгрузить();
Движения.Закупки.Загрузить(ТаблицаЗакупки);

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

 

6.       Передача массива в качестве параметра.

"ВЫБРАТЬ
|             КонтактСКлиентом.Контрагент,
|             КонтактСКлиентом.ВидКонтакта,
|             КонтактСКлиентом.Заголовок,
|             КонтактСКлиентом.Тема,
|             КонтактСКлиентом.МоментВремени
|ИЗ
|             Документ.КонтактСКлиентом КАК КонтактСКлиентом
|ГДЕ
|             КонтактСКлиентом.ВидКонтакта  В (&ВидыКонтактов)"

               ВидыКонтактов = Новый Массив;
               ВидыКонтактов.Добавить(Перечисления.ВидыКонтактов.Звонок);
               ВидыКонтактов.Добавить(Перечисления.ВидыКонтактов.Письмо);
               ВидыКонтактов.Добавить(Перечисления.ВидыКонтактов.Встреча);
               Запрос.УстановитьПараметр("ВидыКонтактов ", ВидыКонтактов);

Что это даёт: текст запроса остаётся читабельным, количество параметров не зашкаливает, трафик данных между клиентом и сервером минимальный.

 

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

Текст, демонстрирующий сразу несколько приёмов, текст кода находится в модуле объекта документа (естественно в оригинале код немного сложнее и движения выполняются по нескольким регистрам), код написан для платформы 1С8.2 :

 

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

   Движения.ОстаткиНоменклатуры.Записывать = Истина;
          ВыполнитьДвиженияОстаткиНоменклатуры();
КонецПроцедуры

Процедура ВыполнитьДвиженияОстаткиНоменклатуры() Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст =" ВЫБРАТЬ
|            РеализацияТоваровТовары.Номенклатура,
|            РеализацияТоваровТовары.Сумма,
|            РеализацияТоваровТовары.Качество,
|            РеализацияТоваровТовары.Ссылка.Дата КАК Период,
|            ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения
|        ИЗ
|            Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|        ГДЕ
|            РеализацияТоваровТовары.Ссылка =&Ссылка
|            И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> Значение(Перечисления.ВидыНоменкклатуры.Услуга)";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);

    Результат = Запрос.Выполнить();
    Движения.ОстаткиНоменклатуры.Загрузить(Результат.Выгрузить());
    Движения.ОстаткиНоменклатуры.Записать();

КонецПроцедуры



Что делает этот код:  процедура "ОбработкаПроведения" вызывает процедуру "ВыполнитьДвиженияОстаткиНоменклатуры" (Далее просто процедура).  Процедура выполняет запрос, с единственным параметром "Ссылка" (это ссылка на наш документ - выполняющий функцию регистратора движений регистра). Запрос возвращет весь перечень номенклатуры документа кроме номеклатуры имеющей тип "Услуга", результат запроса выгружается в таблицу и из таблицы загружается в регистр "РегистрыНакопления.ОстаткиНоменклатуры"(вид регистра - регистр остатков).

Справочно, структура регистра:

Измерения:

    Номенклатура - СправочникСсылка.Номенклатура

   Качество - ПеречислениеСсылка.Качество

Ресурсы:

   Количество - Число 15.3

 

Вместо эпилога: Уважаемые читатели, в общем статья была написана на коленке (писал сразу из головы (даже не в конструкторе/консоли запросов) , не спрашивайте почему так получилось - не скажу!) за полчаса..., в начале февраля выйдет переработанная и несколько расширенная статья (извините, но год закончился - пошла отчётностью, нововведения в законодательстве,.... времени не хватает совсем), если у кого-то есть пожелания увидеть что-то конкретное - пишите в коменты, постараюсь всё учесть. Обязательно напишу про простейшие приёмы и принципы оптимизации в запросах. Новая статья будет так-же написана максимально простым языком новичка для новичков, но надеюсь будет более продумана и не вызовет столько нареканий...

Всех с Крещением Господним!

И успехов всем нам в нашем нелёгком труде!

19.01.2011.

См. также

Лучшие комментарии

44. alexk-is 19.01.2011 12:34
+ 37

Я снова про 5 пример
Конструкцией

| &Поставщик КАК Контрагент

избавились от "лишнего" соединения, конструкцией

|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваров.Номенклатура,
| ПоступлениеТоваров.Ссылка.Контрагент;"

добавили лишнее соединение. Ещё раз предлагаю убрать

| ПоступлениеТоваров.Ссылка.Контрагент;

Всегда считал, что правильные примеры дают правильное понимание. А вот примеры с ошибками отвлекают от того, что они должны были бы продемонстрировать.

Как вам такая демонстрация для правила ЖИ ШИ ? :)
Шищка лежить на дароге. Вазьми шищку и палажи в корман.
# Ответить
34. Spartan 19.01.2011 08:54
(0) Могу еще подсказать прикольный прием в копилку. Буквально на днях столкнулся.
Иногда бывает необходимо отобрать в запросе строки определенной длины или ограничить выборку по длине строковых реквизитов. В этом случае может помочь конструкция ПОДОБНО "____", где число нижних подчеркиваний равно нужному числу символов в строке (в рамках шаблона "_" - один произвольный символ, "%" - несколько произвольных символов). Например, мне нужно было отобрать Контрагентов (длина кода - 9) с пятизначными кодами (получаются в результате синхронизации с другой базой). В запросе написал условие:
// Между подчеркиваниями и % пробел
|ГДЕ
|    Контрагенты.Код ПОДОБНО ""_____ %""

и вуаля...
Ответили: (86)
# Ответить
53. Ish_2 20.01.2011 07:42
(51) Так и не дошло...
Слово "новичкам" означает ПОВЫШЕННОЕ требование к качеству статьи.
Открываю секрет : писать для "новичков" особенно трудно.

Ваша статья идет в разряде : "я тут чего-то накропал - мож и вам пригодится".
Ответили: (65)
+ 2 [ SirYozha; artbear; ]
# Ответить

Комментарии

1. vlad.frost 17.01.2011 19:32
В шестом запросе скобки забыли:
"КонтактСКлиентом.ВидКонтакта В (&ВидыКонтактов)"
+ 1 [ RealEscander; ]
# Ответить
2. RealEscander 17.01.2011 20:20
vlad.frost пишет:

В шестом запросе скобки забыли:

"КонтактСКлиентом.ВидКонтакта В (&ВидыКонтактов)"


Спасибо! Поправил.
# Ответить
3. anig99 17.01.2011 21:13
Значение, вроде, может использовать только предопределенные элементы
+ 1 [ RealEscander; ]
# Ответить
4. USER--1C 17.01.2011 22:01
Спасибо.
Поправьте опечатку.
Вместо "Запрос.УстановитьПараметр("ВидыКонтактов.Добавить ", ВидыКонтактов);"
наверное надо: "Запрос.УстановитьПараметр("ВидыКонтактов", ВидыКонтактов);"
Ответили: (21) (24) (25)
+ 1 [ RealEscander; ]
# Ответить
5. red80 17.01.2011 23:31
1. ...запрос может возвращать значение типа «Неопределено» NULL...
Неопределено <> NULL, не надо путать новичков.
Ответили: (21) (24) (25)
+ 1 [ RealEscander; ]
# Ответить
6. RealEscander 18.01.2011 03:08
anig99 пишет:

Значение, вроде, может использовать только предопределенные элементы


Да, т.е. все те значения к которым можно напрямую обратится в коде (например все значения констант).
Спасибо, добавлю в описаловку.
# Ответить
7. RealEscander 18.01.2011 03:09
USER--1C пишет:

Спасибо.

Поправьте опечатку.

Вместо "Запрос.УстановитьПараметр("ВидыКонтактов.Добавить ", ВидыКонтактов);"

наверное надо: "Запрос.УстановитьПараметр("ВидыКонтактов", ВидыКонтактов);"


точно! это всё копипаст... и нехватка времени
Спасибо, поправил
# Ответить
8. RealEscander 18.01.2011 03:10
red80 пишет:

1. ...запрос может возвращать значение типа «Неопределено» NULL...

Неопределено <> NULL, не надо путать новичков.


Спасибо, поправил.
# Ответить
9. alexk-is 18.01.2011 10:33
Статья не видна под Internet Explorer. Ошибки в разметке.
+ 1 [ RealEscander; ]
# Ответить
10. RealEscander 18.01.2011 10:56
alexk-is пишет:

Статья не видна под Internet Explorer. Ошибки в разметке.


Спасибо за замечание (сам IE не пользовался давно, в нём действительно не показывает)! Сейчас попробую поправить.... придётся наобум (т.к. не понял что именно сделал не так)...
# Ответить
11. RealEscander 18.01.2011 11:15
Если кто знает - подскажите что не так с разметкой или где прочитать про правила разметки, а то методом тыка не получается, а описаловку найти не удалось... :cry:
Ответили: (12)
# Ответить
12. 1cNike 18.01.2011 12:39
(11)У меня в статье http://infostart.ru/public/80338/ такая же проблема. Публикацию создавал в firefox, все корректно отображалось и отображается. Спустя два дня мне написали, что в IE текста статьи нет. Проверил со своего компа - действительно!

После плясок с бубном она таки у меня в IE отобразилась. :evil:
Сделал следующее:
1.Скопировал текст в блокнот и обратно. Отформатировал.
2.Добавил вордовский файл со статьей для тех, у кого по прежнему не отображается.
+ 1 [ Borisych; ]
# Ответить
13. RealEscander 18.01.2011 13:01
1cNike, спасибо, домой приду - буду экспериментв проводить, на работе работу работать еле успеваю.... как-бы изначально всё скопировал кнопкой "копировать из word" а исходные наброски собирал именно в ворде... ладно, не было случая что-бы не удалось победить багов! Справлюсь...
# Ответить
14. RealEscander 18.01.2011 13:28
Многократный копипаст побеждает IE!!!
# Ответить
15. alexk-is 18.01.2011 13:42
Я предполагаю, что в строке

ВидыКонтактов.Добавить("Перечисления.ВидыКонтактов.Звонок");

лишние кавычки. А строка должна выглядеть так

ВидыКонтактов.Добавить(Перечисления.ВидыКонтактов.Звонок);
+ 1 [ RealEscander; ]
# Ответить
16. RealEscander 18.01.2011 14:05
alexk-is, точно.... блин, вчера был не мой день...
# Ответить
17. Ish_2 18.01.2011 14:21
Запрос.Текст = "ВЫБРАТЬ
                    |ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток,0)
                    |ИЗ
                    |РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, ) КАК            
                    |ОстаткиНоменклатурыОстатки"
...Показать Скрыть


Вопрос автору : Для чего и когда применяется РезультатЗапроса.Пустой()?
Ответили: (18)
# Ответить
18. 1cNike 18.01.2011 15:41
(17)хоть я и не автор - отвечу:
Если РезультатЗапроса.Пустой() тогда
//запрос не выбрал ни одной записи
иначе
//хотя бы одна запись выбрана
КонецЕсли;
Удобно использовать во всевозможных проверках. Например, выбираем остатки по какой-то номенклатуре. Если РезультатЗапроса.Пустой(), значит на дату среза по такой номенклатуре нет ни одной записи в ВТ остатки.
# Ответить
19. alexk-is 18.01.2011 15:55
Программный код в тексте публикации можно раскрасить... :)
# Ответить
20. artbear 18.01.2011 16:33
(0) Пример из примера 1 некорректен :( в нем ЕСТЬNULL никогда не сработает :)
Для того, чтобы сработало, добавь параметры к виртуальной таблице, например, список товаров хотя бы :)
а еще лучше какое-нибудь простейшее соединение, например, справочник товаров и левое соединение регистра остатков.
И все-таки объясни новичкам, почему же получается Null.
из твоего объяснения этого совершенно не понятно :(
+ 2 [ SirYozha; Istur; ]
# Ответить
21. artbear 18.01.2011 16:44
(0) ИМХО также (4) и (5) некорректны :(
Колонка Регистратор автоматом не заполнится, из-за чего набор записей регистра накопления не запишется :)
# Ответить
22. RealEscander 18.01.2011 16:45
artbear, запросы писал попроще чисто с целью демонстрации. Ок, поправлю пример 1.
# Ответить
23. V_V_V 18.01.2011 16:58
RealEscander пишет:

Да, т.е. все те значения к которым можно напрямую обратится в коде (например все значения констант).

А также можно проверять на пустую ссылку (справочник, документ и пр.). Пример: ЗНАЧЕНИЕ(Документ.ПриходнаяНакладная.ПустаяСсылка)

P.S. В запросах 8.2 появилась возможность напрямую работать с ТипЗначения. Вот кто бы выложил примеры такого использования (каюсь - сам без понятия)...
# Ответить
24. artbear 18.01.2011 17:03
artbear пишет:
(0) ИМХО также (4) и (5) некорректны
Колонка Регистратор автоматом не заполнится, из-за чего набор записей регистра накопления не запишется

Не уверен, но помнится, что нужно еще колонку Активность как Истину заполнить в запросе :)
# Ответить
25. RealEscander 18.01.2011 17:03
artbear пишет:

(0) ИМХО также (4) и (5) некорректны

Колонка Регистратор автоматом не заполнится, из-за чего набор записей регистра накопления не запишется


ну пусть в табличную часть документа а не в регистр.
Ответили: (26) (27)
# Ответить
26. artbear 18.01.2011 17:16
(25) В ТЧ документа совсем все просто.
Предлагаю показать оба варианта - загрузка в ТЧ и загрузка регистра.
ИМХО О тонкостях загрузки в регистра из таблицы многие не знают :)
# Ответить
27. RealEscander 18.01.2011 18:04
artbear пишет:

(25) В ТЧ документа совсем все просто.

Предлагаю показать оба варианта - загрузка в ТЧ и загрузка регистра.

ИМХО О тонкостях загрузки в регистра из таблицы многие не знают


Ок, по многочисленым просьбам трудящихся админов выдерну прям из конфы кусок кода (слегка упростив запрос), но уверяю Вас регистратора там не было! 1С8.2 в процедуре обработкаПроведения и так его хапает на автомате.
# Ответить
28. RealEscander 18.01.2011 20:16
V_V_V пишет:



ну пусть так:

ВЫБРАТЬ
| ХозрасчетныйДвиженияССубконто.СчетКт,
| ХозрасчетныйДвиженияССубконто.СубконтоКт1,
| ХозрасчетныйДвиженияССубконто.СубконтоКт2,
| ХозрасчетныйДвиженияССубконто.Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
| &ДатаНачало,
| &ДатаОкончание,
| Активность
| И СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Касса)
| И ТИПЗНАЧЕНИЯ(Регистратор) = ""ПриходныйКассовыйОрдер"",
| ,
| ) КАК ХозрасчетныйДвиженияССубконто
# Ответить
29. RealEscander 18.01.2011 20:19
artbear пишет:


Акивность конечно надо, но это только демонстрация приёмов а не урок по написанию программ.
# Ответить
30. V_V_V 18.01.2011 21:02
(28) Не, ругается на ТИПЗНАЧЕНИЯ(Регистратор) = ""ПриходныйКассовыйОрдер""
Переделал на ТИПЗНАЧЕНИЯ(Регистратор) = ТИП(Документ.ПриходныйКассовыйОрдер) -- ругаться перестало. Разобрался, спасибо!
Хотя странно, вроде и сам так делал, а не работало...
# Ответить
31. Ish_2 18.01.2011 21:44
Публикация набрала определенное количество плюсов, поэтому теперь можно сказать "как есть".
Даже для первой публикации - количество ошибок и недочетов очень велико.
И главное - у автора большие проблемы с пониманием запросов.
Очень в этом смысле показателен "говорящий" Пример №1(в первоначальном виде) и комментарий к такому примеру :
Запрос.Текст = "ВЫБРАТЬ 
                    |ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток,0) 
                    |ИЗ 
                    |РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, ) КАК             
                    |ОстаткиНоменклатурыОстатки"
...Показать Скрыть


Это не описка и недочет. Здесь очень существенный пробел в понимании запросов.
Осталось пожелать автору более тщательно подготовиться к следующей публикации.
На снисходительное отношение в будущем будет рассчитывать очень тяжело.
Ответили: (49)
+ 2 [ Istur; artbear; ]
# Ответить
32. ulan 19.01.2011 00:20
Согласен с Ish_2 поставил плюсик, но текст тем более для новичков должен быть "вылизан" очень тщательно.
Последний 7 пример содержит грубейшую ошибку. Все процедуры и функции, расположенные в модуле документа выполняются в контексте сервера.
Это относится конечно и к процедуре ОбработкаПроведения поэтому вызывать из нее процедуру, для того чтобы выполнить ее на сервере, да и вообще использовать директиву &НаСервере для любой процедуры модуля документа занятие не только бессмысленное, не правильное но и вредное поскольку вводит людей в заблуждение.
# Ответить
33. RealEscander 19.01.2011 04:19
Ish_2, ulan, не было задачи писать мегасуперский код, только демонстрация несколько приёмов, почти все из которых мне внове и кажутся мне интересными. Оттого и запросы максимально простые.
# Ответить
34. Spartan 19.01.2011 08:54
(0) Могу еще подсказать прикольный прием в копилку. Буквально на днях столкнулся.
Иногда бывает необходимо отобрать в запросе строки определенной длины или ограничить выборку по длине строковых реквизитов. В этом случае может помочь конструкция ПОДОБНО "____", где число нижних подчеркиваний равно нужному числу символов в строке (в рамках шаблона "_" - один произвольный символ, "%" - несколько произвольных символов). Например, мне нужно было отобрать Контрагентов (длина кода - 9) с пятизначными кодами (получаются в результате синхронизации с другой базой). В запросе написал условие:
// Между подчеркиваниями и % пробел
|ГДЕ
|    Контрагенты.Код ПОДОБНО ""_____ %""

и вуаля...
Ответили: (86)
# Ответить
35. alexk-is 19.01.2011 09:17
Совершенно не раскрыта тема реализации по заказам покупателей :)

"ВЫБРАТЬ
| ВзаиморасчетыСКонтрагентами.Контрагент,
| СУММА(ВзаиморасчетыСКонтрагентами.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами
|ГДЕ
| ВЫРАЗИТЬ(ВзаиморасчетыСКонтрагентами.Регистратор КАК Документ.РеализацияТоваровУслуг).Сделка ССЫЛКА Документ.ЗаказПокупателя
|
|СГРУППИРОВАТЬ ПО
| ВзаиморасчетыСКонтрагентами.Контрагент"
# Ответить
36. RealEscander 19.01.2011 09:20
alexk-is,
предлагаете продолжить мануал?
Ответили: (38)
# Ответить
37. alexk-is 19.01.2011 09:22
В 5 примере использование конструкции

| &Поставщик КАК Контрагент

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

|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваров.Номенклатура,
| ПоступлениеТоваров.Ссылка.Контрагент;"
# Ответить
38. alexk-is 19.01.2011 09:32
(36) От простого к сложному
# Ответить
39. RealEscander 19.01.2011 09:40
alexk-is,
несколько нечестно получится к тем, кто читал изначально (первые читали одно, последние тоже +..+..+..)... логичнее тогда уж накидать часть №2, опять-же вот так халтурить что-то не хочется, читающие хотят видеть код без изъянов, как изначально планировал (минимального размера запросы, что-бы сам приём/метод/особенность использования/.... были на виду, а не образцовый код) многим глаз режет... ну короче тогда уж часть №2 через пару неделек, видимо.

Вообще не ожидал что кому-то тема будет интересна... новичков не так и много...
Ответили: (43)
# Ответить
40. VladimirSil 19.01.2011 11:18
В первом запросе всё равно не будет Null, т.к стоит левое соединение и главной таблицей будет считаться таблица Остатки номенклатуры. Если поставить правое соединение то остатки будут выводится по всему справочнику, вот тогда, если остатка не будет, то будет Null
Ответили: (49)
# Ответить
41. RealEscander 19.01.2011 11:32
VladimirSil,
ок, поправил.
# Ответить
42. rasswet 19.01.2011 11:55
доступно, четко, без "воды" и особенно порадовало "что это дает". А то часто пишут всякое и не сразу поймешь а зачем это всё надо. Спасибо. Жду продолжения)
как вариант можно по управляемым формам сделать такую штуку.
-при изменении одного реквизита, как правильно изменять другие.
-ну и РеквизитФормыВЗначение и остальные.
т.е именно приемы как правильно. а то сделать-то можно разными путями.
Ответили: (45)
# Ответить
43. alexk-is 19.01.2011 12:20
(39) Очень даже честно. Для этого и существует раздел Обновленные публикации »
# Ответить
44. alexk-is 19.01.2011 12:34
+ 37

Я снова про 5 пример
Конструкцией

| &Поставщик КАК Контрагент

избавились от "лишнего" соединения, конструкцией

|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваров.Номенклатура,
| ПоступлениеТоваров.Ссылка.Контрагент;"

добавили лишнее соединение. Ещё раз предлагаю убрать

| ПоступлениеТоваров.Ссылка.Контрагент;

Всегда считал, что правильные примеры дают правильное понимание. А вот примеры с ошибками отвлекают от того, что они должны были бы продемонстрировать.

Как вам такая демонстрация для правила ЖИ ШИ ? :)
Шищка лежить на дароге. Вазьми шищку и палажи в корман.
# Ответить
45. Ish_2 19.01.2011 13:00
(42)
доступно, четко, без "воды" и особенно порадовало "что это дает"


Я уточню , на всякий случай.
НЕ доступно, НЕ четко , С водой . "Это даёт" только неверное представление о запросах.
Сама тема ликбеза по запросам - актуальна и востребована, как оказалось.
Но такого исполнения больше не надо.
Пользователи хором исправляют ошибки автора... Как ни крути - это перебор.
+ 2 [ Rustig; artbear; ]
# Ответить
46. shadowcpu 19.01.2011 16:28
Добрый день.
У меня вопрос по примеру номер 7.
Автор указал структуру регистра:

Измерения:
Номенклатура - СправочникСсылка.Номенклатура
Качество - ПеречислениеСсылка.Качество
Ресурсы:
Количество - Число 15.3

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

Может я чего не понял...

...Вот... как-то... так.... (с)
+ 1 [ artbear; ]
# Ответить
47. RealEscander 19.01.2011 16:46
shadowcpu, точно, пока разрисовывал сегодня - потерял строку
# Ответить
48. RealEscander 19.01.2011 16:48
alexk-is,
статья себя изжила, проще "до основания разрушить а затем...", в начале февраля скорее всего.
# Ответить
49. artbear 19.01.2011 16:51
Согласен с (31) :(
(40) и (44) Это еще раз доказало.
Автор, еще учись :)
Рад, что автор поднял такую тему, но все-таки минусую, т.к. против того, чтобы статьи писались о том, что знаешь слабо :)
# Ответить
50. МagIvan 19.01.2011 22:40
(50) В принципе первый вариант статьи может быть с ошибками и недочетами. Важно потом это вовремя понять и исправиться.

Когда увидел шапку статьи и отрывки запросов, то на секундочку мне показалось, что вот, наконец то, статья по запросам. Но после прочтения, стало понятно, что статья посвещена новобранцам-бегунам первого месяца работы во франчах и прочим через чур юнным студентам. Жаль.
Ответили: (50)
# Ответить
51. RealEscander 20.01.2011 04:08
МagIvan,
в заголовке есть слово "новичкам"! Релиз 2 будет посложнее.
PS Знаю франчей, что отработав во франче пару лет не написали ни одного запроса :o вот так вот!!!
Ответили: (52) (53)
# Ответить
52. artbear 20.01.2011 07:29
(51) Предупреждаю: Если релиз2 выпустишь отдельной статьей и в ней будет повторение текущей статьи, лично закрою публикацию релиза2, т.к. обновления не заслуживают отдельной публикации.
# Ответить
53. Ish_2 20.01.2011 07:42
(51) Так и не дошло...
Слово "новичкам" означает ПОВЫШЕННОЕ требование к качеству статьи.
Открываю секрет : писать для "новичков" особенно трудно.

Ваша статья идет в разряде : "я тут чего-то накропал - мож и вам пригодится".
Ответили: (65)
+ 2 [ SirYozha; artbear; ]
# Ответить
54. Ish_2 20.01.2011 07:54
А, вообще, ликбеза по запросам на ИС не хватает.
Хоть объявляй конкурс : "Запросы для новичков !".
Статья должна содержать запросы с картинками.

Например :
Левое,Правое,Полное,Внутреннее соединения.
Каждое соединение разбирается с картинками.

Дано : "картинка" с двумя табличками
Делаем : "Левое Соединение".
Получаем : "картинка" с итоговой табличкой.
Ответили: (55)
# Ответить
55. CheBurator 20.01.2011 08:03
(54) дарю широким жестом: на! ;-)
http://ru.wikipedia.org/wiki/Join_(SQL)#LEFT_OUTER_JOIN
Ответили: (56)
# Ответить
56. Ish_2 20.01.2011 08:10
(55) Вот, оно как ! Ты и по-ненашему знаешь ?
А мне эти крючки ничего не говорят : Left,Right...
Хочу , чтоб на примере в 1с-овских терминах объяснили что это за зверь : соединение.
Ответили: (57)
# Ответить
57. CheBurator 20.01.2011 08:20
(56) http://www.ozon.ru/context/detail/id/2153652/
глава 10, стр.180 - мне помогло немножко...
.
книжка мне понравилась, как раз для такихх занятых 1Сников, которым некогда штырить в супертонкости, а надо с НДФЛами разбираться
http://www.ozon.ru/context/detail/id/2153652/
Ответили: (58)
# Ответить
58. Ish_2 20.01.2011 08:28
(57) Слабо , переписать то , что узнал на 1с-овском языке и опубликовать на ИС ?
Знаю наперед : прежде всего сам получишь пользу в смысле лучшего понимания отличий SQL и языка запрсов 1с.
Ответили: (59)
# Ответить
59. CheBurator 20.01.2011 08:55
(58) "кушать подано, садитесь жрать, пожалуйста..."
http://infostart.ru/public/76287/
Ответили: (60) (61)
# Ответить
60. Арчибальд 20.01.2011 08:57
(59) Сами они не местные...
# Ответить
61. Ish_2 20.01.2011 09:06
(59) Это я кушал. Не пойдет.
В сто раз актуальнее запросы 1с8, чем 1с++.
1с++ интересен 0.1% пользователей , т.е. отчаянным энтузиастам.
Это не для обиды - это правда.
+ 1 [ Rustig; ]
# Ответить
62. CheBurator 20.01.2011 09:10
запросы 1С++ и 8-ые в своей основе - по моему одна и таж ефигня практически. по крайней мере по синтаксису...
# Ответить
63. Rustig 20.01.2011 09:57
Я изучал запросы по книгам, и скажу вам, что все о чем написано в статье, есть в этих книгах.
http://v8.1c.ru/metod/books/#l1

1. 1С:Предприятие: от 8.0 к 8.1 (с приложением на CD-ROM)
Авторы:
Павел Белоусов - преподаватель 1С:Учебного Центра №1 (Москва, Россия)
Андрей Островерх - преподаватель учебного центра 1С-ТЕЛЛУР (Харьков, Украина)

2. 1С:Предприятие 8.1. Простые примеры разработки
Авторы - А.П. Габец и Д.И. Гончаров - преподаватели 1С-Учебного центра № 3. Книга выпущена под редакцией М.Г. Радченко.

3. 1С:Предприятие 8.1. Практическое пособие разработчика. Примеры и типовые приемы
Автор: Максим Радченко - сотрудник фирмы "1С"

На ИС рекомендую "новичкам" знакомиться со статьями с аватаром "Мы пишем запросы!", например, такая http://infostart.ru/public/79992/ .
Всем удачи! :)
+ 1 [ VMak; ]
# Ответить
64. RealEscander 20.01.2011 11:24
Ish_2, CheBurator, другого места поговорить не нашли?

Rustig, очень эквивалентная замена: вместо коротенькой статейки 3 книги (которые ещё нужно пойти и купить).
# Ответить
65. artbear 20.01.2011 11:45
(53) Молодец, хорошо сформулировал.
Вот и я об этом же, потому и минусую :(
# Ответить
66. V_V_V 20.01.2011 19:39
:D
По запросам информации мизер, тема действительно востребована. Отношение плюсов к минусам за статью говорит именно об этом.
P.S. Автор хотел как лучше, а получилось как всегда - старики заклевали... Причем реально клюют, а не конструктивно критикуют, при всем моем к ним уважении. Очень бы хотелось чтобы у автора не пропало желание писать продолжение, да и на ИС в целом...
Ответили: (67) (68)
# Ответить
67. CheBurator 20.01.2011 20:56
(66) не баись. Опыт показывает что кто желает писать - его ничем не остановишь! а клюют - это правильно. Ценность портала - в его наполнении и степени готовности материалов к использованию. так что ЖЕЛАТЕЛЬНО что все материалы д.б. вылизаны и вычищены максималльно насколько это возможно.
# Ответить
68. artbear 21.01.2011 11:01
(66) Если есть ошибки в подаче материала, обязательно нужно исправлять, нафига нужна статья с ошибками/неточностями.
Выше уже было сказано, для новичков как раз все должно быть правильно, без малейших ошибок.
# Ответить
69. Ish_2 23.01.2011 20:13
Ну , теперь когда рейтинг публикации перевалил за 90 и никто не упрекнет в том ,
что автора заклевали старожилы - можно поставить минус на публикацию.
За огромное количество ошибок и непонимание языка запросов 1с.
# Ответить
70. e.kogan 24.01.2011 16:41
до кучи:
ТаблицаЗакупок = Запрос.Выполнить().Выгрузить();
Движения.Закупки.Загрузить(ТаблицаЗакупки);

вполне можно свернуть до
Движения.Закупки.Загрузить(Запрос.Выполнить().Выгрузить());

это вам на будущее
Ответили: (72)
# Ответить
71. cool.vlad4 24.01.2011 16:49
(0) Пущай клюют - во-первых есть чему поучится, во-вторых в человеке должна быть борьба между неуверенностью в себе из-за такого клевания и уверенности, вырастающей в успехах.
ЗЫ я например благодарен ресурсу, поскольку ни какие курсы 1С не посещал(нет пока возвожности - из-за времени), а уже за полгода знакомства с 1С, отпала необходимость в стороннем программисте.
ЗЫ2 И лучше на коленке не писать - войдет в привычку. Лучше посидеть и подумать. А иной раз и отложить публикацию. Но за старания поставлю плюс.
# Ответить
72. aga_aga 25.01.2011 17:14
(70)
"это вам на будущее"
Это, конечно, так в общем случае, но все же иногда (для отладки н-р) нужно увидеть и промежуточный результат для разрешения сомнений.
# Ответить
73. Borisych 25.01.2011 23:04
может не в тему, но одной знакомой перед приемом на работу дали задачу - получить в запросе список всевозможныx комбинаций букв "а", "б", "в"
предлагайте Ваши варианты
Ответили: (74)
+ 1 [ Larisa_E; ]
# Ответить
74. I_G_O_R 25.01.2011 23:46
(73)
ВЫБРАТЬ
	"а" КАК Буква
ПОМЕСТИТЬ ВТБуквы

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

ВЫБРАТЬ
	"б"

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

ВЫБРАТЬ
	"в"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТБуквы1.Буква + ВТБуквы2.Буква + ВТБуквы3.Буква КАК Поле1
ИЗ
	ВТБуквы КАК ВТБуквы1,
	ВТБуквы КАК ВТБуквы2,
	ВТБуквы КАК ВТБуквы3
ГДЕ
	ВТБуквы1.Буква <> ВТБуквы2.Буква
			И ВТБуквы2.Буква <> ВТБуквы3.Буква
			И ВТБуквы3.Буква <> ВТБуквы1.Буква
...Показать Скрыть


результат:
абв
авб
бав
бва
ваб
вба
# Ответить
75. Borisych 26.01.2011 08:52
для их задачи условие ГДЕ не нужно использовать, т.е. комбинации ааа, абб, тоже должны были присутствовать
# Ответить
76. AVK_Alex 21.10.2011 15:20
Возможно, немного не в тему, зато - про запросы :)
А как решить, например, такую задачу:
Надо выбрать N строк из таблицы, начиная со строки номер M?
Ответили: (77)
# Ответить
77. romansun 21.10.2011 16:07
(76)
Добавлять колонку и нумеровать по порядку её (если такой, понятно, нет). На мисте есть код по нумерованию колонки в запросе.

Напрямую курсоры в 1С-ном запросе не поддерживаются (как и циклы, и условия и т.д.). Хотя мож кто костыли уже нафигачил..

Но вообще, в 1С лично я таких прикладных необходимостей пока не встречал.
# Ответить
78. RealEscander 21.10.2011 19:44
AVK_Alex пишет:
Возможно, немного не в тему, зато - про запросы :)
А как решить, например, такую задачу:
Надо выбрать N строк из таблицы, начиная со строки номер M?


В тему!
Мне реально совсем некогда но скоро надеюсь накропать часть №2.
Ваша задача имеет несколько решений. Самое простое для понимания решение такое: пакетным запросом на первом этапе отбирается N+M строк, потом они сортируются в обратном порядке и из них отбирается в качестве требуемого результата N первых строк.

Для отбора некоторого кол-ва первых строк используют указание в запросе Первые <число>, например

  "ВЫБРАТЬ ПЕРВЫЕ 100
|	План.НомерСтроки,
|	План.Сотрудник,
|	План.Подразделение
|ИЗ
|	РегистрСведений.План КАК План"
...Показать Скрыть
Ответили: (79)
# Ответить
79. Necytij 13.03.2012 23:42
(78) RealEscander,
Опять вы людям мозг начинаете забивать своими псевдо-знаниями? Вам ошибок в начале обсуждения топика мало показали?

Ваш запрос во первых не относится к таблице, в нем выборка из регистра сведений, во вторых, содержит некоторый реквизит НомерСтроки, а если уж он есть, то на него надо накладывать условие >= M <N+M, а не отбирать N + M строк, потом сортировать, и заниматься всякой лабудой. А если такого реквизита нет (как заранее упорядочивающий - "НомерСтроки"), то как вы, черт возьми, отсортируете в обратном порядке??? Не пора ли вам желтую карточку за то, что наводите людей на грабли, на мой взгляд, намеренно.

Нет упорядочивающего стрОки реквизита - никак не отберете одним запросом из произвольного места некоторое количество строк.
Разве что такое пакетного вида извращение: (никогда не должно быть использовано в практическом решении, так это сильный проигрыш в производительности, и лишь для того чтобы поставить галочку, что это можно сделать одним хоть и многоуровневым запросом)
Обязательные условия:
1. исходная таблица данных должна быть упорядочена.
2. наличие некоторого уникального столбца-ключа или составного ключа
Запрос строится в 3 пакета:
Выбрать запросом первые N + M строк в ВТ, вторым пакетом из нее выбрать первые (М - 1) значения ключа в ВТ2, и в третьем пакете запроса выбрать все записи из первого где "не столбец В (ВТ2)" для ключа-столбца или "НЕ (столбецКлюча1,столбецКлюча2,...столбецКлючаХ) В (ВТ2)" для составного ключа.
Ответили: (80)
# Ответить
80. RealEscander 14.03.2012 06:59
(79)"Ваш запрос во первых не относится к таблице"
Есть табличная часть документа, есть таблица значений, есть таблица регистра сведений (он всегда и есть 1 таблица в отличии, например, от регистров накопления). Я не на форуме телепатов и если где-то нечётко описана задача - понимаю исключительно в свою пользу. ЧЯДНТ?
Ответили: (81)
# Ответить
81. Necytij 14.03.2012 10:24
(80) RealEscander,
Ладно, может я и погорячился насчет таблицы. Но ваши ответы скорее уходы от правильного поиска решения, и именно потому что
понимаю исключительно в свою пользу.
# Ответить
82. plastilin 07.11.2012 20:05
спасибо отличная статья
# Ответить
83. Sergeant82 08.11.2012 11:40
Не без косяков, но пару полезностей подчерпнул. Плюсик.
# Ответить
84. bayce 06.11.2013 03:00
мне понравилась статья.
написана простым и понятным языком.
# Ответить
85. agrustny 26.04.2014 01:48
Все из 1 и 2 частей статьи знаю, но она мне очень понравилась. Браво!
# Ответить
86. tehas 18.11.2015 17:56
(34) Spartan, я для себя (что бы всегда было где посмотреть пример) сделал статью с примерами
Оператор проверки строки ПОДОБНО в запросе 1С 8
# Ответить
87. JohnConnor 15.01.2016 05:09
во 2 примере будет выдавать ошибку
Встроенная функция может быть использована только в выражении. (СтрЗаменить)
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл