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

17.01.11

Разработка - Запросы

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

 

Как известно основой работы по отбору данных на платформе 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.

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122114    670    389    

714

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5746    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6284    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1742    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5388    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16181    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. vlad.frost 186 17.01.11 19:32 Сейчас в теме
В шестом запросе скобки забыли:
"КонтактСКлиентом.ВидКонтакта В (&ВидыКонтактов)"
RealEscander; +1 Ответить
2. RealEscander 496 17.01.11 20:20 Сейчас в теме
vlad.frost пишет:

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

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


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

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


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

Спасибо.

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

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

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


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

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

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


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

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


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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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


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



ну пусть так:

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


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


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

и вуаля...
EvgeniyOlxovskiy; OlegK; lmm; p1l1gr1m; RustIG; RealEscander; +6 Ответить
86. tehas 44 18.11.15 17:56 Сейчас в теме
(34) Spartan, я для себя (что бы всегда было где посмотреть пример) сделал статью с примерами
Оператор проверки строки ПОДОБНО в запросе 1С 8
35. alexk-is 6533 19.01.11 09:17 Сейчас в теме
Совершенно не раскрыта тема реализации по заказам покупателей :)

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

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

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

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

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


Я уточню , на всякий случай.
НЕ доступно, НЕ четко , С водой . "Это даёт" только неверное представление о запросах.
Сама тема ликбеза по запросам - актуальна и востребована, как оказалось.
Но такого исполнения больше не надо.
Пользователи хором исправляют ошибки автора... Как ни крути - это перебор.
RustIG; artbear; +2 Ответить
44. alexk-is 6533 19.01.11 12:34 Сейчас в теме
+ 37

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

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

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

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

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

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

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

Как вам такая демонстрация для правила ЖИ ШИ ? :)
Шищка лежить на дароге. Вазьми шищку и палажи в корман.
EvgeniyOlxovskiy; Doom2w; AgregatAvia; BoryaMbi; SirYozha; RustIG; artbear; +7 Ответить
46. shadowcpu 19.01.11 16:28 Сейчас в теме
Добрый день.
У меня вопрос по примеру номер 7.
Автор указал структуру регистра:

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

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

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

...Вот... как-то... так.... (с)
47. RealEscander 496 19.01.11 16:46 Сейчас в теме
shadowcpu, точно, пока разрисовывал сегодня - потерял строку
48. RealEscander 496 19.01.11 16:48 Сейчас в теме
alexk-is,
статья себя изжила, проще "до основания разрушить а затем...", в начале февраля скорее всего.
50. RailMen 823 19.01.11 22:40 Сейчас в теме
(50) В принципе первый вариант статьи может быть с ошибками и недочетами. Важно потом это вовремя понять и исправиться.

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

Ваша статья идет в разряде : "я тут чего-то накропал - мож и вам пригодится".
SirYozha; artbear; +2 Ответить
65. artbear 1448 20.01.11 11:45 Сейчас в теме
(53) Молодец, хорошо сформулировал.
Вот и я об этом же, потому и минусую :(
54. Ish_2 1104 20.01.11 07:54 Сейчас в теме
А, вообще, ликбеза по запросам на ИС не хватает.
Хоть объявляй конкурс : "Запросы для новичков !".
Статья должна содержать запросы с картинками.

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

Дано : "картинка" с двумя табличками
Делаем : "Левое Соединение".
Получаем : "картинка" с итоговой табличкой.
55. CheBurator 3119 20.01.11 08:03 Сейчас в теме
56. Ish_2 1104 20.01.11 08:10 Сейчас в теме
(55) Вот, оно как ! Ты и по-ненашему знаешь ?
А мне эти крючки ничего не говорят : Left,Right...
Хочу , чтоб на примере в 1с-овских терминах объяснили что это за зверь : соединение.
57. CheBurator 3119 20.01.11 08:20 Сейчас в теме
(56) http://www.ozon.ru/context/detail/id/2153652/
глава 10, стр.180 - мне помогло немножко...
.
книжка мне понравилась, как раз для такихх занятых 1Сников, которым некогда штырить в супертонкости, а надо с НДФЛами разбираться
http://www.ozon.ru/context/detail/id/2153652/
58. Ish_2 1104 20.01.11 08:28 Сейчас в теме
(57) Слабо , переписать то , что узнал на 1с-овском языке и опубликовать на ИС ?
Знаю наперед : прежде всего сам получишь пользу в смысле лучшего понимания отличий SQL и языка запрсов 1с.
59. CheBurator 3119 20.01.11 08:55 Сейчас в теме
(58) "кушать подано, садитесь жрать, пожалуйста..."
http://infostart.ru/public/76287/
60. Арчибальд 2706 20.01.11 08:57 Сейчас в теме
(59) Сами они не местные...
61. Ish_2 1104 20.01.11 09:06 Сейчас в теме
(59) Это я кушал. Не пойдет.
В сто раз актуальнее запросы 1с8, чем 1с++.
1с++ интересен 0.1% пользователей , т.е. отчаянным энтузиастам.
Это не для обиды - это правда.
62. CheBurator 3119 20.01.11 09:10 Сейчас в теме
запросы 1С++ и 8-ые в своей основе - по моему одна и таж ефигня практически. по крайней мере по синтаксису...
63. RustIG 1351 20.01.11 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/ .
Всем удачи! :)
64. RealEscander 496 20.01.11 11:24 Сейчас в теме
Ish_2, CheBurator, другого места поговорить не нашли?

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

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

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

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

ВЫБРАТЬ
	"б"

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

ВЫБРАТЬ
	"в"
;

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


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

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

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


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

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

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

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

Нет упорядочивающего стрОки реквизита - никак не отберете одним запросом из произвольного места некоторое количество строк.
Разве что такое пакетного вида извращение: (никогда не должно быть использовано в практическом решении, так это сильный проигрыш в производительности, и лишь для того чтобы поставить галочку, что это можно сделать одним хоть и многоуровневым запросом)
Обязательные условия:
1. исходная таблица данных должна быть упорядочена.
2. наличие некоторого уникального столбца-ключа или составного ключа
Запрос строится в 3 пакета:
Выбрать запросом первые N + M строк в ВТ, вторым пакетом из нее выбрать первые (М - 1) значения ключа в ВТ2, и в третьем пакете запроса выбрать все записи из первого где "не столбец В (ВТ2)" для ключа-столбца или "НЕ (столбецКлюча1,столбецКлюча2,...столбецКлючаХ) В (ВТ2)" для составного ключа.
80. RealEscander 496 14.03.12 06:59 Сейчас в теме
(79)"Ваш запрос во первых не относится к таблице"
Есть табличная часть документа, есть таблица значений, есть таблица регистра сведений (он всегда и есть 1 таблица в отличии, например, от регистров накопления). Я не на форуме телепатов и если где-то нечётко описана задача - понимаю исключительно в свою пользу. ЧЯДНТ?
81. Necytij 14.03.12 10:24 Сейчас в теме
(80)
Ладно, может я и погорячился насчет таблицы. Но ваши ответы скорее уходы от правильного поиска решения, и именно потому что
понимаю исключительно в свою пользу.
82. plastilin 8 07.11.12 20:05 Сейчас в теме
спасибо отличная статья
83. Sergeant82 08.11.12 11:40 Сейчас в теме
Не без косяков, но пару полезностей подчерпнул. Плюсик.
84. bayce 45 06.11.13 03:00 Сейчас в теме
мне понравилась статья.
написана простым и понятным языком.
85. agrustny 19 26.04.14 01:48 Сейчас в теме
Все из 1 и 2 частей статьи знаю, но она мне очень понравилась. Браво!
87. JohnConnor 64 15.01.16 05:09 Сейчас в теме
во 2 примере будет выдавать ошибку
Встроенная функция может быть использована только в выражении. (СтрЗаменить)
88. noxomb 24.07.23 05:23 Сейчас в теме
во 2 примере
| РегистрНакопления. "+ИмяРегистра+".Остатки(&МоментВремени, ) КАК |ОстаткиНоменклатурыОстатки"
в конце нужны еще одни " в конце
Оставьте свое сообщение