Добрый день, есть скд отчет посещения. Выводится день а в нем два столбца-часы по штатному расписанию у сотрудника и часы по отработанному времени в этот день. А по факту выходит 30 дней где пишется только часы по штатному и 30 дней где фактически отработанное время. Как скомпоновать так, чтобы все выводилось в один день? СГРУППИРОВАТЬ ПО не выходит

```1c
    ВЫБРАТЬ
    ВТ.Сотрудник,
    ВТ.СтатьяЗатрат,
    ВТ.День,
    ВТ.Часов
    ПОМЕСТИТЬ ВТШтатное
    ИЗ
    тзШтатноеРасписание КАК ВТ

    СГРУППИРОВАТЬ ПО
    ВТ.День,
    ВТ.Сотрудник,
    ВТ.СтатьяЗатрат,
    ВТ.Часов
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Посещения.Ссылка КАК Посещение
    ПОМЕСТИТЬ ТекущиеПосещения
    ИЗ
    Документ.Посещения КАК Посещения
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.Посещения КАК Посещения1
    ПО Посещения.Ссылка = Посещения1.ПредыдущаяВерсия
    ГДЕ
    ВЫБОР
    КОГДА Посещения1.Ссылка ЕСТЬ NULL
    ТОГДА ИСТИНА
    ИНАЧЕ ЛОЖЬ
    КОНЕЦ
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ПосещенияСотрудники.Ссылка КАК Документ,
    ПосещенияСотрудники.Сотрудник,
    ПосещенияДетали.СтатьяЗатрат,
    ПосещенияДетали.Сумма,
    ПосещенияДетали.Подразделение,
    ПосещенияДетали.ПодразделениеОрганизации,
    ПосещенияДетали.Категория,
    ПосещенияДетали.Количество,
    ПосещенияДетали.НоменклатурнаяГруппа,
    ПосещенияДетали.ВидЗатрат,
    ПосещенияДетали.ВидРаботы,
    ПосещенияСотрудники.Ссылка.Период КАК День
    ПОМЕСТИТЬ Детали
    ИЗ
    Документ.Посещения.Сотрудники КАК ПосещенияСотрудники
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Посещения.Детали КАК ПосещенияДетали
    ПО ПосещенияСотрудники.КлючСтроки = ПосещенияДетали.КлючСтроки
    И ПосещенияСотрудники.Ссылка = ПосещенияДетали.Ссылка
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекущиеПосещения КАК ТекущиеПосещения
    ПО ПосещенияСотрудники.Ссылка = ТекущиеПосещения.Посещение
    ГДЕ
    ПосещенияСотрудники.Ссылка.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ПосещенияСотрудники.Ссылка.Проведен
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Детали.Документ,
    ЕСТЬNULL(Детали.Сотрудник, ВТШтатное.Сотрудник) КАК Сотрудник,
    Детали.СтатьяЗатрат,
    Детали.Сумма КАК СуммаИзДокумента,
    Детали.Подразделение,
    Детали.ПодразделениеОрганизации,
    Детали.Категория,
    Детали.Количество,
    Детали.НоменклатурнаяГруппа,
    Детали.ВидЗатрат,
    Детали.ВидРаботы,
    ЕСТЬNULL(Детали.День, ВТШтатное.День) КАК День,
    Детали.Количество * ЕСТЬNULL(СтавкиОплатыТрудаСрезПоследних.Ставка, 0) КАК Сумма,
    ВТШтатное.Часов,
    ВТШтатное.СтатьяЗатрат КАК СтатьяЗатратШР
    ИЗ
    Детали КАК Детали
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиОплатыТруда.СрезПоследних(&ДатаНачала, ) КАК СтавкиОплатыТрудаСрезПоследних
    ПО Детали.Сотрудник = СтавкиОплатыТрудаСрезПоследних.Сотрудник
    И Детали.ВидРаботы = СтавкиОплатыТрудаСрезПоследних.ВидРабот
    ПОЛНОЕ СОЕДИНЕНИЕ ВТШтатное КАК ВТШтатное
    ПО Детали.Сотрудник = ВТШтатное.Сотрудник
    И Детали.День = ВТШтатное.День

    СГРУППИРОВАТЬ ПО
    Детали.Документ,
    Детали.СтатьяЗатрат,
    Детали.Сумма,
    Детали.Подразделение,
    Детали.ПодразделениеОрганизации,
    Детали.Категория,
    Детали.Количество,
    Детали.НоменклатурнаяГруппа,
    Детали.ВидЗатрат,
    Детали.ВидРаботы,
    ВТШтатное.Часов,
    ВТШтатное.СтатьяЗатрат,
    ЕСТЬNULL(Детали.Сотрудник, ВТШтатное.Сотрудник),
    Детали.Количество * ЕСТЬNULL(СтавкиОплатыТрудаСрезПоследних.Ставка, 0),
    Детали.День,
    ВТШтатное.День
```
---
решение нашлось) ошибка была в том, что выбиралась дата, а не период регистрации. Дата создания документа штатное расписание. Документ создавался в мае, а расписание было на июль. Отсюда и не соответствие.

