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