Почему ключевое слово РАЗЛИЧНЫЕ не работает в динамическом списке 1С и как убрать дубли записей

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке управляемых форм в 1С разработчики часто сталкиваются с нетипичным поведением: запрос с ключевым словом РАЗЛИЧНЫЕ (или DISTINCT), выполненный в консоли запросов, выводит абсолютно уникальные строки, однако тот же самый запрос в динамическом списке на форме показывает дубликаты записей. Разберем причины такого поведения платформы 1С и проанализируем способы решения этой проблемы.

Причины возникновения дублей в динамическом списке

Выясним, почему система компоновки данных (СКД), лежащая в основе динамического списка, меняет поведение запроса:

  1. Добавление служебных и ключевых полей. Динамический список работает в режиме порционного считывания данных. Чтобы корректно получать порции и обеспечивать навигацию, платформа автоматически подставляет в итоговый SQL-запрос скрытые ключевые поля (например, ссылки или ключи записей) и поля порядок/сортировки. Поисковый оператор РАЗЛИЧНЫЕ применяется ко всем полям итоговой выборки. Если видимые реквизиты совпадают, но скрытые ключи записей различаются, СУБД считает такие строки уникальными и возвращает их все. В результате пользователь видит на форме визуальные дубли.
  2. Ограничения на группировки и уникальность. Оператор РАЗЛИЧНЫЕ является частным случаем группировки по всем выбираемым полям. При указании основной таблицы динамического списка платформа накладывает жесткие ограничения на использование операторов ПЕРВЫЕ, РАЗЛИЧНЫЕ и секции СГРУППИРОВАТЬ ПО, так как порционная группировка выборки невозможна без считывания всего объема данных.

Способ 1. Использование пакетных запросов с временными таблицами

Начиная с платформы 8.3.10, в произвольных запросах динамических списков разрешено использовать пакетные запросы. Это позволяет первично отсечь дубли во временной таблице, а затем выгрузить результат в итоговую выборку.

Рассмотрим пример запроса, выбирающего уникальные записи из регистра сведений:


ВЫБРАТЬ РАЗЛИЧНЫЕ
	Коды.КодРаботы КАК Код1,
	Коды.Индекс КАК Индекс1
ПОМЕСТИТЬ ВТ_УникальныеКоды
ИЗ
	РегистрСведений.Коды КАК Коды
ГДЕ
	Коды.Тип В(&Тип)
	И Коды.Клиент = &Клиент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ.Код1 КАК Код,
	ВТ.Индекс1 КАК Индекс
ИЗ
	ВТ_УникальныеКоды КАК ВТ

Обратите внимание: рекомендуется задавать различные псевдонимы для полей во временной таблице и в итоговом запросе (например, Код1 во временной таблице и Код1 КАК Код в финальном запросе). Это предотвращает некорректную подстановку отборов и полей порядка платформой во внутренний подзапрос.

Способ 2. Отключение основной таблицы и настройка ключевых полей

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

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

Чтобы устранить эту ошибку, выполним следующие шаги:

  1. Откроем свойства динамического списка в конфигураторе.
  2. В поле Основная таблица установим значение «Не указана».
  3. В свойстве Вид ключа укажем «Использовать ключевые поля».
  4. В свойстве Поля ключа явно отметим галочками набор полей, который однозначно идентифицирует строку списка.

Решение ошибки «Поле не найдено "_ПараметрСпискаИмяПоляПорядка0"»

После изменения структуры запроса или создания временных таблиц при открытии формы может возникать ошибка с упоминанием служебного поля вида _ПараметрСпискаИмяПоляПорядка0. Разберем, почему она появляется:

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

Для исправления проблемы выполним следующие действия:

  1. В конфигураторе закроем форму, откроем свойства динамического списка и перейдем в диалог Настройка списка.
  2. Перейдем на вкладку Порядок и очистим все установленные поля сортировки.
  3. На форме проверим состав элементов: если элементы выведены из старых полей запроса, перепривяжем свойство ПутьКДанным для колонок таблицы к новым полям списка.
  4. В режиме пользователя сбросим настройки формы через меню Ещё -> Установить стандартные настройки.

Альтернативные варианты вывода данных

Если специфику данных невозможно уложить в логику порционного считывания динамического списка, проанализируем альтернативные решения:

← На главную