При разработке управляемых форм в 1С разработчики часто сталкиваются с нетипичным поведением: запрос с ключевым словом РАЗЛИЧНЫЕ (или DISTINCT), выполненный в консоли запросов, выводит абсолютно уникальные строки, однако тот же самый запрос в динамическом списке на форме показывает дубликаты записей. Разберем причины такого поведения платформы 1С и проанализируем способы решения этой проблемы.
Выясним, почему система компоновки данных (СКД), лежащая в основе динамического списка, меняет поведение запроса:
РАЗЛИЧНЫЕ применяется ко всем полям итоговой выборки. Если видимые реквизиты совпадают, но скрытые ключи записей различаются, СУБД считает такие строки уникальными и возвращает их все. В результате пользователь видит на форме визуальные дубли.РАЗЛИЧНЫЕ является частным случаем группировки по всем выбираемым полям. При указании основной таблицы динамического списка платформа накладывает жесткие ограничения на использование операторов ПЕРВЫЕ, РАЗЛИЧНЫЕ и секции СГРУППИРОВАТЬ ПО, так как порционная группировка выборки невозможна без считывания всего объема данных.Начиная с платформы 8.3.10, в произвольных запросах динамических списков разрешено использовать пакетные запросы. Это позволяет первично отсечь дубли во временной таблице, а затем выгрузить результат в итоговую выборку.
Рассмотрим пример запроса, выбирающего уникальные записи из регистра сведений:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Коды.КодРаботы КАК Код1,
Коды.Индекс КАК Индекс1
ПОМЕСТИТЬ ВТ_УникальныеКоды
ИЗ
РегистрСведений.Коды КАК Коды
ГДЕ
Коды.Тип В(&Тип)
И Коды.Клиент = &Клиент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Код1 КАК Код,
ВТ.Индекс1 КАК Индекс
ИЗ
ВТ_УникальныеКоды КАК ВТ
Обратите внимание: рекомендуется задавать различные псевдонимы для полей во временной таблице и в итоговом запросе (например, Код1 во временной таблице и Код1 КАК Код в финальном запросе). Это предотвращает некорректную подстановку отборов и полей порядка платформой во внутренний подзапрос.
Если динамический список построен не по объекту (справочнику или документу), а по регистру сведений или произвольной выборке, попробуем очистить свойство Основная таблица в настройках списка.
При отмене основной таблицы платформа может выдать ошибку: «Группировка данных не разрешена без указания основной таблицы или при отсутствии у основной таблицы ключевых полей».
Чтобы устранить эту ошибку, выполним следующие шаги:
Основная таблица установим значение «Не указана».Вид ключа укажем «Использовать ключевые поля».Поля ключа явно отметим галочками набор полей, который однозначно идентифицирует строку списка.После изменения структуры запроса или создания временных таблиц при открытии формы может возникать ошибка с упоминанием служебного поля вида _ПараметрСпискаИмяПоляПорядка0. Разберем, почему она появляется:
Эта ошибка означает, что в сохраненных пользовательских настройках формы или в настройках списка конфигуратора осталась сортировка (порядок) по полю, которое сменило свой псевдоним или было удалено из финальной выборки.
Для исправления проблемы выполним следующие действия:
Настройка списка.ПутьКДанным для колонок таблицы к новым полям списка.Если специфику данных невозможно уложить в логику порционного считывания динамического списка, проанализируем альтернативные решения:
Динамическое считывание данных. В этом случае список загрузит весь объем данных сразу, и оператор РАЗЛИЧНЫЕ сработает корректно. Этот вариант подходит только для небольших наборов данных (до нескольких тысяч строк).ТаблицаЗначений, заполняемого на сервере с помощью обычного запросного вызова.