1С 8 вид движения в запросе

1С 8 вид движения в запросе

Содержание

Условия сравнения и проверки в Запросах. Отбор не заполненного значения

Как задать отбор по Типу документа?
Как указать условие для отбора не определенного значения?
Как в языке запросов 1С отобрать не заполненное значение?
Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Код 1C v 8.х Запрос.Текст =
«ВЫБРАТЬ
| усЕдиницыХранения.Ссылка
|ИЗ
| Справочник.усЕдиницыХранения КАК усЕдиницыХранения»
// Пример 1. сравнение с не заполненным булевым значением:
|ГДЕ
| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь
// Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево:
|ГДЕ
| НЕ усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны
// Пример 3. выборка по условию не заполненного поля, имеющего тип «справочник конкретного типа»
|ГДЕ
| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
// Пример 3а. выборка по условию не заполненного поля, имеющего тип «документ конкретного типа»
|ГДЕ
| НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)
// Пример 3б. выборка по условию не заполненного поля, имеющего тип «документы разных типов» (составное поле)
|ГДЕ
| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)
| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)
| ИЛИ …(и т.д. — последовательно перечисляем условия для всех возможных типов этого составного поля))
// Пример 4. или наоборот, если нужно выбрать заполненное значение типа «строка», то поможет условие:
|ГДЕ
| усЕдиницыХранения.Наименование > «»»»
// Пример 5. если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре «ВыполняемыеЗадания» ресурс «Задание» имеет составной тип, среди значений которого возможен документ «Отбор»
|ГДЕ
| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор
// Пример 5а. Еще аналогичный пример, когда нужно выбрать документы конкретного типа
| ВЫБОР
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА «»ПоступлениеТоваровУслуг»»
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА «»РеализацияТоваровУслуг»»
| ИНАЧЕ «»»»
| КОНЕЦ КАК ВидДокумента
// Пример 6. выбор по условию не определенного значения:
|ГДЕ
| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО
// Пример 7. выбор по виду движения «Приход» регистра накопления, «Расход» — аналогично):
|ГДЕ
| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
// Пример 8. Как в запросе указать, что выполнять запрос не нужно (например, нужно программно в зависимости от какого-то
// условия вернуть пустой результат запроса —
// Запрос.Текст = СтрЗаменить(Запрос.Текст, «ГДЕ Док.Ссылка = &ДокументСсылка», «ГДЕ ЛОЖЬ»);).
// Для этого достаточно добавить условие «Где Ложь».
// Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.
|ГДЕ ЛОЖЬ
// Пример 9. Проверка на то, что результат выполнения запроса содержит данные:
Если НЕ Запрос.Выполнить().Пустой() Тогда
// Пример 10. выбор по условию не заполненной даты:
|ГДЕ
| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)
источник

Запросы

  • Как получить данные из табличной части документов?
  • Как получить данные из табличной части документов и представить их в иерархическом виде?
  • Как подсчитать количество одинаковых элементов в выбираемых данных?
  • Как применять условия для отбора по значениям полей, вычисленных как результат агрегатной функции?
  • Как ограничить выборку из виртуальной таблицы?
  • Как просуммировать данные по одинаковым значениям одного из полей выборки?
  • Как получить только те записи, в которых значение определенного поля превышает указанное значение?
  • Как обратиться к подчиненным полям в запросе?
  • Как объединить результаты нескольких запросов?
  • Как выбрать данные из двух таблиц, удовлетворяющие определенному условию?
  • Как дополнить данные одной таблицы данными, выбранными из другой таблицы по определенному условию?
  • Как объединить данные из двух таблиц по определенному условию?
  • Как вывести некоторое значение вместо NULL в запросе?
  • Как вместе с данными некоторой таблицы получить общие итоги из этой же таблицы?
  • Как получить иерархические итоги по группе справочника?
  • Как по состоянию на заданную дату по регистру «ОстаткиНаСкладе» найти последний документ «ПоступлениеТоваровУслуг», по которому приходила номенклатура?
  • Как подсчитать количество записей с одинаковым значением некоторого поля?
  • Как в итоговых записях вывести количество различных записей?
  • Как узнать количество записей в результате запроса?
  • Как проверить достаточность остатков товаров на складах, указанных в документе?
  • Как в запросе осуществить отбор по значению перечисления?
  • Как получить курсы валют на две интересующие даты?
  • Как одним запросом получить таблицу расхождений курсов взаиморасчетов всех выписанных документов «ЗаказПокупателя» с официальным курсом?
  • Как написать запрос таким образом, чтобы на определенном уровне иерархии запроса считались одни итоговые функции, а на другом уровне другие?
  • Как получить перечень документов, приведших данные подчиненного периодического регистра сведений к определенному состоянию
  • Как установить параметры запроса, если текст запроса заранее не известен?
  • Анализ данных

  • Как получить данные о товарах продаваемых вместе?
  • Как порекомендовать сопутствующие товары?
  • Как посмотреть, что будет покупаться в дальнейшем?

