В процессе разработки на платформе 1С:Предприятие многие разработчики сталкиваются с ситуацией, когда запрос, казалось бы, простой и понятный, возвращает «лишние» строки. Чаще всего это происходит при выводе данных в Динамический список, когда в результате мы видим несколько строк с одинаковыми документами и датами, хотя ожидаем увидеть уникальный перечень. Давайте разберем, почему это происходит и как правильно настроить систему, чтобы избавиться от дублей.
Первым делом важно понять: платформа 1С всегда работает с данными в рамках архитектуры регистров. Если вы используете Регистр сведений, он состоит из Измерений, Ресурсов и Реквизитов. Ключевая ошибка при анализе «дублей» заключается в том, что мы смотрим только на те поля, которые вывели на форму, но не учитываем невидимые глазу измерения.
Когда вы используете Динамический список, у него есть важное свойство — Основная таблица. Если это свойство заполнено (например, указан конкретный регистр сведений), платформа автоматически считает ключом записи весь набор измерений регистра плюс период (если регистр подчинен регистратору или имеет периодичность). Даже если вы используете ВЫБРАТЬ РАЗЛИЧНЫЕ или СГРУППИРОВАТЬ ПО, эти механизмы могут конфликтовать с автоматической логикой формирования запроса динамического списка.
Если вы столкнулись с тем, что записи дублируются, прежде всего проверьте свойство Основная таблица у вашего динамического списка. Если задача подразумевает выборку только части данных (например, только дата и документ), наличие основной таблицы заставляет систему «подтягивать» и остальные поля, по которым записи могут различаться (например, разные сотрудники).
Решение: Попробуйте очистить поле Основная таблица. После этого динамический список перестанет «навязывать» свою структуру ключа, и запрос начнет работать строго так, как вы его описали.
Если после настройки основной таблицы проблема сохраняется, рассмотрим синтаксис запроса. Оператор ВЫБРАТЬ РАЗЛИЧНЫЕ работает корректно только тогда, когда значения во всех выбранных колонках полностью совпадают.
Рассмотрим пример запроса, который выбирает нужные нам поля:
ВЫБРАТЬ РАЗЛИЧНЫЕ
РегистрСведений.ДокументФизическогоЛица,
РегистрСведений.ДатаДокумента
ИЗ
РегистрСведений.СоставДокументовЗарплатаКадры КАК РегистрСведений
ГДЕ
(&ФизическоеЛицо = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
ИЛИ РегистрСведений.ФизическоеЛицо В (&ФизическоеЛицо))
Если запрос все еще возвращает дубли, значит, где-то скрыто различие. В 1С тип Дата всегда хранит время. Даже если в интерфейсе вы видите только дату, в базе данных может быть записано разное время (например, 10:00:01 и 10:00:02). Для устранения этого влияния используйте функцию НАЧАЛОПЕРИОДА.
Если выборка должна быть максимально гибкой, лучше всего использовать СГРУППИРОВАТЬ ПО. Это позволяет явно указать платформе, по каким полям нужно обеспечить уникальность. В связке с агрегатными функциями это дает полный контроль над результатом.
ВЫБРАТЬ
РегистрСведений.ДокументФизическогоЛица,
РегистрСведений.ДатаДокумента
ИЗ
РегистрСведений.СоставДокументовЗарплатаКадры КАК РегистрСведений
СГРУППИРОВАТЬ ПО
РегистрСведений.ДокументФизическогоЛица,
РегистрСведений.ДатаДокумента
В этом случае, если у вас есть несколько записей с одинаковыми документами и датами, они схлопнутся в одну строку. Если же в других полях регистра (которые не входят в группировку) данные различаются, они просто игнорируются при формировании итогового набора, что и требуется для достижения чистоты списка.
Ссылка на объект — это уникальный идентификатор. Если вы работаете с составным типом данных (например, когда документ может быть разного вида), убедитесь, что вы не путаете строковые представления объектов с самими ссылками.Применяя эти методы, вы сможете легко управлять выборкой данных в 1С и исключать любые нежелательные повторения. Помните, что правильная настройка Динамического списка — это 90% успеха при создании пользовательских отчетов и обработок.