Здравствуйте. В ЗУП бухгалтер не может подобрать сотрудников (Выплаты - Ведомости в банк - Создать - Подбор). Выходит сообщение "Обнаружено дублирование ключевых значений в колонках "Ссылка". Отображение данных в списке невозможно".
(1) Форма подбора – это Справочник.ФизическиеЛица.Форма.ФормаВыбораСотрудников. Текст запроса там переопределяется динамически. У меня, например, такой:
фактический текст запроса динамического списка
ВЫБРАТЬ
СправочникФизическиеЛица.Ссылка КАК Ссылка,
СправочникФизическиеЛица.ПометкаУдаления КАК ПометкаУдаления,
СправочникФизическиеЛица.Предопределенный КАК Предопределенный,
СправочникФизическиеЛица.Родитель КАК Родитель,
СправочникФизическиеЛица.ЭтоГруппа КАК ЭтоГруппа,
СправочникФизическиеЛица.Код КАК Код,
СправочникФизическиеЛица.Наименование КАК Наименование,
СправочникФизическиеЛица.ДатаРождения КАК ДатаРождения,
СправочникФизическиеЛица.ИНН КАК ИНН,
СправочникФизическиеЛица.СтраховойНомерПФР КАК СтраховойНомерПФР,
ТекущиеКадровыеДанныеСотрудников.ДатаПриема КАК ДатаПриема,
ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения КАК ДатаУвольнения,
ДанныеДляПодбораСотрудников.Код КАК ТабельныйНомер,
ДанныеДляПодбораСотрудников.ВАрхиве КАК ВАрхиве,
ОсновныеСотрудникиФизическихЛиц.ГоловнаяОрганизация КАК Организация,
ДанныеДляПодбораСотрудников.ВидДоговора КАК ВидДоговора,
ДанныеДляПодбораСотрудников.Филиал КАК Филиал,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
ВидыЗанятостиСотрудниковИнтервальный.ВидЗанятости КАК ВидЗанятости
ИЗ
РегистрСведений.ОсновныеСотрудникиФизическихЛиц КАК ОсновныеСотрудникиФизическихЛиц
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК СправочникФизическиеЛица
ПО ОсновныеСотрудникиФизическихЛиц.ФизическоеЛицо = СправочникФизическиеЛица.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
ПО ОсновныеСотрудникиФизическихЛиц.ГоловнаяОрганизация = ТекущиеКадровыеДанныеСотрудников.ГоловнаяОрганизация
И ОсновныеСотрудникиФизическихЛиц.ФизическоеЛицо = ТекущиеКадровыеДанныеСотрудников.ФизическоеЛицо
И ОсновныеСотрудникиФизическихЛиц.Сотрудник = ТекущиеКадровыеДанныеСотрудников.Сотрудник
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
ПО ОсновныеСотрудникиФизическихЛиц.Сотрудник = ДанныеДляПодбораСотрудников.Сотрудник
И (ДанныеДляПодбораСотрудников.ИдентификаторЗаписи В
(ВЫБРАТЬ ПЕРВЫЕ 1
Т.ИдентификаторЗаписи
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК Т
ГДЕ
ОсновныеСотрудникиФизическихЛиц.Сотрудник = Т.Сотрудник
И Т.Филиал <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
И Т.ЭтоГоловнойСотрудник
И (Т.Окончание МЕЖДУ НАЧАЛОПЕРИОДА(ОсновныеСотрудникиФизическихЛиц.ДатаНачала, ДЕНЬ) И КОНЕЦПЕРИОДА(ОсновныеСотрудникиФизическихЛиц.ДатаОкончания, ДЕНЬ)
ИЛИ ОсновныеСотрудникиФизическихЛиц.ДатаОкончания МЕЖДУ НАЧАЛОПЕРИОДА(Т.Начало, ДЕНЬ) И КОНЕЦПЕРИОДА(Т.Окончание, ДЕНЬ))
И ВЫБОР КОГДА &ОтбиратьПоФилиалу ТОГДА Т.Филиал В (&ОтборПоФилиалу) ИНАЧЕ ИСТИНА КОНЕЦ
УПОРЯДОЧИТЬ ПО
Т.ПоДоговоруГПХ,
Т.Начало УБЫВ,
Т.Организация,
Т.Филиал,
Т.Подразделение))
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВидыЗанятостиСотрудниковИнтервальный КАК ВидыЗанятостиСотрудниковИнтервальный
ПО ОсновныеСотрудникиФизическихЛиц.Сотрудник = ВидыЗанятостиСотрудниковИнтервальный.Сотрудник
И (ВидыЗанятостиСотрудниковИнтервальный.ДатаНачала В
(ВЫБРАТЬ ПЕРВЫЕ 1
Т.ДатаНачала
ИЗ
РегистрСведений.ВидыЗанятостиСотрудниковИнтервальный КАК Т
ГДЕ
ОсновныеСотрудникиФизическихЛиц.Сотрудник = Т.Сотрудник
И ОсновныеСотрудникиФизическихЛиц.ДатаОкончания МЕЖДУ НАЧАЛОПЕРИОДА(Т.ДатаНачала, ДЕНЬ) И Т.ДатаОкончания
УПОРЯДОЧИТЬ ПО
Т.ДатаНачала УБЫВ))
ГДЕ
ОсновныеСотрудникиФизическихЛиц.ДатаОкончания = &МаксимальнаяДатаНачалоДня
{ГДЕ
ОсновныеСотрудникиФизическихЛиц.ГоловнаяОрганизация.* КАК Организация,
ДанныеДляПодбораСотрудников.Организация.*,
ДанныеДляПодбораСотрудников.Филиал.*}
Показать
Как видно, тут участвуют регистры сведений:
ОсновныеСотрудникиФизическихЛиц
ТекущиеКадровыеДанныеСотрудников
ДанныеДляПодбораСотрудников
ВидыЗанятостиСотрудниковИнтервальный
Можно искать дубли вручную, а можно просто перезаполнить эти регистры программно, так как они являются рассчитываемыми.
Например, такой код должен перезаполнить эти регистры (используйте на свой страх и риск):
(1) Форма подбора – это Справочник.ФизическиеЛица.Форма.ФормаВыбораСотрудников. Текст запроса там переопределяется динамически. У меня, например, такой:
фактический текст запроса динамического списка
ВЫБРАТЬ
СправочникФизическиеЛица.Ссылка КАК Ссылка,
СправочникФизическиеЛица.ПометкаУдаления КАК ПометкаУдаления,
СправочникФизическиеЛица.Предопределенный КАК Предопределенный,
СправочникФизическиеЛица.Родитель КАК Родитель,
СправочникФизическиеЛица.ЭтоГруппа КАК ЭтоГруппа,
СправочникФизическиеЛица.Код КАК Код,
СправочникФизическиеЛица.Наименование КАК Наименование,
СправочникФизическиеЛица.ДатаРождения КАК ДатаРождения,
СправочникФизическиеЛица.ИНН КАК ИНН,
СправочникФизическиеЛица.СтраховойНомерПФР КАК СтраховойНомерПФР,
ТекущиеКадровыеДанныеСотрудников.ДатаПриема КАК ДатаПриема,
ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения КАК ДатаУвольнения,
ДанныеДляПодбораСотрудников.Код КАК ТабельныйНомер,
ДанныеДляПодбораСотрудников.ВАрхиве КАК ВАрхиве,
ОсновныеСотрудникиФизическихЛиц.ГоловнаяОрганизация КАК Организация,
ДанныеДляПодбораСотрудников.ВидДоговора КАК ВидДоговора,
ДанныеДляПодбораСотрудников.Филиал КАК Филиал,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
ВидыЗанятостиСотрудниковИнтервальный.ВидЗанятости КАК ВидЗанятости
ИЗ
РегистрСведений.ОсновныеСотрудникиФизическихЛиц КАК ОсновныеСотрудникиФизическихЛиц
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК СправочникФизическиеЛица
ПО ОсновныеСотрудникиФизическихЛиц.ФизическоеЛицо = СправочникФизическиеЛица.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
ПО ОсновныеСотрудникиФизическихЛиц.ГоловнаяОрганизация = ТекущиеКадровыеДанныеСотрудников.ГоловнаяОрганизация
И ОсновныеСотрудникиФизическихЛиц.ФизическоеЛицо = ТекущиеКадровыеДанныеСотрудников.ФизическоеЛицо
И ОсновныеСотрудникиФизическихЛиц.Сотрудник = ТекущиеКадровыеДанныеСотрудников.Сотрудник
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
ПО ОсновныеСотрудникиФизическихЛиц.Сотрудник = ДанныеДляПодбораСотрудников.Сотрудник
И (ДанныеДляПодбораСотрудников.ИдентификаторЗаписи В
(ВЫБРАТЬ ПЕРВЫЕ 1
Т.ИдентификаторЗаписи
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК Т
ГДЕ
ОсновныеСотрудникиФизическихЛиц.Сотрудник = Т.Сотрудник
И Т.Филиал <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
И Т.ЭтоГоловнойСотрудник
И (Т.Окончание МЕЖДУ НАЧАЛОПЕРИОДА(ОсновныеСотрудникиФизическихЛиц.ДатаНачала, ДЕНЬ) И КОНЕЦПЕРИОДА(ОсновныеСотрудникиФизическихЛиц.ДатаОкончания, ДЕНЬ)
ИЛИ ОсновныеСотрудникиФизическихЛиц.ДатаОкончания МЕЖДУ НАЧАЛОПЕРИОДА(Т.Начало, ДЕНЬ) И КОНЕЦПЕРИОДА(Т.Окончание, ДЕНЬ))
И ВЫБОР КОГДА &ОтбиратьПоФилиалу ТОГДА Т.Филиал В (&ОтборПоФилиалу) ИНАЧЕ ИСТИНА КОНЕЦ
УПОРЯДОЧИТЬ ПО
Т.ПоДоговоруГПХ,
Т.Начало УБЫВ,
Т.Организация,
Т.Филиал,
Т.Подразделение))
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВидыЗанятостиСотрудниковИнтервальный КАК ВидыЗанятостиСотрудниковИнтервальный
ПО ОсновныеСотрудникиФизическихЛиц.Сотрудник = ВидыЗанятостиСотрудниковИнтервальный.Сотрудник
И (ВидыЗанятостиСотрудниковИнтервальный.ДатаНачала В
(ВЫБРАТЬ ПЕРВЫЕ 1
Т.ДатаНачала
ИЗ
РегистрСведений.ВидыЗанятостиСотрудниковИнтервальный КАК Т
ГДЕ
ОсновныеСотрудникиФизическихЛиц.Сотрудник = Т.Сотрудник
И ОсновныеСотрудникиФизическихЛиц.ДатаОкончания МЕЖДУ НАЧАЛОПЕРИОДА(Т.ДатаНачала, ДЕНЬ) И Т.ДатаОкончания
УПОРЯДОЧИТЬ ПО
Т.ДатаНачала УБЫВ))
ГДЕ
ОсновныеСотрудникиФизическихЛиц.ДатаОкончания = &МаксимальнаяДатаНачалоДня
{ГДЕ
ОсновныеСотрудникиФизическихЛиц.ГоловнаяОрганизация.* КАК Организация,
ДанныеДляПодбораСотрудников.Организация.*,
ДанныеДляПодбораСотрудников.Филиал.*}
Показать
Как видно, тут участвуют регистры сведений:
ОсновныеСотрудникиФизическихЛиц
ТекущиеКадровыеДанныеСотрудников
ДанныеДляПодбораСотрудников
ВидыЗанятостиСотрудниковИнтервальный
Можно искать дубли вручную, а можно просто перезаполнить эти регистры программно, так как они являются рассчитываемыми.
Например, такой код должен перезаполнить эти регистры (используйте на свой страх и риск):
(12) Проблему исправил удалением дубля из регистра сведений "ОсновныеСотрудникиФизическихЛиц". Подскажите пожалуйста, как понять переопределяется динамически? Как его получить?
Список сотрудников - это динамический список, список который выводится на основании запроса при обращении к данным программы. Данные обновятся, обновится и динамический список.
(13) При создании на сервере в форме подбора программно заменяется текст запроса, поэтому недостаточно было просто посмотреть текст запроса в реквизите список, так как он не соответствует фактическому. На первом скрине видно, что в конфигураторе задан один текст запроса (попроще), а на втором – место в коде, где он переопределяется.