Запросы в 1С

 

Оптимизация запросов

https://its.1c.ru/db/v8std/content/658/hdoc

https://stimul.kiev.ua/materialy.htm?a=ispolzovanie_logicheskogo_ili_v_usloviyakh_zaprosov

 Главная / Инструкции по разработке на 1С / Методические материалы для разработчиков и администраторов 1С / 1С:Предприятие 8. Система стандартов и методик разработки конфигураций / Реализация обработки данных / Оптимизация запросов */ Эффективные условия запросов 

Пишут:

.. не следует использовать ИЛИ в условиях запросов: в разделе ГДЕ; в разделе ПО

(сложный материал, разобраться при случае).

 

Видеообучалки по конструктору  запросов

часть 1 https://www.youtube.com/watch?v=Awvv-cJ7sdg

часть 2 https://www.youtube.com/watch?v=q5jmxKCaFoA

 

Текстовый материал к обучалкам http://programmist1s.ru/opisanie-konstruktora-zaprosov-1s/

Чел говорит, что они "писали ручками" запросы в консоли запросов, а можно было эти запросы просто натыкать в конструкторе запросов.

Во второе окошко перетаскиваются объекты для раздела выбрать "ИЗ"". Для виртуальных таблиц можно задать параметры и условия.

Если запрос создается временную таблицу, то временные таблицы будут также видны в левом окошке как источники данных для последующих запросов.

В третье окошко копируются поля, которые необходимо "ВЫБРАТЬ".

 

Секция "УСЛОВИЯ" в конструкторе - это секция ГДЕ в запросе.

 

Закладка "Группировка" - в верхней части поля, по которым просходит группировка. В нижней части указываются, по которым идет подсчет (суммирование, среднее, количество значений, количество различных, минимум, максимум (какая-либо агрегатная функция). Вид запроса показан на 3:33.

Закладка "Объединения/Псевдонимы". Обычные поля в левом столбце не выделены, а псевдонимы выделены жирным шрифтом. МОжно менять названия полей на псевдонимы в этой вкладе, запрос изменится автоматически.

Закладка "Связи" позволяет настроить соединения между таблицами.

Если выбираются данные из одной таблицы, то  вкладка "Связи" не отображается.

Если выбрать несколько таблиц-источников, по общим полям настраивается соединение.

- Галочки В(Все) -В(Все)  - означает полное соединие.

- Сброшенные галочки - означает внутреннее соединение.

- Одна из галочек даст правое (левое) соединение. Если выбрать ВСЕ справа, то в запрос будет левое соединение, просто исходные данные поменяются местами.

 

Урок 1, начиная 5-34, объясняет, как настроить "объединение" запросов.

Объединение - это слияние строк двух запросов в одну общую таблицу.

Соединение - это слияние столбцов из двух таблиц в одну общую таблицу.

 

 В комментах пишут: для ввода амперсанда (&) на клавиатуре нажимается Alt+3, затем 8.

 

На 7:22 во вкладке "Объединения/псевдонимы" копирует существующий запрос. (Есть такая возможность!) Новый запрос отображается на вкладке с правой части экрана. После условие во втором запросе модифицирует.

Ничего не понял!

Во вкладке "Условия" галочке в поле "Произвольное (условие)"  дает возможность указать произвольное условие (скажем, равенство значению перечисления). Если галочка не стоит, то выбранное значение будет восприниматься как параметр.

При объединении запросов во вкладке "Объединения" идут колонки по количеству объединяемых запросов, и в столбике объединяемые поля каждого источника.

 

Вкладка "Упорядочивание"

можно выбрать конкретные поля для упорядочивания и порядок сортировки;

можно установить галочку "Автоупорядочивание".

 

 

Оператор ВЫБОР в запросах 1С 26.05.23

Про оператор ВЫБОР в запросах 1С

https://1s83.info/koding/vybor-kogda-togda-v-zaprose-1s-8-3.html



Вот фрагмент из отчета в консоли отчетов (выводит марки для загрузки в Алкоюнит), файл "ИтогОтчетПоМаркам35.dcf"

С релиза 2.0.30.05 в Далиона изменилось:

Для документа ЕГАИС_ТТН марка стала получать значение "Считана=Истина", если она напрямую сканирована

Если марка принята при сканировании штрихкода групповой упаковки, тогда ПринятаПоШКТары=Истина.

Чтобы в одну графу выводить результат сканирования марки, сделал ВЫБОР:

ВЫБРАТЬ
      ЕГАИС_ТТНДанныеМарок.Марка КАК Марка,
      ЕГАИС_ТТНДанныеМарок.Ссылка.Номер КАК Номер,
      ЕГАИС_ТТНДанныеМарок.Ссылка.Грузоотправитель КАК Грузоотправитель,
      ВЫБОР
      КОГДА ЕГАИС_ТТНДанныеМарок.Считана=Истина
      ТОГДА "Считана"
      КОГДА ЕГАИС_ТТНДанныеМарок.ПринятаПоШКТары=Истина Тогда "ПринятаПоШКтары"
      ИНАЧЕ
      "Не считана" КОНЕЦ
      КАК Считана,
      ЕГАИС_ТТНДанныеМарок.ИдентификаторСтроки КАК ДМИдентификаторСтроки
ПОМЕСТИТЬ ВТ_Марки
ИЗ
Документ.ЕГАИС_ТТН.ДанныеМарок КАК ЕГАИС_ТТНДанныеМарок
ГДЕ
ЕГАИС_ТТНДанныеМарок.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон  И (ЕГАИС_ТТНДанныеМарок.Считана=True) ИЛИ (ЕГАИС_ТТНДанныеМарок.ПринятаПоШКтары=Истина);



Интересно, что:

Условия для полей источника в запросе действуют, даже если поля, которые в условиях, отсутствует в разделе "ВЫБРАТЬ".

Так что по запросу выбираются поля, указанные в разделе "выбрать", а также дополнительные поля, указанных в условиях!



После изменения запроса изменился порядок колонок в выходном отчете:

Пока Считано выводилось как значение поля ЕГАИС_ТТНДанныеМарок.Считана,

оно выводилось до марки.

Когда в графе Считано стал выводится результат выбора, это попало уже в после марки. Что изменилось?



Вопрос: как увидеть легко содержание временных таблиц, не выводя их в отчет? Есть ли такая возможность?

Это намного бы упростило отладку запросов!

 

 

Группировка в запросах. Ошибка "Поле не входит в группу"

Группировка в запросах НЕОБХОДИМА, чтобы по группировочным полям посчитать показатели:

суммa

максимум

минимум

среднее

количество

количество (различные ПОЛЕ).



Пример запроса с группировкой и получением суммы по полю:

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


Если не сделать группировку, выйдет ошибка

Поле не входит в группу "ОКС.Номенклатура"

<<?>>ОКС.Номенклатура КАК НоменклатураОКС


В конструкторе запросов агрегатные функции доступны во вкладке "Группировка"

 

Вот детальная информация https://capitally.ru/1c-development/zaprosy/gruppirovka-v-zaprose/

В статье пишут:

"Допускается использование математических операторов над функциями группировки (+,*,/,-), а также конструкция ВЫБОР и поверх агрегата и внутри (в зависимости от потребностей)"

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

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


Пример запроса, который в консоли отчетов 1С позволяет открывать  карточки номенклатуры из отчетов

Нужно в запросе вывести реквизит

Номенклатура.Ссылка КАК НоменклатураСсылка

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

Важно сделать псевдоним "НоменклатураСсылка", а не "Ссылка", т. к. ссылок много, и поле "Ссылка" не получится добавить в поле "Выбранные поля" для вывода отчета.

 

Еще ошибки в запросах

Ошибка:

Если текст запроса формируется в коде 1С, важно правильно ставить кавычки и запятые, иначе на такой код

|ГДЕ
| Док.ДокументОснование = &ТекСсылка;"
|
|УПОРЯДОЧИТЬ ПО
| КатегорияЦен";

выдаст ошибку:

{(8, 1)}: Ожидается выражение "ВЫБРАТЬ"
<<?>>УПОРЯДОЧИТЬ ПО

 

Ошибка

Вот такой текст запроса выдает ошибку

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Док.Ссылка,
| Док.КатегорияЦен КАК КатегорияЦен
|ИЗ
| Документ.АктПереоценки КАК Док
|ГДЕ
| Док.ДокументОснование = &amp;ТекСсылка
|
|УПОРЯДОЧИТЬ ПО
| КатегорияЦен";

по причине:

{(2, 2)}: Поле не входит в группу "Док.Ссылка"
<<?>>Док.Ссылка,

РСА Исправил название полей, и все заработало!

Потому что правильно:

|УПОРЯДОЧИТЬ ПО
| Док.КатегорияЦен";

 

Неправильно:

|УПОРЯДОЧИТЬ ПО
| КатегорияЦен"; // РСА В том исходном запросе так было можно, а в моем уже нельзя!

  

В консоли отчетов делать

Добавлять заголовки отчета в настройки отчета, чтобы понимать из сохраненных отчетов, какой версией настройки получен отчет, какие применялись отборы, группировки и сортировки.

Заменять названия колонок (длинные название исходных поле) на краткие читаемые в таблице исходных данных

В таблице исходных данных указывать форматирование данных (формат даты, минимальная и макс ширина колонок)

 

Передать значение справочника или перечисления в параметры запроса

Вариант: Передать предпределенное значение справочника в запросе, или в коде модулей 1С

https://capitally.ru/1c-development/zaprosy/znachenie-v-zaprose-v-1s/

В коде модулей обращение к таким элементам производится через менеджер объекта, например:

Ссылка = Справочники.ВидыНоменклатуры.Услуга;

Ссылка = ПланыСчетов.Хозрасчетный.Продукция;

В языке запросов это производится аналогично, но с использованием функции запросов ЗНАЧЕНИЕ().

Функция значение предназначена для получения ссылки на предопределенные значения справочников, перечислений, планов видов характеристик, планов счетов, планов видов расчетов, точек маршрутов бизнес процессов, к системным перечислениям. … РСА Далее даются подробные примеры, в т.ч. ссылки на пустое значение



Вариант 2  Передача обычных значений справочников в параметры запроса

РСА Если значение (справочника) обычное, а не предопределенное, тогда передается в параметр так:

Запрос.УстановитьПараметр("ВыбКатегорияЦен", Справочники.КатегорииЦен.НайтиПоНаименованию("Розничная"));

 

РСА Если пропустить Справочники.КатегорииЦен, тогда выдаст ошибку:

Переменная не определена (КатегорияЦен)

 

Вариант 3: Передача перечислений в качестве параметра в запрос

 Если справочники можно искать по наименованию или коду, то перечисление просто указывается наименование напрямую! Одно или список (проверяется вхождение в список перечислений).

Вот инфа https://dzen.ru/a/YLDDrd_w5km2Bc-E

Перечисления:

ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол КАК Пол
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
ФизическиеЛица.Пол В (ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.Женский), ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.Мужской))

 

Пример РСА (обработка формирования РКО по выпискам банка):

Запрос.УстановитьПараметр("Дата1",Дата1); // "Дата1" - это параметр, который в тексте запроса указан как &Дата1; Дата1 (второй аргумент) - это поле ввода в форме обработки
Запрос.УстановитьПараметр("Дата2",Дата2); // Аналогично
Запрос.УстановитьПараметр("ВыбФирма",ВыбФирма); // Аналогично
Запрос.УстановитьПараметр("ВидОперацииРКО", Перечисления.ВидыОперацийРКО.Инкассация);
Запрос.УстановитьПараметр("ВидОперацииПлатежки", Перечисления.ВидыОперацийПлатежноеПоручение.Инкассация);

 

В 1С8 упростили по сравнению с 1С77, потому что в 1С77 было "многословно":

//поиск в справочнике с уникальностью кода во всем справочнике

Справочник = СоздатьОбъект("Справочник.Товары");

//Режим = 0 (по умолчанию)

Если Справочник.НайтиПоКоду(Код) = 1 Тогда

источник

 

Упорядочить, сгруппировать (удалить детали), выдать детали и итоги в запросах 1С

"УПОРЯДОЧИТЬ ПО" — это именно сортировка!

Вот инфа https://helpme1s.ru/yazyk-zaprosov-1s-8-3-dlya-nachinayushhix-programmistov-uporyadochivanie

СГРУППИРОВАТЬ ПО — оно именно группирует, удаляя что детальные значения в нижестоящих группировках; так надо, если выводится сумма или иной агрегатный итог по детальным полям.

https://helpme1s.ru/yazyk-zaprosov-1s-8-3-dlya-nachinayushhix-programmistov-gruppirovka



Добавление итогов

ИТОГИ ПО - добавляет итоги, не удаляя детальные записи

(в отличие от СГРУППИРОВАТ ПО)

https://helpme1s.ru/yazyk-zaprosov-1s-8-3-dlya-nachinayushhix-programmistov-itogi

 

 Вопрос:

Дата в запросе может быть:

https://capitally.ru/1c-development/zaprosy/data-v-1s-zaprose/

как значение поля выборки;

как входящий параметр (если это текущая дата, то только так);

как результат исполнения встроенных функций языка запроса: ДАТАВРЕМЯ, ДОБАВИТЬКДАТЕ, НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА

 

Если надо сгруппировать по дате, которая результат функции (НАЧАЛОПЕРИОДА). Как тогда поле группировки указывать? Это в одном запросе невозможно? Нужно исходные данные поместить в вирт таблицу, а уже в другом запросе сделать выборку с группировкой?

 Вот ответ в 2011 году

https://1c-pro1.xyz/threads/gruppirovka-daty-dokumenta-v-zaprose.23371/

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

 

Как получить ссылку на документ из его же формы, передать ссылку на текущий документ в параметры запроса

Как получить ссылку на сам документ из его же формы

https://forum.infostart.ru/forum9/topic55084/



в 1с8 есть атрибут ЭтотОбъект.Ссылка

в 1с77 было ТекущийДокумент()



Соответственно в запросах 1С83:

Запрос.УстановитьПараметр("ТекСсылка", ТекущийДокумент()); // выдаст ошибку

 

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

 

 

Отбор по виду регистратора

Если в запросе регистратор составной, то следующий запрос выводит сведения по всем регистраторам, а не только ОКС, хотя в конструкторе из всех регистраторов (там составной тип) выбрал только ОКС.

ВЫБРАТЬ
        Превышения.Регистратор.Ссылка КАК РегистраторСсылка
ИЗ
        РегистрНакопления.Превышения КАК Превышения


Выборка из регистра превышения по виду регистратора делается таким условием:

ГДЕ ТИПЗНАЧЕНИЯ(Превышения.Регистратор.Ссылка) = ТИП(Документ.ОтчетКассовойСмены);



Вот инфа детальная, как отобрать записи регистра по виду регистратора

https://курсы-по-1с.рф/%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE%D0%B5/2019-12-19-how-to-select-records-with-a-certain-type-of-registrar-in-request/

 

 

 

Вот инфа про фигурные скобки в запросе

https://forum.infostart.ru/forum9/topic52204/

Фигурные скобки - это условия построителя отчета/запроса.

В фигурных скобках указываются: 

 

а. Дополнительные поля, которые можно выбрать в результат запроса
Например:

Выбрать Док.Ссылка
{Выбрать Док.*} 
Из .... КАК док


В этом примере, в настройках отчета в списке полей вы сможете выбрать дополнительно любое поле объекта "Док".

б. дополнительные условия (не обязательные).
В Вашем примере, в отборы отчета вы сможете добавить эти поля, и выполнять по ним отбор. Если не добавите, то и отбора, соответственно, по этим полям не будет.

в. То же, что и условия, только по отношению к виртуальным таблицам. Если первые два варианта вы можете использовать в конструкторе запросов на закладке "Построитель", то этот, увы, только ручками.

Выбрать
....
Из 
РегистрыСведений.Такой-то.СрезПоследних({(&ДатаСреза)})


В этом примере, если вы добавите в отбор параметр "ДатаСреза", то срез последних будет на эту дату. Если не добавите, то срез последних будет без какой-то конкретной даты, просто последние установленные в регистре значения.



РСА: Условие в запросе (отбор по виду регистратора, необязательный отбор по фирме) сделаны так:

ГДЕ (Превышения.Регистратор.Дата МЕЖДУ &НачДата И &КонДата)
// И Превышения.Фирма В(&ВыбФирма)
И ТИПЗНАЧЕНИЯ(Превышения.Регистратор.Ссылка) = ТИП(Документ.ОтчетКассовойСмены)
{ГДЕ Превышения.Фирма В(&ВыбФирма)}

 

 

 

 

Еще пример. Необязательное условие в запросе пишется в фигурных скобках (фигурные скобки).

{ГДЕ ТоварныйОтчетПодробно.Номенклатура В ИЕРАРХИИ(&ВыбНоменклатура)}
 

 

Запрос для выборки превышений по выбранным ОКС (список значений), без группировки итогов

ВЫБРАТЬ
Превышения.Номенклатура КАК ПревышНоменклатура,
Превышения.Количество КАК ПревышКоличество,
Превышения.Сумма КАК ПревышСумма,
Превышения.Регистратор КАК ПревышРегистратор,
Превышения.Фирма КАК Фирма
ИЗ
РегистрНакопления.Превышения КАК Превышения
ГДЕ
Превышения.Регистратор В(&ВыбОКС) 
// И Превышения.Фирма = &ВыбФирма // Нет смысла проверять фирмы, если выбраны конкретные ОКС



Текст запроса оформляется в тексте модуля так

Кратко

Запрос = Новый Запрос;

Запрос.Текст ="

|ВЫБРАТЬ

| ГДЕ (ISNULL(ВТ_Банк.СуммаПринято,0)-ISNULL(ВТ_РКО.СуммаСдано,0))<>0";

Запрос.УстановитьПараметр("ДатаНачала", &Дата1);

 

Пример:

Запрос = Новый Запрос;
Запрос.Текст ="
|ВЫБРАТЬ
|       ПлатежноеПоручение.Фирма КАК ФирмаБанк,
|       ПлатежноеПоручение.ВидОперации КАК ВидОперации,
|        ПлатежноеПоручение.Проведен КАК Проведен,
|        НАЧАЛОПЕРИОДА(ПлатежноеПоручение.Дата, ДЕНЬ) КАК ДатаСдачи_В_Банк,
|        СУММА(ПлатежноеПоручение.СуммаДокумента) КАК СуммаПринято
|ПОМЕСТИТЬ ВТ_Банк
|ИЗ
|        Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
|ГДЕ
|        ПлатежноеПоручение.Дата МЕЖДУ &amp;Дата1 И &amp;Дата2
|        И ПлатежноеПоручение.ВидОперации = &amp;ВидОперацииПлатежки 
|        И ПлатежноеПоручение.Фирма=&amp;ВыбФирма
|        И ПлатежноеПоручение.Проведен=Истина
|СГРУППИРОВАТЬ ПО
|        ПлатежноеПоручение.Фирма,
|        ПлатежноеПоручение.ВидОперации,
|        ПлатежноеПоручение.Проведен,
|        НАЧАЛОПЕРИОДА(ПлатежноеПоручение.Дата, ДЕНЬ);
|
|ВЫБРАТЬ
|        РасходныйКассовыйОрдер.Фирма КАК ФирмаРКО,
|        РасходныйКассовыйОрдер.ВидОперации КАК ВидОперации,
|        РасходныйКассовыйОрдер.Проведен КАК Проведен,
|        НАЧАЛОПЕРИОДА(РасходныйКассовыйОрдер.Дата, ДЕНЬ) КАК ДатаРКО,
|        СУММА(РасходныйКассовыйОрдер.СуммаДокумента) КАК СуммаСдано
|ПОМЕСТИТЬ ВТ_РКО        
|ИЗ
|        Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер
|ГДЕ
|        РасходныйКассовыйОрдер.Дата МЕЖДУ &amp;Дата1 И &amp;Дата2
|        И РасходныйКассовыйОрдер.ВидОперации = &amp;ВидОперацииРКО
|    И РасходныйКассовыйОрдер.Фирма=&amp;ВыбФирма
|    И РасходныйКассовыйОрдер.Проведен=Истина
|СГРУППИРОВАТЬ ПО
|        РасходныйКассовыйОрдер.Фирма,
|        РасходныйКассовыйОрдер.ВидОперации,
|        РасходныйКассовыйОрдер.Проведен,
|        НАЧАЛОПЕРИОДА(РасходныйКассовыйОрдер.Дата, ДЕНЬ);     // |//РасходныйКассовыйОрдер.Дата; Так не группируется, т.к. при группировке смотри исходные данные, а время отличается и строки за дату с разным времением не группируются.
|        
|ВЫБРАТЬ
|        ВТ_РКО.ФирмаРКО,
|        ВТ_Банк.ФирмаБанк,
|        ВТ_РКО.ВидОперации,
|        ВТ_РКО.Проведен,        
|        ВТ_РКО.ДатаРКО КАК ДатаРКО,
|        ВТ_Банк.ДатаСдачи_В_Банк,
|        ISNULL(ВТ_РКО.СуммаСдано,0) КАК СуммаСдано,
|        ISNULL(ВТ_Банк.СуммаПринято,0) Как СуммаПринято
|ИЗ
|        ВТ_РКО КАК ВТ_РКО
|        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Банк
|        ПО ВТ_Банк.ДатаСдачи_В_Банк=ВТ_РКО.ДатаРКО
|        ГДЕ (ISNULL(ВТ_Банк.СуммаПринято,0)-ISNULL(ВТ_РКО.СуммаСдано,0))<>0"; 

Запрос.УстановитьПараметр("Дата1",Дата1);
Запрос.УстановитьПараметр("Дата2",Дата2);
Запрос.УстановитьПараметр("ВыбФирма",ВыбФирма);
Запрос.УстановитьПараметр("ВидОперацииРКО", Перечисления.ВидыОперацийРКО.Инкассация);
Запрос.УстановитьПараметр("ВидОперацииПлатежки", Перечисления.ВидыОперацийПлатежноеПоручение.Инкассация);

ТЗ = Запрос.Выполнить().Выгрузить();    
Для Каждого Стр из ТЗ Цикл
 Сообщить(Формат(Стр.ДатаСдачи_В_Банк,"ДФ=""дд.ММ.гггг""")+" сумма: " + Строка(Стр.СуммаПринято)); // Выводит: 12.06.2023 сумма: 16 000
 // Тут все приведено к строкам, по дате указан формат

КонецЦикла;



 

 

Периоды в запросах

Чтобы по оператору "МЕЖДУ" в запросе не попасть в подлянку, что конечным моментом он считает "начало конечной даты", надо:

конечным моментом брать начало следующего дня. Это легко.

ДатаКон указывается в форме 01.01.21, а в параметрах указываем так:

Запрос.УстановитьПараметр("ДатаКонца",КонецДня(ДатаКон)); // Приводим дату конца к концу дня

 



Запросы со вложенными полями

Вот пример такого запроса

ВЫБРАТЬ
ОтчетКассовойСмены.Оплата.(
Ссылка КАК Ссылка,
Ссылка.Дата КАК Дата,
НомерСтроки КАК НомерСтроки,
ВидОплаты КАК ВидОплатыВОКС,
Сумма КАК Сумма,
ПроцентКомиссии КАК ПроцентКомиссии,
СуммаКомиссии КАК СуммаКомиссии
) КАК Оплата
ИЗ
Документ.ОтчетКассовойСмены КАК ОтчетКассовойСмены

 

Просто переписка ссылок, чтобы раскрыть скобки, не поможет избавиться от вложенных полей.

Запросы со вложенными полями при выгрузке результата в таблицу значений в строках таблицы значений будут содержать ВЛОЖЕННЫЕ таблицы значений. Так что итог по полю уже не получить?



Запрос со вложенными полями также невозможно поместить во временную таблицу — будет выдаваться ошибка "В запросе, формирующем временную таблицу, не могут выбираться вложенные таблицы".



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

- Запрос по полям верхнего уровня формирует временную таблицу 1.

- Запрос по вложенным полям формирует временную таблицу 2.

- Запрос из левого соединения двух таблиц выводит все данные в одноуровневую выходную таблицу.



Для выборки вложенных полей источником для выборки указывается сразу табличная часть (Документ.ОтчетКассовойСмены.Оплата), а ссылке в запросе идут на псевдоним источника (ОКС_ТЧ)

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

ВЫБРАТЬ
ОКС_ТЧ.Ссылка КАК ОКС_Ссылка2,
ОКС_ТЧ.НомерСтроки КАК НомерСтроки,
ОКС_ТЧ.ВидОплаты КАК ВидОплатыВОКС,
ОКС_ТЧ.Сумма КАК Сумма,
ОКС_ТЧ.ПроцентКомиссии КАК ПроцентКомиссии,
ОКС_ТЧ.СуммаКомиссии КАК СуммаКомиссии
ПОМЕСТИТЬ ВТ_ВыборкаОплатОКС
ИЗ
Документ.ОтчетКассовойСмены.Оплата КАК ОКС_ТЧ
ГДЕ
ОКС_ТЧ.Ссылка.Фирма = &ВыбФирма
И ОКС_ТЧ.Ссылка.Проведен = ИСТИНА
И ОКС_ТЧ.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ОКС_ТЧ.ВидОплаты <> &ВидОплаты;

 

 

 

­Вот переделка запроса со вложенными полями на пакетный запрос, который выдает одноуровневую таблицу

Запрос = Новый Запрос;

Запрос.Текст ="

//|ВЫБРАТЬ
//| ОтчетКассовойСмены.Оплата.Ссылка КАК Ссылка,
//| ОтчетКассовойСмены.Оплата.Ссылка.Дата КАК Дата,
//| ОтчетКассовойСмены.Оплата.Ссылка.Проведен КАК Проведен,
//| ОтчетКассовойСмены.Оплата.Ссылка.Фирма КАК Фирма,
//| ОтчетКассовойСмены.Оплата.Ссылка.Номер КАК Номер,
//| ОтчетКассовойСмены.Оплата.НомерСтроки КАК НомерСтроки,
//| ОтчетКассовойСмены.Оплата.ВидОплаты КАК ВидОплатыВОКС,
//| ОтчетКассовойСмены.Оплата.Сумма КАК СуммаОтгрузки,
//| ОтчетКассовойСмены.Оплата.ПроцентКомиссии КАК ПроцентКомиссии,
//| ОтчетКассовойСмены.Оплата.СуммаКомиссии КАК СуммаКомиссии
//|ИЗ
//| Документ.ОтчетКассовойСмены КАК ОтчетКассовойСмены
//|ГДЕ
//| ОтчетКассовойСмены.Ссылка.Фирма = &amp;ВыбФирма
//| И ОтчетКассовойСмены.Ссылка.Проведен = ИСТИНА
//| И ОтчетКассовойСмены.Ссылка.Дата МЕЖДУ &amp;ДатаНачала И &amp;ДатаКонца
//| И ОтчетКассовойСмены.Оплата.ВидОплаты <> &amp;ВидОплаты
//|
//|УПОРЯДОЧИТЬ ПО
//| ОтчетКассовойСмены.Ссылка.Дата";
|ВЫБРАТЬ
| ОКС.Ссылка КАК ОКС_Ссылка1
|ПОМЕСТИТЬ ВТ_ВыборкаОКС
|ИЗ
| Документ.ОтчетКассовойСмены КАК ОКС
|ГДЕ
| ОКС.Фирма = &ВыбФирма
| И ОКС.Проведен = ИСТИНА
| И ОКС.Дата МЕЖДУ &ДатаНачала И &ДатаКонца;
|
|// Выборка ТЧ оплат и помещаем в ВТ_ВыборкаОплатОКС
|ВЫБРАТЬ
| ОКС.Ссылка КАК ОКС_Ссылка2,
| ОКС.НомерСтроки КАК НомерСтроки,
| ОКС.ВидОплаты КАК ВидОплатыВОКС,
| ОКС.Сумма КАК Сумма,
| ОКС.ПроцентКомиссии КАК ПроцентКомиссии,
| ОКС.СуммаКомиссии КАК СуммаКомиссии
|ПОМЕСТИТЬ ВТ_ВыборкаОплатОКС
|ИЗ
| Документ.ОтчетКассовойСмены.Оплата КАК ОКС
|ГДЕ
| ОКС.Ссылка.Фирма = &ВыбФирма
| И ОКС.Ссылка.Проведен = ИСТИНА
| И ОКС.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
| И ОКС.ВидОплаты <> &ВидНаличнойОплаты;
|//УПОРЯДОЧИТЬ ПО // Выдало ошибку, тут в выборке даже не поля дата
|// ОтчетКассовойСмены.Ссылка.Дата;
|
|// Делаем запрос из двух ВТ левым соединением
|
|ВЫБРАТЬ
|ВТ_ВыборкаОКС.ОКС_Ссылка1 КАК Ссылка,
|ВТ_ВыборкаОплатОКС.НомерСтроки КАК НомерСтроки,
|ВТ_ВыборкаОплатОКС.ВидОплатыВОКС КАК ВидОплатыВОКС,
|ВТ_ВыборкаОплатОКС.Сумма КАК СуммаОтгрузки,
|ВТ_ВыборкаОплатОКС.ПроцентКомиссии КАК ПроцентКомиссии,
|ВТ_ВыборкаОплатОКС.СуммаКомиссии КАК СуммаКомиссии
|ИЗ ВТ_ВыборкаОКС ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВыборкаОплатОКС
|ПО ВТ_ВыборкаОКС.ОКС_Ссылка1=ВТ_ВыборкаОплатОКС.ОКС_Ссылка2";

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

//Запрос.УстановитьПараметр("ВидОплаты",Перечисления.ТипыОплаты.Наличные); // Смотри, чтобы было то самое 100823 - это выбирает тип оплат нал/безнал, а надо справочник Наличные, Безнал №2, Безнал № 3

Запрос.УстановитьПараметр("ВидНаличнойОплаты",Справочники.ВидыОплаты.НайтиПоНаименованию("Наличные"));

ТЗ_ОКС= Запрос.Выполнить().Выгрузить();



Пакетные запросы в процедурах и функциях 1С

В процедурах и функциях 1С выполняет пакеты запросов как одиночные запросы. Менеджеры временных таблиц не нужны, если не нужно из кода обращаться к данным временных таблиц!

Вот инфа про пакетные запросы, два метода из запуска (Выполнить и ВыполнитьПакет, + менеджеры временных таблиц).

https://programmist1s.ru/rabota-s-paketnyimi-zaprosami-v-1s/



Вот в 2006 пример как получить имя колонки:

https://forum.mista.ru/topic.php?id=198530

так он не рабочий. В СП такого и нет вроде!





Когда в ТЗ попали вложенные ТЗ, стал искать, как найти имена колонок в сформированной ТЗ

https://helpme1s.ru/tablica-znachenij-v-yazyke-1s-8-v-primerax

Вот тут нет нужного примера получения имен колонок из таблицы значений



Вот примеры, как получить имена колонок!

https://www.about1c.ru/v83/language-reference/working-with-value-table

Перебор колонок выполняется следующим образом:

Для каждого Колонка Из тз.Колонки Цикл 
    Сообщить(Колонка.Имя); 
КонецЦикла;



По вложенным таблицам искал

Поиск

 

Вот муть какая-то про вложенные таблицы первой ссылкой

https://forum.infostart.ru/forum9/topic186754/

 

Увидел: В консоли отчетов при добавлении полей в запрос настройки ресурсов слетают! Платформа 8.3.23.1782.  14.01.24

 

 

Вот запрос выводит излишки/недостачи из табличной части дока Инвентаризация (вложенные поля). Во временную таблицу ничего не выгружается; данные берутся из одной табличной части, так что мудрить с выборкой вложенных полей не надо!

Вот запрос из готового отчета
ВЫБРАТЬ
        ИнвентаризацияТовара.Товары.(
                Номенклатура.Код КАК НоменклатураКод,
                Номенклатура КАК НоменклатураСсылка,
                Номенклатура.БазоваяЕдиницаИзмерения КАК НоменклатураБазоваяЕдиницаИзмерения,
                Номенклатура.Родитель КАК НоменклатураРодитель,
                КоличествоУчет КАК КоличествоУчет,
                Количество КАК Количество,
                ВЫБОР
                Когда КоличествоУчет  > Количество Тогда 
                КоличествоУчет-Количество Конец КАК Недостача,
                ВЫБОР
                Когда КоличествоУчет < Количество       Тогда 
                Количество-КоличествоУчет
                Конец КАК Излишек       
        ) КАК Товары,
        ИнвентаризацияТовара.Дата КАК Дата // Мне это поле было не нужно, его убрал после. Но запрос в таком виде работал.
ИЗ
        Документ.ИнвентаризацияТовара КАК ИнвентаризацияТовара
ГДЕ ИнвентаризацияТовара.Ссылка В(&ВыбДокИнв) И
(Товары.КоличествоУчет<>Товары.Количество); 

 

Параметр &ВыбДокИнв - список значений. Можно выбрать несколько документов "Инвентаризация" за день, чтобы вывести разницы и перепроверить остатки, где были разницы.

Поле  "ИнвентаризацияТовара.Дата" было в старых версиях запросов видимо для отбора по дате инвентаризации.

Также добавлены пользовательские условия (группа ИЛИ; Недостача>0;Излишек>0), чтобы выводить или излишки, или недостачу. Условие работает так:

- Если не выбрать ничего, тогда выводятся и излишки, и недостачи.

- Если выбрать все, тогда выводятся и излишки, и недостачи.

- Если выбрать что-то одно,тогда второе поле будет скрыто!

 

 

Условия в пользовательских полях СКД https://infostart.ru/1c/articles/97245/

Пример: В пользовательском поле разница считалась так:

//Излишек
Выбор
Когда [Кол-во факт] > [Кол-во учет]
Тогда [Кол-во факт] - [Кол-во учет]
Конец

//Недостача
Выбор
Когда [Кол-во учет] > [Кол-во факт]
Тогда [Кол-во учет] - [Кол-во факт]
Конец

 

Когда разницы (недостача, излишек) считались в пользовательских полях, при добавлении этих полей в отборе там вместо нормальных названий полей отображалось Поле1, Поле2. Поэтому вместо пользовательских полей в СКД добавил вычисление разниц в сам запрос.

 

В пользовательских настройках СКД в отборе нельзя выбрать поля выборки и слева, и справа в одном условии!

Вот такое в отборе в СКД пользователь не сможет ввести: Товары.КоличествоУчет<>Товары.Количество

 

В консоли запросов, видимо, нельзя сделать параметр, чтобы следующее условие включалось или отключалось!

ГДЕ ИнвентаризацияТовара.Ссылка В(&ВыбДокИнв) И
(Товары.КоличествоУчет<>Товары.Количество); 

 

Такое условие надо добавлять в модуле отчета при формировании текста запроса. Я пока так не делал.

 

Чтобы в отчете на СКД количество выводилось без добавления нулей (по три нуля для целых чисел), указал в СКД шаблон форматирования числа "Ч". И числа выводятся нормально. Вот так, к примеру:

0,32
1
12,354

Вот по теме https://forum.infostart.ru/forum9/topic225093/