При разработке и обновлении внешних печатных форм (например, трудовых договоров или дополнительных соглашений) в программе 1С:Зарплата и управление персоналом 3.1 разработчики часто сталкиваются с тем, что из печатных документов пропадают должность или ФИО руководителя. Попытки получить эти данные напрямую через запрос к регистру сведений СведенияОбОтветственныхЛицах приводят к тому, что возвращаются пустые значения, а сами ресурсы в конфигураторе теперь отображаются с префиксом "Удалить" (например, УдалитьДолжностьРуководителя).
В этой статье мы подробно разберем, почему произошли эти изменения, как правильно использовать штатный программный интерфейс (API) конфигурации для получения сведений о руководителях, проанализируем частые ошибки при передаче параметров и рассмотрим альтернативные варианты решения задачи.
В прошлых версиях конфигурации 1С:ЗУП текстовые наименования должностей и ФИО ответственных лиц хранились непосредственно в плоских полях регистра сведений СведенияОбОтветственныхЛицах. Однако в современных релизах редакции 3.1 разработчики фирмы "1С" перешли на полноценную объектную модель. Теперь в регистре хранятся не текстовые строки, а ссылки на справочники ФизическиеЛица и Должности.
Старые ресурсы регистра были переименованы с добавлением префикса Удалить.... Они оставлены исключительно для обеспечения обратной совместимости при обновлении старых баз данных, но при записи новых сведений они больше не заполняются. Именно поэтому прямые запросы к метаданным начинают возвращать пустые значения. Чтобы избежать подобных проблем при последующих обновлениях системы, разработчикам настоятельно рекомендуется отказаться от прямых запросов и перейти на использование стандартного программного интерфейса БСП и конфигурации. Для изучения доступного программного интерфейса и типовых функций можно использовать справочник методов конфигурации Зарплата и кадры 3.1.
Самый надежный и правильный способ получить сведения об ответственных лицах организации на определенную дату — это использование экспортной функции общего модуля СведенияОбОтветственныхЛицах. Данный метод автоматически учитывает все изменения в структуре метаданных и гарантирует корректность получения информации в будущих релизах.
Рассмотрим структуру вызова этой функции:
ОтветственныеЛица = СведенияОбОтветственныхЛицах.СведенияОбОтветственныхЛицах(Организация, СписокРеквизитов, Дата);
Давайте подробно разберем параметры, которые передаются в эту функцию:
Организации (тип СправочникСсылка.Организации). Передача строки с наименованием вместо ссылки является частой ошибкой, которую мы разберем далее."Руководитель,ДолжностьРуководителя". Также можно запрашивать другие роли, например, "ГлавныйБухгалтер,Кассир".Дата). Программа выполнит поиск актуальной записи в регистре на указанный момент времени.Функция возвращает объект типа Структура, где ключами будут являться запрошенные реквизиты, а значениями — ссылки на соответствующие объекты базы данных (физическое лицо и должность).
Посмотрим на практический пример вызова и обработки результата в коде модуля внешней печатной формы:
// Предположим, что у нас есть выборка данных документа
ПараметрыОрганизации = Новый Структура;
ОрганизацияСсылка = ВыборкаДетальныеЗаписи.Организация;
ДатаДокумента = ВыборкаДетальныеЗаписи.ДатаПриема;
// Вызываем штатный метод для получения структуры ответственных лиц
ОтветственныеЛица = СведенияОбОтветственныхЛицах.СведенияОбОтветственныхЛицах(ОрганизацияСсылка, "Руководитель,ДолжностьРуководителя", ДатаДокумента);
// Проверяем, что структура успешно возвращена и содержит данные
Если ОтветственныеЛица.Свойство("Руководитель") И ЗначениеЗаполнено(ОтветственныеЛица.Руководитель) Тогда
ФИОРуководителя = ФизическиеЛицаЗарплатаКадры.РасшифровкаПодписи(ОтветственныеЛица.Руководитель);
Иначе
ФИОРуководителя = "__________________";
КонецЕсли;
Если ОтветственныеЛица.Свойство("ДолжностьРуководителя") И ЗначениеЗаполнено(ОтветственныеЛица.ДолжностьРуководителя) Тогда
ДолжностьРуководителя = Строка(ОтветственныеЛица.ДолжностьРуководителя);
Иначе
ДолжностьРуководителя = "__________________";
КонецЕсли;
Даже при использовании верного метода общего модуля разработчики часто сталкиваются с ситуацией, когда возвращаемая структура оказывается пустой либо значения реквизитов не заполнены. Проанализируем основные причины этой проблемы:
1. Ошибка при передаче типа данных организации.
Если в качестве первого параметра передать наименование организации в строковом формате (например, "ООО Вектор") вместо ссылки на элемент справочника, функция отработает без ошибок времени выполнения, но вернет пустую структуру. Всегда проверяйте тип передаваемых данных при помощи отладчика. Передаваться должна именно ссылка (СправочникСсылка.Организации).
2. Дата запроса не входит в период действия записи.
Записи в регистре сведений ответственных лиц имеют периодичность. Если вы передаете дату документа (например, дату приема сотрудника пятилетней давности), а сведения о руководителе в базу данных были внесены только со следующего года, то система вернет пустой результат. Убедитесь, что на запрашиваемую дату в системе существует действующая запись о назначении ответственного лица.
3. Попытка неверного обращения через точку к свойствам структуры.
Получив переменную ОтветственныеЛица, разработчики иногда торопятся и пытаются обратиться к должности руководителя через точку от самого руководителя: ОтветственныеЛица.Руководитель.ДолжностьРуководителя. Это грубая ошибка, поскольку в свойстве Руководитель содержится ссылка на элемент справочника ФизическиеЛица, у которого нет реквизита "Должность". Должность руководителя возвращается как отдельное свойство структуры под ключом ДолжностьРуководителя, значением которого является ссылка на справочник Должности.
В конфигурациях на платформе 1С:БСП также часто присутствует дополнительная программная обертка для получения ответственных лиц. Если по каким-то причинам первый метод вам не подходит, мы можем использовать следующую функцию общего модуля:
СписокПолей = "Руководитель, ДолжностьРуководителя";
СтруктураОтветственных = ЗарплатаКадры.ОтветственныеЛицаОрганизации(ОрганизацияСсылка, СписокПолей, ДатаДокумента);
Этот метод работает по схожему принципу и также возвращает заполненную структуру данных, готовую к выводу на печать.
В реальной практике руководители часто действуют не просто на основании своей должности, но и на основании устава, доверенности или приказа. Для хранения этой информации в ЗУП 3.1 предназначен регистр сведений ОснованияПолномочийОтветственныхЛиц.
Если вам требуется получить должность руководителя именно в связке с документом-основанием, можно использовать обращение к этому регистру. Ниже представлен корректный и оптимизированный пример функции, получающей должность сотрудника (руководителя) по его ссылке на физическое лицо через запрос:
&НаСервере
Функция ПолучитьДолжностьИОснованиеРуководителя(ФизическоеЛицоСсылка, ОрганизацияСсылка, ДатаЗапроса) Экспорт
РезультатФункции = Новый Структура("Должность, Основание", "", "");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ОснованияПолномочий.Должность КАК Должность,
| ОснованияПолномочий.ОснованиеСтрокой КАК Основание
|ИЗ
| РегистрСведений.ОснованияПолномочийОтветственныхЛиц.СрезПоследних(&Период, Организация = &Организация И ФизическоеЛицо = &ФизическоеЛицо) КАК ОснованияПолномочий";
Запрос.УстановитьПараметр("Период", ДатаЗапроса);
Запрос.УстановитьПараметр("Организация", ОрганизацияСсылка);
Запрос.УстановитьПараметр("ФизическоеЛицо", ФизическоеЛицоСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
РезультатФункции.Должность = Выборка.Должность;
РезультатФункции.Основание = Выборка.Основание;
КонецЕсли;
Возврат РезультатФункции;
КонецФункции
Важное примечание: Избегайте последовательного перебора всех записей регистра через объект СоздатьНаборЗаписей() без установки фильтров (как иногда предлагают на форумах). Чтение всей таблицы регистра сведений в цикле негативно сказывается на производительности системы. Всегда используйте точечные запросы к виртуальной таблице СрезПоследних с установкой отборов по организации и физическому лицу, как показано в примере выше.
Применяя данные подходы в разработке внешних отчетов и печатных форм, вы обеспечите стабильную работу программного кода и корректное заполнение кадровых документов даже после масштабных обновлений конфигурации 1С:ЗУП. В качестве альтернативы ручной адаптации шаблонов можно использовать комплект актуальных внешних печатных форм для ЗУП и ЗиКГУ.