Программный выбор реквизита шапки с типом справочник

1. P1rate 23.05.16 16:26 Сейчас в теме
Подскажите пожалуйста, есть документ с реквизитом шапки ОтпускРазрешил. Тип значения реквизита - Справочник.Сотрудники. В документе есть флажок, по выбору которого должен заполниться реквизит шапки. В данном случае заполнение не происходит.


//Филиал подбор значений
Функция ФилиалПриИзменении()
        Если Филиал = 1 Тогда 
	    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
            СпрСотр.НайтиПоКоду("91141");
	    ОтпускРазрешил = СпрСотр.ТекущийЭлемент();
    	КонецЕсли;
	  
КонецФункции
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. aka Любитель XML 23.05.16 16:30 Сейчас в теме
(1) P1rate, пройти отладчиком попробуй, все станет понятно
3. P1rate 23.05.16 16:43 Сейчас в теме
(2) aka Любитель XML, Я совсем зелёный в этом деле и только учусь) Если было бы понятно - то я не спросил бы)
4. aka Любитель XML 23.05.16 16:47 Сейчас в теме
(3) P1rate, прочитай как отладку делать. Если бы я не умел пользоваться отладкой, то сделал бы так
Функция ФилиалПриИзменении()
        сообщить("Филиал = "+Строка(Филиал));
        Если Филиал = 1 Тогда 
        СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
            СпрСотр.НайтиПоКоду("91141");
        сообщить("Сотрудник = "+Строка(СпрСотр.ТекущийЭлемент()));
        ОтпускРазрешил = СпрСотр.ТекущийЭлемент();
        КонецЕсли;
      
КонецФункции
Показать
5. sonne 23.05.16 16:49 Сейчас в теме
(3) P1rate, Филиал - это флажок? Сотрудник по такому коду точно есть?
+ вот, (4) верно говорит.
6. P1rate 23.05.16 17:03 Сейчас в теме
(5) sonne, филиал - это флажок с формулой: ФилиалПриИзменении(), сотрудник по такому коду точно есть и всё равно пустое значение. Пробовал искать и по наименованию - всё равно не получается.
7. sonne 23.05.16 17:12 Сейчас в теме
(6) P1rate, попробовали сделать то, что (4) написал?
8. Slypower 2 23.05.16 17:17 Сейчас в теме
Вообще я бы вставил это не в Функцию, а процедуру и вписал бы название процедуры в флажок на форме в графу: формула
9. P1rate 23.05.16 17:20 Сейчас в теме
Да, в сообщениях появляется сотрудник =
10. sonne 23.05.16 17:20 Сейчас в теме
(9) P1rate, значит, не находит сотрудника по такому коду.
У вас код справочника Сотрудники строковый? Какая длина кода, 5?
11. P1rate 23.05.16 17:24 Сейчас в теме
(10) sonne, Это я уже понял. Пробовал через процедуру - эффект тот же. Вообще справочник с периодическими реквизитами.
Сейчас пробую так и ничего не получается:
Процедура ФилиалПриИзменении()
	    Если Филиал = 1 Тогда 
			СпрСотр = СоздатьОбъект("Справочник.Сотрудники");  
			СпрСотр.ИспользоватьДату(ТекущаяДата());
                        СпрСотр.НайтиПоКоду("91141");
	       	        сообщить("Сотрудник = "+Строка(СпрСотр.ТекущийЭлемент()));
		   	ОтпускРазрешил = СпрСотр.ТекущийЭлемент();
    	   КонецЕсли;
	  
КонецПроцедуры
Показать
12. anresh 23.05.16 17:25 Сейчас в теме
(11) P1rate, Скорее всего неправильно указан тип реквизита ОтпускРазрешил
17. P1rate 23.05.16 17:30 Сейчас в теме
(12) anresh, у реквизита отпуск разрешил указан тип Справочник.Сотрудники
18. anresh 23.05.16 17:32 Сейчас в теме
(17) P1rate, если работает строка Сообщить(ОтпускРазрешил) - значит вы где-то потом затираете это значение.
21. P1rate 23.05.16 17:35 Сейчас в теме
(18) anresh, строка сообщить(ОтпускРазрешил); не работает. Тут проблема где то раньше, т.к. при сообщить("Сотрудник = "+Строка(СпрСотр.ТекущийЭлемент())); я получаю Сотрудник = .
22. sonne 23.05.16 17:37 Сейчас в теме
(21) P1rate, пробовали (16)? Вы не так код ищете скорее всего.
24. P1rate 23.05.16 17:41 Сейчас в теме
(22) sonne, И 16 пробовал, и поиск по наименованию пробовал с копированием наименования из справочника. Всё равно не ищет. Я не представляю, в чём проблема(
25. anresh 23.05.16 17:43 Сейчас в теме
(24) P1rate, почему вы пишите что не ищет - если вы говорите (9) что сообщить работает? У вас не происходит присвоение значения в реквизит. Пробуйте (14) и сверяйте название реквизита в форме и в вашем коде. Чудес не бывает.
27. P1rate 23.05.16 17:46 Сейчас в теме
(25) anresh, я имел ввиду, что появляется сообщить = и всё, пустота, значение не находит.
28. sonne 23.05.16 17:49 Сейчас в теме
(24) P1rate, а вы точно проверяете в измененной базе? :)) Ну и из этой же области: 91141 - это точно код справочника, а не какой-нибудь еще реквизит?
Если код справочника числовой, то и искать по коду нужно число, а не строку. Больше там ничего и быть-то не может...
29. P1rate 23.05.16 17:53 Сейчас в теме
(28) sonne,
Это точно код тот и точно проверяю в той базе, так как запускаю её сразу же из конфигуратора. Мистика какая то вообщем))
30. anresh 23.05.16 18:04 Сейчас в теме
(29) P1rate, может все-таки это табельный номер?
31. sonne 23.05.16 18:06 Сейчас в теме
(29) P1rate, давайте тогда все картинки :) Из конфигуратора свойства справочника Сотрудники, свойство колонки Код из списка справочника.
P.S. Когда скрины выкладываете, замазывайте наименование Организации и несущественные для текущей проблемы данные типа оклада...
32. P1rate 23.05.16 18:29 Сейчас в теме
(31) sonne, Картинок много, закинул их в архив. Ссылка на файлообменник : http://my-files.ru/jzfur5
33. sonne 23.05.16 18:41 Сейчас в теме
(32) P1rate, хм. Нет под рукой 1с7. Какие еще параметры есть у функции НайтиПоНаименованию? Не помню, может, там по умолчанию ставится поиск по родителю, а он не выбран.
23. anresh 23.05.16 17:38 Сейчас в теме
(17) P1rate, еще бывает что на форму не реквизит документа вынесен, а просто элемент добавлен и идентификатор у него другой (какая-нибудь буковка другая - например О английская или в коде у вас "О" английская и фактически происходит присвоение значения в переменную а не в реквизит - перепишите в коде а лучше скопируйте из реквизита документа)
13. sonne 23.05.16 17:27 Сейчас в теме
(11) P1rate, код у справочника точно не периодический реквизит, поэтому ИспользоватьДату тут никак не поможет.
См. вопросы выше по коду справочника.
15. P1rate 23.05.16 17:28 Сейчас в теме
(10) sonne, Длина кода 5. Тип кода - числовой.
16. sonne 23.05.16 17:29 Сейчас в теме
(15) P1rate, тогда вместо этого
СпрСотр.НайтиПоКоду("91141"); 

пишите это
СпрСотр.НайтиПоКоду(91141); 
19. anresh 23.05.16 17:34 Сейчас в теме
(16) sonne, в сообщениях у него появляется сотрудник.
20. sonne 23.05.16 17:34 Сейчас в теме
(19) anresh, неа, не появляется (9)
14. anresh 23.05.16 17:27 Сейчас в теме
Попробуйте так
Процедура ФилиалПриИзменении() 
Если Филиал = 1 Тогда 
СпрСотр = СоздатьОбъект("Справочник.Сотрудники"); 
СпрСотр.ИспользоватьДату(ТекущаяДата()); 
СпрСотр.НайтиПоКоду("91141"); 
сообщить("Сотрудник = "+Строка(СпрСотр.ТекущийЭлемент())); 
ОтпускРазрешил = СпрСотр.ТекущийЭлемент(); 

сообщить(ОтпускРазрешил);

КонецЕсли;
Показать
26. v3rter 23.05.16 17:45 Сейчас в теме
А сам возврат значения запрограммировали? Значение должно же как-то вернуться из функции?

Функция ФилиалПриИзменении()
//  ...
      ФилиалПриИзменении = ОтпускРазрешил ;
КонецФункции


Что-то великоват код 91141 для справочника сотрудников, может Вы где-то ошиблись?
34. loki03 24.05.16 05:05 Сейчас в теме
Если код числовой - без кавычек.
Вообще-то я всегда делаю проверку

Если СпрСотр.НайтиПоКоду(Код)=1 Тогда
  // Что-то делаем
Иначе
  Сообщить("Не найден");
КонецЕсли;


А у справочника сотрудники уникальность кодов какая? Если в пределах подчинения = тогда ищи по полному коду.
36. P1rate 24.05.16 09:15 Сейчас в теме
(34) loki03, Делал и с ковычками и без ковычек. Делал с проверкой поиска - сотрудника не находит. Искал его через НайтиПоНаименованию - и всё равно не находит. Уникальность кодов действительно в пределах подчинения. Где найти полный код в таком случае?
37. Rokky78 40 24.05.16 09:51 Сейчас в теме
(36) P1rate, Полный код вернет метод ПолныйКод().
ПолныйКод()
Синтаксис:
ПолныйКод()
Назначение:
Возвращает строку, содержащую полный код выбранного элемента справочника со всеми вышестоящими уровнями, разделенными символом /.

Но в Вашем случае, я думаю, это не совсем удобно. Я бы все-таки искал по наименованию. Обратите внимание на второй и третий параметры этого метода. По умолчанию он ищет внутри установленного подчинения и по совпадению первых символов.

НайтиПоНаименованию(<?>,,);
Синтаксис:
НайтиПоНаименованию(<Наименование>,<Режим>,<ФлагПоиска>)
Назначение:
Найти элемент справочника по наименованию.
Возвращает: 1 - если действие выполнено;
0 - если действие не выполнено (элемент не найден).
Параметры:
<Наименование> - строка с наименованием искомого элемента справочника,
<Режим> - необязательный параметр. Число: 1 - поиск внутри установленного подчинения (родителя); 0 - поиск во всем справочнике вне зависимости от родителя. Значение по умолчанию - 1.
<ФлагПоиска> - необязательный параметр. Число: 1 - найти точное соответствие наименования; 0 - найти наименование по первым символам. Значение по умолчанию - 0.



Попробуйте

СпрСотр.НайтиПоНаименованию("Наименование",0,1);


P.S. а вообще, поиск по коду/наименованию лучше не использовать. Это не универсальный алгоритм.
38. P1rate 24.05.16 09:55 Сейчас в теме
(37) Rokky78, Спасибо Вам огромнейшее, работает!!!
39. Rokky78 40 24.05.16 09:59 Сейчас в теме
35. loki03 24.05.16 05:09 Сейчас в теме
Или еще вариант, если все остальное не работает.

ОтпускРазрещил=ЗначениеИзСтрокиВнутр(ЗдесьСформированаяСтрокаНужногоСотрудника);
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот