Добрый день!
Подскажите пожалуйста, как лучше реализовать;
Есть документ Реализация услуг в котором есть строка Содержание.
И есть связанный с ним документ Путевой лист в котором указывается Водитель(ФИО).
Подскажите пожалуйста, как реализовать чтобы при выборе Водителя в Путевом листе, заполнялась строка Содержание в документе Реализация услуг(Указывалось ФИО).
Спасибо!

Пробую решить с помощью конструктора запроса с обработкой результата

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | уатПутевойЛист.Водитель1
    |ИЗ
    | Документ.уатПутевойЛист КАК уатПутевойЛист";

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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ПутевойЛист = ВыборкаДетальныеЗаписи.Владелец;
    ПутевойЛист.СсылкаНаДокумент = ВыборкаДетальныеЗаписи.СсылкаНаДокумент;
    КонецЦикла;
```
---
Ура Товарищи!
Выкладываю рабочий код

```1c
    &НаКлиенте
    Процедура УслугиЗаказПриИзменении (Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ТекДанные = Элементы.Услуги.ТекущиеДанные;
    Содержание = УслугиЗаказПриИзмененииНаСервере(ТекДанные.Заказ);
    ТекДанные.Содержание = Содержание;
    КонецПроцедуры
```

```1c
    &НаСервере
    Функция УслугиЗаказПриИзмененииНаСервере(Заказ)
    //Связываем ЗаказГрузоотправителя с МаршрутнымЛистом

    МаршрутныйЛист = Неопределено;
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    | уатМаршрутныйЛистЗаказы.Ссылка
    |ИЗ
    | Документ.уатМаршрутныйЛист.Заказы КАК уатМаршрутныйЛистЗаказы
    |ГДЕ
    | уатМаршрутныйЛистЗаказы.ЗаказГрузоотправителя = &ЗаказГрузоотправителя";

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

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

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

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

    //Связываем МаршрутныйЛист с ПутевымЛистом

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

    Запрос.УстановитьПараметр("ДокументОснование", МаршрутныйЛист);

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

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи.Водитель1;
    КонецЕсли;
    КонецФункции
```
---
Заказ Грузоотправителя - Маршрутный Лист - Путевой Лист

Вот так построена связь документов
А я все это время пытался получить данные не замечая Маршрутный Лист
---
В какой момент заполняется ФИО водителя в путевом листе, до Реализации или после? И не могу понять, откуда у вас в выборке вдруг появились и владелец и ссылкаНаДокумент, если запрос возвращает только Водитель1?
---
Что-то не вижу связи между кодом и требуемой задачей. Да и сам код нерабочий ни при каких условиях. Да и вообще, не стоит заполнять один документ из другого без очень крайней необходимости. Кривое решение. Наверняка можно и без этого обойтись, раз реализация и путевой лист и так связаны
---
Подскажите пожалуйста, а каким образом решить задачу, что нужно исправить в коде?
---
Я бы для начала посоветовал задать вопрос "зачем все это надо". Наверняка всего лишь для какого-то отчета. Вот отчет и исправить, а не придумывать костыли
---
Как происходит связь путевого листа и реализации? В путевом листе есть табличная часть реализаций? Если да, то при проведении путевого листа просто пробегай ТЧ построчно, и заполняй содержание.
---
Связь происходит так
---
Роман, Вы прям капитан очевидность... В конфе как связь настроена? У путевого листа реквизит "Документ основания", в котором указывается реализация; либо наоборот, в реализации реквизит "Документ основания", где указываем путевой лист; либо через табличную часть????
---
Более подробно
---
По цепочке связи от путевого листа двигайтесь к реализации, получайте её, пишите туда водителя, и записывайте реализацию... и будет Вам счастье )
Если посмотреть на файл, то связь идёт через МЛ. Где, наверняка есть табличная часть с реализациями.
Ну так получите маршрутный лист, и пробегите по его табличной части
---
Для каждого Строчка из [РеквизитПутевогоЛистаГдеУказанМаршрутныйЛист].[ТабличнаяЧастьМаршрутногоЛистаСРеализациями] Цикл
     ДокОбъектРеализации = Строчка.[ИмяКолонкиТЧРеализации].ПолучитьОбъект();
     Для каждого СтрокаУслуги Из ДокОбъектРеализации Цикл
          СтрокаУслуги.Содержание = [РеквизитВодятел1ИзПутевогоЛиста];
     КонецЦикла;
     ДокОбъектРеализации.Записать();
КонецЦикла;
---
В составе Маршрутного листа реквизит ЗаказГрузоотправителя
(МаршрутныйЛист-ТабличнаяЧасть-Заказы-ЗаказГрузоотправителя)

В составе Путевого листа - ДокументОснование
(ПутевойЛист-Реквизит-ДокументОснование)

Пытаюсь реализовать функцией УслугиЗаказПриИзменении т.е. при выборе вида Заказа будет заполняться строка Содержание
---
В составе Маршрутного листа реквизит ЗаказГрузоотправителя
(МаршрутныйЛист-ТабличнаяЧасть-Заказы-ЗаказГрузоотправителя)

В составе Путевого листа - ДокументОснование
(ПутевойЛист-Реквизит-ДокументОснование)
---
```1c
    Процедура УслугиЗаказПриИзменении(Элемент)

    СтрокаТабличнойЧасти = Элементы.Услуги.ТекущиеДанные;
    СтрокаТабличнойЧасти.Содержание = уатОбщегоНазначенияТиповые.ПолучитьЗначениеРеквизита(СтрокаТабличнойЧасти.Заказ, "????");

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

Не знаю как правильно указать путь к Сотруднику Водитель1
---
Добавил реквизит Водитель1(Справочник.Ссылка.Сотрудники) в уатЗаказГрузоотправителя

```1c
    Процедура УслугиЗаказПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Услуги.ТекущиеДанные;
    СтрокаТабличнойЧасти.Содержание = уатОбщегоНазначенияТиповые.ПолучитьЗначениеРеквизита(СтрокаТабличнойЧасти.Заказ, "Водитель1");
    КонецПроцедуры
```

В общем модуле уатОбщегоНазначенияТиповые прописал:

```1c
    // Водитель1
    Если уатЕстьРеквизитДокумента("Водитель1", МетаданныеДокумента) Тогда
    ДокументОбъект.Водитель1 = ДокументОснование.Водитель1;
    КонецЕсли;
```

При изменении Заказа выдается пустой реквизит Содержание, в чем ошибка?
---
Зачем так все усложнять? Опираясь на (15) можно написать так

```1c
    Процедура УслугиЗаказПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Услуги.ТекущиеДанные;
    СтрокаТабличнойЧасти.Содержание = ПолучитьВодителя(СтрокаТабличнойЧасти.Заказ);
    КонецПроцедуры

    &НаСервереБезКонтекста
    Функция ПолучитьВодителя(СсылкаДок)
    Если НЕ СсылкаДок.Пустая() Тогда
    Возврат СсылкаДок.Водитель1.Наименование;
    Иначе
    Возврат ";
    КонецЕсли;
    КонецФункции
```
---
Эта процедура не подходит т.к. она назначает в ДокументОбъекте реквизит Водитель1, а вам нужно чтобы возвращалось значение Водитель1, которое вы будете устанавливать в свое содержание (нужна похожая функция, с
```1c
    Возврат ДокументОснование.Водитель1;
```
 )
---
Должно получиться что то типа :

```1c
    // Водитель1
    Если уатЕстьРеквизитДокумента("Водитель1", МетаданныеДокумента) Тогда
    Возврат ДокументОснование.Водитель1;
    КонецЕсли;
```

?

Возникает ошибка, уатОбщегоНазначенияТиповые.Модуль процедура не может возвращать значение
---
поэтому и написал что нужна похожая функция

```1c
    Функция ВернутьЗначениеРеквизита(парам1, парам2)
    //начальный кусок кода
    Если уатЕстьРеквизитДокумента("Водитель1", МетаданныеДокумента) Тогда
    Возврат ДокументОснование.Водитель1;
    КонецЕсли;
    Возврат Неопределено;
    КонецФункции;
```

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

Функция ВернутьЗначениеРеквизита (парам1, парам2), где она создается?
Что есть оригинальная процедура?
---
в общем модуле уатОбщегоНазначенияТиповые есть процедура ПолучитьЗначениеРеквизита. скопируйте её целиком, переименуйте Процедура и КонецПроцедуры на Функция и КонецФункции соответственно..далее переименуйте "ПолучитьЗначениеРеквизита" на ВернутьЗначениеРеквизитаВодитель например. чтоб было похоже на кусок кода что указан выше. И в самом документе вместо вызова старой процедуры указываете тот же модуль, но имя вашей новой функции

```1c
    СтрокаТабличнойЧасти.Содержание = уатОбщегоНазначенияТиповые.ВернутьЗначениеРеквизитаВодитель(СтрокаТабличнойЧасти.Заказ, "Водитель1");
```
---
Что получается в итоге:
в модуле уатРеализацияУслуг

```1c
    Процедура УслугиЗаказПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Услуги.ТекущиеДанные;
    СтрокаТабличнойЧасти.Содержание = уатОбщегоНазначенияТиповые.ВернутьЗначениеРеквизитаВодитель(СтрокаТабличнойЧасти.Заказ, "Водитель1");
    КонецПроцедуры
```

в модуле уатОбщегоНазначенияТиповые

```1c
    Функция ВернутьЗначениеРеквизитаВодитель(Ссылка, ИмяРеквизита) Экспорт
    МетаданныеДокумента = ДокументОбъект.Метаданные();
    Результат = ПолучитьЗначенияРеквизитов(Ссылка, ИмяРеквизита);
    Возврат Результат[ИмяРеквизита];

    Если уатЕстьРеквизитДокумента("Водитель1", МетаданныеДокумента) Тогда
    Возврат ДокументОснование.Водитель1;
    КонецЕсли;
    Возврат Неопределено;

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

Проблема в том что переменная не определена ДокументОбъект и ДокументОснование
---
Исправил

```1c
    Функция ВернутьЗначениеРеквизитаВодитель(Ссылка, ИмяРеквизита) Экспорт
```

На

```1c
    Функция ВернутьЗначениеРеквизитаВодитель(Ссылка, ИмяРеквизита, ДокументОбъект, ДокументОснование) Экспорт
```

Ошибка, недостаточно фактических параметров и ссылается на

```1c
    Процедура УслугиЗаказПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Услуги.ТекущиеДанные;
    СтрокаТабличнойЧасти.Содержание = уатОбщегоНазначенияТиповые.ВернутьЗначениеРеквизитаВодитель(СтрокаТабличнойЧасти.Заказ, "Водитель1");
    КонецПроцедуры
```
---
Можете выложить исходный текст процедуры ПолучитьЗначениеРеквизита без изменений ?
---
Да, вот оригинальная процедура

```1c
    Функция ПолучитьЗначениеРеквизита(Ссылка, ИмяРеквизита) Экспорт

    Результат = ПолучитьЗначенияРеквизитов(Ссылка, ИмяРеквизита);
    Возврат Результат[ИмяРеквизита];

    КонецФункции
```
---
Странно, почему она Функция, а не процедура
---
Посмотрел в типовом коде, судя по коду возвращается структура реквизитов, в которой уже есть ваш водитель.

```1c
    Процедура УслугиЗаказПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Услуги.ТекущиеДанные;
    СтрокаТабличнойЧасти.Содержание = уатОбщегоНазначенияТиповые.ВернутьЗначениеРеквизитаВодитель(СтрокаТабличнойЧасти.Заказ, "Водитель1");
    КонецПроцедуры
```

Этот код бы отработал как надо если бы в Заказе был бы реквизит Водитель1, а он в документе Путевой лист, осталось узнать как связана реализация с путевым листом ? Путевой лист сделан на основании Заказа или он выбран в каком-то другом реквизите?
---
Ребят, как я только не пытался сделать и так и сяк
Что в итоге в документе уатРеализацияУслуг

```1c
    &НаКлиенте
    Процедура УслугиЗаказПриИзменении (Элемент, ДанныеВыбора, СтандартнаяОбработка, ДокументОснование)
    УслугиЗаказПриИзмененииНаСервере(ДокументОснование)
    КонецПроцедуры
```

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

    Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);

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

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

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

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

Сомневаюсь по поводу
```1c
    Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);
```

и

```1c
    СтрокаТабличнойЧасти.Содержание = РезультатЗапроса.Выбрать();
```
---
тогда уж скорее всего так:

```1c
    &НаКлиенте
    Процедура УслугиЗаказПриИзменении (Элемент)
    СтрокаТабличнойЧасти = Элементы.Услуги.ТекущиеДанные;
    СтрокаТабличнойЧасти.Содержание =УслугиЗаказПриИзмененииНаСервере()
    КонецПроцедуры

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

    Запрос.УстановитьПараметр("ДокументОснование", Объект.ДокументОснование);

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

    Если РезультатЗапроса.Количество() = 0 тогда
    Возврат ";
    КонецЕсли;

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

    ВыборкаДетальныеЗаписи.Следующий()

    Возврат ВыборкаДетальныеЗаписи.Водитель1;

    КонецФункции
```
---
Вот что получается у меня

```1c
    &НаКлиенте
    Процедура УслугиЗаказПриИзменении (Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ТекДанные = Элементы.Услуги.ТекущиеДанные;
    УслугиЗаказПриИзмененииНаСервере(ТекДанные.Заказ)
    КонецПроцедуры
```

```1c
    &НаСервере
    Процедура УслугиЗаказПриИзмененииНаСервере(Заказ)

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

    Запрос.УстановитьПараметр("ДокументОснование", Заказ);

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

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

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

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

Не уверен в правильности заполнения ТекДанные.Содержание
---
Все остальное вроде правильно
---
Какого типа реквизит содержание? если строка, тогда так

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

    Запрос.УстановитьПараметр("ДокументОснование", Заказ);

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

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

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

    КонецПроцедуры
```
---
У ВыборкаДетальныеЗаписи.нВодитель будет тип "Строка", т.к. получаешь ПРЕДСТАВЛЕНИЕ в запросе. А ТекДанные - это у тебя текущие данные ТаблицыФормы, которая связанная с данными (смотри в свойствах путь к данным), там уже смотри тип у колонки "Содержание".
---
или посмотри в отладчике ТипЗнч(ТекДанные.Содержание)
---
Ура Товарищи!
Выкладываю рабочий код

```1c
    &НаКлиенте
    Процедура УслугиЗаказПриИзменении (Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ТекДанные = Элементы.Услуги.ТекущиеДанные;
    Содержание = УслугиЗаказПриИзмененииНаСервере(ТекДанные.Заказ);
    ТекДанные.Содержание = Содержание;
    КонецПроцедуры
```

```1c
    &НаСервере
    Функция УслугиЗаказПриИзмененииНаСервере(Заказ)
    //Связываем ЗаказГрузоотправителя с МаршрутнымЛистом

    МаршрутныйЛист = Неопределено;
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    | уатМаршрутныйЛистЗаказы.Ссылка
    |ИЗ
    | Документ.уатМаршрутныйЛист.Заказы КАК уатМаршрутныйЛистЗаказы
    |ГДЕ
    | уатМаршрутныйЛистЗаказы.ЗаказГрузоотправителя = &ЗаказГрузоотправителя";

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

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

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

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

    //Связываем МаршрутныйЛист с ПутевымЛистом

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

    Запрос.УстановитьПараметр("ДокументОснование", МаршрутныйЛист);

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

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи.Водитель1;
    КонецЕсли;
    КонецФункции
```
---
Заказ Грузоотправителя - Маршрутный Лист - Путевой Лист

Вот так построена связь документов
А я все это время пытался получить данные не замечая Маршрутный Лист
---
Более правильно использовать соединения

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

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

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

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи.Водитель1;
    КонецЕсли;
    КонецФункции
```
---
И со временем оно будет работать все медленнее и медленнее.
---
Это почему же?
---
Потому что, этот запрос выбирает все существующие документы указанных типов, потом производит их соединение, и только после этого делает отбор по условию. Чем больше документов путевой и маршрутный лист, тем дольше идет выборка.
Использовать надо выборку по регистру с отбором по периоду.
---
Подскажите пожалуйста, как изменить мой запрос,
 что бы выводилось не %Водитель1% а, Ф.И.О. : %Водитель1%?
---
т. е. как добавить текст перед выводом "Водителя"?
---
Возврат " Ф.И.О. : " + ВыборкаДетальныеЗаписи.Водитель1;
---
а если в запросе то
 | ""Ф.И.О. : "" + уатПутевойЛист.Водитель1.Наименование