Комментарии 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С из параметра — таблицы значений можно выбирать только в запросе, который кладёт результат во временную таблицу (
ПОМЕСТИТЬ).&reference as referenceпрямо вИЗдаст ошибку при выполнении. Нужен первый запрос пакета:select т.контрагент, т.договор into reference from &reference as т.Таблицы через запятую с условиями в
where— это внутреннее соединение. Строки ТЧ, которых нет в эталоне, отбрасываются ещё до группировки. Поэтомуcount(тч.номерстроки)считает только совпавшие строки, и оба счётчика всегда равны. Элемент с эталонными строками плюс одной лишней пройдёт проверку — это ошибка 1 из статьи. А элемент с пустой ТЧ в выборку не попадёт вообще, так что пустой эталон тоже не сработает.
Если начать со справочника и присоединить ТЧ и эталон левым соединением, первый счётчик посчитает все строки ТЧ, а второй — только совпавшие. Получится как раз запрос из статьи.
нужно написать запрос
А в решении написали целую функцию. Тут надо бы уточнять задание, я бы понял "запрос" как "текст запроса". Так слишком просто, дайте человеку консоль запросов и пусть количество строк эталона тоже считает в запросе.
Согласен, «написать запрос» можно понять по-разному. Ответ здесь — текст запроса, а функция вокруг только показывает, откуда берутся параметры. Количество строк эталона можно посчитать и в самом запросе, ещё одним запросом пакета:
ВЫБРАТЬ Т.Контрагент КАК Контрагент, Т.Договор КАК Договор
ПОМЕСТИТЬ Эталон
ИЗ &Эталон КАК Т
;
ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество
ПОМЕСТИТЬ Размер
ИЗ Эталон
;
ВЫБРАТЬ Спр.Ссылка КАК Ссылка
ИЗ Справочник.ТырымПырым КАК Спр
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Размер КАК Размер ПО ИСТИНА
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ТырымПырым.ТЧ КАК ТЧ
ПО ТЧ.Ссылка = Спр.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Эталон КАК Эталон
ПО Эталон.Контрагент = ТЧ.Контрагент И Эталон.Договор = ТЧ.Договор
СГРУППИРОВАТЬ ПО Спр.Ссылка
ИМЕЮЩИЕ КОЛИЧЕСТВО(ТЧ.НомерСтроки) = МАКСИМУМ(Размер.Количество)
И КОЛИЧЕСТВО(Эталон.Контрагент) = МАКСИМУМ(Размер.Количество)
Параметр остаётся один — сама таблица. При пустом эталоне КОЛИЧЕСТВО(*) вернёт одну строку с нулём, так что элементы с пустой ТЧ найдутся и здесь. Хотя таблицу значений в консоли запросов тоже придётся как-то задать, так что совсем без кода не обойтись.
Да я как бы и не спрашивал решение. )
Я лишь уточнил, что решение целиком через запрос, на мой взгляд, интереснее.
таблицу значений в консоли запросов тоже придётся как-то задать
Неужели вы пользуетесь исключительно типовой консолью? Ну даже если и так, собрать таблицу из двух строк в запросе несложно. Так что да, "совсем без кода не обойтись", но этот код будет частью текста запроса.

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