Всем доброго времени суток.
Столкнулся с такой проблемой.

Написал огромный запрос, в нем есть такие строки

|Контрагент = Документ.РеализацияПродукции.Контрагент;
|Грузополучатель = Документ.РеализацияПродукции.Грузополучатель;

И в вот засада, если в документе РеализацияПродукции, не выбран грузополучатель, это означает что он = контрагенту. Но как это обозначить в запросе? А мне очень важно что бы в переменную запроса попало не пустое значение, а именно значение справочника.

Для справки Контрагент и Грузополучатель, это один и тот же справочник.
Помогите пожалуйста.
---
KiLLius, Прислушайтесь к (27).А если использовать ТаблицуЗначений. И простой перебор документов, то я вспотею её сортировать и перебирать. Если нет возможности использовать индексированную таблицу даю функцию для непотной сортировки и перебора тз из готовящейся публикации.

```1c
    Функция ИтоговаяПоГруппировкамТЗ(исхТЗ,СтрГруппировок,СтрИтогов,ДобУровень = 0)

    Если (ПустоеЗначение(СтрГруппировок) = 1) Или (ПустоеЗначение(СтрИтогов) = 1) Тогда

    Предупреждение("Не отмечены поля группировок или поля итогов!!!");

    Возврат ";

    КонецЕсли;

    ТЗ = СоздатьОбъект("ТаблицаЗначений");

    исхТЗ.Выгрузить(ТЗ,,,СтрГруппировок+","+СтрИтогов);

    ТЗ.Свернуть(СтрГруппировок,стрИтогов);

    ТЗИтогов = СоздатьОбъект("ТаблицаЗначений");

    ТЗ.Выгрузить(ТЗИтогов);

    спТаблиц = СоздатьОбъект("СписокЗначений");

    спСвертки = СоздатьОбъект("СписокЗначений");

    свернутьПо = ";

    сДляСписка = СтрЗаменить(стрГруппировок,",",РазделительСтрок);

    СчетчикЦикла = 0;

    Для ф = 1 По СтрКоличествоСтрок(сДляСписка) Цикл

    спСвертки.ДобавитьЗначение(СтрПолучитьСтроку(сДляСписка,ф));

    КонецЦикла;

    Для ф=1 По спСвертки.РазмерСписка()-1 Цикл

    времТ = СоздатьОбъект("ТаблицаЗначений");

    ТЗ.Выгрузить(времТ);

    свернутьПо = свернутьПо + ?(ф=1,",",") + спСвертки.ПолучитьЗначение(ф);

    времТ.Свернуть(свернутьПо,СтрИтогов);

    спТаблиц.ДобавитьЗначение(времТ,свернутьПо);

    КонецЦикла;

    Если ДобУровень = 1 Тогда

    ТЗ.НоваяКолонка("Уровень_Группировки","Число");

    КонецЕсли;

    Для ф=1 По спТаблиц.РазмерСписка() Цикл

    времТ = СпТаблиц.ПолучитьЗначение(ф);

    ВремТ.ВыбратьСтроки();

    Пока ВремТ.ПолучитьСтроку() = 1 Цикл

    ТЗ.НоваяСтрока();

    Для ы = 1 По ВремТ.КоличествоКолонок() Цикл

    идКолонки = времТ.ПолучитьПараметрыКолонки(ы);

    текЗнач = ВремТ.ПолучитьЗначение(времТ.НомерСтроки,идКолонки);

    ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,идКолонки,текЗнач);

    Если ДобУровень = 1 Тогда

    ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,"Уровень_Группировки",ф);

    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;

    ТЗ.Сортировать(стрГруппировок);

    Возврат ТЗ;

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

исхТЗ - исходная (полная ТЗ)
СтрГруппировок - Строка с порядком и идентификаторами колонок группировки. Например: "ЮМ,РМ,Контрагент,Грузополучатель"
СтрИтогов - Строка с идентификаторами колонок для которых подбиваются итоги групп.
Возвращает ТЗ с группами и итогами по ним.
Для работы функции нужно только сгенерировать строки с группировками и итогами. Полученную таблицу можно сразу выводить. Если ДобУровень = 1 тогда к результирующей ТЗ добавится колонка "Уровень_Группировки" с порядковым номером группы (в ншем примере для ЮМ это 1, РМ=2, Контрагент = 3 и т.д.). Помогает при печати выводить по номеру уровня нужную секцию печатной формы.
---
Вот блин, я совсем видать слабый в 1С.
Просто написал запрос

```1c
    Текст = "//{{ЗАПРОС(Производственные затраты)
    |Период с НачДата по КонДата;
    |Обрабатывать НеПомеченныеНаУдаление;
    |ОбрабатыватьДокументы Проведенные;
    |
    |Грузополучатель = Документ.РеализацияПродукции.Грузополучатель,
    | Документ.РеализацияПродукции.Контрагент;
    |Группировка Грузополучатель;
    |";
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("таблица");

    Если Запрос.Выполнить(Текст) = 0 Тогда
    Возврат;
    КонецЕсли;

    Пока Запрос.Группировка(1) = 1 Цикл
    Грузополучатель = Запрос.Грузополучатель;
    Таб.ВывестиСекцию("1");

    КонецЦикла;

    Таб.показать();
