Загрузка табеля ЗУП 3.1 из Excel

1. PolybomyGeka 15.08.26 19:20 Сейчас в теме
Доброго времени суток.
Прошу помочь у опытных людей может кто сталкивался с таким как у меня.
Делаю обработку загрузки табеля из Excel в ЗУП 3.1. для транспортной организации. Есть водители которые в один день могут работать на 2-х, 3-х машинах, или в этот день у него может быть еще ремонт. Соответственно в табеле в Excel у него три записи с его ФИО и табельным номером + гаражный номер. Обработка загружает тремя отдельными строками. (скриншот прикрепляю). Если создать табель как есть на основе загруженных данных, то времени с видом: Явка в итоге за месяц получается больше чем самих дней в месяце, на сколько я понял это не правильно. (скриншот тоже прилагаю). Если эту таблицу выгрузить в ТЗ и Свернуть, то результат не поменяется т.к. строки различаются. Если поместить в временные таблицы и потом сгруппировать то получается но лишь при условии что вид времени не одинаковый, строка схлопывается, но если там будет напривер в один день Явка, и Ремонт то в результате часы сложатся, а в виде времени будет стоят тот вид который был первый. В этом собственно и вопрос, как объединить время в пределах дня с одним и тем же видом времени с 2-х - 3-х строк ТЗ, а если вид времени не совпадает то оставлять его отдельной строкой.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
35. PolybomyGeka 21.08.26 06:38 Сейчас в теме
Не судите строго за такой ужасный код, я новичок в программировании. В общем решил вопрос через циклы, понимаю что ужасно но что поделать задача поставлена и надо решать, таблица не большая и производительности хватает.

 &НаСервере
 Процедура ПолучитьТЗИзКоллекции()
	 
	 ТЗ = ТЗТЧ2.Выгрузить();
	 
         //Создаю копию ТЗ с ключевыми полями для группировки и отбора только Дублей по ключемым полям.
	 КопияТЗ = ТЗ.Скопировать(,"СотрСтрока, ТабНСтрока");
	 Имя = "Повтор";
	 ТипЗначения = Новый ОписаниеТипов("Число");
	 КопияТЗ.Колонки.Добавить(Имя, ТипЗначения);
	 Для Каждого Строка Из КопияТЗ Цикл
		 Строка.Повтор = 1;
	 КонецЦикла;
	 
	 КопияТЗ.Свернуть("СотрСтрока, ТабНСтрока" , "Повтор");
	 
	 ВсегоСтрок = КопияТЗ.Количество();
	 // Обходим свернутую ТЗ и удаляем уникальные строки имеющие значение в колонке Повтор =1
	 Для Счетчик = 1 По ВсегоСтрок Цикл
		 Индекс = ВсегоСтрок - Счетчик;
		 ТекущаяСтрока = КопияТЗ[Индекс];
		 
		 Если ТекущаяСтрока[Имя] = 1 Тогда
			 КопияТЗ.Удалить(Индекс);
		 КонецЕсли;
	 КонецЦикла;   
	 

	 //Создал Соответствие и сформировал Ключ для поиска по ТЗ
	 Совпадения = Новый Соответствие();
	 
	 Для каждого СтрокаТЗ1 из КопияТЗ Цикл
		 Ключ = СтрокаТЗ1["СотрСтрока"] + "," + СтрокаТЗ1["ТабНСтрока"]; // Объединяем значения
		 Совпадения.Вставить(Ключ, Истина);
	 КонецЦикла;
	 
	 ВсегоСтрок = ТЗ.Количество();
	 ТЗДубли = ТЗ.СкопироватьКолонки();

	 //Через цикл обхожу основную таблицу сравнивая строки по Ключам созданных в соответствии 
        // Записываю найденные строки в копиюТЗ, а с основной ТЗ удаляю эти строки.
	 Для Счетчик = 1 По ВсегоСтрок Цикл
		 Индекс = ВсегоСтрок - Счетчик;
		 ТекущаяСтрока = ТЗ[Индекс]; 
		 Ключ = ТекущаяСтрока["СотрСтрока"] + "," + ТекущаяСтрока["ТабНСтрока"];
		 Если Совпадения.Получить(Ключ) = Неопределено Тогда
			 Продолжить; // Нет совпадения  
		 Иначе
			 НоваяСтрокаПриёмника = ТЗДубли.Добавить();
			 ЗаполнитьЗначенияСвойств(НоваяСтрокаПриёмника, ТекущаяСтрока);
			 //МассивДублей.Добавить(ТекущаяСтрока);
			 ТЗ.Удалить(Индекс);
		 КонецЕсли; 
		 
	 КонецЦикла; 
	 	 
	 ТЗДубли.Сортировать("СотрСтрока Возр");
	 ВидДеньСтрока = "ВидВремениСтрока";
	 ВидНочьСтрока = "ВидВремени2Строка";
	 ЧасДеньСтрока = "ЧасовСтрока";
	 ЧасНочьСтрока = "ЧасовНочьСтрока"; 
	 ЗначениеДляУдаления = Ложь;
	 Индекс1 = 0;
	 Индекс2 = ТЗДубли.Количество() - 1;
	 КоличествоСтрок = ТЗДубли.Количество() - 1;
	 
	 // Перебор строк с сравнением со всеми строками по двум параметрам.
	 Пока Индекс1 <= КоличествоСтрок  Цикл
		 ТекущаяСтрока = ТЗДубли[Индекс1];
		 //СледующаяСтрока = ТЗДубли[Индекс1 + 1];
		 
		 Пока Индекс2 > Индекс1 Цикл
			 СледующаяСтрока = ТЗДубли[Индекс2];
			 
                        // Теперь сравниваем нужные колонки
			 Если ТекущаяСтрока.СотрСтрока = СледующаяСтрока.СотрСтрока И
				 ТекущаяСтрока.ТабНСтрока = СледующаяСтрока.ТабНСтрока Тогда
				 
				 ЗначениеДляУдаления = Истина;
				 
				 Для Счетчик = 1 По 31 Цикл
					 ВидДень = ВидДеньСтрока + Счетчик;
					 ВидНочь = ВидНочьСтрока + Счетчик;
					 ЧасДень = ЧасДеньСтрока + Счетчик;
					 ЧасНочь = ЧасНочьСтрока + Счетчик;
					 
					 Если ТекущаяСтрока[ВидДень] = СледующаяСтрока[ВидДень] Тогда
						 ТекущаяСтрока[ЧасДень] = ТекущаяСтрока[ЧасДень] + СледующаяСтрока[ЧасДень];
						 СледующаяСтрока[ВидДень] = "";
						 СледующаяСтрока[ЧасДень] = 0;
												 
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли;
						 
					 ИначеЕсли ТекущаяСтрока[ВидДень] = "" И СледующаяСтрока[ВидДень] <> "" Тогда
						 ТекущаяСтрока[ЧасДень] = СледующаяСтрока[ЧасДень];
						 ТекущаяСтрока[ВидДень] = СледующаяСтрока[ВидДень]; 
						 СледующаяСтрока[ВидДень] = "";
						 СледующаяСтрока[ЧасДень] = 0;
						 
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли; 
					 ИначеЕсли ТекущаяСтрока[ВидДень] <> "" И СледующаяСтрока[ВидДень] = "" Тогда
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли;
					 Иначе
						 Если ЗначениеДляУдаления Тогда
							 ЗначениеДляУдаления = Ложь;
							 ИндексДляУдаления = Неопределено;
						 КонецЕсли;
					 КонецЕсли; 
					 
					 Если ТекущаяСтрока[ВидНочь] = СледующаяСтрока[ВидНочь] Тогда
						 ТекущаяСтрока[ЧасНочь] = ТекущаяСтрока[ЧасНочь] + СледующаяСтрока[ЧасНочь];
						 СледующаяСтрока[ВидНочь] = "";
						 СледующаяСтрока[ЧасНочь] = 0;
						 						 
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли;
						 
					 ИначеЕсли ТекущаяСтрока[ВидНочь] = "" И СледующаяСтрока[ВидНочь] <> "" Тогда
						 ТекущаяСтрока[ЧасНочь] = СледующаяСтрока[ЧасНочь];
						 ТекущаяСтрока[ВидНочь] = СледующаяСтрока[ВидНочь]; 
						 СледующаяСтрока[ВидНочь] = "";
						 СледующаяСтрока[ЧасНочь] = 0;
						 
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли; 
					 ИначеЕсли ТекущаяСтрока[ВидНочь] <> "" И СледующаяСтрока[ВидНочь] = "" Тогда
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли;
					 Иначе
						 Если ЗначениеДляУдаления Тогда
							 ЗначениеДляУдаления = Ложь;
							 ИндексДляУдаления = Неопределено;
						 КонецЕсли;
					 КонецЕсли;
					 
				 КонецЦикла;
				 
				 Если ЗначениеДляУдаления Тогда 
					 ТЗДубли.Удалить(ИндексДляУдаления);
					 КоличествоСтрок = ТЗДубли.Количество() - 1;
				 КонецЕсли;	
				 
			 КонецЕсли;
			 
			 Индекс2 = Индекс2 - 1;
			 
		 КонецЦикла;   
		 
		 Индекс1 = Индекс1 + 1;
		 Индекс2 = ТЗДубли.Количество() - 1;
	 КонецЦикла; 
	 
	 СтрокиДубли = ТЗДубли.Количество();
	 
         //Добавляем сгруппированые строки по всем колонкам в основную ТЗ
	 Для Счетчик = 1 По СтрокиДубли Цикл
		 ИндексСтроки = СтрокиДубли - Счетчик;
		 ТекСтрока = ТЗДубли[ИндексСтроки]; 
		 НовСтрокаПриёмника = ТЗ.Добавить();
		 ЗаполнитьЗначенияСвойств(НовСтрокаПриёмника, ТекСтрока);	
	 КонецЦикла; 
	 
         //Обновляем нумерацию строк
	 НомерПоСчету = 1;
	 Для Каждого СтрТЗ Из ТЗ Цикл
		 СтрТЗ.НомерСтроки = НомерПоСчету;
		 НомерПоСчету = НомерПоСчету + 1;
	 КонецЦикла;
	 
	 ТЗТЧ2.Загрузить(ТЗ);  
	 
 КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. GenaT1C 13 16.08.26 06:58 Сейчас в теме
(1) Делайте же в экселе сначала ОДИН сводный табель на листе Свод, это элементарно, и только затем загружайте в ЗУП. По принципу: один сотрудник = одна строка.
4. dehro 15 17.08.26 07:07 Сейчас в теме
(1)
....Если эту таблицу выгрузить в ТЗ и Свернуть, то результат не поменяется т.к. строки различаются. Если поместить в временные таблицы и потом сгруппировать то получается но лишь при условии что вид времени не одинаковый, строка схлопывается, но если там будет напривер в один день Явка, и Ремонт то в результате часы сложатся, а в виде времени будет стоят тот вид который был первый...


Наверное, поля группировки покурить нужно. Должно хорошо получится. Направление мыслей правильное.

(2) Т.е. excel "СВОД" создать может, а програмно из табличек никак?
5. GenaT1C 13 17.08.26 07:36 Сейчас в теме
(4) Мне вообще не нравится, когда на каждую машину отдельный изначальный табель. Как будто на каждую машину свой отдельный завгар, что табелирует )
7. dehro 15 17.08.26 09:02 Сейчас в теме
(5) Ситуацию не знаю, но телепат примерно так бормочет: выгрузка идет из программы учёта автотранспорта, там в разрезе по машинам. Изменить выгрузку не могут.

ТС пишет о проблеме схлопывания Явки и Ремонта (часы, скорее всего по разному оплачиваются). Про проблему схлопывания Явки с Явкой ничего в (0) нет.
3. PolybomyGeka 17.08.26 04:54 Сейчас в теме
Наверное так и придётся делать, всё-таки думал что как то можно программно разделить. Спасибо.
6. YA_514896950 40 17.08.26 08:30 Сейчас в теме
(3) ну так при загрузке делайте программно свертку и все
8. PolybomyGeka 17.08.26 09:57 Сейчас в теме
(6) Так не получатся, По мимо ФИО надо еще сравнивать реквизиты за каждый день: ВидВремени, ОтработаноЧасовДень, ВидВремениНочь, ОтработаноЧасоНочь (в конце каждого из этих реквизитов добавляется номер дня 1, 2, 3, ...), если пусто то пропускать, если данные в обеих записях то надо сложить часы при условии что вид времени совпадает за этот день. А это на минуточку 124 реквизита только касающихся данных по времени: День Ночь и Вида времени для каждого дня. Прописать их проверку при загрузке как то на мой взгляд не реально.
Смысл в том что Если ВидВремени в строке 1 совпадает с ВидВремени в строке два, то суммируем часы из реквизитов: ОтработаноЧасовДень обеих строк и очищаем реквизит во второй строке, если вид времени не совпал то оставляем. В итоге получить хочу все реквизиты которые совпали по ВидВремени просуммированы, А во второй строке остались только часы с ВидВремени которые не совпали с первой строкой.
Прикрепленные файлы:
9. YA_514896950 40 17.08.26 10:29 Сейчас в теме
(8) прописываете все реквизиты и не ленитесь. озадачьте ии. он вам накидает код.
36. SweetSweetLoot 21.08.26 07:52 Сейчас в теме
(8)
Смысл в том что Если ВидВремени в строке 1 совпадает с ВидВремени в строке два, то суммируем часы из реквизитов: ОтработаноЧасовДень обеих строк и очищаем реквизит во второй строке, если вид времени не совпал то оставляем. В итоге получить хочу все реквизиты которые совпали по ВидВремени просуммированы, А во второй строке остались только часы с ВидВремени которые не совпали с первой строкой.

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


ТЗ = новый ТаблицаЗначений();
Для Счетчик = 1 По ЧислоДней Цикл
    ТЗ.Колонки.Добавить("ЧислоДней"+Счетчик,ОписаниеТипа(Число));
КонецЦикла;

Для Каждого Строка Из СписокСтрок Цикл
    НоваяСтрока = ТЗ.Добавить();

    Для Счетчик = 1 По ЧислоДней Цикл
        НоваяСтрока["ЧислоДней"+Счетчик] = Строка[НачальнаяПозицияВЭксель+Счетчик];//C Высокой вероятностью у вас строки идут по порядку в эксель если нет то соболезную
    КонецЦикла;
КонецЦикла
Показать

В [] можно обращаться как по индексу колонки, так и по имени и можно это использовать.
10. puzo50 17.08.26 10:35 Сейчас в теме
зачем стока реквизитов? вам нужен только один - вид времени. и количество. единственное что - 31 день. загрузили из одного екселя, другого третьего. выгрузили в ТЗ. ТЗ свернули по видам времени, по количеству просуммировали. записали в табель. всё. предусмотреть вариант, когда он не будет записывать, так как, например, нет такого вида времени, или когда времени получилось больше 24 часов.
11. PolybomyGeka 17.08.26 12:47 Сейчас в теме
(10) Если я правильно понял перед каждой итерацией цикла надо делать поиск по колонке ФИО и если совпадает перебирать остальные колонки сравнивая их с получаемыми данными? Только вопрос как привязаться к Дню? Сотрудник может работать на другой машине 1 - 2 раза за месяц, так же и с ремонтом. Поэтому столько и реквизитов на 1 день = 4 реквизита: ВидВремени и ОтработаноЧасов, ВидВремениНочь и ОтработаноЧасовНочь.
12. puzo50 17.08.26 12:57 Сейчас в теме
(11) нет. просто вид времени. зачем ещё видвремениночь?
получаете таблицу
иванов 01.01.1913 Я 2.5
иванов 01.01.1913 ОТ 2.5
иванов 01.01.1913 В 2.5
иванов 01.01.1913 Я 2.5
...
свернули все ваши данные по сотруднику(по табельному номеру конечно же), дате, видувремени. суммирование - по количеству часов. всё. вывели в табель. вроде простая задача. то ли бригадир поезда чего-то не понимает
13. PolybomyGeka 17.08.26 15:22 Сейчас в теме
(12) Получается табель то состоит образно говоря из 50 человек и например Иванов И.И. может быть первый стоять в табели и еще 15-тым.
По итогу получаю строку:
Иванов И.И. | 1.1.1111 | Я | 15 | 2.1.1111 | Я | 11 | 3.1.1111 | Я | 15 | и т.д до 31 числа с учетом что какойто день может быть видом 15.1.1111 | "" | "" |
Следующая строка с этим сотрудником:
Иванов И.И. ...... | 2.1.1111 | Я | 10 | 3.1.1111 | Р | 5 | 4.1.1111 | "" | "" | ... И т.д.

Получается строки не одинаковые и свернуть их не получится.
В идеале как надо: время с одинаковым видом времени свернуть в одну строку или в первую, а в дубле оставить лишь время которое отличается от сравниваемой.
14. GenaT1C 13 17.08.26 15:46 Сейчас в теме
(13) Дубль два: не мудрите. Не тащите в ЗУП машины из авто-проги. Ведь там же суммы заработка сдельного считаете? А в ЗУП переносите только итоговую сдельщину?
Вот также и с табелем. Не надо машин, простые Я.
15. PolybomyGeka 17.08.26 17:18 Сейчас в теме
(14) Так я и хочу это убрать, только вот в Excel они ведут так табеля, им надо знать для руководства кто на какой машине работал, где машина была на собственные нужды. От этого и проблема с лишними строками в табеле Excel, в 1с надо сводно отразить по человеку на какую дату сколько отработал не важно на какой машине, если ремонт еще был то ремонт включить в этот день.
16. GenaT1C 13 17.08.26 17:42 Сейчас в теме
(15) Дубль два: я лет 20 назад вёл зп в экселе. Там элементарно добавить в книгу новый лист, назвать "Свод" и спокойно собрать в одной ячейке даты все "Я" и "Н" со всех листов машин, пусть и нулевых в некоторой части.
17. PolybomyGeka 17.08.26 18:35 Сейчас в теме
(16) А если на одну и туже дату 3 вида времени тоже в сводную соберет? Я вот пробовал сегодня, безобразие получилось, может табель в Excel такой, но даты с временем общем по видам времени он мне так в свод и не вывел
18. GenaT1C 13 17.08.26 19:16 Сейчас в теме
(17) Дубль три: у Вас в своде не будет много видов времени, которые Вы напузырили в авто-проге. В своде будет только два основных: Я, Н.

На листах по машинам будет: 5 одной машины, 3 другой и 1 третьей. В своде будет Я-9
19. PolybomyGeka 17.08.26 20:05 Сейчас в теме
(18) А при чем тут авто прога? О ней слова здесь небело, табель он ведут в ручную на основе путевых листов, никто ничего не выгружает. У них за один день в Excel может быть три записи, 1-я на одной машине, 2-я на втрой, 3-я еще ремонт проскочить в этот день и это я про ночные часы не пишу уже.
20. GenaT1C 13 17.08.26 20:17 Сейчас в теме
(19) давайте эксельки, чтоб был там в том числе один кекс полностью, посмотрим.
21. PolybomyGeka 18.08.26 06:46 Сейчас в теме
(20) Я немного сократил табель, чтоб меньше вникать, но общий смысл как они его ведут понятен будет. По сотруднику: Верхняя строка с часами это дневные, Нижняя строка - это ночные часы. Разделение обязательно.
Прикрепленные файлы:
Табель за Июль 2026г .xls
22. GenaT1C 13 18.08.26 07:27 Сейчас в теме
(21) Поясните по часам Иванова на одну дату: 01.07.2026
Я вижу по машине 5624 4 часа и по машине 5497 6 часов, т.е. всего 10.
Вот эта нижняя цифра 7 - это ночные? Они в том числе, надеюсь? Они внутри этих 10?
23. PolybomyGeka 18.08.26 07:52 Сейчас в теме
(22) Нет не внутри, верхняя строка это дневные часы, нижняя это ночные и они идут отдельно. т.к. оплата за ночные больше. еще и 5-го числа стоит ремонт в дневных часах, это тоже отдельно должно выводится.
24. GenaT1C 13 18.08.26 08:03 Сейчас в теме
(23) Но тогда ведь получится 10 + 7 = 17 часов работы 1 июля. Это соответствует реальности? У вас там концлагерь?
25. PolybomyGeka 18.08.26 08:05 Сейчас в теме
(24) Наверное, я не удивлюсь этому уже. Бывает и по 22 проставляют - 11 день и 11 ночь. На сколько они и в правду так работают не знаю. Но так оплачивает заказчик и потом организация платит зарплату за эти часы.
27. GenaT1C 13 18.08.26 08:29 Сейчас в теме
(25) Принято.
Создайте книгу 202607
В ней листы с именами под каждую машину с номерами: 5497, 5624... плюс дополнительные листы с запасом под будущие номера 0001, ..., 0050 или 0020 - сами решите.
Теперь выделяйте все листы книги и рисуйте табель пока для одного водителя. У него будет 5 строк: Я, Н, Р и две про запас, на будущее, мало ли какой ещё код времени возникнет.
Теперь копируйте вниз этого пятистрочного водителя на реальное количество их плюс трёхкратный запас под будущие приёмы по текучке.

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