Как получить данные из табличной части документов?

ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

Как получить данные из табличной части документов и представить их в иерархическом виде?

ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ИТОГИ ПО Номенклатура ТОЛЬКО ИЕРАРХИЯ

Как подсчитать количество одинаковых элементов в выбираемых данных?

ВЫБРАТЬ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары СГРУППИРОВАТЬ ПО РеализацияТоваровУслугТовары.Номенклатура

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

ВЫБРАТЬ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары СГРУППИРОВАТЬ ПО РеализацияТоваровУслугТовары.Номенклатура ИМЕЮЩИЕ СУММА(РеализацияТоваровУслугТовары.Количество) > 10

Как ограничить выборку из виртуальной таблицы?

ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК ПродажиОбороты

Как просуммировать данные по одинаковым значениям одного из полей выборки?

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

Как получить только те записи, в которых значение определенного поля превышает указанное значение?

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

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

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

Как объединить результаты нескольких запросов?

// Одним запросом получим номенклатуру из всех табличных частей документа Реализация товаров, услуг: ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугВозвратнаяТара.Номенклатура ИЗ Документ.РеализацияТоваровУслуг.ВозвратнаяТара КАК РеализацияТоваровУслугВозвратнаяТара ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугУслуги.Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги

Как выбрать данные из двух таблиц, удовлетворяющие определенному условию?

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

Как дополнить данные одной таблицы данными, выбранными из другой таблицы по определенному условию?

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

Как объединить данные из двух таблиц по определенному условию?

// Получим список номенклатуры с количеством, заказанным покупателям и поставщикам // через полное соединение по условию: ВЫБРАТЬ ВЫБОР КОГДА (ЗаказыПокупателейОстатки.Номенклатура) ЕСТЬ NULL ТОГДА ЗаказыПоставщикамОстатки.Номенклатура ИНАЧЕ ЗаказыПокупателейОстатки.Номенклатура КОНЕЦ КАК Номенклатура, ЗаказыПокупателейОстатки.КоличествоОстаток КАК ЗаказаноПокупателями, ЗаказыПоставщикамОстатки.КоличествоОстаток КАК ЗаказаноПоставщикам ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаОтч) КАК ЗаказыПокупателейОстатки ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Остатки(&ДатаОтч) КАК ЗаказыПоставщикамОстатки ПО ЗаказыПокупателейОстатки.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура // То же самое, но по другому ВЫБРАТЬ ВложенныйЗапрос.Номенклатура, СУММА(ВложенныйЗапрос.ЗаказаноПокупателями) КАК ЗаказаноПокупателями, СУММА(ВложенныйЗапрос.ЗаказаноПоставщикам) КАК ЗаказаноПоставщикам ИЗ (ВЫБРАТЬ ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура, ЗаказыПокупателейОстатки.КоличествоОстаток КАК ЗаказаноПокупателями, 0 КАК ЗаказаноПоставщикам ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаОтч, ) КАК ЗаказыПокупателейОстатки ОБЪЕДИНИТЬ ВЫБРАТЬ ЗаказыПоставщикамОстатки.Номенклатура, 0, ЗаказыПоставщикамОстатки.КоличествоОстаток ИЗ РегистрНакопления.ЗаказыПоставщикам.Остатки(&ДатаОтч, ) КАК ЗаказыПоставщикамОстатки ) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Номенклатура

Как вывести некоторое значение вместо NULL в запросе?

ВЫБРАТЬ ЕСТЬNULL(Справочник.Номенклатура.Артикул, «—«) КАК Артикул, Справочник.Номенклатура.Представление КАК Номенклатура

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

ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.СуммаОборот КАК СуммаПродаж, ПродажиОбороты.СуммаОборот / СовокупныеОбороты.СуммаОборот * 100 КАК ПроцентнаяДоля ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК ПродажиОбороты ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК СовокупныеОбороты ПО ИСТИНА УПОРЯДОЧИТЬ ПО ПроцентнаяДоля УБЫВ

Как получить иерархические итоги по группе справочника?

ВЫБРАТЬ ТоварыГруппы.Ссылка КАК Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ (ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Родитель В ИЕРАРХИИ(&Группа) И (Номенклатура.ЭтоГруппа = ЛОЖЬ) ) КАК ТоварыГруппы ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментПолучения, Номенклатура В ИЕРАРХИИ (&Группа)) КАК ТоварыНаСкладахОстатки ПО ТоварыГруппы.Ссылка = ТоварыНаСкладахОстатки.Номенклатура ИТОГИ СУММА(КоличествоОстаток) ПО Номенклатура ТОЛЬКО ИЕРАРХИЯ

Как по состоянию на заданную дату по регистру «ОстаткиНаСкладе» найти последний документ «ПоступлениеТоваровУслуг», по которому приходила номенклатура?

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

Как подсчитать количество записей с одинаковым значением некоторого поля?

ВЫБРАТЬ Контрагенты.ОсновнойМенеджерПокупателя, КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК КоличествоЗакрепленных ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ (Контрагенты.ЭтоГруппа = ЛОЖЬ) И (Контрагенты.ОсновнойМенеджерПокупателя <> &НеЗаполненМенеджер) СГРУППИРОВАТЬ ПО Контрагенты.ОсновнойМенеджерПокупателя УПОРЯДОЧИТЬ ПО КоличествоЗакрепленных УБЫВ

Как в итоговых записях вывести количество различных записей?

ВЫБРАТЬ Контрагенты.ОсновнойМенеджерПокупателя.Представление КАК ОсновнойМенеджерПокупателя, Контрагенты.Представление, 1 КАК КоличествоЗакрепленных ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ (Контрагенты.ЭтоГруппа = ЛОЖЬ) УПОРЯДОЧИТЬ ПО КоличествоЗакрепленных УБЫВ ИТОГИ КОЛИЧЕСТВО(КоличествоЗакрепленных) ПО ОсновнойМенеджерПокупателя

Как узнать количество записей в результате запроса?

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

Как проверить достаточность остатков товаров на складах, указанных в документе?

ВЫБРАТЬ ВложенныйЗапрос.Номенклатура, ВложенныйЗапрос.Размещение КАК Склад, ВложенныйЗапрос.КоличествоСписываемое, ТоварыНаСкладахОстатки.КоличествоОстаток ИЗ (ВЫБРАТЬ ВнутреннийЗаказТовары.Номенклатура КАК Номенклатура, ВнутреннийЗаказТовары.Размещение КАК Размещение, СУММА(ВнутреннийЗаказТовары.Количество *ВнутреннийЗаказТовары.Коэффициент) КАК КоличествоСписываемое ИЗ Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТовары ГДЕ ВнутреннийЗаказТовары.Ссылка = &Ссылка СГРУППИРОВАТЬ ПО ВнутреннийЗаказТовары.Номенклатура, ВнутреннийЗаказТовары.Размещение ) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментВремениДокумента, Склад В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВЫРАЗИТЬ(ВнутреннийЗаказТоварыДляОтбора.Размещение КАК Справочник.Склады) ИЗ Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТоварыДляОтбора ГДЕ ВнутреннийЗаказТоварыДляОтбора.Ссылка = &Ссылка И НЕ ВЫРАЗИТЬ(ВнутреннийЗаказТоварыДляОтбора.Размещение КАК Справочник.Склады) ЕСТЬ NULL ) И Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВнутреннийЗаказТоварыДляОтбора.Номенклатура ИЗ Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТоварыДляОтбора ГДЕ ВнутреннийЗаказТоварыДляОтбора.Ссылка = &Ссылка)) КАК ТоварыНаСкладахОстатки ПО ВложенныйЗапрос.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура И ВложенныйЗапрос.Размещение = ТоварыНаСкладахОстатки.Склад

Как в запросе осуществить отбор по значению перечисления?

Запрос.Текст = «ВЫБРАТЬ | ВоинскийУчетСрезПоследних.Физлицо |ИЗ | РегистрСведений.ВоинскийУчет.СрезПоследних(&ДатаОтчета) КАК ВоинскийУчетСрезПоследних |ГДЕ | ВоинскийУчетСрезПоследних.ОтношениеКВоинскомуУчету = &Состоит» Запрос.УстановитьПараметр(«ДатаОтчета», ДатаОтчета); Запрос.УстановитьПараметр(«Состоит», Перечисления.ОтношениеКВоинскомуУчету.Состоит);

Как получить курсы валют на две интересующие даты?

ВЫБРАТЬ ВалютыСрезПоследних.Валюта, ВалютыСрезПоследних.Курс, &ПерваяДата Как Дата ИЗ РегистрСведений.Валюты.СрезПоследних(&ПерваяДата, ) КАК ВалютыСрезПоследних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВалютыСрезПоследних.Валюта, ВалютыСрезПоследних.Курс, &ВтораяДата ИЗ РегистрСведений.Валюты.СрезПоследних(&ВтораяДата, ) КАК ВалютыСрезПоследних

Как одним запросом получить таблицу расхождений курсов взаиморасчетов всех выписанных документов «ЗаказПокупателя» с официальным курсом?

ВЫБРАТЬ ВложенныйЗапрос.Ссылка КАК Документ, ВложенныйЗапрос.ДоговорКонтрагентаВалютаВзаиморасчетов КАК ВалютаДоговора, ВложенныйЗапрос.КурсВзаиморасчетов, ВЫБОР КОГДА КурсыВалют.Курс ЕСТЬ NULL ТОГДА 0 ИНАЧЕ КурсыВалют.Курс КОНЕЦ КАК КурсОфициальный, ВЫБОР КОГДА КурсыВалют.Курс ЕСТЬ NULL ТОГДА ВложенныйЗапрос.КурсВзаиморасчетов ИНАЧЕ ВложенныйЗапрос.КурсВзаиморасчетов — КурсыВалют.Курс КОНЕЦ КАК Превышение ИЗ (ВЫБРАТЬ ЗаказПокупателя.Ссылка КАК Ссылка, МАКСИМУМ(КурсыВалют.Период) КАК Период, ЗаказПокупателя.КурсВзаиморасчетов КАК КурсВзаиморасчетов, ЗаказПокупателя.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ДоговорКонтрагентаВалютаВзаиморасчетов ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО ЗаказПокупателя.ДоговорКонтрагента.ВалютаВзаиморасчетов = КурсыВалют.Валюта И ЗаказПокупателя.Дата >= КурсыВалют.Период СГРУППИРОВАТЬ ПО ЗаказПокупателя.КурсВзаиморасчетов, ЗаказПокупателя.ДоговорКонтрагента.ВалютаВзаиморасчетов, ЗаказПокупателя.Ссылка ) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО ВложенныйЗапрос.ДоговорКонтрагентаВалютаВзаиморасчетов = КурсыВалют.Валюта И ВложенныйЗапрос.Период = КурсыВалют.Период

Как написать запрос таким образом, чтобы на определенном уровне иерархии запроса считались одни итоговые функции, а на другом уровне другие?

ВЫБРАТЬ ОстаткиТоваровКомпанииОстатки.Номенклатура КАК Номенклатура, ОстаткиТоваровКомпанииОстатки.Номенклатура.Представление, ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры.Представление, ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК КоличествоОстаток, NULL как Заказ, 0 КАК Резерв ИЗ РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗаказыПокупателейОстатки.Номенклатура, ЗаказыПокупателейОстатки.Номенклатура.Представление, ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры, ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры.Представление, 0, ЗаказыПокупателейОстатки.ЗаказПокупателя, ЗаказыПокупателейОстатки.КоличествоОстаток ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки ИТОГИ СУММА(КоличествоОстаток), СУММА(Резерв) ПО Номенклатура, ХарактеристикаНоменклатуры

Как получить перечень документов, приведших данные подчиненного периодического регистра сведений к определенному состоянию?

ВЫБРАТЬ КандидатыНаРаботу.ФизЛицо КАК ФизЛицо, КандидатыНаРаботу.Регистратор КАК Документ, КандидатыНаРаботу.Статус КАК Статус ИЗ РегистрСведений.КандидатыНаРаботу.СрезПоследних(&ДатаОтчета, ) КАК КандидатыНаРаботуСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КандидатыНаРаботу КАК КандидатыНаРаботу ПО КандидатыНаРаботуСрезПоследних.ФизЛицо = КандидатыНаРаботу.ФизЛицо ГДЕ КандидатыНаРаботуСрезПоследних.Статус = &Отложен И КандидатыНаРаботу.Период <= &ДатаОтчета УПОРЯДОЧИТЬ ПО КандидатыНаРаботу.ФизЛицо.Наименование, Документ ИТОГИ МАКСИМУМ(Статус) ПО ФизЛицо АВТОУПОРЯДОЧИВАНИЕ

Как установить параметры запроса, если текст запроса заранее не известен?

Запрос = Новый Запрос(» |ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)»); // Получить описание параметров запроса. ПараметрыЗапроса = Запрос.НайтиПараметры(); Для Каждого ПараметрЗапроса Из ПараметрыЗапроса Цикл ЗаданноеЗначение = Неопределено; // Открыть диалог ввода значения данного параметра. Если ВвестиЗначение(ЗаданноеЗначение, «Задайте значение параметра » + ПараметрЗапроса.Имя, ПараметрЗапроса.ТипЗначения) Тогда Запрос.УстановитьПараметр(ПараметрЗапроса.Имя, ЗаданноеЗначение); Иначе Возврат; КонецЕсли; КонецЦикла; РезультатЗапроса = Запрос.Выполнить();

Анализ данных

Как получить данные о товарах продаваемых вместе?

Анализ = Новый АнализДанных; // Выбранный тип анализа как раз и указывает на то, что ищем // «совместно продаваемые» товары. Анализ.ТипАнализа = Тип(«АнализДанныхПоискАссоциаций»); Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ПродажиКомпанииОбороты.Регистратор Как ДокументПродажи, | ПродажиКомпанииОбороты.Номенклатура |ИЗ | РегистрНакопления.ПродажиКомпании.Обороты(&НачПериода, &КонПериода, Регистратор) КАК ПродажиКомпанииОбороты |УПОРЯДОЧИТЬ ПО | ДокументПродажи»; Запрос.УстановитьПараметр(«НачПериода», НачПериода); Запрос.УстановитьПараметр(«КонПериода», КонПериода); // Получить продажи за указанный период. // Выбрана периодичность по Регистратору, т.к. необходимо получить // данные о совместных продажах в рамках одной покупки. Анализ.ИсточникДанных = Запрос.Выполнить(); // Выполнить анализ в соответствии с указанным источником. РезультатАнализа = Анализ.Выполнить(); // Для вывода результата анализа воспользуемся построителем // отчета анализа данных. Построитель = Новый ПостроительОтчетаАнализаДанных(); Построитель.Макет = Неопределено; Построитель.ТипАнализа = Тип(«АнализДанныхПоискАссоциаций»); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнализа, ТабДок); ТабДок.Показать();

Как порекомендовать сопутствующие товары?

Анализ = Новый АнализДанных; // Найти ассоциации. Анализ.ТипАнализа = Тип(«АнализДанныхПоискАссоциаций»); Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ПродажиКомпанииОбороты.Регистратор КАК ДокументПродажи, | ПродажиКомпанииОбороты.Номенклатура |ИЗ | РегистрНакопления.ПродажиКомпании.Обороты(&НачПериода, &КонПериода, Регистратор) КАК ПродажиКомпанииОбороты |УПОРЯДОЧИТЬ ПО | ДокументПродажи»; // Ассоциации ищем подокументно, это определяется поведением // объекта «АнализДанных» «по умолчанию» при выборе // периодичности виртуальной таблицы Регистратор Запрос.УстановитьПараметр(«НачПериода», НачПериода); Запрос.УстановитьПараметр(«КонПериода», КонПериода); Анализ.ИсточникДанных = Запрос.Выполнить(); РезультатАнализа = Анализ.Выполнить(); // Исходя из полученного анализа создать прогноз. МодельПрогноза = РезультатАнализа.СоздатьМодельПрогноза(); // ТЗ- таблица значений, содержащая данные о том, // какие номенклатурные позиции вошли в «текущую» покупку. МодельПрогноза.ИсточникДанных = ТЗ; // ТП — элемент управления «Табличное поле» связанный через // свойство «Данные» с реквизитом формы «ТП» (тип ТаблицаЗначений) ТП = МодельПрогноза.Выполнить(); ЭлементыФормы.ТП.СоздатьКолонки();

Как посмотреть, что будет покупаться в дальнейшем?

ТабДок = Новый ТабличныйДокумент; Анализ = Новый АнализДанных; // Нужно спрогнозировать цепочку событий, поэтому выбираем // тип анализа «Поиск последовательностей». Анализ.ТипАнализа = Тип(«АнализДанныхПоискПоследовательностей»); Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ПродажиКомпанииОбороты.ДоговорВзаиморасчетовПокупателя.Владелец КАК Контрагент, | ПродажиКомпанииОбороты.Номенклатура, | ПродажиКомпанииОбороты.Период |ИЗ | РегистрНакопления.ПродажиКомпании.Обороты(&НачПериода, &КонПериода, Регистратор) КАК ПродажиКомпанииОбороты»; Запрос.УстановитьПараметр(«НачПериода», НачПериода); Запрос.УстановитьПараметр(«КонПериода», КонПериода); Анализ.ИсточникДанных = Запрос.Выполнить(); Колонка = Анализ.НастройкаКолонок.Найти(«Период»); // Указать, что колонка «Период» имеет тип «Время», // что «позволит понять» хронологию событий Колонка.ТипКолонки = ТипКолонкиАнализаДанныхПоискПоследовательностей.Время; РезультатАнализа = Анализ.Выполнить(); МодельПрогноза = РезультатАнализа.СоздатьМодельПрогноза(); // ТЗ- таблица значений, содержащая исходные данные для прогноза // например, какой контрагент, какой товар закупил (исходя из чего // попытаемся узнать, что они еще закупят). МодельПрогноза.ИсточникДанных = ТЗ; // ТП — элемент управления «Табличное поле» связанный через // свойство «Данные» с реквизитом формы «ТП» //(тип ТаблицаЗначений) ТП = МодельПрогноза.Выполнить(); ЭлементыФормы.ТП.СоздатьКолонки(); // Построитель — реквизит формы, имеющий тип // ПостроительОтчетаАнализаДанных. Ряд табличных полей // в диалоге могут быть связаны со свойствами — коллекциями // данного объекта Построитель.ТипАнализа = Тип(«АнализДанныхПоискПоследовательностей»); Построитель.Вывести(РезультатАнализа, ТабДок); ТабДок.Показать();

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

Рассматриваемая задача может быть актуальна, когда требуется соединить данные двух регистров, причем набор условий соединения не полностью идентифицирует строку регистра, т.е. в результате соединения по данному условию в выборке может быть несколько «одинаковых» строк.
Допустим, есть две таблицы:

Таблица 1:

Реквизит 1

а

б

в

Таблица 2:

Реквизит 1 Реквизит 2
а 1
а 2
б 34
в 10
в 15

Требуется присоединить Реквизит 2 к Таблице 1, не размножая при этом строки, взяв случайным образом (т.е. любое) значение Реквизита 2 по условию равенства Реквизитов 1 таблицы 1 и 2.

Если написать запрос с Левым соединением:

1С (Код)

1 2 3 4 5 6 7 «ВЫБРАТЬ | Таблица1. Реквизит1 | Таблица2. Реквизит2 |ИЗ | Таблица1 КАК Таблица1 | ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2 | ПО Таблица2. Реквизит1= Таблица1. Реквизит1»

, то строки исходной таблицы «размножатся».

ВЫБРАТЬ РАЗЛИЧНЫЕ тут тоже не поможет, т.к. значения Реквизит 2 различные.

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

Чтобы решить эту задачу, можно использовать получение максимального значения «Реквизита 2». Метод подходит не только для числового значения этого реквизита, а и для любого другого. Но получим мы при этом, конечно не случайное значение из множества, а то, что система вычислит как макимальное. В большинстве случаев такое решение задачи полностью удовлетворит.

Вот запрос, решающий эту задачу:

1С (Код)

1 2 3 4 5 6 7 8 9 «ВЫБРАТЬ | Таблица1. Реквизит1 | МАКСИМУМ(Таблица2.Реквизит2) КАК Реквизит2 |ИЗ | Таблица1 КАК Таблица1 | ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2 | ПО Таблица2. Реквизит1= Таблица1. Реквизит1 |СГРУППИРОВАТЬ ПО | Таблица1. Реквизит1»

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

Запоминаем Таблицу 2 в ее копии, затем Таблицу 2 сворачиваем по Реквизиту 1 и затем перебором строк свернутой таблицы 2 и ее копии выбираем Реквизит2:

1С (Код)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 КопияТ2 = Таблица2.Скопировать(); // Запоминаем Таблицу 2 в ее копии Таблица2.Свернуть(«Реквизит1»); // Таблицу 2 сворачиваем по Реквизиту 1 Если Таблица2.Количество() <> КопияТ2.Количество() Тогда // проверим, может таблицы совпали, тогда присоединение будет один к одному и «изворачиваться» не надо Таблица2.Колонки.Добавить(«Реквизит2»); Для каждого СтрокаТаблицыТЗ Из Таблица2 Цикл Для каждого СтрокаТаблицыКопии Из КопияТ2 Цикл Если СтрокаТаблицыТЗ.Реквизит1 = СтрокаТаблицыКопии.Реквизит1 Тогда СтрокаТаблицыТЗ.Реквизит2 = СтрокаТаблицыКопии.Реквизит2; КопияТ2.Удалить(СтрокаТаблицыКопии); // строка свое отслужила, уберем ее из таблицы. чтобы снова не просматривать Прервать; КонецЕсли; КонецЦикла; КонецЦикла; Иначе // раз совпали, то просто восстановим таблицу Таблица2 = КопияТ2.Скопировать(); КонецЕсли;

Пишите, если найдете другой интересный метод решения. С удовольствием посмотрим.

Работа с дополнительными реквизитами в 1С: Бухгалтерия 2.0

Сразу оговорюь, что всё сказаное в статье справедливо для всех конфигураций 1С, где применяются дополнительные реквизиты (т.е. конфигураций, где в основе лежат «стандартные подсистемы»). Однако, я использовал дополнительные реквизиты только в 1С: Бухгалтерия 2.0.

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

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

Тут приходит на помощь механизм, который в стандартных подсистемах (типовых конфигурациях) называется «Дополнительные реквизиты». В частности мы будем использовать следующие его особенности:

  • Возможность добавления информации к документу без изменения самого документа;
  • Возможность добавления дополнительной информации к документу без изменения конфигурации.

(Дополнительные реквизиты — это регистр сведений в котором хранится ссылка на документ и наименование дополнительного реквизита, который связан с документом. Само значение хранится в ПланеВидовХаррактеристик.)

И так, первое что нужно сделать — это добавить дополнительный реквизит, кнопка добавления располагается в командной панели журнала документов или в самом документе (в режиме предприятия):

Чтобы не модифицировать существующий журнал, я создал новый журнал документов, в котором сделал кнопку на командной панели «Проверен». Эта кнопка инвертирует статус документа «Проверено».

Код для получения статуса документа (чтения дополнительного реквизита):

Процедура ЖурналДокументовСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Запрос = Новый Запрос(); Запрос.УстановитьПараметр(«НазначениеСвойств», ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(ДанныеСтроки.Ссылка)); Запрос.УстановитьПараметр(«ОбъектОтбораЗначений», ДанныеСтроки.Ссылка); Запрос.Текст = «ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | СвойстваОбъектов.Наименование, | ЗначенияСвойствОбъектов.Значение КАК ПричинаЗамены, | ЕСТЬNULL(ЗначенияСвойствОбъектов.Значение, ЛОЖЬ) КАК Проверен |ИЗ | (ВЫБРАТЬ | СвойстваОбъектов.Ссылка КАК Ссылка, | СвойстваОбъектов.Наименование КАК Наименование, | СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления | ИЗ | ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов | ГДЕ | СвойстваОбъектов.НазначениеСвойства В(&НазначениеСвойств) | И СвойстваОбъектов.ПометкаУдаления = ЛОЖЬ | И (СвойстваОбъектов.Наименование = «»Проверено»» | ИЛИ СвойстваОбъектов.Наименование = «»ПричинаЗамены»»)) КАК СвойстваОбъектов | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов | ПО (ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка) | И (ЗначенияСвойствОбъектов.Объект = &ОбъектОтбораЗначений)»; Выборка = Запрос.Выполнить().Выбрать(); ОформлениеСтроки.Ячейки.Проверен.ОтображатьФлажок = Истина; Пока Выборка.Следующий() Цикл Если Выборка.Наименование = «Проверено» Тогда ОформлениеСтроки.Ячейки.Проверен.Флажок = Выборка.Проверен; ИначеЕсли Выборка.Наименование = «ПричинаЗамены» Тогда ОформлениеСтроки.Ячейки.ПричинаЗамены.Значение = Выборка.ПричинаЗамены; КонецЕсли; КонецЦикла; Если ДанныеСтроки.Ссылка.Метаданные().Имя = «ОперацияБух» Тогда ОформлениеСтроки.Ячейки.СуммаДокумента.Значение = ДанныеСтроки.Ссылка.СуммаОперации; ИначеЕсли ДанныеСтроки.Ссылка.Метаданные().Имя = «ОтчетОРозничныхПродажах» Тогда ОформлениеСтроки.Ячейки.СуммаДокумента.Значение = ДанныеСтроки.Ссылка.Оплата.Итог(«СуммаОплаты»); ИначеЕсли ДанныеСтроки.Ссылка.Метаданные().Имя = «ПереоценкаТоваровВРознице» Тогда ОформлениеСтроки.Ячейки.СуммаДокумента.Значение = ДанныеСтроки.Ссылка.Товары.Итог(«СуммаПереоценки»); ИначеЕсли ДанныеСтроки.Ссылка.Метаданные().Имя = «ПриходныйКассовыйОрдер» Тогда ОформлениеСтроки.Ячейки.СуммаДокумента.Значение = ДанныеСтроки.Ссылка.СуммаДокумента; КонецЕсли; КонецПроцедуры

Код для изменения (записи) реквизита:

Процедура ДействияФормыПроверен(Кнопка) НаборЗаписейЗначенияСвойств = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей(); СвойстваИЗначения = ПолучитьСтатус(ЭлементыФормы.ЖурналДокументовСписок.ТекущиеДанные.Ссылка); Для каждого Строка Из СвойстваИЗначения Цикл Если Строка.СвойстваОбъектовНаименование = «Проверено» И Строка.Проверен <> Истина Тогда Запись = НаборЗаписейЗначенияСвойств.Добавить(); Запись.Объект = ЭлементыФормы.ЖурналДокументовСписок.ТекущиеДанные.Ссылка; Запись.Свойство = Строка.Свойство; Запись.Значение = Не Строка.Проверен; КонецЕсли; Если ЗначениеЗаполнено(Строка.Значение) И Строка.Значение <> Ложь И Строка.СвойстваОбъектовНаименование <> «Проверено» Тогда Запись = НаборЗаписейЗначенияСвойств.Добавить(); Запись.Объект = ЭлементыФормы.ЖурналДокументовСписок.ТекущиеДанные.Ссылка; Запись.Свойство = Строка.Свойство; Запись.Значение = Строка.Значение; КонецЕсли; КонецЦикла; НаборЗаписейЗначенияСвойств.Отбор.Объект.Установить(ЭлементыФормы.ЖурналДокументовСписок.ТекущиеДанные.Ссылка); Попытка НаборЗаписейЗначенияСвойств.Записать(); Исключение КонецПопытки; ЖурналДокументовСписок.Обновить(); КонецПроцедуры

Я привёл пример кода только для записи одного дополнительного реквизита «Проверен», у меня есть ещё реквизит причина заметы, но с ним всё аналогично.

С отчетами тоже всё просто: в универсальном отчете по документу появяться дополнительный реквизиты в группе «ссылка».

Права на изменение/чтение реквизита:

У меня права на изменение дополнительных реквизитов были у всех. Но их легко ограничить программно, добавив в начало процедуры чтения/записи код:

Если Не РольДоступна(«ПолныеПрава») Тогда Возврат; КонецЕсли;

или

Если Не (ИмяПользователя() = «Вася» Или Найти(ИмяПользователя(), «Петя») > 0) Тогда Возврат; КонецЕсли;

Старался расписать достаточно подробно и коснуться всех аспектов использования дополнительных реквизитов, чтобы не пришлось даже искать где кнопка добавить реквизит.

UPD 16.07.2012

Функция ПолучитьСтатус(Объект) Запрос = Новый Запрос(); Запрос.УстановитьПараметр(«НазначениеСвойств», ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(Объект)); Запрос.УстановитьПараметр(«ОбъектОтбораЗначений», Объект); Запрос.Текст = «ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | СвойстваОбъектов.Наименование КАК СвойстваОбъектовНаименование, | СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления, | СвойстваОбъектов.Ссылка КАК Свойство, | ЗначенияСвойствОбъектов.Значение КАК Значение, | ЕСТЬNULL(ЗначенияСвойствОбъектов.Значение, ЛОЖЬ) КАК Проверен |ИЗ | (ВЫБРАТЬ | СвойстваОбъектов.Ссылка КАК Ссылка, | СвойстваОбъектов.Наименование КАК Наименование, | СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления | ИЗ | ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов | ГДЕ | СвойстваОбъектов.НазначениеСвойства В(&НазначениеСвойств)) КАК СвойстваОбъектов | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов | ПО (ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка) | И (ЗначенияСвойствОбъектов.Объект = &ОбъектОтбораЗначений) | |УПОРЯДОЧИТЬ ПО | СвойстваОбъектовНаименование»; ТабЗнач = Запрос.Выполнить().Выгрузить(); Возврат ТабЗнач; КонецФункции

В чем разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С

Цитата из справки 1С:
«По умолчанию при объединении запросов полностью одинаковые строки в результате запроса, сформированные РАЗНЫМИ запросами, заменяются одной. Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое слово ВСЕ.»
Конструкция ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ объединяет два результата запроса в один.
Пример запроса для вывода всех документов Приход и Расход:
Код 1C v 8.х ВЫБРАТЬ
Расход.Ссылка
ИЗ
Документ.Расход КАК Расход
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Приход.Ссылка
ИЗ
Документ.Приход КАК Приход
Конструкция ОБЪЕДИНИТЬ — соединяет два результата и группирует повторяющие строки,
А конструкция ОБЪЕДИНИТЬ ВСЕ — НЕ группирует автоматически строки результата.
Подробнее:
Порядок следования определяется порядком в списке полей в предложении ВЫБРАТЬ.
Количество полей можно изменить добавлением пустого фиктивного поля:
Код 1C v 8.х ВЫБРАТЬ
Приходная. Контрагент,
Приходная.Сумма,
0 КАК Менеджер
ИЗ
Документ.Приходная КАК Приходная
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Расходная.Контрагент,
Расходная.Сумма,
Расходная.Сотрудник
ИЗ
Документ.Расходная КАК Расходная
До некоторой степени, операции объединения и соединения прямо противоположны: при соединении у источников обязательно должен быть ключ (при объединении наличие ключа абсолютно не имеет значения), при соединении количество полей может быть произвольным (при объединении количество нолей должно совпадать и поля должны следовать в одном и то же порядке), при соединении природа данных в источниках может быть различна (при объединении связываются однотипные данные).
Смысл механизма
При объединении, фактически, выполняются два запроса, а потом их результаты объединяются в один общий. Конструкция ОБЪЕДИНИТЬ ВСЕ оставит в итоговом запросе только неповторяющиеся записи (то есть, результат её действия аналогичен использованию фразы РАЗЛИЧНЫЕ после выполнения объединения).
Назначение псевдонимов, упорядочивание и расчёт итогов выполняются после объединения и действуют на результирующую таблицу.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *