Обновить

Комментарии 5

На вашем 1С ни разу не писал, но так будет работать?

function catalog_elements_with_same_ts(reference) export
	q = new query;
	q.setparameter("reference", reference);
	q.setparameter("referencerowcount", reference.count());
	q.text =
	"select
	|	спр.ссылка as ссылка
	|from
	|	справочник.тырымпырым as спр,
	|	справочник.тырымпырым.тч as тч,
	|	&reference as reference
	|where
	|	тч.ссылка = спр.ссылка
	|	and reference.контрагент = тч.контрагент
	|	and reference.договор = тч.договор
	|group by
	|	спр.ссылка
	|having
	|	count(тч.номерстроки) = &referencerowcount
	|	and count(reference.контрагент) = &referencerowcount";

	return q.execute().unload().unloadcolumn("ссылка");
endfunction

Идея верная, два счётчика в ИМЕЮЩИЕ — как в статье. Но в таком виде не заработает, по двум причинам.

  1. В 1С из параметра — таблицы значений можно выбирать только в запросе, который кладёт результат во временную таблицу (ПОМЕСТИТЬ). &reference as reference прямо в ИЗ даст ошибку при выполнении. Нужен первый запрос пакета: select т.контрагент, т.договор into reference from &reference as т.

  2. Таблицы через запятую с условиями в where — это внутреннее соединение. Строки ТЧ, которых нет в эталоне, отбрасываются ещё до группировки. Поэтому count(тч.номерстроки) считает только совпавшие строки, и оба счётчика всегда равны. Элемент с эталонными строками плюс одной лишней пройдёт проверку — это ошибка 1 из статьи. А элемент с пустой ТЧ в выборку не попадёт вообще, так что пустой эталон тоже не сработает.

Если начать со справочника и присоединить ТЧ и эталон левым соединением, первый счётчик посчитает все строки ТЧ, а второй — только совпавшие. Получится как раз запрос из статьи.

нужно написать запрос

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

Согласен, «написать запрос» можно понять по-разному. Ответ здесь — текст запроса, а функция вокруг только показывает, откуда берутся параметры. Количество строк эталона можно посчитать и в самом запросе, ещё одним запросом пакета:

ВЫБРАТЬ Т.Контрагент КАК Контрагент, Т.Договор КАК Договор
ПОМЕСТИТЬ Эталон
ИЗ &Эталон КАК Т
;
ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество
ПОМЕСТИТЬ Размер
ИЗ Эталон
;
ВЫБРАТЬ Спр.Ссылка КАК Ссылка
ИЗ Справочник.ТырымПырым КАК Спр
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ Размер КАК Размер ПО ИСТИНА
	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ТырымПырым.ТЧ КАК ТЧ
	ПО ТЧ.Ссылка = Спр.Ссылка
	ЛЕВОЕ СОЕДИНЕНИЕ Эталон КАК Эталон
	ПО Эталон.Контрагент = ТЧ.Контрагент И Эталон.Договор = ТЧ.Договор
СГРУППИРОВАТЬ ПО Спр.Ссылка
ИМЕЮЩИЕ КОЛИЧЕСТВО(ТЧ.НомерСтроки) = МАКСИМУМ(Размер.Количество)
	И КОЛИЧЕСТВО(Эталон.Контрагент) = МАКСИМУМ(Размер.Количество)

Параметр остаётся один — сама таблица. При пустом эталоне КОЛИЧЕСТВО(*) вернёт одну строку с нулём, так что элементы с пустой ТЧ найдутся и здесь. Хотя таблицу значений в консоли запросов тоже придётся как-то задать, так что совсем без кода не обойтись.

Да я как бы и не спрашивал решение. )

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

таблицу значений в консоли запросов тоже придётся как-то задать

Неужели вы пользуетесь исключительно типовой консолью? Ну даже если и так, собрать таблицу из двух строк в запросе несложно. Так что да, "совсем без кода не обойтись", но этот код будет частью текста запроса.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации