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

См. также

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

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

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

10000 руб.

02.09.2020    124914    682    389    

732

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    2228    andrey_sag    10    

28

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

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

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

13.02.2024    6005    KawaNoNeko    23    

25

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

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

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

1 стартмани

31.01.2024    2148    2    Yashazz    0    

31

Запрос 1С copilot

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

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

5 стартмани

15.01.2024    6632    31    mkalimulin    27    

51

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

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

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

14.12.2023    1879    vandalsvq    7    

29

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

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

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

06.12.2023    5625    user1923546    26    

46

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

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

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

11.10.2023    16593    skovpin_sa    14    

101
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 6534 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 6534 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 6534 18.01.11 15:55 Сейчас в теме
Программный код в тексте публикации можно раскрасить... :)
+
20. artbear 1522 18.01.11 16:33 Сейчас в теме
(0) Пример из примера 1 некорректен :( в нем ЕСТЬNULL никогда не сработает :)
Для того, чтобы сработало, добавь параметры к виртуальной таблице, например, список товаров хотя бы :)
а еще лучше какое-нибудь простейшее соединение, например, справочник товаров и левое соединение регистра остатков.
И все-таки объясни новичкам, почему же получается Null.
из твоего объяснения этого совершенно не понятно :(
EvgeniyOlxovskiy; SirYozha; Istur; +3
21. artbear 1522 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 1522 18.01.11 17:03 Сейчас в теме
artbear пишет:
(0) ИМХО также (4) и (5) некорректны
Колонка Регистратор автоматом не заполнится, из-за чего набор записей регистра накопления не запишется

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

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

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


ну пусть в табличную часть документа а не в регистр.
+
26. artbear 1522 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 1522 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 6534 19.01.11 09:17 Сейчас в теме
Совершенно не раскрыта тема реализации по заказам покупателей :)

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

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

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

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

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


Я уточню , на всякий случай.
НЕ доступно, НЕ четко , С водой . "Это даёт" только неверное представление о запросах.
Сама тема ликбеза по запросам - актуальна и востребована, как оказалось.
Но такого исполнения больше не надо.
Пользователи хором исправляют ошибки автора... Как ни крути - это перебор.
RustIG; artbear; +2
44. alexk-is 6534 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

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

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

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

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

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

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

Дано : "картинка" с двумя табличками
Делаем : "Левое Соединение".
Получаем : "картинка" с итоговой табличкой.
+
55. CheBurator 3119 20.01.11 08:03 Сейчас в теме
(54) дарю широким жестом: на! ;-)
http://ru.wikipedia.org/wiki/Join_(SQL)#LEFT_OUTER_JOIN
Арчибальд; +1
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. Арчибальд 2707 20.01.11 08:57 Сейчас в теме
(59) Сами они не местные...
+
61. Ish_2 1104 20.01.11 09:06 Сейчас в теме
(59) Это я кушал. Не пойдет.
В сто раз актуальнее запросы 1с8, чем 1с++.
1с++ интересен 0.1% пользователей , т.е. отчаянным энтузиастам.
Это не для обиды - это правда.
RustIG; +1
62. CheBurator 3119 20.01.11 09:10 Сейчас в теме
запросы 1С++ и 8-ые в своей основе - по моему одна и таж ефигня практически. по крайней мере по синтаксису...
+
63. RustIG 1556 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/ .
Всем удачи! :)
VMak; +1
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 1522 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 примере
| РегистрНакопления. "+ИмяРегистра+".Остатки(&МоментВремени, ) КАК |ОстаткиНоменклатурыОстатки"
в конце нужны еще одни " в конце
+
Оставьте свое сообщение