1С запрос количество строк в табличной части

Как в запросе отобрать только табличные части с указанным условием и не заполненные. Автор статьи: Гений 1С | Редакторы:
Последняя редакция №3 от 23.08.06 |

Ключевые слова: табличная часть,запрос

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

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

Исходный запрос был таким:

Можно было убрать условие где, тогда бы в результат попали все табличные части, даже не заполненные. Но тогда бы терялось удобство использования отбора и скорость отчета бы гораздо уменьшилась. Мне бы пришлось программно перебирать таблицу значений Дети и проверять год рождения.

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

Для пустой табличной части условие в скобках давало ложь, НЕ превращало его в истину. Все нужные данные попадали.

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

Идем дальше

Но лучше всего и надежнее использовать другой подход. Если уж вам хочется таблиц значений, нужно написать этот запрос так:

kgn Вопрос-ответ Отзывов (2) В закладки

Помогите в запросе подсчитать отдельно кол-во строк в табл.частях документа “ГотоваяПродукция”.В табл.части “Материалы”(назовем Кол1) и отдельно и в табл.части “Затраты” (назовем Кол2)отдельно! В запросе “КолвоСтрокПродукции.КолвоСтрок” -это общее кол-во строк в док.ГотоваяПродукция(Кол1+Кол2). В тексте запроса “КоличествоПриход” будет рассчитываться в зависимости от Кол1 или Кол2.
Вот текст запроса:

ПродукцияИМатериалы.Склад КАК Склад,
ПродукцияИМатериалы.Регистратор КАК Регистратор,
ПродукцияИМатериалы.Номенклатура КАК Продукция,
ПродукцияИМатериалы.ХарактеристикаНоменклатуры КАК Характеристика,
ПродукцияИМатериалы.Материал.СтатьяЗатрат.ВидЗатрат КАК ВидЗатрат,

//****вот здесь условие будет строитья с Кол1 или Кол2

СУММА(ВЫБОР
КОГДА ПродукцияИМатериалы.КоличествоМат = 0
ТОГДА 0
КОГДА ПродукцияИМатериалы.КоличествоМат <> 0
И КолвоСтрокПродукции.КолвоСтрок = 1
ТОГДА ПродукцияИМатериалы.Количество / КолвоСтрокПродукции.КолвоСтрок
КОГДА ПродукцияИМатериалы.КоличествоМат <> 0
И КолвоСтрокПродукции.КолвоСтрок > 1
ТОГДА ПродукцияИМатериалы.Количество / (КолвоСтрокПродукции.КолвоСтрок – 1)
ИНАЧЕ ПродукцияИМатериалы.Количество / КолвоСтрокПродукции.КолвоСтрок
КОНЕЦ) КАК КоличествоПриход,

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

Читайте также:  Сканер сбора данных тест

СГРУППИРОВАТЬ ПО
Продукция.Регистратор.СкладПолучатель,
Продукция.Номенклатура,
Продукция.ХарактеристикаНоменклатуры,
Материалы.Номенклатура,
Материалы.ХарактеристикаНоменклатуры,
Продукция.Регистратор

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

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

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

СГРУППИРОВАТЬ ПО
КолвоСтрокМат.Продукция,
КолвоСтрокМат.ХарактеристикаПродукции,
КолвоСтрокМат.Регистратор) КАК КолвоСтрокПродукции
ПО ПродукцияИМатериалы.Регистратор = КолвоСтрокПродукции.Регистратор
И ПродукцияИМатериалы.Номенклатура = КолвоСтрокПродукции.Продукция
И ПродукцияИМатериалы.ХарактеристикаНоменклатуры = КолвоСтрокПродукции.ХарактеристикаПродукции
<ГДЕ
ПродукцияИМатериалы.Склад.*,
ПродукцияИМатериалы.Регистратор.*,
ПродукцияИМатериалы.Номенклатура.*,
ПродукцияИМатериалы.ХарактеристикаНоменклатуры.*,
ПродукцияИМатериалы.Материал.*>

