Имя: Пароль:
1C
1C 7.7
v7: Даты в таблице значений
,
0 Марфа Васильевна
 
30.12.14
16:35
Туплю целый день... помогите. есть таблица значений, содержащая две даты каких-то событий: дата начала и дата окончания.
например
05.01.14 - 08.01.14
14.04.14 - 18.04.14
10.10.14 - 15.10.14
нужно из неё сделать другую таблицу, где были бы расписаны все временные промежутки 2014 года.
а именно
01.01.14 - 04.01.14
05.01.14 - 08.01.14
09.01.14 - 13.04.14
14.04.14 - 18.04.14
19.04.14 - 09.10.14
10.10.14 - 15.10.14
16.10.14 - 31.12.14
как?
вопрос тупой, но к концу дня торможу. спасибо!!!
1 polosov
 
30.12.14
16:37
(0) Тестовое задание на позицию прогера?
2 Злопчинский
 
30.12.14
16:39
(0) в общем случае - проблема.
т.к. недостаточно исходных данных.
например, неясно - в исходной таблице временные интервалы могут быть перекрывающимися или нет?
3 Марфа Васильевна
 
30.12.14
16:40
нет, это персонифицированный учёт в Беларуси (ЗиК).
перекрываться НЕ могут даты (пусть уж хоть здесь будет облегчение)
4 Злопчинский
 
30.12.14
16:45
Пусть будет ТЗ
в Колонками ДатаН и ДатаК
пусть временные промежутки - неперекрывающиеся
пусть временные интервалы принадлежат одному году
.
ща, попробую налабать
5 Марфа Васильевна
 
30.12.14
16:46
Злопчинский, а налабайте, буду прям сильно благодарна!!! :)
6 Euguln
 
30.12.14
16:48
(0)Загнать в одну колонку и отсортрировать
7 polosov
 
30.12.14
16:48
(3) Берем начало года, и потом в цикле по количеству строк бегаем по датам и формируем в конец ТЗ новые периоды. В конце упорядочить по первой колонке.
8 Euguln
 
30.12.14
16:48
*отсортировать
9 Марфа Васильевна
 
30.12.14
16:49
о, спасибо! проведу клинические испытания :)
10 Злопчинский
 
30.12.14
17:51
На тебе!
11 Злопчинский
 
30.12.14
17:52
Собственно код с набором (избыточных?) тестов
.
//======================================================================
Процедура ПечатьТЗ(ТЗ,Заголовок)
    
    ТЗ.ВыбратьСтроку(,Заголовок);
    
КонецПроцедуры // ПечатьТЗ

//*******************************************
Функция ПосчитатьДляБульбаша(ТЗ)
    
    Если ТЗ.КоличествоСтрок()=0
    Тогда
      Возврат "нет данных"
    КонецЕсли;

    ТЗ.Сортировать("ДатаН");
    ТЗ.ПолучитьСтрокуПоНомеру(1);

    НачалоИнтервала = НачГода(ТЗ.ДатаН);
    КонецИнервала   = КонГода(ТЗ.ДатаН);

    КС = ТЗ.КоличествоСтрок();
    Для ы=1 По КС
    Цикл
        ТЗ.ПолучитьСтрокуПоНомеру(ы);

        ДатаК = ТЗ.ДатаН - 1;
        ДатаН = ТЗ.ДатаК + 1;
        
        Если ТЗ.ДатаН <> НачалоИнтервала
        Тогда
            ТЗ.НоваяСтрока();
            ТЗ.ДатаН = НачалоИнтервала;
            ТЗ.ДатаК = ДатаК;
        КонецЕсли;
        
        НачалоИнтервала = ДатаН;
        
        Если ТЗ.НомерСтроки = КС
        Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если НачалоИнтервала < КонецИнервала
    Тогда
        ТЗ.НоваяСтрока();
        ТЗ.ДатаН = НачалоИнтервала;
        ТЗ.ДатаК = КонГода(НачалоИнтервала);
    КонецЕсли;
    ТЗ.Сортировать("ДатаН");
    Возврат "";
    
КонецФункции //ПосчитатьДляБульбаша()

//======================================================================
Процедура Сформировать()
    
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("ДатаН","Дата",,,,12);
    ТЗ.НоваяКолонка("ДатаК","Дата",,,,12);
    ТЗ.НоваяКолонка("Флаг","Строка",,,"");   //символ = это данные заданные,

    //тест1
    ТЗ.УдалитьСтроки();
    
    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '05.01.14';
    ТЗ.ДатаК = '08.01.14';
    ТЗ.Флаг     = "*";
    
    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '14.04.14';
    ТЗ.ДатаК = '18.04.14';
    ТЗ.Флаг     = "*";
    
    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '10.10.14';
    ТЗ.ДатаК = '15.10.14';
    ТЗ.Флаг     = "*";
    
    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест1 набор неперекрывающихся интервалов");
    
    //тест2
    ТЗ.УдалитьСтроки();
    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест2 пустая таблица");
    
    //тест3
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '01.01.14';
    ТЗ.ДатаК = '31.12.14';
    ТЗ.Флаг     = "*";
    
    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест3 один интервал = весь год");

    //тест4
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '01.01.14';
    ТЗ.ДатаК = '01.01.14';
    ТЗ.Флаг     = "*";

    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест4 один интервал = первый день года");

    //тест5
    ТЗ.УдалитьСтроки();
    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '31.12.14';
    ТЗ.ДатаК = '31.12.14';
    ТЗ.Флаг     = "*";

    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест5 один интервал = последний день года");

    //тест6
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '18.07.14';
    ТЗ.ДатаК = '25.08.14';
    ТЗ.Флаг     = "*";

    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест6 один интервал в середине года");

    //тест6
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '18.07.14';
    ТЗ.ДатаК = '25.08.14';
    ТЗ.Флаг     = "*";

    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест6 один интервал в середине года");
    
    //тест7
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '18.09.14';
    ТЗ.ДатаК = '18.09.14';
    ТЗ.Флаг     = "*";

    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест7 один интервал = 1 день в середине года");

    //тест8
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '18.09.14';
    ТЗ.ДатаК = '18.09.14';
    ТЗ.Флаг     = "*";

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '19.09.14';
    ТЗ.ДатаК = '19.09.14';
    ТЗ.Флаг     = "*";
    
    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест8 один интервал = 2 дня подряд в середине года");

    //тест9
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '01.01.14';
    ТЗ.ДатаК = '01.01.14';
    ТЗ.Флаг     = "*";

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '02.01.14';
    ТЗ.ДатаК = '02.01.14';
    ТЗ.Флаг     = "*";
    
    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест9 два интервала, в начале года");

    //тест10
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '30.12.14';
    ТЗ.ДатаК = '30.12.14';
    ТЗ.Флаг     = "*";

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '31.12.14';
    ТЗ.ДатаК = '31.12.14';
    ТЗ.Флаг     = "*";
    
    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест10 два интервала, в конце года");
    
    //тест11
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '01.01.14';
    ТЗ.ДатаК = '01.01.14';
    ТЗ.Флаг     = "*";

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '15.01.14';
    ТЗ.ДатаК = '18.01.14';
    ТЗ.Флаг     = "*";
    
    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест11 два интервала, в начале года c разрывом");

    //тест12
    ТЗ.УдалитьСтроки();

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '20.12.14';
    ТЗ.ДатаК = '25.12.14';
    ТЗ.Флаг     = "*";

    ТЗ.НоваяСтрока();
    ТЗ.ДатаН = '31.12.14';
    ТЗ.ДатаК = '31.12.14';
    ТЗ.Флаг     = "*";
    
    Результат = ПосчитатьДляБульбаша(ТЗ);
    ПечатьТЗ(ТЗ,"тест12 два интервала, в конце года с разрывом");
    
    
КонецПроцедуры // Сформировать
12 Злопчинский
 
30.12.14
18:12
Ну и где эта Марфа Васильевна?
В постели с мужиком кувыркается, оттягивается по самое нехочу, а я тут потею за рабочим столом...?
13 Garykom
 
гуру
30.12.14
19:13
(12) ну кто с кем\чем предпочитает кувыркаться и оттягиваться ))
14 Злопчинский
 
30.12.14
19:21
(13) Обидно!
;-)
15 Марфа Васильевна
 
30.12.14
19:59
Злопчинский! спасибо Вам огромное!!! (сделаю вид, что про постель и мужика Вы не писали...)
плюсики Вам в карму и хорошего настроения Вашей жене, чтоб и Вы тоже... того...
16 unregistered
 
31.12.14
09:51
(0) Если я правильно понял задачу, то речь идёт о стандартном фукнционале регистра расчета.
Требуемая таблица - есть не что иное как таблица фактический периодов действия по всем видам расчета.

Если я прав, то нафига тут вообще велосипед?
17 SleepyHead
 
гуру
31.12.14
10:53
(16) Затем, что это 1с 7.7.

Можно поработать с журналом расчетов, но знает ли об этом автор темы, нам неизвестно.
18 Марфа Васильевна
 
02.01.15
07:00
и вас с Новым годом.
(16) нет, речь не идёт о регистрах. это Зарплата и Кадры. там не регистры и оперативный учёт, а расчет. катайтесь на велосипеде.
(17) таблица значений была получена путём работы с журналом расчетов. да, автор близко знаком с журналами расчетов. и Вы блесной блеснули, поздравляю.
вам заняться, похоже, нечем.
спасибо Злопчинскому - всё работает.
19 Vladal
 
13.01.15
20:13
(6) Я бы сортировал обе колонки - наало и конец периода.
20 GreyK
 
13.01.15
22:12
(11) Ты это хотел сделать?
Функция ДополнитьПериоды(ТЗ1,ДатаНачала,ДатаОкончания)
    Перем ТекНачало;
    ТЗ2 =СоздатьОбъект("ТаблицаЗначений");
    ТЗ1.Выгрузить(ТЗ2,,,);
    ТЗ2.УдалитьСтроки();
    ТекНачало = ДатаНачала;
    ТЗ1.Сортировать("ДатаНачала");
    ТЗ1.ВыбратьСтроки();
    Пока ТЗ1.ПолучитьСтроку() = 1 Цикл
        Если ТЗ1.ДатаНачала > ТекНачало Тогда
            ТЗ2.НоваяСтрока();
            ТЗ2.ДатаНачала = ТекНачало;
            ТЗ2.ДатаОкончания = ТекНачало - 1;
        КонецЕсли;
        ТЗ2.НоваяСтрока();
        ТЗ2.ДатаНачала = ТЗ1.ДатаНачала;
        ТЗ2.ДатаОкончания = ТЗ1.ДатаОкончания;
        // Здесь какое-то бла-бла по передаче дополнительных реквизитов из ТЗ1 в ТЗ2
        ТекНачало = ТЗ1.ДатаОкончания + 1;
    КонецЦикла;
    Если ТекНачало < ДатаОкончания Тогда
        ТЗ2.НоваяСтрока();
        ТЗ2.ДатаНачала = ТекНачало;
        ТЗ2.ДатаОкончания = ДатаОкончания;
    КонецЕсли;
    Возврат ТЗ2;
КонецФункции // ДополнитьПериоды()
21 Злопчинский
 
13.01.15
22:20
(20)  хз что эта функция делает
Я написал то что тс попросил
Смайл
22 GreyK
 
13.01.15
22:24
(21) Со Старым Новым Годом! :)
23 Злопчинский
 
13.01.15
22:28
(22) будь здоров не чихай