Почему возникает ошибка «Неуникальное имя реквизита» при программном создании документа «Индексация заработка» и как её исправить?

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

При автоматизации кадрового учета в конфигурациях 1С:ERP 2.5 или 1С:Зарплата и управление персоналом 3.1 программисты часто сталкиваются с ситуацией, когда документ, созданный программно, записывается без ошибок, но наотрез отказывается открываться в пользовательском интерфейсе. Типичный пример — ошибка «Неуникальное имя реквизита. Имя: ОкладИспользуется» (или аналогичная с именами других показателей) в документе ИндексацияЗаработка.

Давайте подробно разберем, почему это происходит, как устроены динамические формы в зарплатных решениях 1С и как правильно написать код для заполнения табличных частей, чтобы избежать подобных конфликтов.

Выясним причину ошибки

Рассмотрим механизм работы формы документа ИндексацияЗаработка. В отличие от простых документов, формы в ЗУП и ERP являются динамическими. Это означает, что состав колонок в табличной части на экране не определен жестко в конфигураторе, а строится «на лету» при открытии документа на сервере.

Проанализируем ситуацию: когда вы открываете форму, срабатывает процедура ПриСозданииНаСервере, которая обращается к общим модулям (например, ЗарплатаКадры). Система считывает данные из табличной части Показатели и для каждого найденного там показателя (например, «Оклад», «Премия», «Надбавка») программно добавляет на форму набор реквизитов. Эти реквизиты имеют служебные префиксы и суффиксы, такие как Используется, ТекущееЗначение, ПредставлениеТаблицы.

Если в табличной части Показатели одна и та же ссылка на справочник ПоказателиРасчетаЗарплаты встречается более одного раза, система пытается создать реквизит формы с одним и тем же именем (например, ОкладИспользуется) повторно. В этот момент платформа 1С генерирует исключение «Неуникальное имя реквизита», и форма закрывается с ошибкой.

Разберем структуру табличных частей документа

Для корректного программного создания документа необходимо четко понимать связь между его табличными частями. В документе ИндексацияЗаработка их несколько, и они работают в связке:

  1. Показатели: Это перечень всех видов начислений, которые будут индексироваться в рамках данного документа для всех сотрудников. Если вы индексируете «Оклад» для 500 человек, в этой таблице должна быть ровно одна строка с этим показателем.
  2. Сотрудники: Здесь перечисляется список сотрудников, участвующих в индексации.
  3. ЗначенияПоказателей: Самая объемная таблица. В ней указываются конкретные новые значения (коэффициенты или суммы) для каждого сотрудника по каждому показателю из первой таблицы.
  4. ПересчетТарифныхСтавок: Техническая таблица, необходимая для корректного расчета совокупной тарифной ставки после индексации.

Пошаговое решение проблемы

Проанализируем типичную ошибку начинающего программиста: создание строки в таблице Показатели внутри цикла по сотрудникам. Это в корне неверно. Рассмотрим правильный алгоритм заполнения.

Шаг 1. Определение списка уникальных показателей

Перед тем как приступать к заполнению документа, определите, какие именно показатели вы планируете изменять. Создайте массив или таблицу значений с уникальными ссылками на справочник ПоказателиРасчетаЗарплаты.

Шаг 2. Заполнение табличной части «Показатели»

Заполняйте эту таблицу только один раз, используя ваш список уникальных показателей. Посмотрим на пример кода:


// Правильное заполнение таблицы показателей
НовыйДокумент = Документы.ИндексацияЗаработка.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
// ... заполнение других реквизитов ...

СтрокаТЧ = НовыйДокумент.Показатели.Добавить();
СтрокаТЧ.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Оклад");
// Теперь в ТЧ "Показатели" есть ОДНА строка с Окладом. Этого достаточно для всех сотрудников.

Шаг 3. Заполнение данных по сотрудникам

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


Для Каждого ТекСотрудник Из СписокСотрудников Цикл
    // Добавляем сотрудника
    НоваяСтрокаСотр = НовыйДокумент.Сотрудники.Добавить();
    НоваяСтрокаСотр.Сотрудник = ТекСотрудник;
    
    // Добавляем значение показателя для ЭТОГО сотрудника
    НоваяСтрокаЗначение = НовыйДокумент.ЗначенияПоказателей.Добавить();
    НоваяСтрокаЗначение.Сотрудник = ТекСотрудник;
    НоваяСтрокаЗначение.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Оклад");
    НоваяСтрокаЗначение.Значение = 50000; // Новое значение оклада
КонецЦикла;

Как проверить документ перед записью?

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

Используйте метод таблицы значений Свернуть для быстрой проверки:


ТаблицаПроверки = НовыйДокумент.Показатели.Выгрузить();
КоличествоДо = ТаблицаПроверки.Количество();
ТаблицаПроверки.Свернуть("Показатель");
КоличествоПосле = ТаблицаПроверки.Количество();

Если КоличествоДо <> КоличествоПосле Тогда
    Сообщить("Внимание! Обнаружены дубли показателей. Форма документа не откроется!");
КонецЕсли;

Резюме

Ошибка «Неуникальное имя реквизита» — это защитный механизм платформы, предотвращающий создание одинаковых элементов управления на форме. В контексте зарплатных документов это почти всегда означает, что структура данных в объекте не соответствует ожиданиям логики формы. Соблюдайте уникальность строк в табличной части Показатели, и ваши программно созданные документы будут открываться без проблем.

Рассмотренный подход актуален не только для индексации, но и для других документов, использующих динамическое построение колонок показателей, таких как ИзменениеОплатыТруда, НазначениеПлановогоНачисления и другие документы подсистемы расчета зарплаты в 1С:ERP и 1С:ЗУП.

← На главную