Здравия всем!

Объясню суть проблемы:

Есть механизм, который берет СКД и Настройки, формирует указанные наборы данных как запросы, а потом результат запроса помещает обратно в СКД и выводит в ТабДокумент. Механизм имеет разные назначения, один из них - получение резульатата СКД и в виде ТЗ и в виде ТабДок без повторного выполнения запросов в СКД.

Реализован механизм так:

Имею СКД и Настройки
1. Получаю МакетКомпоновки
2. Беру из него запрос\параметры
3. Выполняю отдельно запрос
4. Делаю копию СКД - СКД2
5. В СКД2 заменяю НаборДанныхЗапрос на НаборДанныхОбъект. В результате в НаборДанныхОбъект есть только те поля, которые есть И в НаборДанныхЗапрос И в результате запроса.
6. Формирую табличный документ обычным программным образом, используя СКД2.

В результате имеем и ТЗ (результат запроса) и ТД (выведен при помощи СКД, поэтому всё как надо)

ОДНАКО!
Ошибка случается, если пользователь в настройках укажет отбор по полю, которое не выводится в отчет. Потому что:
1. Запрос не выбирает это поле. А значит его и не будет в ТЗ. А значит его не будет и в НаборДанныхОбъект
2. При выводе СКД2 сама СКД пытается наложить отбор это поле, но его нет в наборе данных объект.

Сейчас нашел вариант решения: перед выводом СКД2 восстанавливать настройки (Компоновщик.Восстановить())
Но и тут есть косяк - тогда в шапке табличного документа инфа о этом отборе появляеться не будет (потому что его фактически и не было при выводе СКД2)

В общем как-то так.
Есть ли какие-нить другие способы?
---
По вашей схеме:
1. Получаю МакетКомпоновки
2. Беру из него запрос\параметры
3. Выполняю отдельно запрос
4. Делаю копию СКД - СКД2
5. В СКД2 заменяю НаборДанныхЗапрос на НаборДанныхОбъект. В результате в НаборДанныхОбъект есть только те поля, которые есть И в НаборДанныхЗапрос И в результате запроса.
В наборе данных НаборДанныхЗапрос заменяем запрос на запрос типа
```1c
    Выбрать первые 0...
```
, добавляем НаборДанныхОбъект. В итоге 2 набора 1 с фиктивным запросом, второй с данными из запроса.
6. Формирую табличный документ обычным программным образом, используя СКД2.

Во вложении отчет-пример, но там схемы уже в макетах.
---
SeiOkami, 1. Запрос не выбирает это поле. А значит его и не будет в ТЗ. А значит его не будет и в НаборДанныхОбъект
А если на это поле в колонке "Роли" поставить флаг "Обязательное"?
---
и так на всех полях ), не, это не вариант..
Попробовать самостоятельно вывести отборы? по настройкам первого СКД
---
sommid, Так там может быть полей 2-3 :)
---
dj_serega, забыл сказать, что и это пробовал)
Но это на некоторых отчетах сильно замедляет выполнение, поэтому не вариант
---
SeiOkami, задачу опиши для чего замену делаешь.
А так все верно раз удалил объекты, а на них пользователь делал отборы, то и результат нулевой. В таком случае нельзя давать право пользователю играть с настройками или добавлять в подмененный запрос все поля.
---
Xershi, нет разницы в том, для чего это все (хотя я уже описал выше).

Если я удаляю косячные отборы при выводе СКД2, то на результат это НЕ влияет - отборы уже сработали в запросе и ТЗ содержит отфильтрованные данные.
---
SeiOkami, разница есть. Можно найти более оптимальное решение.
Отборы работаю когда вы формируете отчет и не ранее! Значит алгоритм у вас не все учел.
При компоновке все можно перебрать, главное условие результат конечного запроса должен соответствовать схеме, которую юезры могут и изменить.
---
Xershi, не понимаю. Я выполняю запрос из МакетаКомпоновки. А в нем запрос УЖЕ с отборами.
---
SeiOkami, так выполните ваши манипуляции до того. Или зачем все выполнять после?
Я для таких целей создавал копию получал результаты и затем делал заменую. Потому что если выполнить запрос через СКД, то уже все результат не изменить. Для того и СКД то делалась. А вы что хотите этот механизм по своему выполнить? Думаю так не получится. Нужно делать как уже написал все до того как!
---
Xershi, как я могу "выполнять манипуляции до того" ? Это как вообще? Можно на примере моих шагов из (1) ?
---
SeiOkami, ну я же написал получить текст запрос и отборы. Программно составить запрос результат. Получить нужные параметры и еще раз пересобрать запрос и запихнуть его в схему выполнить. Важное условие с отборами я вам уже написал. В чем у вас проблема?
---
Xershi, это уже выполнение одного и того же запроса ДВАЖДЫ. А суть в том, что при помощи шагов в (1) я выполняю запрос ОДИН раз.
Перед тем как писать код нужно разработать алгоритм. В данной ситуации копаться в коде вообще не нужно, потому что в нем ошибок нет. Возможно, есть ошибки в алгоритме, но не в коде, потому что он соответствует алгоритму.
---
SeiOkami, где вы 1 раз по вашему алгоритму выполняете запрос? Или алгоритм с опечатками написали?
---
Xershi, выделил жирным выполнение запроса

1. Получаю МакетКомпоновки
2. Беру из него запрос\параметры
3. Выполняю отдельно запрос
4. Делаю копию СКД - СКД2
5. В СКД2 заменяю НаборДанныхЗапрос на НаборДанныхОбъект. В результате в НаборДанныхОбъект есть только те поля, которые есть И в НаборДанныхЗапрос И в результате запроса.
6. Формирую табличный документ обычным программным образом, используя СКД2.
---
суть в том, что при помощи шагов в (1) я выполняю запрос ОДИН раз
как же один, если
3. Выполняю отдельно запрос
6. Формирую табличный документ обычным программным образом, используя СКД2.

Что мешает использовать ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений без всех этих пертурбаций со второй скд и чтением отборов?

Вам станет еще веселее, когда вы узнаете, что быстрые пользовательские настройки(отборы в частности) хранятся вообще в другой коллекции, причем без указания полей, по которым делается быстрый отбор, только их идентификаторы.
---
mymyka,

1. Получаю МакетКомпоновки
2. Беру из него запрос\параметры
3. Выполняю отдельно запрос
4. Делаю копию СКД - СКД2
5. В СКД2 заменяю НаборДанныхЗапрос на НаборДанныхОбъект. В результате в НаборДанныхОбъект есть только те поля, которые есть И в НаборДанныхЗапрос И в результате запроса.
6. Формирую табличный документ обычным программным образом, используя СКД2.

При формировании СКД2 не выполняется запрос, потому что я заменил НаборДанныхЗапрос на НаборДанныхОбъект

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

Вам станет еще веселее, когда вы узнаете, что быстрые пользовательские настройки(отборы в частности) хранятся вообще в другой коллекции, причем без указания полей, по которым делается быстрый отбор, только их идентификаторы
Нет, пользовательские настройки накладываются на основные настройки при использовании метода КомпоновщикНастроек.ПолучитьНастройки(). В результате в полученных настройках уже ВСЁ есть.
---
SeiOkami, выполнить и сформировать тут знак равенства.
Так что база 2 раза дергается. Мы вам тоже самое предлагаем.
И я не понимаю в чем с этим проблема.
---
Xershi, думаю, что при использовании набора данных типа Объект работает только компановка на сервере приложений, а при запросе еще и сервер БД цепляется
---
Xershi, не верно. При формировании СКД2 НЕ выполняется запрос из НаборДанныхЗапрос, потому его в СКД2 в принципе нет.
---
SeiOkami, так никто и не говорит об исходном запросе.
Вы просто намудрили. А сути это не меняет. Я решал аналогичную задачу. И пришлось наложить ряд ограничений, чтобы все работало как нужно!
---
Xershi,

Если у меня запрос из НаборДанныхЗапрос выполняется минимум 10 минут, то по моей логике вывод и в ТЗ и в ТабДок займет минимум 10 минут. А в вашем же примере это займет минимум 20 минут. Так и что я конкретно перемудрил?
---
SeiOkami, а что вы такое тяните из базы, что это 10 минут формируется. У меня запросы больше 2 минут не формируются, это при том что там вываливается туча данных, которые в принципе не нужны.

Да и специфику вашу вы не озвучили. Так что имеем что имеем.
---
Xershi,

Да и специфику вашу вы не озвучили.

Всё уже давно озвучено. Универсальный механизм. Уже указанны в теме некоторые варианты использования:
получение резульатата СКД и в виде ТЗ и в виде ТабДок без повторного выполнения запросов в СКД
для выполнении разных наборов данных в разных базах
а так же фоновыми заданиями в разрезе каждого разделителя.

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

(50) Жолтокнижниг,
В чем смысл этого пустого НаборДанныхЗапрос? Да, если наложить отбор на поле, которое не выводишь, то ошибка высыпаться не будет, но и отбор работать не будет, потому что по этому полю в НаборДанныхОбъект нет ничего (ни одна запись из НаборДанныхОбъект не будет выведена)
---
SeiOkami, по первому тезису в тз можно выгрузить результат запроса это не СКД! А вот табличный документы делают через СКД. Суть понятна?
---
Xershi,
по первому тезису в тз можно выгрузить результат запроса это не СКД! А вот табличный документы делают через СКД. Суть понятна?
если честно, то я вообще ничего из этого комментария не понял.
---
SeiOkami, ну ты уже код писал?
Ты мне скажи как ты получаешь ТЗ, когда ты выполнил СКД?
---
Xershi, Уже все написано и работает. Кроме указанной изначально проблемы.

Реализован механизм так:

Имею СКД и Настройки
1. Получаю МакетКомпоновки
2. Беру из него запрос\параметры
3. Выполняю отдельно запрос
4. Делаю копию СКД - СКД2
5. В СКД2 заменяю НаборДанныхЗапрос на НаборДанныхОбъект. В результате в НаборДанныхОбъект есть только те поля, которые есть И в НаборДанныхЗапрос И в результате запроса.
6. Формирую табличный документ обычным программным образом, используя СКД2.

В результате имеем и ТЗ (результат запроса) и ТД (выведен при помощи СКД, поэтому всё как надо)
---
SeiOkami, 3. Выполняю отдельно запрос какой запрос вы выполняете? Конечный?
6. Формирую табличный документ обычным программным образом, используя СКД2.
А потом вы его модифицируете и запускаете СКД. СКД можно запустить лишь основной в отчете. По итогу это 2 раза обращаться к базе. Или по простому 2 раза запускать запрос.
Вот в таком ключе у вас 1 раза обратиться к базе не получится.

Поэтому поясните что значит 1 раз выполнить запрос?
---
Xershi, вы что-то не то себе в голове накрутили. Прошу внимательнее читать мои ответы

какой запрос вы выполняете? Конечный?

1. Получаю МакетКомпоновки
2. Беру из него запрос\параметры
3. Выполняю отдельно запрос

А потом вы его модифицируете и запускаете СКД.
Где я модифицирую запрос?

СКД можно запустить лишь основной в отчете.
Программно выполнить можно любую СКД, какой бы она ни была и где бы не находилась

