Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
01 июл 2024, 07:01

Регистр соотвествия.

Автор Анжела, 05 янв 2017, 10:49

0 Пользователей и 1 гость просматривают эту тему.

Анжела

1С:Предприятие 8.2 (8.2.19.130)
Зарплата и Управление Персоналом, редакция 2.5 (2.5.108.1)

Здравствуйте, иногда надо подменить одного сотрудника на другого. Если жена получает за мужа. (только в отчете по документам никакого незаконного действия нет)
Решил сделать регистр сведений, где создал 2 измерения Сотрудник и СотрудникПодмена где тип: СправочникСсылка.СотрудникиОрганизаций

Дальше запросом в моей обработке ищу этих сотрудников и заменяю.

Запрос = новый запрос;
Функция АрендаАТ(Сотрудник1)
Запрос.Текст = "ВЫБРАТЬ
| СоотвествиеСотрудников.Сотрудник,
| СоотвествиеСотрудников.СотрудникПодмена
|ИЗ
| РегистрСведений.СоотвествиеСотрудников КАК СоотвествиеСотрудников
|ГДЕ
| СоотвествиеСотрудников.Сотрудник = &Сотрудник";
Запрос.УстановитьПараметр("Сотрудник",Сотрудник1);
ЕстьПодмена = 0;
СотрудникПодмена = Справочники.СотрудникиОрганизаций.ПустаяСсылка();
Рез = запрос.Выполнить().Выбрать();

Пока рез.Следующий() цикл
СотрудникПодмена = рез.СотрудникПодмена;
ЕстьПодмена = 1;
КонецЦикла;

Если ЕстьПодмена = 1 Тогда

Сотрудник1 = СотрудникПодмена;

КонецЕсли;

{Обработка.ДанныеПоЗаработнойПлатеСотрудников.Форма.ФормаОтчета.Форма(341)}: Поле объекта недоступно для записи (Ссылка)
Сотрудник1 = СотрудникПодмена;

alex0402

Цитата: Анжела от 05 янв 2017, 10:49Функция АрендаАТ(Сотрудник1)

передается ссылка? Все правильно. так и должно быть.
нужно левым соединением подцепить регистр и если СотрудникПодмена не null, то вывести СотрудникПодмена.

isnull(СотрудникПодмена,Сотрудник)
Добавлено: 05 янв 2017, 11:34


да еще! функция вызывается в цикле? а там запрос.:^454^:
Спасибо за Сказать спасибо

Анжела

Цитата: alex0402 от 05 янв 2017, 11:33
Цитата: Анжела от 05 янв 2017, 10:49Функция АрендаАТ(Сотрудник1)

передается ссылка? Все правильно. так и должно быть.
нужно левым соединением подцепить регистр и если СотрудникПодмена не null, то вывести СотрудникПодмена.

isnull(СотрудникПодмена,Сотрудник)
Добавлено: 05 янв 2017, 11:34


да еще! функция вызывается в цикле? а там запрос.:^454^:

Так как сказали вы не получилось : (

LexaK

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

в коде где обращаетесь к функции

//если есть подмена, вернется другой сотрудник, если подмены нет - вернется старый
СотрудникПодмены = АрендаАТ(Сотрудник1);

//функция


Функция АрендаАТ(Сотрудник1)
Запрос = новый запрос;
Запрос.Текст = "ВЫБРАТЬ
| СоотвествиеСотрудников.Сотрудник,
| СоотвествиеСотрудников.СотрудникПодмена
|ИЗ
| РегистрСведений.СоотвествиеСотрудников КАК СоотвествиеСотрудников
|ГДЕ
| СоотвествиеСотрудников.Сотрудник = &Сотрудник";
Запрос.УстановитьПараметр("Сотрудник",Сотрудник1);

//это все не надо
//ЕстьПодмена = 0;
//СотрудникПодмена = Справочники.СотрудникиОрганизаций.ПустаяСсылка();

Рез = запрос.Выполнить().Выбрать();
Если рез.Следующий()Тогда
    Возврат рез.СотрудникПодмена;
Иначе
    Возврат Сотрудник1;
КонецЕсли;

//это тоже не надо
//Пока рез.Следующий() цикл
//СотрудникПодмена = рез.СотрудникПодмена;
//ЕстьПодмена = 1;
//КонецЦикла;

//Если ЕстьПодмена = 1 Тогда

//Сотрудник1 = СотрудникПодмена;

//КонецЕсли;

КонецФункции


если помогло нажмите: Спасибо!

Анжела

Цитата: LexaK от 11 янв 2017, 09:58
Попробуйте сделать по другому.
краткое напоминание как работает/возвращает значение функция,

в коде где обращаетесь к функции

//если есть подмена, вернется другой сотрудник, если подмены нет - вернется старый
СотрудникПодмены = АрендаАТ(Сотрудник1);

//функция


Функция АрендаАТ(Сотрудник1)
Запрос = новый запрос;
Запрос.Текст = "ВЫБРАТЬ
| СоотвествиеСотрудников.Сотрудник,
| СоотвествиеСотрудников.СотрудникПодмена
|ИЗ
| РегистрСведений.СоотвествиеСотрудников КАК СоотвествиеСотрудников
|ГДЕ
| СоотвествиеСотрудников.Сотрудник = &Сотрудник";
Запрос.УстановитьПараметр("Сотрудник",Сотрудник1);

//это все не надо
//ЕстьПодмена = 0;
//СотрудникПодмена = Справочники.СотрудникиОрганизаций.ПустаяСсылка();

Рез = запрос.Выполнить().Выбрать();
Если рез.Следующий()Тогда
    Возврат рез.СотрудникПодмена;
Иначе
    Возврат Сотрудник1;
КонецЕсли;

//это тоже не надо
//Пока рез.Следующий() цикл
//СотрудникПодмена = рез.СотрудникПодмена;
//ЕстьПодмена = 1;
//КонецЦикла;

//Если ЕстьПодмена = 1 Тогда

//Сотрудник1 = СотрудникПодмена;

//КонецЕсли;

КонецФункции



Тогда вопрос, а что если сделать так. Правильно ли это будет?

Функция АрендаАТ(Знач Сотрудник1)
вместо
Функция АрендаАТ(Сотрудник1)

LexaK

Цитировать
Функция АрендаАТ(Знач Сотрудник1)
вместо
Функция АрендаАТ(Сотрудник1)

Так не правильно.

Попробуйте сделать так как вам сказали (выше, пример рабочего кода)
если помогло нажмите: Спасибо!

Анжела

Цитата: LexaK от 12 янв 2017, 12:43
Цитировать
Функция АрендаАТ(Знач Сотрудник1)
вместо
Функция АрендаАТ(Сотрудник1)

Так не правильно.

Попробуйте сделать так как вам сказали (выше, пример рабочего кода)
Спасибо. Попробую
Добавлено: 13 янв 2017, 04:22


Цитата: Анжела от 13 янв 2017, 03:58
Цитата: LexaK от 12 янв 2017, 12:43
Цитировать
Функция АрендаАТ(Знач Сотрудник1)
вместо
Функция АрендаАТ(Сотрудник1)

Так не правильно.

Попробуйте сделать так как вам сказали (выше, пример рабочего кода)
Спасибо. Попробую

http://dropmefiles.com/nEx7D вот моя обработка. Если делаю как вы, вылазит много ошибок.
В 342 строке, добавляю Руками наших сотрудников. А хочется чтобы было через регистр

LexaK

ваша обработка по вашей ссылке не скачивается!
попробуйте вложить ее в здесь-же, в ответе
нажмите внизу кнопку: Предварительный просмотр

внизу появится область: Вложения и другие параметры, раскройте ее
там будет поле Вложение, нажмите обзор и выберите свой файл.
если помогло нажмите: Спасибо!

Анжела

Цитата: LexaK от 13 янв 2017, 09:31
ваша обработка по вашей ссылке не скачивается!
попробуйте вложить ее в здесь-же, в ответе
нажмите внизу кнопку: Предварительный просмотр

внизу появится область: Вложения и другие параметры, раскройте ее
там будет поле Вложение, нажмите обзор и выберите свой файл.
Вот моя обработка

LexaK

В вашей процедуре нет того о чем вы пишите.
код подбора из регистра закомментирован
а в старом коде у вас "зашито" соответствие по кода Сотрудник1 -> Сотрудник2

    Сотрудник2 = Неопределено;
    Сотрудник2код = Неопределено;
    ФизЛицо = Неопределено;
    Если Сотрудник1.Код = "60305810000000000792" Тогда       //
        Сотрудник2код = "60305810000000000610";              //
        ФизЛицо = "000000682";
    ИначеЕсли Сотрудник1.Код = "60305810000000001016" Тогда  //
        Сотрудник2код = "60305810000000000843";              //
        ФизЛицо = "000000966";
    ИначеЕсли Сотрудник1.Код = "60305810000000000723" Тогда  //
        Сотрудник2код = "60305810000000000863";              //
        ФизЛицо = "000000980";
и т.д.


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

Примечание
да и писать сразу в Ексель это очень плохая идея, необходимо сформировать 1С-ный ТабличныйДокумент а его уже сохранить как лист Екселя! Это гораздо эффективнее.


если помогло нажмите: Спасибо!

Теги:  

Похожие темы (5)

Рейтинг@Mail.ru

Поиск