При автоматизации кадрового учета в конфигурациях 1С:ERP 2.5 или 1С:Зарплата и управление персоналом 3.1 программисты часто сталкиваются с ситуацией, когда документ, созданный программно, записывается без ошибок, но наотрез отказывается открываться в пользовательском интерфейсе. Типичный пример — ошибка «Неуникальное имя реквизита. Имя: ОкладИспользуется» (или аналогичная с именами других показателей) в документе ИндексацияЗаработка.
Давайте подробно разберем, почему это происходит, как устроены динамические формы в зарплатных решениях 1С и как правильно написать код для заполнения табличных частей, чтобы избежать подобных конфликтов.
Рассмотрим механизм работы формы документа ИндексацияЗаработка. В отличие от простых документов, формы в ЗУП и ERP являются динамическими. Это означает, что состав колонок в табличной части на экране не определен жестко в конфигураторе, а строится «на лету» при открытии документа на сервере.
Проанализируем ситуацию: когда вы открываете форму, срабатывает процедура ПриСозданииНаСервере, которая обращается к общим модулям (например, ЗарплатаКадры). Система считывает данные из табличной части Показатели и для каждого найденного там показателя (например, «Оклад», «Премия», «Надбавка») программно добавляет на форму набор реквизитов. Эти реквизиты имеют служебные префиксы и суффиксы, такие как Используется, ТекущееЗначение, ПредставлениеТаблицы.
Если в табличной части Показатели одна и та же ссылка на справочник ПоказателиРасчетаЗарплаты встречается более одного раза, система пытается создать реквизит формы с одним и тем же именем (например, ОкладИспользуется) повторно. В этот момент платформа 1С генерирует исключение «Неуникальное имя реквизита», и форма закрывается с ошибкой.
Для корректного программного создания документа необходимо четко понимать связь между его табличными частями. В документе ИндексацияЗаработка их несколько, и они работают в связке:
Проанализируем типичную ошибку начинающего программиста: создание строки в таблице Показатели внутри цикла по сотрудникам. Это в корне неверно. Рассмотрим правильный алгоритм заполнения.
Шаг 1. Определение списка уникальных показателей
Перед тем как приступать к заполнению документа, определите, какие именно показатели вы планируете изменять. Создайте массив или таблицу значений с уникальными ссылками на справочник ПоказателиРасчетаЗарплаты.
Шаг 2. Заполнение табличной части «Показатели»
Заполняйте эту таблицу только один раз, используя ваш список уникальных показателей. Посмотрим на пример кода:
// Правильное заполнение таблицы показателей
НовыйДокумент = Документы.ИндексацияЗаработка.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
// ... заполнение других реквизитов ...
СтрокаТЧ = НовыйДокумент.Показатели.Добавить();
СтрокаТЧ.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Оклад");
// Теперь в ТЧ "Показатели" есть ОДНА строка с Окладом. Этого достаточно для всех сотрудников.
Шаг 3. Заполнение данных по сотрудникам
В цикле по сотрудникам добавляйте строки в таблицу Сотрудники и соответствующие им строки в таблицу ЗначенияПоказателей. Важно помнить, что связь между сотрудником и его показателями в некоторых документах может осуществляться через идентификатор строки или просто по ссылке на сотрудника.
Для Каждого ТекСотрудник Из СписокСотрудников Цикл
// Добавляем сотрудника
НоваяСтрокаСотр = НовыйДокумент.Сотрудники.Добавить();
НоваяСтрокаСотр.Сотрудник = ТекСотрудник;
// Добавляем значение показателя для ЭТОГО сотрудника
НоваяСтрокаЗначение = НовыйДокумент.ЗначенияПоказателей.Добавить();
НоваяСтрокаЗначение.Сотрудник = ТекСотрудник;
НоваяСтрокаЗначение.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Оклад");
НоваяСтрокаЗначение.Значение = 50000; // Новое значение оклада
КонецЦикла;
Чтобы убедиться, что вы не допустили ошибку дублирования, перед вызовом метода Записать() можно выполнить простую проверку. Проанализируем количество строк в таблице Показатели и их уникальность. Если количество строк больше, чем количество уникальных видов показателей, документ гарантированно не откроется.
Используйте метод таблицы значений Свернуть для быстрой проверки:
ТаблицаПроверки = НовыйДокумент.Показатели.Выгрузить();
КоличествоДо = ТаблицаПроверки.Количество();
ТаблицаПроверки.Свернуть("Показатель");
КоличествоПосле = ТаблицаПроверки.Количество();
Если КоличествоДо <> КоличествоПосле Тогда
Сообщить("Внимание! Обнаружены дубли показателей. Форма документа не откроется!");
КонецЕсли;
Ошибка «Неуникальное имя реквизита» — это защитный механизм платформы, предотвращающий создание одинаковых элементов управления на форме. В контексте зарплатных документов это почти всегда означает, что структура данных в объекте не соответствует ожиданиям логики формы. Соблюдайте уникальность строк в табличной части Показатели, и ваши программно созданные документы будут открываться без проблем.
Рассмотренный подход актуален не только для индексации, но и для других документов, использующих динамическое построение колонок показателей, таких как ИзменениеОплатыТруда, НазначениеПлановогоНачисления и другие документы подсистемы расчета зарплаты в 1С:ERP и 1С:ЗУП.