СГРУППИРОВАТЬ ПО
ПродукцияИМатериалы.Материал,
ПродукцияИМатериалы.Регистратор,
ПродукцияИМатериалы.Номенклатура,
ПродукцияИМатериалы.ХарактеристикаНоменклатуры,
ПродукцияИМатериалы.ХарактеристикаМатериала,
ПродукцияИМатериалы.Склад,
ПродукцияИМатериалы.Материал.БазоваяЕдиницаИзмерения,
ПродукцияИМатериалы.Материал.СтатьяЗатрат.ВидЗатрат

УПОРЯДОЧИТЬ ПО
Склад,
Продукция,
Характеристика,
Регистратор
<УПОРЯДОЧИТЬ ПО
Склад,
Продукция,
Характеристика,
Регистратор,
Материал>
ИТОГИ
СУММА(КоличествоПриход),
СУММА(СтоимостьПриход),
СРЕДНЕЕ(Себестоимость),
СУММА(КоличествоМат),
СУММА(СуммаМат),
СУММА(ЦенаМат),
СУММА(КолвоМатНаЕдиницу),
СУММА(СтоимМатНаЕдиницу),
СУММА(КолвоСтрок)
ПО
ОБЩИЕ,
Склад,
Продукция,
Характеристика,
Регистратор
<ИТОГИ ПО
Склад,
Продукция,
Характеристика,
Регистратор,
Материал>

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

Здесь все достаточно просто. Обращаемся к данным табличной части документа, группируем по ключевым полям с использование агрегатной функции для подсчета количества номеров строк. Накладываем условие по вычисленному значению агрегатной функции. Все.

Читайте также:  Как изменить вес изображения в фотошопе

2) Классика жанра. Выведем в сообщении пользователю номера всех тех строк табличной части, которые являются дублями.

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

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

Запрос.Текст =
"ВЫБРАТЬ
| ТабЧасть.Качество,
| ТабЧасть.Номенклатура,
| ТабЧасть.СерияНоменклатуры,
| ТабЧасть.Склад,
| ТабЧасть.ХарактеристикаНоменклатуры,
| ТабЧасть.НомерСтроки КАК НомерСтроки
|ПОМЕСТИТЬ ВТ_ТабЧасть
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК ТабЧасть
|ГДЕ
| ТабЧасть.Ссылка = &Ссылка
|;
| |////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТабЧасть.Качество КАК Качество,
| ТабЧасть.Номенклатура КАК Номенклатура,
| ТабЧасть.СерияНоменклатуры КАК СерияНоменклатуры,
| ТабЧасть.Склад КАК Склад,
| ТабЧасть.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ТабЧасть.НомерСтроки КАК НомерСтроки
|ИЗ
| ВТ_ТабЧасть КАК ТабЧасть
|ГДЕ
| (ТабЧасть.Качество, ТабЧасть.Номенклатура, ТабЧасть.СерияНоменклатуры, ТабЧасть.Склад, ТабЧасть.ХарактеристикаНоменклатуры) В
| (ВЫБРАТЬ
| ВТ.Качество,
| ВТ.Номенклатура,
| ВТ.СерияНоменклатуры,
| ВТ.Склад,
| ВТ.ХарактеристикаНоменклатуры
| ИЗ
| ВТ_ТабЧасть КАК ВТ
| СГРУППИРОВАТЬ ПО
| ВТ.Качество,
| ВТ.Номенклатура,
| ВТ.СерияНоменклатуры,
| ВТ.Склад,
| ВТ.ХарактеристикаНоменклатуры
| ИМЕЮЩИЕ
| КОЛИЧЕСТВО(ВТ.НомерСтроки) > 1)
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки
|ИТОГИ ПО
| Качество,
| Номенклатура,
| СерияНоменклатуры,
| Склад";
РезЗапроса = Запрос.Выполнить () ;
Если Не РезЗапроса.Пустой () Тогда
Выб_Качество = РезЗапроса.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_Качество.Следующий () Цикл
Выб_Номенклатура = Выб_Качество.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_Номенклатура.Следующий () Цикл
Выб_СерияНоменклатуры = Выб_Номенклатура.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_СерияНоменклатуры.Следующий () Цикл
Выб_Склад = Выб_СерияНоменклатуры.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_Склад.Следующий() Цикл
Выборка = Выб_Склад.Выбрать ();
ТекстСообщения = "" ;
Пока Выборка.Следующий () Цикл
ТекстСообщения = ТекстСообщения + ?( ПустаяСтрока ( ТекстСообщения ) , "" , ", " ) + Выборка.НомерСтроки ;
КонецЦикла;
ТекстСообщения = "Обнаружено дублирование строк: " + ТекстСообщения ; Сообщить(ТекстСообщения);
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;

А теперь попробуем оценить перспективу доработки. Допустим, у нас изменился состав ключевых полей в сторону увеличения их количества: добавились ЕдиницаИзмерения и ЗаказПокупателя. Чтобы контроль дублей строк не перестал работать, нам нужно доработать запрос и обход результата запроса следующим образом:

Запрос = Новый Запрос ;
Запрос.УстановитьПараметр ( "Ссылка" , Ссылка );
Запрос.Текст =
" ВЫБРАТЬ
| ТабЧасть.ЕдиницаИзмерения,
| ТабЧасть.ЗаказПокупателя,
| ТабЧасть.Качество,
| ТабЧасть.Номенклатура,
| ТабЧасть.СерияНоменклатуры,
| ТабЧасть.Склад,
| ТабЧасть.ХарактеристикаНоменклатуры,
| ТабЧасть.НомерСтроки КАК НомерСтроки
|ПОМЕСТИТЬ ВТ_ТабЧасть
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК ТабЧасть
|ГДЕ
| ТабЧасть.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТабЧасть.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ТабЧасть.ЗаказПокупателя КАК ЗаказПокупателя,
| ТабЧасть.Качество КАК Качество,
| ТабЧасть.Номенклатура КАК Номенклатура,
| ТабЧасть.СерияНоменклатуры КАК СерияНоменклатуры,
| ТабЧасть.Склад КАК Склад,
| ТабЧасть.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ТабЧасть.НомерСтроки КАК НомерСтроки
|ИЗ
| ВТ_ТабЧасть КАК ТабЧасть
|ГДЕ
| (ТабЧасть.ЕдиницаИзмерения, ТабЧасть.ЗаказПокупателя, ТабЧасть.Качество, ТабЧасть.Номенклатура, ТабЧасть.СерияНоменклатуры, ТабЧасть.Склад, ТабЧасть.ХарактеристикаНоменклатуры) В
| (ВЫБРАТЬ
| ВТ.ЕдиницаИзмерения,
| ВТ.ЗаказПокупателя,
| ВТ.Качество,
| ВТ.Номенклатура,
| ВТ.СерияНоменклатуры,
| ВТ.Склад,
| ВТ.ХарактеристикаНоменклатуры
| ИЗ
| ВТ_ТабЧасть КАК ВТ
| СГРУППИРОВАТЬ ПО
| ВТ.ЕдиницаИзмерения,
| ВТ.ЗаказПокупателя,
| ВТ.Качество,
| ВТ.Номенклатура,
| ВТ.СерияНоменклатуры,
| ВТ.Склад,
| ВТ.ХарактеристикаНоменклатуры
| ИМЕЮЩИЕ
| КОЛИЧЕСТВО(ВТ.НомерСтроки) > 1)
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки
|ИТОГИ ПО
| Качество,
| Номенклатура,
| СерияНоменклатуры,
| Склад,
| ХарактеристикаНоменклатуры,
| ЕдиницаИзмерения" ;
РезЗапроса = Запрос.Выполнить ();
Если Не РезЗапроса.Пустой () Тогда
Выб_Качество = РезЗапроса.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_Качество.Следующий () Цикл
Выб_Номенклатура = Выб_Качество.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_Номенклатура.Следующий () Цикл
Выб_СерияНоменклатуры = Выб_Номенклатура.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_СерияНоменклатуры.Следующий () Цикл
Выб_Склад = Выб_СерияНоменклатуры.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_Склад.Следующий () Цикл
Выб_ХарактеристикаНоменклатуры = Выб_Склад.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_ХарактеристикаНоменклатуры.Следующий () Цикл
Выб_ЕдиницаИзмерения = Выб_ХарактеристикаНоменклатуры.Выбрать ( ОбходРезультатаЗапроса.ПоГруппировкам );
Пока Выб_ЕдиницаИзмерения.Следующий () Цикл
ТекстСообщения = "" ;
Выборка = Выб_ЕдиницаИзмерения.Выбрать ();
Пока Выборка.Следующий () Цикл
ТекстСообщения = ТекстСообщения + ?( ПустаяСтрока ( ТекстСообщения ), " " , ", " ) + Выборка.НомерСтроки ;
КонецЦикла;
ТекстСообщения = "Обнаружено дублирование строк: " + ТекстСообщения ;
Сообщить ( ТекстСообщения );
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;