Вот в таком ключе у вас 1 раза обратиться к базе не получится.
Не получится, а уже получилось. Повторю:
Уже все написано и работает.
---
SeiOkami, Программно выполнить можно любую СКД программно можно. Если не имеет смысла в самой сути СКД, тогда и построитель запроса можно использовать.
Вы сказали что уже все работает, тогда ваш алгоритм в корне не верен. Пункт 3 и 6 это два обращения к базе. Так что я считаю вы свои шаги не верно трактуете или нам пишите.
---
Xershi, разговор пошел по кругу:
При формировании СКД2 НЕ выполняется запрос из НаборДанныхЗапрос, потому его в СКД2 в принципе нет.
Если у меня запрос из НаборДанныхЗапрос выполняется минимум 10 минут, то по моей логике вывод и в ТЗ и в ТабДок займет минимум 10 минут. А в вашем же примере это займет минимум 20 минут.
Обращение к базе есть, НО НаборДанныхЗапрос НЕ выполняется

Снова повторю: уже все работает. Не ищите проблемы там, где их нет.
---
заданные пользователем параметры передаются в СКД2 только один раз, при первом выполнении отчета. При повторном формировании отчета почему-то значения параметров не заполнены, что не так ?
воспользовался отчетом из этой темы
---
В результате в полученных настройках уже ВСЁ есть.
значения параметров передаются в СКД2 только при первом выполнении отчета. При всех последующих формированиях отчета значения параметров, заданных пользователем на форме, таинственным образом пропадают на сервере, и соответственно отчет формируется без параметров. В форме отчета на клиенте введенные параметры видны, а на сервере нет, почему так ?
 использовал отчет из этой ветки, просто добавил к нему 1 параметр.
---
[/IMG]
---
SeiOkami, нужны не примеры шагов а ваш код.
---
SeiOkami,
не знаю, зачем , но если вам нужно один и тот же по сути отчет вывести и в ТЗ , и в табличный документ, тогда так не подходит?

```1c
    // Сформируем отчет
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОсновнойСхемы, ДанныеРасшифровки);

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    // ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, Новый Структура("РезультатЗапроса", ВнешниеДанные), ДанныеРасшифровки, Истина);
    // в табличный документ
    ПроцессорВыводаВТабличныйДокумент = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВыводаВТабличныйДокумент.УстановитьДокумент(ДокументРезультат);
    ПроцессорВыводаВТабличныйДокумент.Вывести(ПроцессорКомпоновкиДанных);

    // в таблицу или дерево значений
    ТЗ = Новый ТаблицаЗначений;
    ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.УстановитьОбъект(ТЗ);
    ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Вывести(ПроцессорКомпоновкиДанных);
```
---
ЧерныйКот,

Механизм имеет разные назначения, один из них - получение резульатата СКД и в виде ТЗ и в виде ТабДок без повторного выполнения запросов в СКД.

На указанном вами примере запросы в СКД будут формироваться дважды. А значит и время формирования увеличится в два раза.
---
SeiOkami,
// ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, Новый Структура("РезультатЗапроса", ВнешниеДанные), ДанныеРасшифровки, Истина);
без двойного выполнения запроса. просто набор данных объект, уже посчитанный. ну собственно у вас так и сделано.
---
ЧерныйКот, запросы в СКД выполняется при :
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.Вывести()
---
SeiOkami
Спасибо, этого я не знал) Еще учусь ...
(32) mymyka
СКД2 у него содержит простую выборку из набора данных объект , уже посчитанных.
так что всё верно, запрос выполняется однократно.
---
SeiOkami,
а если при получении СКД1 запоминать установленные отборы,
потом при СКД2 НастройкиОсновнойСхемы.ПараметрыДанных.Элементы добавить их в параметры, и удалить из НастройкиОсновнойСхемы.ДоступныеПоляОтбора.Элементы , НастройкиОсновнойСхемы.Отбор.ДоступныеПоляОтбора.Элементы ?
---
ЧерныйКот, наводит на мысль...
Для чего вы это предполагаете делать?
---
SeiOkami,
ну у вас СКД2 не находит отборы, полей таких нет. При этом вам нужно вывести отборы в итоговый табличный документ.
Обмануть СКД2, удалить несуществующие отборы, добавить их в табличный документ под видом параметров данных.
Параметры СКД2 выведет , а отборы не применит.
---
ЧерныйКот, да, так должно проканать... Но нужно хорошенько проверить возможность адекватного отображения. Костыль, но пока что наилучший вариант)
---
SeiOkami,
если без костылей, тогда в запрос придется включать все поля, на которые пользователи установили отборы. тогда и СКД2 отработает стандартно, без изменений настроек. Но выше вы написали что это существенно замедляет выполнение, поэтому как то так...
---
а условное оформление при таком подходе не отвалиться точно так же как отборы? к сожалению тип результата - табличный документ или таблица значений - указывается на первом этапе выполнения СКД.. поэтому как-то не очень представляю как красиво получить оба результата при однократном выполнении запроса
---
sommid,

а условное оформление при таком подходе не отвалиться точно так же как отборы?
Нет, если поле учавствует в условном оформлении, то оно выбирается в запросе и попадает в ТЗ

поэтому как-то не очень представляю как красиво получить оба результата при однократном выполнении запроса

Это лишь одно из назначений механизма (и не основное). Используется для выполнении разных наборов данных в разных базах, а так же фоновыми заданиями в разрезе каждого разделителя.
---
Возможно это вам подойдет

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

    Возврат Запрос;
    КонецФункции
```
---
, видимо, вы не прочли (0)
Хотя я вас понимаю - там много букоф )
---
Можно подробнее: покажи какой отбор выставляет Юзер !?
---
Vitaly1C8, а что ты хочешь узнать. Отбор стоял на реквизит, который в подмененном запросе отсутствует. Вот и весь сыр бор.
---
Может я что-то упустил, но как пользователь может указать отбор по несуществующему в СКД2 полю? - видимо это возможно только в том случае, когда вы настройки СКД1 используете для СКД2, что несколько некорректно. Если вышеизложенное верно, то делайте копию настроек СКД1, чистите в ней все отборы(благо они уже сработали в СКД1), а потом применяйте копию настроек к СКД2.
Но... сомнительно то, что при настроенном отборе вы в ТЗ будете иметь копию детальных записей СКД1, т.к. отборы ложатся на конечный формируемый СКД запрос, а не вписываются хитрым образом в текст запроса набора данных.
---
Lancelot-2M, это возможно когда пользователь настроил. А потом только начнется работа над запросом СКД.
---
Xershi, "это возможно когда пользователь настроил. А потом только начнется работа над запросом СКД." - можно подробнее развернуть вашу мысль
---
Lancelot-2M, Прочитайте шаги в (1).
---
SeiOkami,
можно еще проще) без махинаций с параметрами данных

добавить вычисляемое поле НашОтбор = ИСТИНА;
для каждого отбора из пользовательских = сделать замену. условие отбора поле "НашОтбор" условие сравнения "равенство", правое значение ИСТИНА.
а тут самое интересное = НастройкиОсновнойСхемы.Отбор.Элементы[ИндексПользовательскогоОтбора].Представление = "Тест отбор1";
сам текст можно задавать какой угодно, таким он и выведется в отборы в табличном документе.
короче задача сводится к тому чтобы текстовое представление отбора сформировать.
---
ЧерныйКот, да, завтра опробую как-то поиграть с представлением отбора. Надеюсь, что это решит все проблемы)
---
SeiOkami, тогда тем более, раз берете конечный запрос из макета, а не из набора данных (я как раз с ними сегодня игрался... заигрался)), то просто чистите отбор в копии настроек, предназначенной для СКД2
---
Lancelot-2M, я уже об этом писал:
Сейчас нашел вариант решения: перед выводом СКД2 восстанавливать настройки (Компоновщик.Восстановить())
Но и тут есть косяк - тогда в шапке табличного документа инфа о этом отборе появляеться не будет (потому что его фактически и не было при выводе СКД2)
---
Можно создать свой макет заголовка и в него выводить текст отбора сформированный программно, попробовать поиграться с несколькими наборами данных. Зная точно проблему можно точнее дать ответ. Если ваш вопрос вывод отбора, то макет, если варианты решения задачи, то необходимо больше инфы.
---
По вашей схеме:
1. Получаю МакетКомпоновки
2. Беру из него запрос\параметры
3. Выполняю отдельно запрос
4. Делаю копию СКД - СКД2
5. В СКД2 заменяю НаборДанныхЗапрос на НаборДанныхОбъект. В результате в НаборДанныхОбъект есть только те поля, которые есть И в НаборДанныхЗапрос И в результате запроса.
В наборе данных НаборДанныхЗапрос заменяем запрос на запрос типа
```1c
    Выбрать первые 0...
```
, добавляем НаборДанныхОбъект. В итоге 2 набора 1 с фиктивным запросом, второй с данными из запроса.
6. Формирую табличный документ обычным программным образом, используя СКД2.

Во вложении отчет-пример, но там схемы уже в макетах.
---
Жолтокнижниг,

В чем смысл этого пустого НаборДанныхЗапрос? Да, если наложить отбор на поле, которое не выводишь, то ошибка высыпаться не будет, но и отбор работать не будет, потому что по этому полю в НаборДанныхОбъект нет ничего (ни одна запись из НаборДанныхОбъект не будет выведена)

Беру слова назад - похоже, СКД не накладывает фильтры на поле из НаборДанныхОбъект. Я думал, что вы имеете ввиду поместить два набора данных (Запрос и Объект) в НаборДанныхОбъединение - тогда бы отборы работали не корректно.

Сейчас поотлаживаю. Если будет работать, то это довольно интересный выход
---
Жолтокнижниг,
добавлен пустой запрос для накладываемых отборов, и отборы которые на наборе данных объект приводили к ошибкам, теперь накладываются на пустой запрос и ошибок нет.
Не споткнется ли СКД при компоновке, на каких либо отборах, и второй вопрос, время на выполнение пустого запроса какое?
А так интересный вариант)
---
ЧерныйКот,
Не споткнется ли СКД при компоновке, на каких либо отборах
Для всего нужно тестирование, но на первый взгляд не должно быть проблем.
время на выполнение пустого запроса какое?
Думаю небольшое, но можно поэксперементировать.

Это была просто идея, для качественной реализации необходимо время

(61) Xershi, Вы кажется не понимаете суть вопроса или не пытаетесь понять
Вы сказали что уже все работает, тогда ваш алгоритм в корне не верен. Шикарный вывод
---
Жолтокнижниг,
Шикарно всё!
Взял вашу идею для доработки своего универсального механизма - теперь в СКД2 не только НаборДанныхЗапрос превращается в НаборДанныхОбъект, но и добавляется "пустышка" НаборДанныхОбъект, в которую передается пустая ТЗ с колонками.
Косяки возникали в ситуациях, когда было несколько связанных наборов данных, каждый из которых превращался в НаборДанныхОбъект. 1С ругалась на "пустышки", мол, нельзя использовать несвязанные наборы данных. Но это, как оказалось, можно обойти, если в НаборДанных-пустышку добавлять только те поля, которые есть в "НаборДанныхЗапрос", но нет в "НаборДанныхОбъект". Пока что всё работает.
Спасибо за идею!
---
SeiOkami, Да, на здоровье.
---
Можно ли как-то обойтись без описания структуры набора-объект? В объект попадает таблица с очень большим количеством колонок.
---
Главное, чтобы не начали выпадать ошибки, мол нельзя использовать этот отбор, это несвязанные наборы данных
---
Ну что тут сказать, когда говорите про 2 запроса, так и говорите, что первый запрос не в счет! Так что кто виноват, в том что так пишите. А раз все работает, то что мы обсуждаем? А то ваша логика ну не капли не совпадает с тем что пишите, а с кодом так вообще может быть совсем 3!

Если нет четкого понимая и определения, то и говорить тут не о чем!
---
Сообщение было скрыто модератором.