```

И выводит просто данные как если бы указал

```1c
    |Грузополучатель = Документ.РеализацияПродукции.Грузополучатель;
```

В чем проблема и где ошибка??
---
тут вижу три выхода:
1. обрабатывать результат запроса
2. использовать внешнюю функцию (что грозит большими тормозами при выполнении запроса)
3. использовать 1с++ и прямые запросы
---
andrewks,
Тормоза в запросе не критичны. Это ежемесячный отчёт, и сколько он будет формироваться особого значения не имеет.
Про 1С ++ и прямые запросы по подробнее плиз если можно.
(3) G.P.,
Вот именно, что запрос дико большой и там дальше берутся условия из грузополучателя, по типу
|ЮМ = Документ.РеализацияПродукции.Грузополучатель.ЮМ;

И дальше идёт накопление итогов по видам отгруженной продукции по ЮМ, Типу продукции и тд., так же присутствует периодичность. К тому же идёт куча группировок. А если не группировать по Грузополучателю и контрагенту, тогда вся суть отчёта теряет смысл.
А если использовать ТаблицуЗначений. И простой перебор документов, то я вспотею её сортировать и перебирать. Да и гибкость отчёта потеряется((

Вообщем засада засад.

Помогите кто чем может.
Уверен есть простое и изящное решение.
---
KiLLius, Прислушайтесь к (27).А если использовать ТаблицуЗначений. И простой перебор документов, то я вспотею её сортировать и перебирать. Если нет возможности использовать индексированную таблицу даю функцию для непотной сортировки и перебора тз из готовящейся публикации.

```1c
    Функция ИтоговаяПоГруппировкамТЗ(исхТЗ,СтрГруппировок,СтрИтогов,ДобУровень = 0)

    Если (ПустоеЗначение(СтрГруппировок) = 1) Или (ПустоеЗначение(СтрИтогов) = 1) Тогда

    Предупреждение("Не отмечены поля группировок или поля итогов!!!");

    Возврат ";

    КонецЕсли;

    ТЗ = СоздатьОбъект("ТаблицаЗначений");

    исхТЗ.Выгрузить(ТЗ,,,СтрГруппировок+","+СтрИтогов);

    ТЗ.Свернуть(СтрГруппировок,стрИтогов);

    ТЗИтогов = СоздатьОбъект("ТаблицаЗначений");

    ТЗ.Выгрузить(ТЗИтогов);

    спТаблиц = СоздатьОбъект("СписокЗначений");

    спСвертки = СоздатьОбъект("СписокЗначений");

    свернутьПо = ";

    сДляСписка = СтрЗаменить(стрГруппировок,",",РазделительСтрок);

    СчетчикЦикла = 0;

    Для ф = 1 По СтрКоличествоСтрок(сДляСписка) Цикл

    спСвертки.ДобавитьЗначение(СтрПолучитьСтроку(сДляСписка,ф));

    КонецЦикла;

    Для ф=1 По спСвертки.РазмерСписка()-1 Цикл

    времТ = СоздатьОбъект("ТаблицаЗначений");

    ТЗ.Выгрузить(времТ);

    свернутьПо = свернутьПо + ?(ф=1,",",") + спСвертки.ПолучитьЗначение(ф);

    времТ.Свернуть(свернутьПо,СтрИтогов);

    спТаблиц.ДобавитьЗначение(времТ,свернутьПо);

    КонецЦикла;

    Если ДобУровень = 1 Тогда

    ТЗ.НоваяКолонка("Уровень_Группировки","Число");

    КонецЕсли;

    Для ф=1 По спТаблиц.РазмерСписка() Цикл

    времТ = СпТаблиц.ПолучитьЗначение(ф);

    ВремТ.ВыбратьСтроки();

    Пока ВремТ.ПолучитьСтроку() = 1 Цикл

    ТЗ.НоваяСтрока();

    Для ы = 1 По ВремТ.КоличествоКолонок() Цикл

    идКолонки = времТ.ПолучитьПараметрыКолонки(ы);

    текЗнач = ВремТ.ПолучитьЗначение(времТ.НомерСтроки,идКолонки);

    ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,идКолонки,текЗнач);

    Если ДобУровень = 1 Тогда

    ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,"Уровень_Группировки",ф);

    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;

    ТЗ.Сортировать(стрГруппировок);

    Возврат ТЗ;

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

исхТЗ - исходная (полная ТЗ)
СтрГруппировок - Строка с порядком и идентификаторами колонок группировки. Например: "ЮМ,РМ,Контрагент,Грузополучатель"
СтрИтогов - Строка с идентификаторами колонок для которых подбиваются итоги групп.
Возвращает ТЗ с группами и итогами по ним.
Для работы функции нужно только сгенерировать строки с группировками и итогами. Полученную таблицу можно сразу выводить. Если ДобУровень = 1 тогда к результирующей ТЗ добавится колонка "Уровень_Группировки" с порядковым номером группы (в ншем примере для ЮМ это 1, РМ=2, Контрагент = 3 и т.д.). Помогает при печати выводить по номеру уровня нужную секцию печатной формы.
---
dusha0020,
Спасибо большое, алгоритм просто шикарен. Будет полезен для меня во многих местах. Попробую и в данном случае прикрутить. Посмотрим что получится.

А сейчас постараюсь всё же описать полную задачу отчёта.Может всё таки ошибка кроется в самом начале. И придется всё переделывать.

И так:
Наше предприятие работает с так называемыми ЮнитМенеджерами(ЮМ) и РегиональнымиМенеджерами(РМ). Грубо говоря 1 ЮМ стоит во главе нескольких РМ, как пирамида. Отгружая продукцию тому или иному контрагенту, в этом замешаны ЮМ и РМ. И вот встал вопрос кто из ЮМ и РМ халтурит, а кого можно наградить. И вообще не плохо бы видеть динамику их активности. Причём, контрагенты у нас крупные. И имея главный офис в городе N, у него много филиалов по всей стране, но расчеты идут на главный офис, а доставка уже по филиалам(грузополучатель). Т.Е. ЮМ и РМ привязаны к грузополучателю, а не к главному контрагенту.(вот от сюда сыр бор с грузополучателем). Далее, у нас условно 5 групп номенклатуры. И в отчёте должна быть разбивка по этим видам.
Вот примерный шаблон таблицы

Ну и для ясности ещё и код запроса

```1c
    Код1 = "1";
    Код2 = "2";
    Код3 = "3";
    Код4 = "4";
    Код5 = "5";

    Текст = "//{{ЗАПРОС(Запрос)
    |Период с ДатаНач" + ПериодПо + ";
    |Обрабатывать НеПомеченныеНаУдаление;
    |ОбрабатыватьДокументы Проведенные;
    |
    |Контрагент = Документ.РеализацияПродукции.Контрагент;
    |Грузополучатель = Документ.РеализацияПродукции.Грузополучатель;
    |ЮМ = Документ.РеализацияПродукции.Грузополучатель.ЮМ;
    |РМ = Документ.РеализацияПродукции.Грузополучатель.РМ;
    |Номенклатура = Документ.РеализацияПродукции.Товар;
    |ВидНоменклатуры = Документ.РеализацияПродукции.Товар.ВидНоменклатуры;
    |Количество = Документ.РеализацияПродукции.Количество;
    |Нетто = Документ.РеализацияПродукции.ВесНетто;
    |Сумм = Документ.РеализацияПРодукции.Сумма;
    |Функция Кол1 = Сумма(Количество) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код1);
    |Функция Кол2 = Сумма(Количество) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код2);
    |Функция Кол3 = Сумма(Количество) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код3);
    |Функция Кол4 = Сумма(Количество) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код4);
    |Функция Кол5 = Сумма(Количество) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код5);
    |
    |Функция Нетто1 = Сумма(Нетто) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код1 );
    |Функция Нетто2 = Сумма(Нетто) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код2 );
    |Функция Нетто3 = Сумма(Нетто) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код3 );
    |Функция Нетто4 = Сумма(Нетто) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код4 );
    |Функция Нетто5 = Сумма(Нетто) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код5 );
    |
    |Функция Сумма1 = Сумма(Сумм) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код1);
    |Функция Сумма2 = Сумма(Сумм) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код2);
    |Функция Сумма3 = Сумма(Сумм) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код3);
    |Функция Сумма4 = Сумма(Сумм) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код4);
    |Функция Сумма5 = Сумма(Сумм) когда (ВидНоменклатуры.Родитель.Родитель.Код = Код5);
    // Дальше идет добавление условий через процедуру
    //Условия могут наложиться абсолютно на любой параметр, причём это может быть как отдельный элемент
    //Так и целая папка или список

    // А тут идёт группировки, тоже через процедуру. Группируется тоже по всему чему только можно,
    //и есть группировка с периодом. Т.е. День, неделя, месяц, и тд. То что позволяет запрос.
    |";
```