Вот и всё по июлю. Остаётся только копировать книгу на август с именем 202608 и т.д.

Данные со сводных листов -> в ЗУП
29. PolybomyGeka 18.08.26 09:06 Сейчас в теме
(27) не пойдут на это, очень много людей 100+ и много машин, диспетчера запутаются, поэтому делают табель по всем сотрудниками на одном листе. Проще и куда реальней заставить их в ручную делать свод на отдельном листе.
30. GenaT1C 13 18.08.26 09:09 Сейчас в теме
(29) И не надо ломать привычки людей. Достаточно прописать любому самому мелкому клерку (да хоть студентке) в служебной обязанности раз в месяц переносить цифры из полученных бумажно-подписанных табелей в эти эксель-книги. Полдня работы.
Пишите служебку.

На пальцах: Вы никогда не напишете рабочий алгоритм по прямому сбору из имеющихся табелей. Практика показывает, что бригадиры всегда начнут перезаписывать ФИО, добавлять строки и столбцы. Любой алгоритм квакнет.
26. dehro 15 18.08.26 08:17 Сейчас в теме
(21) Из этой XLS формируете таблицу значений с колонками: ДатаРаботы, Сотрудник, ЧасовДень, ЧасовНочь, Ремонт.
Далее
МояТЗ.Свернуть("ДатаРаботы, Сотрудник", "ЧасовДень, ЧасовНочь, Ремонт")


И то что получилось можно смело пихать в табель.

XLS, конечно, не простая. Если ведут руками, наверное могут и колонки менять/удалять.
28. PolybomyGeka 18.08.26 09:03 Сейчас в теме
(26) Свернуть не получится, строки уникальные получаются не свернет, пробовал уже так.
31. dehro 15 18.08.26 09:36 Сейчас в теме
(28) Дата работы с минутами? Сотрудник строкой? При создании ТЗ укажи тип колонки ДатаРаботы только Дата, а Сотрудник, например, Строка (150).

Других причин не вижу.
32. ZergKRSK 130 18.08.26 11:00 Сейчас в теме
(28)
строки уникальные получаются

А конкретнее?
33. АннаШ 130 18.08.26 11:45 Сейчас в теме
Чего-то вы мусолите долго, извините 😆
ИМХО, нужно менять подход с заполнению табеля.
Кто проверяет полностью заполненный табель? Не по авто, а сводно.
Вот пусть этот человек сядет и в ЗУПе заполнит (автоматом по графику, поправит, где не автоматом).
И полностью поддержу оратора из (30) - поверьте опыту.
34. АннаШ 130 18.08.26 11:46 Сейчас в теме
(33) Только не книги Excel, а табеля ЗУП.
35. PolybomyGeka 21.08.26 06:38 Сейчас в теме
Не судите строго за такой ужасный код, я новичок в программировании. В общем решил вопрос через циклы, понимаю что ужасно но что поделать задача поставлена и надо решать, таблица не большая и производительности хватает.

 &НаСервере
 Процедура ПолучитьТЗИзКоллекции()
	 
	 ТЗ = ТЗТЧ2.Выгрузить();
	 
         //Создаю копию ТЗ с ключевыми полями для группировки и отбора только Дублей по ключемым полям.
	 КопияТЗ = ТЗ.Скопировать(,"СотрСтрока, ТабНСтрока");
	 Имя = "Повтор";
	 ТипЗначения = Новый ОписаниеТипов("Число");
	 КопияТЗ.Колонки.Добавить(Имя, ТипЗначения);
	 Для Каждого Строка Из КопияТЗ Цикл
		 Строка.Повтор = 1;
	 КонецЦикла;
	 
	 КопияТЗ.Свернуть("СотрСтрока, ТабНСтрока" , "Повтор");
	 
	 ВсегоСтрок = КопияТЗ.Количество();
	 // Обходим свернутую ТЗ и удаляем уникальные строки имеющие значение в колонке Повтор =1
	 Для Счетчик = 1 По ВсегоСтрок Цикл
		 Индекс = ВсегоСтрок - Счетчик;
		 ТекущаяСтрока = КопияТЗ[Индекс];
		 
		 Если ТекущаяСтрока[Имя] = 1 Тогда
			 КопияТЗ.Удалить(Индекс);
		 КонецЕсли;
	 КонецЦикла;   
	 

	 //Создал Соответствие и сформировал Ключ для поиска по ТЗ
	 Совпадения = Новый Соответствие();
	 
	 Для каждого СтрокаТЗ1 из КопияТЗ Цикл
		 Ключ = СтрокаТЗ1["СотрСтрока"] + "," + СтрокаТЗ1["ТабНСтрока"]; // Объединяем значения
		 Совпадения.Вставить(Ключ, Истина);
	 КонецЦикла;
	 
	 ВсегоСтрок = ТЗ.Количество();
	 ТЗДубли = ТЗ.СкопироватьКолонки();

	 //Через цикл обхожу основную таблицу сравнивая строки по Ключам созданных в соответствии 
        // Записываю найденные строки в копиюТЗ, а с основной ТЗ удаляю эти строки.
	 Для Счетчик = 1 По ВсегоСтрок Цикл
		 Индекс = ВсегоСтрок - Счетчик;
		 ТекущаяСтрока = ТЗ[Индекс]; 
		 Ключ = ТекущаяСтрока["СотрСтрока"] + "," + ТекущаяСтрока["ТабНСтрока"];
		 Если Совпадения.Получить(Ключ) = Неопределено Тогда
			 Продолжить; // Нет совпадения  
		 Иначе
			 НоваяСтрокаПриёмника = ТЗДубли.Добавить();
			 ЗаполнитьЗначенияСвойств(НоваяСтрокаПриёмника, ТекущаяСтрока);
			 //МассивДублей.Добавить(ТекущаяСтрока);
			 ТЗ.Удалить(Индекс);
		 КонецЕсли; 
		 
	 КонецЦикла; 
	 	 
	 ТЗДубли.Сортировать("СотрСтрока Возр");
	 ВидДеньСтрока = "ВидВремениСтрока";
	 ВидНочьСтрока = "ВидВремени2Строка";
	 ЧасДеньСтрока = "ЧасовСтрока";
	 ЧасНочьСтрока = "ЧасовНочьСтрока"; 
	 ЗначениеДляУдаления = Ложь;
	 Индекс1 = 0;
	 Индекс2 = ТЗДубли.Количество() - 1;
	 КоличествоСтрок = ТЗДубли.Количество() - 1;
	 
	 // Перебор строк с сравнением со всеми строками по двум параметрам.
	 Пока Индекс1 <= КоличествоСтрок  Цикл
		 ТекущаяСтрока = ТЗДубли[Индекс1];
		 //СледующаяСтрока = ТЗДубли[Индекс1 + 1];
		 
		 Пока Индекс2 > Индекс1 Цикл
			 СледующаяСтрока = ТЗДубли[Индекс2];
			 
                        // Теперь сравниваем нужные колонки
			 Если ТекущаяСтрока.СотрСтрока = СледующаяСтрока.СотрСтрока И
				 ТекущаяСтрока.ТабНСтрока = СледующаяСтрока.ТабНСтрока Тогда
				 
				 ЗначениеДляУдаления = Истина;
				 
				 Для Счетчик = 1 По 31 Цикл
					 ВидДень = ВидДеньСтрока + Счетчик;
					 ВидНочь = ВидНочьСтрока + Счетчик;
					 ЧасДень = ЧасДеньСтрока + Счетчик;
					 ЧасНочь = ЧасНочьСтрока + Счетчик;
					 
					 Если ТекущаяСтрока[ВидДень] = СледующаяСтрока[ВидДень] Тогда
						 ТекущаяСтрока[ЧасДень] = ТекущаяСтрока[ЧасДень] + СледующаяСтрока[ЧасДень];
						 СледующаяСтрока[ВидДень] = "";
						 СледующаяСтрока[ЧасДень] = 0;
												 
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли;
						 
					 ИначеЕсли ТекущаяСтрока[ВидДень] = "" И СледующаяСтрока[ВидДень] <> "" Тогда
						 ТекущаяСтрока[ЧасДень] = СледующаяСтрока[ЧасДень];
						 ТекущаяСтрока[ВидДень] = СледующаяСтрока[ВидДень]; 
						 СледующаяСтрока[ВидДень] = "";
						 СледующаяСтрока[ЧасДень] = 0;
						 
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли; 
					 ИначеЕсли ТекущаяСтрока[ВидДень] <> "" И СледующаяСтрока[ВидДень] = "" Тогда
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли;
					 Иначе
						 Если ЗначениеДляУдаления Тогда
							 ЗначениеДляУдаления = Ложь;
							 ИндексДляУдаления = Неопределено;
						 КонецЕсли;
					 КонецЕсли; 
					 
					 Если ТекущаяСтрока[ВидНочь] = СледующаяСтрока[ВидНочь] Тогда
						 ТекущаяСтрока[ЧасНочь] = ТекущаяСтрока[ЧасНочь] + СледующаяСтрока[ЧасНочь];
						 СледующаяСтрока[ВидНочь] = "";
						 СледующаяСтрока[ЧасНочь] = 0;
						 						 
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли;
						 
					 ИначеЕсли ТекущаяСтрока[ВидНочь] = "" И СледующаяСтрока[ВидНочь] <> "" Тогда
						 ТекущаяСтрока[ЧасНочь] = СледующаяСтрока[ЧасНочь];
						 ТекущаяСтрока[ВидНочь] = СледующаяСтрока[ВидНочь]; 
						 СледующаяСтрока[ВидНочь] = "";
						 СледующаяСтрока[ЧасНочь] = 0;
						 
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли; 
					 ИначеЕсли ТекущаяСтрока[ВидНочь] <> "" И СледующаяСтрока[ВидНочь] = "" Тогда
						 Если ЗначениеДляУдаления Тогда
							 ИндексДляУдаления = Индекс2;
						 КонецЕсли;
					 Иначе
						 Если ЗначениеДляУдаления Тогда
							 ЗначениеДляУдаления = Ложь;
							 ИндексДляУдаления = Неопределено;
						 КонецЕсли;
					 КонецЕсли;
					 
				 КонецЦикла;
				 
				 Если ЗначениеДляУдаления Тогда 
					 ТЗДубли.Удалить(ИндексДляУдаления);
					 КоличествоСтрок = ТЗДубли.Количество() - 1;
				 КонецЕсли;	
				 
			 КонецЕсли;
			 
			 Индекс2 = Индекс2 - 1;
			 
		 КонецЦикла;   
		 
		 Индекс1 = Индекс1 + 1;
		 Индекс2 = ТЗДубли.Количество() - 1;
	 КонецЦикла; 
	 
	 СтрокиДубли = ТЗДубли.Количество();
	 
         //Добавляем сгруппированые строки по всем колонкам в основную ТЗ
	 Для Счетчик = 1 По СтрокиДубли Цикл
		 ИндексСтроки = СтрокиДубли - Счетчик;
		 ТекСтрока = ТЗДубли[ИндексСтроки]; 
		 НовСтрокаПриёмника = ТЗ.Добавить();
		 ЗаполнитьЗначенияСвойств(НовСтрокаПриёмника, ТекСтрока);	
	 КонецЦикла; 
	 
         //Обновляем нумерацию строк
	 НомерПоСчету = 1;
	 Для Каждого СтрТЗ Из ТЗ Цикл
		 СтрТЗ.НомерСтроки = НомерПоСчету;
		 НомерПоСчету = НомерПоСчету + 1;
	 КонецЦикла;
	 
	 ТЗТЧ2.Загрузить(ТЗ);  
	 
 КонецПроцедуры
Показать
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот