Добрый день. Попрошу сильно не ругаться на мою некомпетентность, я только начал изучение языка 1С. Задача такова: имеется документ "КадровоеПеремещение" и регистр сведений "СведенияОСотрудниках". Необходимо при переводе сотрудника на новое подразделение/должность выводить предыдущее подразделение и должность.
Проблема в следующем: я создаю обработку "ПриИзменении" реквизита "Сотрудник" в модуле формы, выбирая "На клиенте и сервере без контекста". В серверной процедуре я выполняю запрос к регистру сведений для получения подразделения и должности для определённого сотрудника. Мой код следующий:

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

    Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    КонецПроцедуры

    &НаКлиенте
    Процедура СотрудникПриИзменении(Элемент)

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

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

При попытке скомпилировать код, возникает ошибка, а именно "Переменная не определена (Сотрудник) СотрудникПриИзмененииНаСервере(<<?>>Сотрудник);". Я понимаю, что если определить эту переменную, то в данной процедуре создастся новая переменная с таким же именем, однако в себе она ничего хранить не будет. Как можно решить возникшую проблему? Уповаю на вашу помощь.
---
А сотрудник - Это реквизит формы или документа? Если Это реквизит документа, то нужно:
"СотрудникПриИзмененииНаСервере(Объект.Сотрудник)"
---
В данном случае, скорее всего X известна, просто человек ещё не понимает, что обращаться к X нужно через Объект. Объект.Сотрудник
---
ТекущиеДанные.Сотрудник - посмотрите отладчиком.
---
А сотрудник - Это реквизит формы или документа? Если Это реквизит документа, то нужно:
"СотрудникПриИзмененииНаСервере(Объект.Сотрудник)"
---
&НаСервереБезКонтекста Замените на &НаСервере
---
А это ещё зачем?
---
Считаете не надо? нет проблем. ;)
---
Абсолютно все что вы используете , должно быть определено до того момента как вы его используете...
То есть

Вот какую ошибку вы видите в примере

```1c
    Процедура Сложение()
    Результат = А+10;
    КонецПроцедуры
```

А тут есть разница?

```1c
    Процедура Сложение(А)
    Результат = А+10;
    КонецПроцедуры

    Процедура Сложение()
    А=20;
    Результат = А+10;
    КонецПроцедуры
```

Надеюсь вам ясна ваша ошибка...

А как искать решение если путь неясен вам могу подсказать следующий:
Запускайте отладчик , ставьте останов на своей ошибке и смотрите ЧТО такое Элемент и что такое Сотрудник....
---
Честно говоря, нет, ошибка неясна. Можете, пожалуйста, посоветовать источник, где я мог бы ознакомиться с этой темой? Дабы заполнить этот пробел в знаниях.
---
Я же сказал - запускайте конфигуратор и отладку и смотрите КАК оно вообще все происходит - лучше 1 раз увидеть ...
---
Увас проблема не 1С-ная...
Вы пока в принципе не умеете мыслить программистом. Попробуйте программировать на Basic или еще что попроще ...
Не знаю что сейчас реально доступно... Вам нужно научиться сначала думать именно как машина, а уж 1с никуда не денется

Что тут неясного - вам говорит, что "Переменная не определена (Сотрудник)

Если я вам скажу "У меня в кармане Х+5 яблок, скажите мне сколько у меня яблок в кармане?"

Что вы ответите?
---
В данном случае, скорее всего X известна, просто человек ещё не понимает, что обращаться к X нужно через Объект. Объект.Сотрудник
---
хочу не согласиться...
Объект.Сотрудник
и Сотрудник
Это все же не одно и то же !
И даже Совсем не одно и тоже , тем более что выдает ошибку...

И все же нужно понимать, что если пишет , что "Перемнная не определена" то это именно - X не известен...
А вот почему он не известен, хотя вроде как про него речь - это уже другая песня...
---
Я вижу проблему просто в передачи значений полученных в выборке в переменную и дальнейшем использовании этих значений по собственным нуждам . Далее смотрите код ,как бы я это решил -

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

    Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Если ВыборкаДетальныеЗаписи.Количество() = 0 Тогда
    Сообщить("Этот сотрудник" + (Указываем пусть к реквизиту с данным сотрудником+"не был ещё добавлен в БД");
    Возврат Неопределено;
    Если ВыборкаДетальныеЗаписи.Количество() > 0 Тогда
  СтруктураПоиска = Новый Структура();

  Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
  СтруктураПоиска.Добавить ("Сотрудник" , Выборка.Сотрудник);
                СтруктураПоиска.Добавить ("Подразделение" , Выборка.Подразделение);
                СтруктураПоиска.Добавить ("Должность" , Выборка.Подразделение);
  КонецЦикла;
 Возврат СтруктураПоиска;
    КонецПроцедуры

&НаКлиенте
Процедура СотрудникПриИзменении(Элемент)

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

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

Помимо всего этого ,так же необходимо в запрос передать текущие данные выбранные в реквизите сотрудник, так как Вырка должна собрать данные именно по сотруднику который вам нужен. А сейчас ей просто не с чем сравнивать данные .

Жду так же критики своего совета, если в нем есть что то на ваш взгляд не правильное . Буду рад любому мнению,ведь я тоже не так давно начал сам обучаться данному ремеслу .
---
UPD. Дошаманил до подобного состояния, код ошибки меня просто сводит с ума. :)

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

    Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    СтарыеДанные = (ВыборкаДетальныеЗаписи.Подразделение + " на должности " + ВыборкаДетальныеЗаписи.Должность);
    Возврат СтарыеДанные;
    КонецЕсли;

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

    &НаКлиенте
    Процедура СотрудникПриИзменении(Элемент)
    Объект.СтарыеДанные = СотрудникПриИзмененииНаСервере(Объект.Сотрудник);
    КонецПроцедуры
```

Соответственно, конфигуратор не ругается, ругается сама конфигурация. Проходился отладчиком, и ВыборкаДетальныеЗаписи.Подразделение, и ВыборкаДетальныеЗаписи.Должность в строковом формате, ниже прикрепил значения переменных. Это вообще как понимать? :)
---
Проблема решена, спасибо большое!