```1c
    | ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации Как Дата
    |ИЗ
    | Документ.ШтатноеРасписаниеУпр.Сотрудники КАК ШтатноеРасписаниеУпрСотрудники
    |ГДЕ
    | ШтатноеРасписаниеУпрСотрудники.Ссылка.Проведен = ИСТИНА
    | И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации >= &ДатаНач
    | И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации <= &ДатаКон";
```

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

третий запрос - первый запрос ЛЕВОЕ СОЕДИНЕНИЕ второй запрос (соединяем по датам и ФИО)

В третем запросе будет: ФИО, по штатному, по факту
И его в СКД можно разместить.
---
пробую, не выходит, либо только часы по штатному появляются либо по отработанному
---
Пример как соединить две таблицы

```1c
    ВЫБРАТЬ
    "Иванов" КАК ФИО,
    20 КАК План
    ПОМЕСТИТЬ ВТ_План

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Петров",
    10

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Сидоров",
    30
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    "Иванов" КАК ФИО,
    100 КАК Факт
    ПОМЕСТИТЬ ВТ_Факт

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Петров",
    20
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_План.ФИО КАК ФИО,
    ВТ_План.План КАК План,
    ВТ_Факт.Факт КАК Факт
    ИЗ
    ВТ_План КАК ВТ_План
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Факт КАК ВТ_Факт
    ПО ВТ_План.ФИО = ВТ_Факт.ФИО
```
---
Объединение
ПО Детали.Сотрудник = ВТШтатное.Сотрудник
Но судя по запросу, одно из полей может принимать значение NULL.
Корректнее будет получить полный список сотрудников, и уже с ним объединять обе таблицы.
---
там отчет только по одному сотрудник должен быть. Из документа начисление зарплаты сотрудника выбираешь отчет по посещениям
---
Значит, берите сотрудника из таблицы документа (там он точно не NULL), а уже к нему присоединяйте остальные таблицы. Если выбирается не то, что должно быть, тестируйте запрос, последовательно присоединяя каждую временную таблицу и анализируя что получилось.
---
Как считается поля "Аналитика" в запросе такого поля нету!
---
Аналитика это номенклатурная группа
---
У вас нету в плане ном группе из за этого разъезжается план и факт. или убирайте ном группу из группировки отчета, или в скд сделать еще набор данных или переделать запрос
---
Это что бы документы у которых были пересчёты не попадали.
```1c
    Документ.Посещения КАК Посещения
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.Посещения КАК Посещения1
    ПО Посещения.Ссылка = Посещения1.ПредыдущаяВерсия
```

Но дальше есть ещё одно условие
```1c
    ГДЕ
    ПосещенияСотрудники.Ссылка.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ПосещенияСотрудники.Ссылка.Проведен
```
 Т.е. если у исходного документа есть документ пересчет, который позже этого периода, то исходный документ не попадет так как есть документ пересчет, а документ пересчет не попадет так как он в период не попадает. А еще пересчет может быть не проведен. Т.е какие-то посещения вообще не попадут, хотя они возможно имели место.
Какие движения делает этот документ. Может сразу их смотреть, а не по документам бегать?
---
в документе посещения есть часы которые идут автоматом(по пропуску на КП) , а если сотрудник не отметился, то через некоторое время его заносят вручную, или вообще могут часы изменить
---
```1c
    ВЫБРАТЬ
    ВТ.Сотрудник,
    ВТ.СтатьяЗатрат,
    ВТ.День,
    ВТ.Часов
    ПОМЕСТИТЬ ВТШтатное
    ИЗ
    тзШтатноеРасписание КАК ВТ

    СГРУППИРОВАТЬ ПО
    ВТ.День,
    ВТ.Сотрудник,
    ВТ.СтатьяЗатрат,
    ВТ.Часов
    ;
```
 Может хотя бы часы просуммировать, а не просто выбрать различные?

```1c
    ВЫБРАТЬ
    ВТ.Сотрудник,
    ВТ.СтатьяЗатрат,
    ВТ.День,
    Сумма(ВТ.Часов) as Часов
    ПОМЕСТИТЬ ВТШтатное
    ИЗ
    тзШтатноеРасписание КАК ВТ

    СГРУППИРОВАТЬ ПО
    ВТ.День,
    ВТ.Сотрудник,
    ВТ.СтатьяЗатрат
    ;
```
---
а они сделаны)

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    //Программно формируем отчет
    //Отменяем стандартную обработку
    СтандартнаяОбработка = Ложь;
    //Получаем схему
    Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

    //...и настройки
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

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

    зпрс = Новый Запрос;
    зпрс.УстановитьПараметр("ДатаНач",НачалоДня(ПараметрДата.ДатаНачала));
    зпрс.УстановитьПараметр("ДатаКон",КонецДня(ПараметрДата.ДатаОкончания));
    зпрс.Текст = "ВЫБРАТЬ
    | ШтатноеРасписаниеУпрСотрудники.Сотрудник,
    | ШтатноеРасписаниеУпрСотрудники.Часов1,
    | ШтатноеРасписаниеУпрСотрудники.Часов2,
    | ШтатноеРасписаниеУпрСотрудники.Часов3,
    | ШтатноеРасписаниеУпрСотрудники.Часов4,
    | ШтатноеРасписаниеУпрСотрудники.Часов5,
    | ШтатноеРасписаниеУпрСотрудники.Часов6,
    | ШтатноеРасписаниеУпрСотрудники.Часов7,
    | ШтатноеРасписаниеУпрСотрудники.Часов8,
    | ШтатноеРасписаниеУпрСотрудники.Часов9,
    | ШтатноеРасписаниеУпрСотрудники.Часов10,
    | ШтатноеРасписаниеУпрСотрудники.Часов11,
    | ШтатноеРасписаниеУпрСотрудники.Часов12,
    | ШтатноеРасписаниеУпрСотрудники.Часов13,
    | ШтатноеРасписаниеУпрСотрудники.Часов14,
    | ШтатноеРасписаниеУпрСотрудники.Часов15,
    | ШтатноеРасписаниеУпрСотрудники.Часов16,
    | ШтатноеРасписаниеУпрСотрудники.Часов17,
    | ШтатноеРасписаниеУпрСотрудники.Часов18,
    | ШтатноеРасписаниеУпрСотрудники.Часов19,
    | ШтатноеРасписаниеУпрСотрудники.Часов20,
    | ШтатноеРасписаниеУпрСотрудники.Часов21,
    | ШтатноеРасписаниеУпрСотрудники.Часов22,
    | ШтатноеРасписаниеУпрСотрудники.Часов23,
    | ШтатноеРасписаниеУпрСотрудники.Часов24,
    | ШтатноеРасписаниеУпрСотрудники.Часов25,
    | ШтатноеРасписаниеУпрСотрудники.Часов26,
    | ШтатноеРасписаниеУпрСотрудники.Часов27,
    | ШтатноеРасписаниеУпрСотрудники.Часов28,
    | ШтатноеРасписаниеУпрСотрудники.Часов29,
    | ШтатноеРасписаниеУпрСотрудники.Часов30,
    | ШтатноеРасписаниеУпрСотрудники.Часов31,
    | ШтатноеРасписаниеУпрСотрудники.СтатьяЗатрат,
    | ШтатноеРасписаниеУпрСотрудники.Ссылка.Дата Как Дата
    |ИЗ
    | Документ.ШтатноеРасписаниеУпр.Сотрудники КАК ШтатноеРасписаниеУпрСотрудники
    |ГДЕ
    | ШтатноеРасписаниеУпрСотрудники.Ссылка.Проведен = ИСТИНА
    | И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации >= &ДатаНач
    | И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации <= &ДатаКон";

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

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

    Для Каждого стр из рез Цикл
    Для ит = 1 по 31 цикл
    Если стр["Часов"+СокрЛП(ит)] <> 0 тогда
    нстр = тзШтатноеРасписание.Добавить();
    нстр.Сотрудник = стр.Сотрудник;
    нстр.СтатьяЗатрат = стр.СтатьяЗатрат;
    нстр.День = НачалоМесяца(стр.Дата)+86400*(ит-1);
    нстр.Часов = стр["Часов"+СокрЛП(ит)];
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;

    МВТ = Новый МенеджерВременныхТаблиц;

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

    //ВнешниеНаборыДанных = Новый Структура;
    //ВнешниеНаборыДанных.Вставить("тзШтатноеРасписание",тзШтатноеРасписание);

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

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

(14) Вы не поняли. Я не спрашивал как оно происходит по природе. Я показал пример когда у вас данные в БД есть, а в ваш запрос они не попадут, хотя должны. В вашем запросе логическая ошибка.
---
```1c
    нстр.День = НачалоМесяца(стр.Дата)+86400*(ит-1);
```
 И для февраля с 28 днями отработает? Первое февраля + 31 день будет уже март. Ну, и в марте уже март. Можно запросом сразу собрать нужную таблицу из "Документ.ШтатноеРасписаниеУпр.Сотрудники", а не циклом бегать и гонять данные из SQL сервера на 1С сервер и обратно.
```1c
    Если стр["Часов"+СокрЛП(ит)] <> 0 тогда
```
Не проверяет того, что в февральском документе кто-то запихнул в 31 февраля не нулевые данные.
---
решение нашлось) ошибка была в том, что выбиралась дата, а не период регистрации. Дата создания документа штатное расписание. Документ создавался в мае, а расписание было на июль. Отсюда и не соответствие.

```1c
    | ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации Как Дата
    |ИЗ
    | Документ.ШтатноеРасписаниеУпр.Сотрудники КАК ШтатноеРасписаниеУпрСотрудники
    |ГДЕ
    | ШтатноеРасписаниеУпрСотрудники.Ссылка.Проведен = ИСТИНА
    | И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации >= &ДатаНач
    | И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации <= &ДатаКон";
```

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