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