Как вывести контактную информацию сотрудника (прописку и телефон) во внешнем отчете СКД в 1С:ERP 2 и ЗУП 3.1

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

При разработке внешних отчетов по кадровому учету в конфигурациях 1С:ERP Управление предприятием 2 или 1С:Зарплата и управление персоналом 3 программисты часто сталкиваются с задачей вывода контактной информации сотрудников (например, адреса по прописке и номера мобильного телефона). На первый взгляд задача кажется тривиальной, но архитектурные особенности современных конфигураций на базе БСП (Библиотеки стандартных подсистем) могут вызвать затруднения.

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

---

Почему возникает сложность при получении контактной информации?

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

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

---

Способ 1. Простой прямой запрос к контактной информации физических лиц

Если перед вами стоит задача максимально быстро и просто вывести данные во внешний отчет СКД, не перегружая его сложной архитектурой представлений, лучшим выбором будет прямое соединение справочника Сотрудники с табличной частью КонтактнаяИнформация справочника ФизическиеЛица.

Разберем рабочий пример запроса по шагам. Мы связываем сотрудника с его физическим лицом, а затем выполняем левое соединение для получения телефона и адреса по прописке.


ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    Сотрудники.Код КАК ТабельныйНомер,
    АдресПоПрописке.Представление КАК Прописка,
    Телефон.Представление КАК Телефон
ИЗ
    Справочник.Сотрудники КАК Сотрудники
    
    // Получаем адрес по прописке физического лица
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК АдресПоПрописке
        ПО (АдресПоПрописке.Ссылка = Сотрудники.ФизическоеЛицо)
        И (АдресПоПрописке.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица))
        
    // Получаем мобильный телефон физического лица
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК Телефон
        ПО (Телефон.Ссылка = Сотрудники.ФизическоеЛицо)
        И (Телефон.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонМобильныйФизическиеЛица))

Важные нюансы данного способа:

  1. Мы используем именно ЛЕВОЕ СОЕДИНЕНИЕ. Если у какого-то сотрудника не будет заполнен телефон или адрес, он все равно попадет в отчет, просто соответствующие поля останутся пустыми. Если применить ВНУТРЕННЕЕ СОЕДИНЕНИЕ, сотрудники без контактных данных полностью исчезнут из результата отчета.
  2. Мы обязательно фильтруем контактную информацию по предопределенным видам из справочника ВидыКонтактнойИнформации. Для адреса регистрации это АдресПоПропискеФизическиеЛица, а для мобильного телефона — ТелефонМобильныйФизическиеЛица (или общий ТелефонФизическиеЛица в зависимости от того, как ведется учет на предприятии).

---

Способ 2. Профессиональный механизм представлений кадровых данных

В подсистемах ERP и ЗУП встроен мощный инструмент автоматического формирования сложных запросов — так называемый механизм кадровых представлений. Этот способ сложнее в реализации, но он является стандартом разработки для типовых конфигураций 1С. Он автоматически учитывает историю изменений данных на определенную дату, права доступа (Rls) и особенности хранения данных в различных версиях БСП.

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

Шаг 2.1. Описание пакета запросов в СКД

В схеме компоновки данных мы должны создать пакет запросов. В этом пакете обязательно должна присутствовать временная таблица с именем Представления_КадровыеДанныеСотрудников. Мы описываем ее структуру, выбирая пустые ссылки нужных нам типов. Система сама поймет, какие поля мы запросили, и заполнит их реальными значениями.

Посмотрим на пример описания структуры такой таблицы в запросе СКД:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
    ДАТАВРЕМЯ(1, 1, 1) КАК Период,
    "" КАК ТелефонМобильный,
    "" КАК АдресПоПрописке,
    ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение,
    ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность
ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    "ТолькоРазрешенные" = ИСТИНА

Шаг 2.2. Программный вызов обработчика в модуле отчета

Если мы просто запустим отчет с таким запросом, поля останутся пустыми. Нам необходимо "попросить" систему перехватить построение отчета и заполнить временную таблицу реальными данными. Для этого в модуле объекта нашего внешнего отчета необходимо переопределить стандартное событие ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	// Создаем соответствие дополнительных полей представлений (если требуются специфические настройки)
	СоответствиеДополнительныхПолей = Новый Соответствие;
	
	// Вызываем типовой метод заполнения общих источников данных кадрового учета
	ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект, СоответствиеДополнительныхПолей);
	
	// Стандартный вывод отчета после программной модификации схемы
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

При вызове метода ЗаполнитьОбщиеИсточникиДанныхОтчета платформа автоматически найдет таблицу с именем Представления_КадровыеДанныеСотрудников, проанализирует требуемые поля (в нашем примере это телефон, прописка, подразделение и должность), сформирует сложный оптимизированный SQL-запрос с учетом сведений о физических лицах и запишет результат во временную таблицу.

---

Как объединить представления кадровых данных с другими таблицами (например, реестром отпусков)

Часто программистам требуется не просто вывести список сотрудников, а соединить кадровые данные с какими-либо бизнес-данными (например, с регистром сведений РеестрОтпусков, чтобы получить список отсутствующих сотрудников со всеми контактными номерами на случай экстренной связи).

Разберем, как правильно спроектировать пакет запросов СКД для решения этой задачи. Мы сначала соберем данные по отпускам, затем объявим таблицу представлений и на третьем шаге соединим их.


// ЗАПРОС 1: Выбираем информацию по отсутствиям сотрудников за период во временную таблицу
ВЫБРАТЬ
    РеестрОтпусков.Сотрудник КАК Сотрудник,
    РеестрОтпусков.ДатаНачалаПериодаОтсутствия КАК Период,
    РеестрОтпусков.КоличествоДнейОтпуска КАК КоличествоДнейОтпуска
ПОМЕСТИТЬ ВТСотрудникиОтпуска
ИЗ
    РегистрСведений.РеестрОтпусков КАК РеестрОтпусков
ГДЕ
    РеестрОтпусков.ДатаНачалаПериодаОтсутствия МЕЖДУ &ДатаНачала И &ДатаОкончания;

////////////////////////////////////////////////////////////////////////////////
// ЗАПРОС 2: Описываем кадровые представления на основе нашей ВТ сотрудников
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВТСотрудникиОтпуска.Сотрудник КАК Сотрудник,
    ВТСотрудникиОтпуска.Период КАК Период,
    "" КАК ТелефонМобильный,
    "" КАК АдресПоПрописке,
    ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение,
    ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность
ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников
ИЗ
    ВТСотрудникиОтпуска КАК ВТСотрудникиОтпуска;

////////////////////////////////////////////////////////////////////////////////
// ЗАПРОС 3: Итоговая сборка данных для отчета
ВЫБРАТЬ
    ВТСотрудникиОтпуска.Сотрудник КАК Сотрудник,
    ВТСотрудникиОтпуска.КоличествоДнейОтпуска КАК КоличествоДнейОтпуска,
    КадровыеДанные.ТелефонМобильный КАК Телефон,
    КадровыеДанные.АдресПоПрописке КАК Прописка,
    КадровыеДанные.Должность КАК Должность,
    КадровыеДанные.Подразделение КАК Подразделение
ИЗ
    ВТСотрудникиОтпуска КАК ВТСотрудникиОтпуска
    ЛЕВОЕ СОЕДИНЕНИЕ Представления_КадровыеДанныеСотрудников КАК КадровыеДанные
        ПО ВТСотрудникиОтпуска.Сотрудник = КадровыеДанные.Сотрудник
        И ВТСотрудникиОтпуска.Период = КадровыеДанные.Период

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

---

Как узнать, какие поля доступны для использования в представлениях?

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

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

---

Альтернативный вариант получения кадровых данных программным кодом (без СКД)

В завершение разберем ситуацию, когда вам нужно быстро получить телефон или прописку сотрудников не в отчете СКД, а внутри какого-то алгоритма во внешней обработке или документе. Писать сложные запросы к регистрам сведений вручную не обязательно. Для этого в общем модуле КадровыйУчет реализован готовый программный интерфейс API.

Проанализируем пример программного создания временной таблицы кадровых данных через Менеджер Временных Таблиц (МВТ):


// Создаем менеджер временных таблиц для нашего будущего запроса
МенеджерВТ = Новый МенеджерВременныхТаблиц;

// Подготовим массив сотрудников, по которым нам нужны данные
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(ВыбранныйСотрудник);

// Задаем список нужных нам полей через запятую
СтрокаПолей = "АдресПоПрописке, ТелефонМобильный";

// Вызываем программный метод БСП
КадровыйУчет.СоздатьНаДатуВТКадровыеДанныеСотрудников(
    МенеджерВТ, 
    Истина, 
    МассивСотрудников, 
    СтрокаПолей, 
    ТекущаяДата()
);

// Теперь в МенеджереВТ создана физическая таблица ВТКадровыеДанныеСотрудников.
// Мы можем обратиться к ней обычным запросом.
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КадровыеДанные.Сотрудник,
    |	КадровыеДанные.АдресПоПрописке,
    |	КадровыеДанные.ТелефонМобильный
    |ИЗ
    |	ВТКадровыеДанныеСотрудников КАК КадровыеДанные";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить("Сотрудник: " + Выборка.Сотрудник + ", Телефон: " + Выборка.ТелефонМобильный);
КонецЦикла;

Использование этого метода гарантирует, что ваш код останется работоспособным даже после масштабных обновлений конфигурации 1С:ERP или ЗУП вендором, так как метод СоздатьНаДатуВТКадровыеДанныеСотрудников является частью официального стабильного API программного продукта.

← На главную