В общем вот такая беда.
Ну и стоит учитывать функицонал отчёта. Расшифровки по чему только можно. Итоги по строкам. Ну и детализация при двойном щелчке мыши в таблице. Вплоть до открытия документа отгрузки.
Ещё раз напомню проблему. Работает абсолютно всё, до момента когда в реализации не выбран грузополучатель, тогда идёт группировка по пустому значению ЮМ и РМ. Это не есть хорошо.
Если есть какие идеи выскажите плиз. Очень нужна Ваша помошь.

PS. С 1с++ ИндексированнаяТаблица не работал. Но сейчас постараюсь узнать что это за зверь такой.
PS2. Признаюсь я всего год работаю с 1С. и из них только пол года осознано) Так что сильно не пинайте.
---
Всё таки я сделал 2 запроса. слил их в таблицу, таблицу свернул по методу (28) dusha0020. Сейчас допиливаю всё остальное. Обидно конечно что не всё запросом выполнилось. Но деваться некуда((
---
Доброго времени!
Логично будет вставить условие при обработке результатов запроса

Если ПустоеЗначение(Запрос.Грузополучатель)=0 Тогда
    Результат=Запрос.Грузополучатель;
Иначе
    Результат=Запрос.Контрагент;
КонецЕсли;
---
Про 1С ++ и прямые запросы по подробнее плиз если можно
http://www.1cpp.ru/forum/YaBB.pl?num=1148874473
http://www.1cpp.ru/forum/YaBB.pl?num=1148127139/0
http://www.1cpp.ru/forum/YaBB.pl?num=1193394153/0
+ сам форум http://www.1cpp.ru/forum/YaBB.pl?board=query

http://www.script-coding.com/Direct_queries.html
http://infostart.ru/public/17613/
---
Ну тогда в запросе пиши Грузополучатель=ПолучитьГрузополучателя(Грузополучатель,Контрагент)
А в модуле определи функцию ПолучитьГрузополучателя, в которой опиши логику выбора этого получателя, как я писал ранее
Если ПустоеЗначение(Грузополучатель)=0 Тогда
 Возврат(Грузополучатель);
Иначе
 Возврат(Контрагент);
КонецЕсли;
---
G.P.,
Секунду сейчас попробую. Так то выглядит очень круто!!
---
За ссылки огромное спасибо.
Но я так понимаю прямые запросы это для sql. А мы всё ещё с dbf барахтаемся((
---
KiLLius, прямые запросы работают и с sql, и с dbf базами
---
извиняюсь, ступил, вариант с внешней функцией здесь отпадает, ибо перем.запроса

остаётся два варианта
---
А как прикрутить внешнюю функцию к запросу?
Грузополучатель=ПолучитьГрузополучателя(Грузополучатель,Контрагент)
Ошибка запроса
---
KiLLius, см. (10)
---
|Контрагент = Документ.РеализацияПродукции.Контрагент;
|Груз = Документ.РеализацияПродукции.Грузополучатель;
|Грузополучатель = " + ПолучитьГрузополучателя( + "Груз" + , + "Контрагент" + ) +";

Тоже ошибка компилирования.
---
Посмотрел((
Но получается у меня 0 вариантов.
У нас не sql.
Обрабатывать результат запроса никак.
Внешнюю функцию тоже никак.
---
Обрабатывать результат запроса никак.
почему?
---
andrewks,
Потому что Грузополучатель это важный элемент для получения данных о ЮМ и РМ. Вот в этих строках
|ЮМ = Документ.РеализацияПродукции.Грузополучатель.ЮМ;
|РМ = Документ.РеализацияПродукции.Грузополучатель.РМ;

А дальше грубо говоря идёт группировка по
1)ЮМ
2)РМ
3)Контрагент
4)Грузополучатель

Идут они в произвольной последовательности в зависимости от пожеланий юзера. На форме галочки со стрелочками))
А имея пустое значение на выходе грузополучателя мы по умолчанию имеем пустые значений ЮМ и РМ. И получается формируя отчёт по 3ем контрагентам, в которых, к примеру, в 3 разных Реализациях были пустые грузополучатели, мы имеем общий итог по пустому значению ЮМ и РМ. А это в корне не правильные данные. ЮМ и РМ у них разные.
---
ещё есть вариант с изменением хранения данных в БД - т.е. записывать в Грузополучатель контрагента в любом случае
---
andrewks,
ещё есть вариант с изменением хранения данных в БД - т.е. записывать в Грузополучатель контрагента в любом случае
Это вариант как раз и рассматриваю.
Кстати сразу вопрос.
Допустим мне надо этот отчёт с начала 2012 года. Мы как порядочная организация, регулярно восстанавливаем последовательность, если я программно во всех реализация с начала года переприсвою значение грузополучателя, и буду просто записывать документ, не перепроводя его, у нас последовательноть собъётся? Реквизит грузополучатель не влияет ни на регистры ни на счета. Чисто информативный.
---
KiLLius, если программно без перепроведения, то не собьётся
---
andrewks, а на итогах это тоже не отразится? Просто если что то поёдет ни так, меня на запчасти разберут. У нас овердофига реализаций... И востановление последовательности болезненный процесс.
---
KiLLius, программная перезапись Записать() через объект, созданный с СоздатьОбъект(), не приводит к перепроведению документа, если не используется вызов Провести()
---
KiLLius, ещё советую: отладить обработку на копии базы, и не забываем про бэкапы
---
Бэкапы у нас ежедневные.
Ну вопрос с пересохранением ясен.

Все таки может найдется решение более изящнее. Если требуется предоставлю больше информации.
---
Трудно посоветовать что-то конкретное, т.к. не понятно что нужно и не виден сам сапрос.

Попробуй так:
|Контрагент = Документ.РеализацияПродукции.Контрагент;
|Грузополучатель = Документ.РеализацияПродукции.Грузополучатель, Документ.РеализацияПродукции.Контрагент;
---
да блин, это вам не восьмёрка
как правило в 7.7 применяю таблицы значений и как следствие постобработку
---
Завтра выложу весь запрос и суть отчёта. Вероятно я алгоритмически не правильно построил весь отчёт, и сам себя загнал в угол.
---
Вполне изящное решение с выгрузкой результата запроса в таблицу значений, расчет дополнительных колонок в ТЗ, свертка/группировка ТЗ и вывод отчета.
Я пользуюсь 1с++ ИндексированнаяТаблица. В зависимости от указанных пользователем детализаций отчета делается Группировать(), в результате получается иерархическая ТЗ с итогами по группировкам, которую очень легко и удобно выводить.
---
```1c
    Функция ПолучитьГП(ДокРеализации)
    Если ПустоеЗначение(ДокРеализации.Грузополучатель) = 1 Тогда
    Возврат ДокРеализации.Контрагент;
    Иначе
    Возврат
    ДокРеализации.Грузополучатель;
    КонецЕсли;
    КонецФункции

    ...
    Код1 = "1";
    Код2 = "2";
    Код3 = "3";
    Код4 = "4";
    Код5 = "5";

    Текст = "//{{ЗАПРОС(Запрос)
    |Период с ДатаНач" + ПериодПо + ";
    |Обрабатывать НеПомеченныеНаУдаление;
    |ОбрабатыватьДокументы Проведенные;
    |
    |Контрагент = Документ.РеализацияПродукции.Контрагент;
    |Грузополучатель = ПолучитьГП(Документ.РеализацияПродукции);
```

А так пробовали?
---
dusha0020, а поподробнее, куда это вставить? я так понимаю в запрос внешняя функция не вставляется же.
---
KiLLius, Так вы напишите ее (функцию) отдельно в модуле, выше основной процедуры. И используйте ее в запросе.
Ну примерно так:

```1c
    Функция ПолучитьГП(ДокРеализации)
    Если ПустоеЗначение(ДокРеализации.Грузополучатель) = 1 Тогда
    Возврат ДокРеализации.Контрагент;
    Иначе
    Возврат
    ДокРеализации.Грузополучатель;
    КонецЕсли;
    КонецФункции

    Процедура Сформировать()//Формирование запроса
    ...//Код процедуры перед цитируемым
    Код1 = "1";
    Код2 = "2";
    Код3 = "3";
    Код4 = "4";
    Код5 = "5";

    Текст = "//{{ЗАПРОС(Запрос)
    |Период с ДатаНач" + ПериодПо + ";
    |Обрабатывать НеПомеченныеНаУдаление;
    |ОбрабатыватьДокументы Проведенные;
    |
    |Контрагент = Документ.РеализацияПродукции.Контрагент;
    |Грузополучатель = ПолучитьГП(Документ.РеализацияПродукции);
    ...//Продолжение запроса и прочие команды из существующей процедуры
    КонецПроцедуры//Сформировать
```

