Добрый день, есть скд отчет посещения. Выводится день а в нем два столбца-часы по штатному расписанию у сотрудника и часы по отработанному времени в этот день. А по факту выходит 30 дней где пишется только часы по штатному и 30 дней где фактически отработанное время. Как скомпоновать так, чтобы все выводилось в один день? СГРУППИРОВАТЬ ПО не выходит
ВЫБРАТЬ
ВТ.Сотрудник,
ВТ.СтатьяЗатрат,
ВТ.День,
ВТ.Часов
ПОМЕСТИТЬ ВТШтатное
ИЗ
тзШтатноеРасписание КАК ВТ
СГРУППИРОВАТЬ ПО
ВТ.День,
ВТ.Сотрудник,
ВТ.СтатьяЗатрат,
ВТ.Часов
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Посещения.Ссылка КАК Посещение
ПОМЕСТИТЬ ТекущиеПосещения
ИЗ
Документ.Посещения КАК Посещения
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Посещения КАК Посещения1
ПО Посещения.Ссылка = Посещения1.ПредыдущаяВерсия
ГДЕ
ВЫБОР
КОГДА Посещения1.Ссылка ЕСТЬ NULL
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ПосещенияСотрудники.Ссылка КАК Документ,
ПосещенияСотрудники.Сотрудник,
ПосещенияДетали.СтатьяЗатрат,
ПосещенияДетали.Сумма,
ПосещенияДетали.Подразделение,
ПосещенияДетали.ПодразделениеОрганизации,
ПосещенияДетали.Категория,
ПосещенияДетали.Количество,
ПосещенияДетали.НоменклатурнаяГруппа,
ПосещенияДетали.ВидЗатрат,
ПосещенияДетали.ВидРаботы,
ПосещенияСотрудники.Ссылка.Период КАК День
ПОМЕСТИТЬ Детали
ИЗ
Документ.Посещения.Сотрудники КАК ПосещенияСотрудники
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Посещения.Детали КАК ПосещенияДетали
ПО ПосещенияСотрудники.КлючСтроки = ПосещенияДетали.КлючСтроки
И ПосещенияСотрудники.Ссылка = ПосещенияДетали.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекущиеПосещения КАК ТекущиеПосещения
ПО ПосещенияСотрудники.Ссылка = ТекущиеПосещения.Посещение
ГДЕ
ПосещенияСотрудники.Ссылка.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
И ПосещенияСотрудники.Ссылка.Проведен
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Детали.Документ,
ЕСТЬNULL(Детали.Сотрудник, ВТШтатное.Сотрудник) КАК Сотрудник,
Детали.СтатьяЗатрат,
Детали.Сумма КАК СуммаИзДокумента,
Детали.Подразделение,
Детали.ПодразделениеОрганизации,
Детали.Категория,
Детали.Количество,
Детали.НоменклатурнаяГруппа,
Детали.ВидЗатрат,
Детали.ВидРаботы,
ЕСТЬNULL(Детали.День, ВТШтатное.День) КАК День,
Детали.Количество * ЕСТЬNULL(СтавкиОплатыТрудаСрезПоследних.Ставка, 0) КАК Сумма,
ВТШтатное.Часов,
ВТШтатное.СтатьяЗатрат КАК СтатьяЗатратШР
ИЗ
Детали КАК Детали
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиОплатыТруда.СрезПоследних(&ДатаНачала, ) КАК СтавкиОплатыТрудаСрезПоследних
ПО Детали.Сотрудник = СтавкиОплатыТрудаСрезПоследних.Сотрудник
И Детали.ВидРаботы = СтавкиОплатыТрудаСрезПоследних.ВидРабот
ПОЛНОЕ СОЕДИНЕНИЕ ВТШтатное КАК ВТШтатное
ПО Детали.Сотрудник = ВТШтатное.Сотрудник
И Детали.День = ВТШтатное.День
СГРУППИРОВАТЬ ПО
Детали.Документ,
Детали.СтатьяЗатрат,
Детали.Сумма,
Детали.Подразделение,
Детали.ПодразделениеОрганизации,
Детали.Категория,
Детали.Количество,
Детали.НоменклатурнаяГруппа,
Детали.ВидЗатрат,
Детали.ВидРаботы,
ВТШтатное.Часов,
ВТШтатное.СтатьяЗатрат,
ЕСТЬNULL(Детали.Сотрудник, ВТШтатное.Сотрудник),
Детали.Количество * ЕСТЬNULL(СтавкиОплатыТрудаСрезПоследних.Ставка, 0),
Детали.День,
ВТШтатное.День
ПоказатьПрикрепленные файлы:

По теме из базы знаний
Найденные решения
(16) решение нашлось) ошибка была в том, что выбиралась дата, а не период регистрации. Дата создания документа штатное расписание. Документ создавался в мае, а расписание было на июль. Отсюда и не соответствие.
Вот измененная часть запроса, которая сработала
| ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации Как Дата
|ИЗ
| Документ.ШтатноеРасписаниеУпр.Сотрудники КАК ШтатноеРасписаниеУпрСотрудники
|ГДЕ
| ШтатноеРасписаниеУпрСотрудники.Ссылка.Проведен = ИСТИНА
| И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации >= &ДатаНач
| И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации <= &ДатаКон";
Вот измененная часть запроса, которая сработала
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Вот простая логика:
первый запрос - получаем данные по штатному расписанию (временная таблица)
второй запрос - получаем данные по факту (временная таблица)
третий запрос - первый запрос ЛЕВОЕ СОЕДИНЕНИЕ второй запрос (соединяем по датам и ФИО)
В третем запросе будет: ФИО, по штатному, по факту
И его в СКД можно разместить.
первый запрос - получаем данные по штатному расписанию (временная таблица)
второй запрос - получаем данные по факту (временная таблица)
третий запрос - первый запрос ЛЕВОЕ СОЕДИНЕНИЕ второй запрос (соединяем по датам и ФИО)
В третем запросе будет: ФИО, по штатному, по факту
И его в СКД можно разместить.
(3) Пример как соединить две таблицы
ВЫБРАТЬ
"Иванов" КАК ФИО,
20 КАК План
ПОМЕСТИТЬ ВТ_План
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Петров",
10
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Сидоров",
30
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
"Иванов" КАК ФИО,
100 КАК Факт
ПОМЕСТИТЬ ВТ_Факт
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Петров",
20
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_План.ФИО КАК ФИО,
ВТ_План.План КАК План,
ВТ_Факт.Факт КАК Факт
ИЗ
ВТ_План КАК ВТ_План
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Факт КАК ВТ_Факт
ПО ВТ_План.ФИО = ВТ_Факт.ФИО
Показать
(6) Значит, берите сотрудника из таблицы документа (там он точно не NULL), а уже к нему присоединяйте остальные таблицы. Если выбирается не то, что должно быть, тестируйте запрос, последовательно присоединяя каждую временную таблицу и анализируя что получилось.
(1) Это что бы документы у которых были пересчёты не попадали.
Но дальше есть ещё одно условие Т.е. если у исходного документа есть документ пересчет, который позже этого периода, то исходный документ не попадет так как есть документ пересчет, а документ пересчет не попадет так как он в период не попадает. А еще пересчет может быть не проведен. Т.е какие-то посещения вообще не попадут, хотя они возможно имели место.
Какие движения делает этот документ. Может сразу их смотреть, а не по документам бегать?
Документ.Посещения КАК Посещения
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Посещения КАК Посещения1
ПО Посещения.Ссылка = Посещения1.ПредыдущаяВерсия
Но дальше есть ещё одно условие
ГДЕ
ПосещенияСотрудники.Ссылка.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
И ПосещенияСотрудники.Ссылка.Проведен
Какие движения делает этот документ. Может сразу их смотреть, а не по документам бегать?
(1) Может хотя бы часы просуммировать, а не просто выбрать различные?
ВЫБРАТЬ
ВТ.Сотрудник,
ВТ.СтатьяЗатрат,
ВТ.День,
ВТ.Часов
ПОМЕСТИТЬ ВТШтатное
ИЗ
тзШтатноеРасписание КАК ВТ
СГРУППИРОВАТЬ ПО
ВТ.День,
ВТ.Сотрудник,
ВТ.СтатьяЗатрат,
ВТ.Часов
;
ПоказатьВЫБРАТЬ
ВТ.Сотрудник,
ВТ.СтатьяЗатрат,
ВТ.День,
Сумма(ВТ.Часов) as Часов
ПОМЕСТИТЬ ВТШтатное
ИЗ
тзШтатноеРасписание КАК ВТ
СГРУППИРОВАТЬ ПО
ВТ.День,
ВТ.Сотрудник,
ВТ.СтатьяЗатрат
;
Показать
(12) а они сделаны)
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
//Программно формируем отчет
//Отменяем стандартную обработку
СтандартнаяОбработка = Ложь;
//Получаем схему
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//...и настройки
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
//Создаем компоновщик макета и получаем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
//<--------------------------------------------------------------------------------------->//
ПараметрДата = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период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);
нстр.Часов = стр["Часов"+СокрЛП(ит)];
КонецЕсли;
КонецЦикла;
КонецЦикла;
МВТ = Новый МенеджерВременныхТаблиц;
зпрс = Новый Запрос;
зпрс.УстановитьПараметр("тзШтатноеРасписание",тзШтатноеРасписание);
зпрс.МенеджерВременныхТаблиц = МВТ;
зпрс.Текст = "ВЫБРАТЬ
| ВТ.Сотрудник,
| ВТ.СтатьяЗатрат,
| ВТ.День,
| ВТ.Часов
|ПОМЕСТИТЬ тзШтатноеРасписание
|ИЗ
| &тзШтатноеРасписание КАК ВТ";
зпрс.Выполнить();
//ВнешниеНаборыДанных = Новый Структура;
//ВнешниеНаборыДанных.Вставить("тзШтатноеРасписание",тзШтатноеРасписание);
//Инициализируем процессор компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина,,МВТ);
//<--------------------------------------------------------------------------------------->//
//Очищаем документ результата
ДокументРезультат.Очистить();
//Выводим отчет в документ
ПроцессорВывода = Новый
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Показать
(13) Не увидел где они суммируются. Первый запрос не нужен, если он ничего не делает. Он создает копию таблицы в менеджере. Зачем если она там уже есть.
(14) Вы не поняли. Я не спрашивал как оно происходит по природе. Я показал пример когда у вас данные в БД есть, а в ваш запрос они не попадут, хотя должны. В вашем запросе логическая ошибка.
(14) Вы не поняли. Я не спрашивал как оно происходит по природе. Я показал пример когда у вас данные в БД есть, а в ваш запрос они не попадут, хотя должны. В вашем запросе логическая ошибка.
(13) И для февраля с 28 днями отработает? Первое февраля + 31 день будет уже март. Ну, и в марте уже март. Можно запросом сразу собрать нужную таблицу из "Документ.ШтатноеРасписаниеУпр.Сотрудники", а не циклом бегать и гонять данные из SQL сервера на 1С сервер и обратно. Не проверяет того, что в февральском документе кто-то запихнул в 31 февраля не нулевые данные.
нстр.День = НачалоМесяца(стр.Дата)+86400*(ит-1);
Если стр["Часов"+СокрЛП(ит)] <> 0 тогда
(16) решение нашлось) ошибка была в том, что выбиралась дата, а не период регистрации. Дата создания документа штатное расписание. Документ создавался в мае, а расписание было на июль. Отсюда и не соответствие.
Вот измененная часть запроса, которая сработала
| ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации Как Дата
|ИЗ
| Документ.ШтатноеРасписаниеУпр.Сотрудники КАК ШтатноеРасписаниеУпрСотрудники
|ГДЕ
| ШтатноеРасписаниеУпрСотрудники.Ссылка.Проведен = ИСТИНА
| И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации >= &ДатаНач
| И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации <= &ДатаКон";
Вот измененная часть запроса, которая сработала
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот