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

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

    Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументТабличнаяЧасть.ПеремещениеТоваров.Товары") Тогда
    ЗначениеЗаказа = "ДокументРезерва";
    Иначе
    ЗначениеЗаказа = "ЗаказПокупателя";
    КонецЕсли;

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

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

Дальше идет проверка выбранного.......
---
А в чем собственно проблема? Колонка у вас называется "ДокументРезерва".
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ДокументРезерва", "МояЛюбимаяКолонка");
---
В запросе - уже никак. Вам необходимо динамически формировать сам текст запроса в зависимости от типа документа.
---
А в чем собственно проблема? Колонка у вас называется "ДокументРезерва".
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ДокументРезерва", "МояЛюбимаяКолонка");
---
Колонка у меня называется, в зависимости от типа документа, или ЗаказПокупателя или ДокументРезерва.
---
Это колонка в выбираемой табличной части у вас зависит от типа документа. А имя колонки в результате запроса - всегда "Документ резерва". Именно её я и предлагаю изменить, если я вас правильно услышал.
---
Нет не правильно. Интересует именно колонка в выбираемой части.
Ну в общем вопрос решен полностью.
---
Не знаю правильно я сделал или нет, но работает:

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

..обзывать товарную табличную часть именем "СсылкаНаДокумент" - это прям шпионский детектив какой-то и "Операция "Ы"... ну...
---
Через месяц понадобится доработать, откроет модуль и будет удивляться "ну кто так пишет?!" :)
---
В общем работает, НО появилась одна непонятка.
Теперь при закрытии не измененного документа (перемещение или реализация) постоянно спрашивает "данные были изменены сохранить изменения" или если нажать в документе с начало провести, а затем его закрыть - "данные были изменены сохранить изменения".
Убираю замену строки для подбора - все работает нормально, ни чего не спрашивает.
Ставлю назад и опять начинается.
Я что то связи этого сообщения со строкой запроса понимаю.

Работаем в УПП. В базе используется и тонкий и толстый клиент.
Запрос проявляет себя только в толстом клиенте.
---
А это смотря где ты его размещаешь и что выполняешь по результату запроса...
---
ОбработкаПроведения() в обоих документах.
После
 Если мУдалятьДвижения Тогда
  ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Истина, РежимПроведения);
 КонецЕсли;
---
И где здесь твой запрос?
---
Мне нужно, чтоб документ можно было записать, но нельзя было провести.
---
Чувак, извини, вопрос не по теме - ты точно 9 лет на форуме?
---
И причем тут запрос?
---
Девять лет я только читал его. Пишу первый раз. Нужда заставила.
---
Так, понял. Видимо полный текст нужен.

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

 // Дерево значений, содержащее имена необходимых полей в запросе по шапке.
 Перем ДеревоПолейЗапросаПоШапке;

 Если мУдалятьДвижения Тогда
  ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Истина, РежимПроведения);
 КонецЕсли;

 // +МУР Контроль остатков
 Если Отказ = Ложь Тогда
  ТоварыСписком = ЭтотОбъект.Товары;
  СкладОтправитель = ЭтотОбъект.СкладОтправитель;
  Отказ = МУР_ОбщегоНазначенияВызовСервера.ПроверкаТоваровВРезервеИСвободныхОстатках(ДатаДок, СкладОтправитель, ТоварыСписком, Отказ);
 КонецЕсли;
 // -МУР
..........................................
---
Нет. Как я уже сказал - необходимо понять что ты делаешь с результатом запроса.
---
Ошибся:

```1c
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    // Дерево значений, содержащее имена необходимых полей в запросе по шапке.
    Перем ДеревоПолейЗапросаПоШапке;

    Если мУдалятьДвижения Тогда
    ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Истина, РежимПроведения);
    КонецЕсли;

    // +МУР Контроль остатков
    Если Отказ = Ложь Тогда
    ДатаДок = ЭтотОбъект.Дата;
    ТоварыСписком = ЭтотОбъект.Товары;
    СкладОтправитель = ЭтотОбъект.СкладОтправитель;
    Отказ = МУР_ОбщегоНазначенияВызовСервера.ПроверкаТоваровВРезервеИСвободныхОстатках(ДатаДок, СкладОтправитель, ТоварыСписком, Отказ);
    КонецЕсли;
    // -МУР
    ............................
```