Читайте также:  Jquery selected option text

3) Альтернативный вариант.

Реализация предыдущего варианта другим способом. Предлагаю использовать особенность запросов 1С, позволяющих обращаться к данным табличных частей, как к обычным полям выборки. Ну все-таки не совсем обычным, но все же полям выборки. Кроме того, нам придётся использовать не самый оптимальный способ соединения данных – декартово произведение. Почему так – опишу ниже.

Несколько комментариев по поводу запроса.

Работа с табличными частями в качестве полей выборки накладывает ряд ограничений на выполнение запросов. Во-первых, это работа с временными таблицами. Т.е. нельзя помещать такие объекты во временные таблицы, но никто не мешает использовать вложенные запросы. Во-вторых, это соединения таблиц. Мне требовалось написать такой запрос, который бы возвратил мне наборы ключевых полей по которым имеются дубли, и многострочный объект, содержащий все строки с таким же набором ключевых полей. Обычные соединения (ВНУТРЕННЕЕ, ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ) возвращают всю табличную часть, что, в общем, правильно – для части объекта условие соединения же выполняется? Выполняется. Ну тогда и получите всю табличную часть. Искомый результат, как оказалось, достигается декартовым произведением. Мне как-то претит видеть в тексте запроса перечисление таблиц через запятую, поэтому я все декартовы произведения всегда реализую через «. СОЕДИНЕНИЕ . ПО (ИСТИНА)». Чтобы ограничить мсье Декарта в аппетитах (и повысить производительность), применяются дополнительные ограничения.

Теперь о производительности. Производились тестовые замеры каждого из вариантов на документе с большим количеством строк в табличной части. Количество строк в тестируемом документе: 47 817, 4 комбинации ключевых полей с дублями по 2, 2, 3 и 4 строки. Результаты замеров:

Вариант 1) 0:00:00.078 сек.

Вариант 2) 0:00:00.265 сек.

Вариант 3) 0:00:01.513 сек.

Как видим, третий вариант, как и ожидалось, самый медленный, но он же является самым удобным в перспективе модификации.

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

1) Выбираем вид объекта: Документ или Справочник.

2) Выбираем тип объекта: Какой именно документ или справочник.

3) Выбираем табличную часть объекта.

4) Определяем состав ключевых полей в специальном диалоге

5) Если мы хотим, то можем указать ссылку на объект, чтобы проверить его на наличие дублей.

6) Если активен флажок «Сгенерировать и показать код для проверки на дубли», то будет сгенерирован программный код для выполнения проверки на дубли строк с имеющимися настройками.

Эксперт по технологическим вопросам ООО ЦБР ИнфоСофт