Это неправильно. Внешняя функция при получении переменных в запросе использоваться НЕ МОЖЕТ. См (36).
Код не стираю, чтобы было стыдно.
---
KiLLius, в запрос внешняя функция не вставляется же Это кто Вам такое сказал?
---
Я оказывается сполер забыл развернуть_)) Извиняюсь за глупый прошлый пост.
Сейчас попробовал эффекта 0

Если Запрос.Выполнить(Текст) = 0 Тогда
{ОТГРУЗКА ПОКУПАТЕЛЯМ.ERT(922)}: Грузополучатель = <<?>> ПолучитьГП(Документ.РеализацияПодукции);
Запрос[7] : Неверно заданный путь 'ПолучитьГП'
Если Запрос.Выполнить(Текст) = 0 Тогда
{ОТГРУЗКА ПОКУПАТЕЛЯМ.ERT(922)}: Группировка ЮнитМенеджер Без Групп;Группировка РегныйМенеджер Без Групп;Условие (Контрагент = МоноУсловие1 <<?>> );
Запрос[32] : Ошибка в условии

Вот такие ошибки выдаёт. Не проходит выполнение функции. Запрос к функции не обращается. Может её объявить надо где нибудь?
---
KiLLius, Теперь Вы меня извините. Внешняя функция возможна только в функциях или условии. Просто при получении переменных ее действительно использовать нельзя:(
Запутал я Вас.
---
Выложите весь ert-шник. Или полностью код модуля.
---
Да ничего. Лишний раз убедился в том что нельзя.
Выкладывать ert?
---
KiLLius, Выложите. В любом случае попробовать довести все до ума стоит.
---
вот сам отчёт. Сразу скажу структура стырена из стандартных отчётов 1С ПУБ.
Пока попытаюсь реализовать вариант микса запрос + тз. Из запроса выгрузить данные в таблицу и группировать её с помощью вашего алгоритма. Просто если полностью отказываться от запроса, я теряю дикую функциональность с вариативностью выбора и условий отчёта.
В общем посмотрите на досуге пожалуйста.
---
KiLLius, Посмотрел отчет. Очевидная проблема в определении ЮМ и РМ при пустом грузополучателе. Тогда есть такой вопрос: а есть ли эти реквизиты у Контрагента? Если да то почему бы не получать эти значения из контрагента документа, который всегда на месте?
Еще как вариант получать Грузополучателя как в (24), но в этом случае в суммирующих функциях добавить условие включать в итог при пустом грузополучателе документа только тогда, когда грузополучатель запроса (полученный из поля контрагент) равен контрагенту документа.
---
dusha0020,
Еще как вариант получать Грузополучателя как в (24), но в этом случае в суммирующих функциях добавить условие включать в итог при пустом грузополучателе документа только тогда, когда грузополучатель запроса (полученный из поля контрагент) равен контрагенту документа.

Реквизиты ЮМ и РМ есть у контрагента. И при пустом грузополучателе именно их и надо присвоить в переменные запроса ЮМ и РМ.
А вот про Ваше предложение с наложением дополнительного условия, я не совсем понял. Можно как-нибудь по доходчивей, если Вас не затруднит.

(41) ADirks, спасибо большое, надо обязательно вникнуть. И да первый вариант уж дико пафосный)
---
KiLLius, Это имеется в виду примерно так в запросе:

```1c
    |Док = Документ.РеализацияПродукции;
    |Грузополучатель = Документ.РеализацияПродукции.Грузополучатель,Документ.РеализацияПродукции.Контрагент;
    ...
    |Функция Кол1 = Сумма(Количество) когда ((ВидНоменклатуры.Родитель.Родитель.Код = Код1) И (?(ПустоеЗначение(Док.Грузополучатель) = 1,Грузополучатель,Док.Контрагент) = Док.Контрагент);
```

Т.е. вводим переменную Док и по другому получаем грузополучателя, а по всем результирующим функциям добавляем условие для суммирования из документов с пустыми грузополучателями.
---
Вообще есть куча способов вывести ТЗ с группировками и итогами
Вот к примеру, очень пафосно: http://infostart.ru/public/13849/
а здесь целая методика: http://infostart.ru/public/17062/
Лично я пользуюсь этим: http://infostart.ru/public/15510/
или попроще, ГруппировкаТЗ http://infostart.ru/public/15487/
---
Попробовал, что то не получилось.
Такое чувство что где то на уровне группировки обрубает значения поступающие из

|Грузополучатель = Документ.РеализацияПродукции.Грузополучатель,Документ.РеализацияПродукции.Контрагент;

Так как в переменную грузополучатель, не приходит значение контрагента(
---
KiLLius, сдается мне, что попытки всё сделать только одним запросом бесперспективны. Попробуйте таки сделать, как советуют, через таблицу значений. Получить можно примерно так:
1. Составляем два запроса. В одном запросе ставим условие ПустоеЗначение(Грузополучатель)=1, и все значения берем из контрагента, во втором ПустоеЗначение(Грузополучатель)=0 и все значения берем из грузополучателя.
2 В обоих запросах добавляем необходимые условия и группировки.
3. Выполняем оба запроса. Результаты выгружаем в ТЗ без итогов. Объединяем ТЗ и делаем свертку.
А далее смотрите все методы, которые предлагали для работы с ТЗ.
---
nicotin, да я думал над этим вариантом. Работать будет 100%. Просто хочется все альтернативы просмотреть.

я не могу разобраться с механизмом присваивания 2х значений в 1 переменную.

|Грузополучатель = Документ.РеализацияПродукции.Грузополучатель,Документ.РеализацияПродукции.Контрагент;

какие значений при таком варианте принимает переменная грузополучатель? и почему эта строчка не даёт ни какого изменения в результате((
---
KiLLius, эта конструкция не даст Вам желаемый эффект. как я уже говорил, у вас остаётся 2 подхода:
1. прямой запрос
2. постобработка результата запроса

либо поменять логику хранения данных, чтобы в этом поле не было пустых значений
---
andrewks, это понятно. Но для общего развития, как она работает, что бы знать.
---
KiLLius, это что-то типа левого соединения в 8-ке
---
andrewks, к сожалению я в 8рке не разбираюсь.(( можно на пальцах? и с примерами.
---
Да никак она не работает. Через запятую перечисляются разные объекты, из которых берется значение переменной. Если объект один и тот же, то будет взято первое значение (Грузополучатель), остальные (Контрагент) будут проигнорированы.
---
panda-34, беда. Хотя даже в книге описания встроенного языка Ч2. на странице 804 указан пример, когда из одного документа берётся 2 реквизита и присваивается одной переменной.
---
KiLLius, текст этого запроса в студию
---
andrewks, вот пример запроса от 1С в журнале учета полученных и выставленных счетов-фактур

```1c
    |НДС = Документ.СчетФактураПолученный.НДС20,
    | Документ.СчетФактураПолученный.НДС10,
```

Как и следовало ожидать, не сработало. Пришлось допиливать - вводить разные переменные для разных ставок.
---
nicotin, я и утверждал, что не сработает. мне это доказывать не надо
---
andrewks, Чушь пишешь.
Нет такого отчета, который нельзя было бы получить черным запросом. Просто он может получиться тяжелым, но и то не обязательно ...
---
Кошки рулят, решение в студию, иначе можно считать это обычным флудом
---
andrewks, Решение должен найти автор топика. Это его работа. Он за нее получает деньги. Я за него работать не собираюсь.
Мне за это не платят. Если автор не может в силу каких-то причин выполнять свою работу, надо либо увольняться, либо платить деньги. Это будет честно и справедливо ...
А твои закидоны - это вброс на вентилятор.
---
Кошки рулят, всё ясно. давай, до свиданья ©
---
andrewks, Да иди - кто тут тебя держит? Плакать по поводу того, что ты хлопнешь дверью никто не собирается. Все равно одну пургу бесполезную гонишь ...
---
Кошки рулят, больше не пиши в теме плиз. Не надо флуда.
---
KiLLius, Воинствующая безграмотность?
Осторое желание заткнуть рот всем, кто говорит что-то неприятное в твой адрес?
Руки чешутся?
---
Кошки рулят, тебя топикстартер шуганул? Шуганул. Вот и шел бы спокойно. Чтобы банхаммером не пользоваться.
---
Арчибальд, Уже много лет в Москве т.н. казаки пытаются добиться права патрулировать улицы города. Я так понимаю, ты тут тоже из себя ряженого корчишь?
Или ты может быть бред из (32) тут хочешь защитить? А ведь он эту ахинею на полном серьезе втирает топистартеру. Нет желания порядок навести?
По сабжу: задача не смотря на то как ее описывает автор (одно только "Присваивание в запросе с условие" говорит о том что человек даже не может словами объяснить задачу, не владеет ни инструментом, ни даже терминологией) имеет решение. И именно черным запросом и именно без ТЗ и всяких внешних приблуд, которые ему так усиленно здесь пиарят, выдавая за панацею.
Но автор встал в недопустимую позицию: вот моя поделка, ну-ка быстренько сделайте ее за меня. Он не хочет удочку - ему нужна рыба, о которой он будет всем рассказывать как ловко он ее выловил. А когда ему на это указывают, он начинает кривляться, и безграмотные персонажи типа andrewks, dusha0020 дружно поддакивают. А ты тут вообще никаким боком ...
---
Кошки рулят, Так и перед Вами за (32) извиниться? Извините, любезнейший, за мою ошибку, пусть и не Вам адресованную. Перед стартером, я уже извинился и исправился. Может еще перед кем покаяться?
От Вас кроме громких слов никакого выхлопа в этой теме, зато не ошибается тот кто ничего не делает, а только демонстрирет свою мудрость и профессионализм умными общими фразами.
---
Кошки рулят, пока на денечек заткнись. Понравится - можно будет продлить удовольствие.
---
Вот полная вырезка из книги
Однако, допускается в описании внутренней переменной указание на разные справочники либо на разные документы. Переменной, указывающей на разные справочники или документы присваивается тип данных «Справочник неопределенного вида» или «Документ неопределенного вида» соответственно.
* Например, правомерно задать такую внутреннюю переменную:
Парам = Документ.Счет.Клиент, Документ.Счет.Фирма;
(Здесь предполагается, что в контексте конфигурации, реквизиты "Клиент" и "Фирма" — это элементы справочников). Если использовать такую внутреннюю переменную для построения Группировки, то она будет означать следующее: пройти по документам "Счет" и выбрать значения клиентов и фирм, встречающихся в них (и, например, упорядочить эти элементы по наименованию). Как интерпретировать результаты полученной выборки при таком запросе — будет зависеть от контекста поставленной задачи.
---
Думаю стоит назначит вознаграждение за решение. Первый раз это делаю. вы уж сильно не пинайте если что.
---
В чорном запросе переменную не слепишь, разве что в условии использовать смогешь.
Проще всего - прямым запросом.
Ну или в ТЗ потом обработать результат или 2-мя чорными запросами.. или через Получить()
---
А вот такой вопрос, можно в конструкцию
```1c
    |функция
```

влепить обыкновенное присваивание?
---
KiLLius, а вот в функциях можно почти всё, включая внешние вызовы
---
KiLLius, в запросе есть ещё две переменные, связанные с реквизитом Грузополучатель документа
Потому что Грузополучатель это важный элемент для получения данных о ЮМ и РМ. Вот в этих строках
|ЮМ = Документ.РеализацияПродукции.Грузополучатель.ЮМ;

|РМ = Документ.РеализацияПродукции.Грузополучатель.РМ;
С группировками ЮМ и РМ будет та же проблема, что и с группировкой Грузополучатель. Так что пока самый простой вариант - заполнение реквизита в ранее введенных документах.
---
|Условие(ПустоеЗначение(Грузополучатель)=0 );
а так?
|Условие(Грузополучатель.Выбран()=1 );
или так?
---
если (74) не сработает то функцию в условие которая проверяет на пустоту, точно сработает...
---
А вы что - 7.7 обсуждаете?
Не может быть.
Страсти-то, страсти - как по восьмерке... :))
---
Сообщение было скрыто модератором.
---
у меня в семерке не работает Если глЕстьРеквизитШапки("Контрагент",Вид)=1 Тогда
   спр1=СоздатьОбъект("Справочник.Контрагенты") ;
   Если НайтиСправочник(Спр.ПолучитьАтрибут("Контрагент"),,Спр1,"ПоКоду", ,, )=1 Тогда
   Теккл =Спр1 ;
   КонецЕсли;

      Док.Контрагент=Теккл.ТекущийЭлемент();
---
Док.контрагент - пустой
---
теккл = Вейделевское райпо
                             Док.Контрагент = ""
                    Теккл.ТекущийЭлемент() = Вейделевское райпо
                           Док.Контрагент = ""
---
разобралась :) при переносе документ не находился