Далее стандартная процедура проведения.
---
Вот и я не понимаю - ПРИЧЕМ тут запрос?
Но я написал, то что вижу на экране при работе.
---
Ну ок. Не хочешь рассказывать про то, что ты делаешь с результатом запроса - не понимай дальше сам.
---
Вся функция.

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

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТаблицаТовары.Номенклатура,
    | ТаблицаТовары.ХарактеристикаНоменклатуры,
    | ТаблицаТовары.СерияНоменклатуры,
    | ТаблицаТовары.Количество,
    | ТаблицаТовары.ЕдиницаИзмеренияМест,
    | ТаблицаТовары.ЗаказПокупателя КАК ДокументРезерва
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    | &ТаблицаТовары КАК ТаблицаТовары
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ.Номенклатура КАК Номенклатура,
    | ВТ.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | ВТ.СерияНоменклатуры КАК СерияНоменклатуры,
    | ВТ.ДокументРезерва КАК ЗаказВДокументе,
    | ВТ.ЕдиницаИзмеренияМест КАК ЕдМест,
    | ОстатокТовара.ДокументРезерва КАК ЗаказВБазе,
    | ОстатокТовараВЯщиках.ДокументРезерва КАК ЗаказВБазеВЯщиках,
    | ВТ.Количество КАК КоличествоВДокументе,
    | ОстатокТовара.КоличествоОстаток КАК ОстатокВРезерве,
    | ОстатокТовараВЯщиках.КоличествоОстаток КАК ОстатокВРезервеВЯщиках,
    | СвободныйОстаткок.КоличествоСУчетомСерииОстаток КАК СвободныйОстаток,
    | СвободныйостатокВЯщиках.КоличествоОстаток КАК СвободныйостатокВЯщиках
    |ИЗ
    | ВТ КАК ВТ
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&НаДату, Склад = &Склад) КАК ОстатокТовара
    | ПО (ОстатокТовара.Номенклатура = ВТ.Номенклатура)
    | И (ОстатокТовара.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
    | И (ОстатокТовара.СерияНоменклатуры = ВТ.СерияНоменклатуры)
    | И (ОстатокТовара.ДокументРезерва = ВТ.ДокументРезерва)
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МУР_ТоварыВРезервеНаСкладахВЯщиках.Остатки(&НаДату, Склад = &Склад) КАК ОстатокТовараВЯщиках
    | ПО (ОстатокТовараВЯщиках.Номенклатура = ВТ.Номенклатура)
    | И (ОстатокТовараВЯщиках.СерияНоменклатуры = ВТ.СерияНоменклатуры)
    | И (ОстатокТовараВЯщиках.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
    | И (ОстатокТовараВЯщиках.ДокументРезерва = ВТ.ДокументРезерва)
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&НаДату, Склад = &Склад) КАК СвободныйОстаткок
    | ПО (СвободныйОстаткок.Номенклатура = ВТ.Номенклатура)
    | И (СвободныйОстаткок.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
    | И (СвободныйОстаткок.СерияНоменклатуры = ВТ.СерияНоменклатуры)
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МУР_ТоварыНаСкладахЯщики.Остатки(&НаДату, Склад = &Склад) КАК СвободныйостатокВЯщиках
    | ПО (СвободныйостатокВЯщиках.Номенклатура = ВТ.Номенклатура)
    | И (СвободныйостатокВЯщиках.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
    | И (СвободныйостатокВЯщиках.СерияНоменклатуры = ВТ.СерияНоменклатуры)";

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

    //Отказ = Ложь;

    Если НЕ ВыборкаЗапроса.Пустой() Тогда
    Пока РезультатЗапроса.Следующий() Цикл
    Если РезультатЗапроса.ОстатокВРезерве <> РезультатЗапроса.ОстатокВРезервеВЯщиках
    И ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе) Тогда
    Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
    Сообщить("Расфасованное количество в документе не соответствует расфасованному количеству в резерве.");
    Отказ = Истина;
    ИначеЕсли (РезультатЗапроса.ЗаказВДокументе <> РезультатЗапроса.ЗаказВБазе
    ИЛИ РезультатЗапроса.ЗаказВДокументе <> РезультатЗапроса.ЗаказВБазеВЯщиках)
    И ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе) Тогда
    Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
    Сообщить("Не верно указан заказ в документе или нет такого количества этой позиции под заказ " + РезультатЗапроса.ЗаказВДокументе + ".");
    Отказ = Истина;
    ИначеЕсли НЕ ЗначениеЗаполнено(РезультатЗапроса.СвободныйОстаток) И НЕ ЗначениеЗаполнено(РезультатЗапроса.СвободныйостатокВЯщиках + ".")
    И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе)
    И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЕдМест) Тогда
    Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
    Сообщить("Нет свободных остатков в ящиках или без них для проведения документа.");
    Отказ = Истина;
    ИначеЕсли (ЗначениеЗаполнено(РезультатЗапроса.ОстатокВРезервеВЯщиках) ИЛИ ЗначениеЗаполнено(РезультатЗапроса.СвободныйостатокВЯщиках))
    И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЕдМест) Тогда
    Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
    Сообщить("Продукция расфасована. Укажите расфасовку в документе.");
    Отказ = Истина;
    ИначеЕсли РезультатЗапроса.СвободныйОстаток <> РезультатЗапроса.СвободныйостатокВЯщиках
    И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе)
    И ЗначениеЗаполнено(РезультатЗапроса.ЕдМест) Тогда
    Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
    Сообщить("Свободный остаток не совпадает со свободным остатком в ящиках.");
    Отказ = Истина;
    ИначеЕсли (ЗначениеЗаполнено(РезультатЗапроса.ОстатокВРезерве) ИЛИ ЗначениеЗаполнено(РезультатЗапроса.ОстатокВРезервеВЯщиках))
    И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе) Тогда
    Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
    Сообщить("Товар находится в резерве. Укажите заказ.");
    Отказ = Истина;
    ИначеЕсли (ЗначениеЗаполнено(РезультатЗапроса.ОстатокВРезервеВЯщиках) ИЛИ ЗначениеЗаполнено(РезультатЗапроса.СвободныйостатокВЯщиках))
    И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЕдМест) Тогда
    Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
    Сообщить("Товар расфасован. В документе не указана расфасовка.");
    Отказ = Истина;
    Иначе
    Отказ = Ложь;
    КонецЕсли;
    КонецЦикла;
    ИначеЕсли СсылкаНаДокумент.Количество() = 0 Тогда
    Отказ = Отказ;
    Иначе
    Сообщить("На складах нет остатков товаров указанных в документе");
    Отказ = Истина;
    КонецЕсли;

    Возврат Отказ;

    КонецФункции
```
---
Вот это все - в обработчик ПередЗаписью(), а не в ОбработкаПроведения(). Вернее, вызов проверки переставь.
И сделай это процедурой, а не функцией (Отказ возвращать не надо, это сквозной входной/выходной параметр).
---
ПередЗаписью() находится в модуле формы, а не в общем модуле.
Хотелось бы сделать один вызов.

У нас документы имеют как обычные формы так и управляемые.
И оба вида форм одного и того же документа используются.
Для примера: бухгалтера работают в толстом клиенте, а сбыт и кладовщики только в тонком.

Так сделано из-за сильного ограничения в ресурсах единственного сервера.
На нем реализовано ВСЁ.
Говорить, что так нельзя мне не нужно - это все к моему начальству.
---
ПередЗаписью() находится в модуле формы, а не в общем модуле. ШТОА???
---
Сделал. Работает.
Спасибо.
Давно я так не тупил.