Имя: Пароль:
1C
1С v8
Получить GUID руководителя подразделения в ЗУП по GUID подразделения
0 grayyr
 
03.07.13
13:56
Доброго времени суток.
Введение.
Занимаюсь интеграцией системы документооборота с 1С ЗУП 8.2. Необходимо импортировать несколько справочников (в том числе "Сотрудники" и "Подразделения организаций") из 1С в документооборот.

Справочники успешно импортируются, с этим я разобрался. У меня проблема как штатными средствами 1С получить GUID сотрудника, являющегося руководителем подразделения имея только GUID и код подразделения.

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

Конфигуация - 1С Предприятие 8.2 ЗУП 2.5.

Подскажите, если не сложно. Спасибо.
1 Sammo
 
03.07.13
13:58
1. Получить ссылку подразделения по гуиду.
2. Получить ссылку руководителя по ссылке подразделения.
3. Получить гуид сотрудника по ссылке из пункта 2
2 grayyr
 
03.07.13
14:20
1. Получить ссылку подразделения по гуиду.
Это видимо так:
 Справочники.ПодразделенияОрганизаций.ПолучитьСсылку(гуид);

2. Получить ссылку руководителя по ссылке подразделения.
А это как сделать? В подразделении нету реквизита "Руководитель"...
3 ale-sarin
 
03.07.13
14:24
(2) Видимо есть регистр сведений, где связаны подразделение и руководитель?
4 Sammo
 
03.07.13
14:41
(2) Обычно гуид - строка, тогда
ПолучитьСсылку(Новый УникальныйИдентификатор(гуид))

Регистр сведений наподобие ответственные лица. Не помню что там в ЗУП-е
5 grayyr
 
03.07.13
14:41
Есть регистр сведений "ОтветственныеЛица", у него есть измерение "СтруктурнаяЕдиница" с типом Справочник.Подразделения. А у меня ссылка на Справочник.ПодразделенияОрганизаций. Подойдёт?

Но сотрудника-то в регистре всё равно нету...
6 kosts
 
03.07.13
14:46
(5) Еще там есть ФизическоеЛицо и Должность
7 almar
 
03.07.13
14:48
(5) Регистр сведений ОтветственныеЛицаОрганизаций
8 grayyr
 
03.07.13
15:02
Точно, есть ещё один регистр сведений с ФизЛицом и Должностью.
Но мне-то нужен Сотрудник, а у ФизЛица может быть несколько сотрудников. Как выбрать?
9 Мыш
 
03.07.13
15:05
(8) Выбирай последнего принятого, работающего не по совместительству.
10 acsent
 
03.07.13
15:10
ты не програмно можешь найти руководителя подразделения?
11 grayyr
 
03.07.13
15:19
(10) в карточке показывает ссылку с ФИО и должностью. При нажатии открывается табличка с такими же колонками. Видимо это и есть тот самый регистр...
12 almar
 
03.07.13
15:22
"Лыжники, догадался Штирлиц"
13 hhhh
 
03.07.13
15:50
(11) сотрудника в документообороте надо к физлицу в ЗУПЕ привязать. Чтобы не путаться.
14 grayyr
 
03.07.13
15:58
(13) Сотрудники и ФизЛица в документообороте связаны. Я другого понять не могу - в табличке которая показывает содержимое регистра даёт выбрать именно сотрудника, хотя такого реквизита в регистре нет. Как мне программно выйти на сотрудника через регистр?
15 grayyr
 
04.07.13
15:37
Кажется дошло.
По подразделению невозможно однозначно установить связь между подразделением и сотрудником, поскольку таковая связь не предусмотрена технологией :)

При задании руководителя выбирается сотрудник, но в регистр записывается только физлицо. А должность выбирается из отдельного справочника и никак не связана с выбранным сотрудником.

Остаётся сделать выборку работающих сотрудников заданного физлица и взять из неё первого...
16 grayyr
 
05.07.13
09:38
Вот что получилось:

// Функция возвращает GUID руководителя подразделения по GUID подразделения.
Функция ПолучитьРуководителяПодразделения(ПодразделениеГУИД) Экспорт
   
   РуководительГУИД = "";
   РуководительГУИДУволенный = "";
   
   ПодрСсылка = Справочники.ПодразделенияОрганизаций.ПолучитьСсылку(Новый УникальныйИдентификатор(ПодразделениеГУИД));
   
   Отбор = Новый Структура;
   Отбор.Вставить("СтруктурнаяЕдиница", ПодрСсылка);
   Отбор.Вставить("ОтветственноеЛицо", Перечисления.ОтветственныеЛицаОрганизаций.Руководитель);
   
   СрезПоследних = РегистрыСведений.ОтветственныеЛицаОрганизаций.СрезПоследних(ТекущаяДата(), Отбор);
   
   Если СрезПоследних.Количество() > 0 Тогда
       Если ЗначениеЗаполнено(СрезПоследних[0].ФизическоеЛицо) Тогда
           ТекстЗапроса =
               "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
               |    Сотрудники.Ссылка, Сотрудники.Код, Сотрудники.Наименование, Сотрудники.ДатаУвольнения
               |ИЗ
               |    Справочник.СотрудникиОрганизаций КАК Сотрудники
               |ГДЕ
               |    (Сотрудники.ФизЛицо = &ФизЛицо)";  // и Сотрудники.ДатаУвольнения = NULL
           
           Запрос = Новый Запрос;
           Запрос.Текст = ТекстЗапроса;
           Запрос.УстановитьПараметр("ФизЛицо", СрезПоследних[0].ФизическоеЛицо);
           
           Рез = Запрос.Выполнить();
           Если Рез.Выбрать().Количество() > 0 Тогда
               Выборка = Рез.Выбрать();
               Пока Выборка.Следующий() Цикл
                   Если Not (ЗначениеЗаполнено(Выборка.ДатаУвольнения)) Тогда
                       РуководительГУИД = Строка(Выборка.Ссылка.УникальныйИдентификатор());
                   Иначе
                       РуководительГУИДУволенный = Строка(Выборка.Ссылка.УникальныйИдентификатор());
                   КонецЕсли;
               КонецЦикла;
               Если Not (ЗначениеЗаполнено(РуководительГУИД)) Тогда
                   РуководительГУИД = РуководительГУИДУволенный;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   
   Возврат РуководительГУИД;
   
КонецФункции      // ПолучитьРуководителяПодразделения(ПодразделениеГУИД)

Спасибо всем кто помог.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан