Как добавить столбец из регистра сведений в динамический список журнала документов и избежать ошибки дублирования?

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

При попытке расширить функционал ЖурналДокументов в конфигурации 1С:ЗУП 3.1 разработчики часто сталкиваются с техническими ограничениями динамических списков. Одной из самых распространенных проблем является ошибка «Обнаружено дублирование ключевых значений в колонках: "Ссылка"». Давайте подробно разберем, почему она возникает и как правильно модифицировать запрос, чтобы получить необходимые данные без нарушения целостности работы формы.

Понимание природы ошибки

Динамический список в управляемых формах 1С всегда опирается на уникальный ключ — как правило, это поле Ссылка. Платформа ожидает, что каждой строке в таблице будет соответствовать ровно один документ. Когда вы добавляете в запрос ЛЕВОЕ СОЕДИНЕНИЕ с регистром сведений, содержащим исторические данные (например, ГражданствоФизическихЛиц), и у сотрудника в регистре оказывается несколько записей (например, история смен гражданства или некорректные записи), запрос возвращает несколько строк на один документ.

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

Правильный подход к решению: используем СрезПоследних

Вместо того чтобы соединять список документов со всей физической таблицей регистра, нам необходимо получить актуальное состояние данных на текущий момент. В 1С для периодических регистров сведений существует механизм виртуальных таблиц, в частности — СрезПоследних.

Использование виртуальной таблицы гарантирует, что для каждого физического лица (или сотрудника) в выборку попадет ровно одна запись — последняя по периоду. Это превращает наше соединение из «один-ко-многим» в «один-к-одному», что полностью устраняет проблему дублирования ссылок.

Пошаговая инструкция по изменению запроса

Чтобы реализовать данную задачу, выполните следующие действия:

  1. Откройте форму списка ЖурналДокументов.ПриемыПереводыУвольнения в конфигураторе.
  2. Перейдите в свойства динамического списка и откройте редактор запроса.
  3. Добавьте соединение с виртуальной таблицей СрезПоследних регистра ГражданствоФизическихЛиц.

Пример корректной структуры запроса:


ВЫБРАТЬ
    ЖурналДокументов.Ссылка КАК Ссылка,
    ЖурналДокументов.Дата КАК Дата,
    // ... остальные поля документа
    Гражданство.Страна КАК Страна
ИЗ
    ЖурналДокументов.ПриемыПереводыУвольнения КАК ЖурналДокументов
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрСведений.ГражданствоФизическихЛиц.СрезПоследних(&Период, ) КАК Гражданство
ПО
    ЖурналДокументов.Сотрудник.ФизическоеЛицо = Гражданство.ФизическоеЛицо

Важные рекомендации и предостережения

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

Следуя данному подходу, вы не только решите проблему с дублированием записей, но и сделаете код более читаемым и соответствующим стандартам разработки 1С. Использование виртуальных таблиц — это «золотой стандарт» работы с регистрами, который позволяет избежать множества ошибок при создании отчетов и списков.

Если после применения СрезПоследних ошибка продолжает появляться, проверьте, не возникает ли дублирование из-за других соединений в вашем запросе (например, с регистром НаличиеФайлов). Принцип остается тем же: каждое соединение должно обеспечивать однозначное соответствие записи документа и записи дополнительной таблицы.

← На главную