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

Иногда бывает необходимо получить последние или первые строки табличных частей нескольких элементов (документов, справочников и т.п.) Проблема в том, что у разных элементов может быть разное количество строк в табличной части, поэтому получить нужную строку по номеру не получится, а использовать сортировку и ВЫБРАТЬ ПЕРВЫЕ 1 зачастую нельзя.

Рассмотрим пример. В запросе, который получает данные из документов Приобретение товаров и услуг необходимо получить поле с адресом контрагента. В новых версиях конфигураций 1С контактная информация контрагентов хранится в табличной части справочника. В этой табличной части хранятся не только актуальные адреса, но история.

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

Итак, для начала получим номер строки актуального адреса:

"ВЫБРАТЬ
| МАКСИМУМ(КонтрагентыКонтактнаяИнформация.НомерСтроки) КАК НомерСтроки,
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
|ГДЕ
| КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
| КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)
|СГРУППИРОВАТЬ ПО
| КонтрагентыКонтактнаяИнформация.Ссылка"

Здесь мы выбираем из табличной части справочника Контрагенты строки, удовлетворяющие условиям (в этой табличной части могут быть не только адреса), а потом с помощью группировки получаем максимальный номер строки. Это и будет последний актуальный адрес.

Теперь поместим результат этого запроса во временную таблицу и с ее помощью получим сам адрес.

"ВЫБРАТЬ
| МАКСИМУМ(КонтрагентыКонтактнаяИнформация.НомерСтроки) КАК НомерСтроки,
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка
|ПОМЕСТИТЬ НомерСтрокиАдреса
|ИЗ
| Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
|ГДЕ
| КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
| КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)
|СГРУППИРОВАТЬ ПО
| КонтрагентыКонтактнаяИнформация.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка,
| КонтрагентыКонтактнаяИнформация.Представление КАК Представление
|ИЗ
| НомерСтрокиАдреса КАК НомерСтрокиАдреса
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
| ПО (КонтрагентыКонтактнаяИнформация.Ссылка = НомерСтрокиАдреса.Ссылка)
| И НомерСтрокиАдреса.НомерСтроки = КонтрагентыКонтактнаяИнформация.НомерСтроки"

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

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

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

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

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