gifts2017

Некоторые полезные новичкам платформы 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.

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

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


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

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


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

Спасибо.

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

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

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


точно! это всё копипаст... и нехватка времени
Спасибо, поправил
8. Александр Шемякин (RealEscander) 18.01.11 03:10
red80 пишет:

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

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


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

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


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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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


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



ну пусть так:

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


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


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

и вуаля...
OlegK; lmm; p1l1gr1m; Rustig; RealEscander; +5 Ответить 1
35. Алексей Константинов (alexk-is) 19.01.11 09:17
Совершенно не раскрыта тема реализации по заказам покупателей :)

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

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

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

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

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

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

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

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

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

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

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

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

Как вам такая демонстрация для правила ЖИ ШИ ? :)
Шищка лежить на дароге. Вазьми шищку и палажи в корман.
Doom2w; AgregatAvia; BoryaMbi; SirYozha; Rustig; artbear; +6 Ответить
45. Игорь Исхаков (Ish_2) 19.01.11 13:00
(42)
доступно, четко, без "воды" и особенно порадовало "что это дает"


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

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

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

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

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

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

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

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

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

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

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

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

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

ВЫБРАТЬ
	"б"

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

ВЫБРАТЬ
	"в"
;

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


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

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

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


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

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

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

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

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