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

Работа с документами и справочниками

Автор shurik91, 06 авг 2017, 22:50

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

shurik91

Здравствуйте! Помогите, пожалуйста. Хочу сделать следующее: при заполнении документа "Прием на работу" при выборе сотрудника автоматически подтягивалась бы должность из справочника "Сотрудники".
Процедура ПриОткрытии ()
Выборка1 = Справочники.Сотрудники.Выбрать();
Пока Выборка1.Следующий() Цикл
Должн = Выборка1.Должность; // Дожность - это реквизит справочника Сотрудники
Если Сотрудник = Выборка1 Тогда // Сотрудник - это реквизит справочника Сотрудники, там указывается
                                //  ФИО, Выборка1 после начала выполнения цикла хранит в себе значение
                                // реквизита наименование, в котором указывается ФИО
Должность = Должн;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;

oleg-x

Код должен выполнятся не при открытие, а при изменение реквизита сотрудник, а при открытие сотрудник еще может быть не заполнен и тебе же не надо каждый раз при открытие, заполнять должность, даже если она уже заполнена.
И еще, когда условие выполнено, нужно прервать цикл.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

shurik91

Цитата: oleg-x от 07 авг 2017, 01:27
когда условие выполнено, нужно прервать цикл.
Так у меня же указано завершение цикла, ведь стоит КонецЦикла; И еще вопрос. Процедуру назвать не при открытии, а как тогда? Наверное, есть какая то стандартная процедура "ПриВыборе" или что-нибудь типа неё?

AIFrame

Зачем лопатить весь справочник сотрудников, когда можно получить его явно?

Если ЗначениеЗаполнено(Сотрудник) Тогда
    СотрудникСсылка = Справочники.Сотрудники.НайтиПоКоду(Сотрудник.Код);
    Если СотрудникСсылка <> неопределено Тогда
        Должность = СотрудникСсылка.Должность;
    КонецЕсли;
КонецЕсли;

И никаких циклов не надо.
Если коды в справочнике неуникальны, поиск по коду можно заменить на поиск по реквизиту. Любому.

Идем дальше. Значения поля Сотрудник у вас, как я понял, итак является ссылкой на элемент справочника Сотрудники.
Должность = Сотрудник.Должность;

И повесить на поле Сотрудник на форме обработчик ПриВыборе.
Добавить проверку на пустое значение и все:
Если ЗначениеЗаполнено(Сотрудник) Тогда
    Должность = Сотрудник.Должность
КонецЕсли;


---
И небольшое замечание.
Если Сотрудник = Выборка1
Это неверно. Выборка1 - это строка\некий скомпонованный элемент результат запроса, а не ссылка на справочник. Выборка1 содержит в себе эту ссылку и реквизиты этой ссылки, а не является ей как таковой.
Если Сотрудник = Выборка1.Ссылка
Вот так должно быть

shurik91

Спасибо большое. Попробую как ВЫ сказали.
Добавлено: 07 авг 2017, 10:47


А если, всё-таки, я хочу извлечь данные из Выборка1 можно что-нибудь сделать? Это мне нужно для того, что бы попасть в условие.

oleg-x

Цитата: shurik91 от 07 авг 2017, 08:45
Цитата: oleg-x от 07 авг 2017, 01:27
когда условие выполнено, нужно прервать цикл.
Так у меня же указано завершение цикла, ведь стоит КонецЦикла; И еще вопрос. Процедуру назвать не при открытии, а как тогда? Наверное, есть какая то стандартная процедура "ПриВыборе" или что-нибудь типа неё?
Это завершение цикла, когда обойдет все значения. То есть у вас 10000 записей в справочнике, на 100 записи было выполнено условие, но программа продолжит лопатить остальные записи, что вам уже не нужно. При выполнение условия в данном случае нужно написать команду "прервать".
У каждого реквизита есть событие, вам нужно событие при изменение.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

shurik91

Олег, а можно, пожалуйста, тогда код.

oleg-x

Процедура ПриИзменениеСотрудник ()
Выборка1 = Справочники.Сотрудники.Выбрать();
    Пока Выборка1.Следующий() Цикл
    Должн = Выборка1.Должность; // Дожность - это реквизит справочника Сотрудники
    Если Сотрудник = Выборка1.ссылка Тогда  // Сотрудник - это реквизит справочника Сотрудники, там указывается
                                //  ФИО, Выборка1 после начала выполнения цикла хранит в себе значение
                                // реквизита наименование, в котором указывается ФИО
Должность = Должн;
Прервать;  //условие выполнено, дальше перебирать выборку не имеет смысла
КонецЕсли;
КонецЦикла;
КонецПроцедуры; //Но так будет не быстро, 1С рекомендует пользоваться запросами, пример ниже

Процедура ПриИзмененииСотрудник()

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Должность
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Сотрудник);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Должность = ВыборкаДетальныеЗаписи.Должность;
КонецЕсли;

КонецПроцедуры


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

Процедура ПриИзмененииСотрудник()
Если ЗначениеЗаполнено(Сотрудник) Тогда
Должность = Сотрудник.Должность;
КонецЕсли;
КонецПроцедуры //так делаем, если берем значение из документа/справочник, ссылку на который есть в объекте.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

shurik91

Цитата: oleg-x от 07 авг 2017, 12:25
Процедура ПриИзменениеСотрудник ()
Выборка1 = Справочники.Сотрудники.Выбрать();
    Пока Выборка1.Следующий() Цикл
    Должн = Выборка1.Должность; // Дожность - это реквизит справочника Сотрудники
    Если Сотрудник = Выборка1.ссылка Тогда  // Сотрудник - это реквизит справочника Сотрудники, там указывается
                                //  ФИО, Выборка1 после начала выполнения цикла хранит в себе значение
                                // реквизита наименование, в котором указывается ФИО
Должность = Должн;
Прервать;  //условие выполнено, дальше перебирать выборку не имеет смысла
КонецЕсли;
КонецЦикла;
КонецПроцедуры; //Но так будет не быстро, 1С рекомендует пользоваться запросами, пример ниже

Зачем после Выборка1.Ссылка ?
[/quote]

Добавлено: 07 авг 2017, 13:36


Цитата: shurik91 от 07 авг 2017, 13:35
Цитата: oleg-x от 07 авг 2017, 12:25
Процедура ПриИзменениеСотрудник ()
Выборка1 = Справочники.Сотрудники.Выбрать();
    Пока Выборка1.Следующий() Цикл
    Должн = Выборка1.Должность; // Дожность - это реквизит справочника Сотрудники
    Если Сотрудник = Выборка1.ссылка Тогда  // Сотрудник - это реквизит справочника Сотрудники, там указывается
                                //  ФИО, Выборка1 после начала выполнения цикла хранит в себе значение
                                // реквизита наименование, в котором указывается ФИО
Должность = Должн;
Прервать;  //условие выполнено, дальше перебирать выборку не имеет смысла
КонецЕсли;
КонецЦикла;
КонецПроцедуры; //Но так будет не быстро, 1С рекомендует пользоваться запросами, пример ниже


[/quote]


Зачем после Выборка1.Ссылка ?

oleg-x

ЦитироватьЗачем после Выборка1.Ссылка ?
Затем, что выборка это не ссылка на элемент, а некий набор данных об одном элементе, в котором есть ссылка на элемент и многое другое.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

Теги:

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

Рейтинг@Mail.ru

Поиск