Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
1

Формирование движений

11.05.2016, 12:48. Просмотров 634. Ответов 15
Метки нет (Все метки)

Всем добрый день, помогите разобраться, в программировании 1С я новичек, проблема такая: Есть у меня отчет который выводит данные по документам из регистра сведений, такие как Дата начал Дата окончания Автомобиль и его статус. Статус изменяется от текущего времени допустим документ разнарядка на рейс сформировал статус " В рейсе" на конкретный период или документ ремонт статус "ремонт", вопрос такой как сделать так что бы между датами в которых нет никаких действий , формировать статус " Свуободен" , как я понял необходимо делать 2 движения каждым документом на конкретный промежуток документа и после его на начало окончания действия предыдущего.
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
СостояниеАвто = Перечисления.СостояниеАвтомобиля.Свободен;
 
    Движения.СостояниеАвтомобиля.Записывать = Истина;
    Движение = Движения.СостояниеАвтомобиля.Добавить();
    Движение.Период = Дата;
    Движение.Автомобиль = Автомобиль;
    Движение.Механик = 1;
    Движение.ДатаНачала = ДатаОтправления;
    Движение.ДатаОкончания = ДатаПрибытия;
    Движение.Состояние = СостояниеАвтомобиля;
    
 
    Движения.СостояниеАвтомобиля.Записывать = Истина;
    Движение = Движения.СостояниеАвтомобиля.Добавить();
    Движение.Период = Дата;
    Движение.Автомобиль = Автомобиль;
    Движение.Механик = 1;
    Движение.ДатаНачала = ДатаПрибытия;
    Движение.ДатаОкончания = ?
    Движение.Состояние = СостояниеАвто;
Подскажите какую дату брать или как это можно сделать по другому?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2016, 12:48
Ответы с готовыми решениями:

Формирование движений без перепроведения документов
Добрый день! Конфигурация Управление торговлей, редакция 11.1.6.17. Создал регистр накопления,...

Нет движений по расходной накладной по РБ
Не могу понять, почему расходная накладная не делает движения по РБ Управленческий....

Выбор значения в зависимости от типа движений
Всем привет! Пытаюсь собрать свою конфигурацию. 1С 8.3 В управляемом приложении Документ РКО....

Ошибки при записи движений документа в регистр накопления
Здравствуйте. Есть собственная конфигурация 1С 8.3 по планированию и учету проектов. В Конфигурации...

Удаление движений при установке отметки удаления
Я пока не профи по 1С..... Есть у меня такая задача - создать так, чтобы при установке отметки...

15
GreenkA
Форумчанин
Эксперт 1С
3003 / 1923 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
11.05.2016, 14:22 2
Winlll, а зачем вам столько дат? Делайте просто одно движение со статусом "В рейсе", в Период записи будете записывать ДатаОтправления; вторая запись - "Свободен", Период - ДатаПрибытия.
У вас периодический регистр, тогда по СрезуПоследних() на дату в промежутке между ДатаОтправления и ДатаПрибытия будете получать статус "В рейсе", а после ДатаПрибытия - "Свободен".
0
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
11.05.2016, 14:38  [ТС] 3
Извините , я вас не совсем понял, как можно меньше дат сделать, у меня есть 4 документа по которым происходят изменение "состостояния" это " В рейсе" "Запланирован рейс" Ремонт и плановый ремонт , Операция срез последних мне найдет последнюю запись по регистру , но между этими датами ( в рейсе и запланирован рейс на такую то дату" могут быть и другие к примеру ремонт. Или я что то не понимаю?
0
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
11.05.2016, 15:38  [ТС] 4
Может я что то не так объяснил, попробую по конкретнее . есть документы которые вносят в регистр сведения состояния , ремонт вносит "ремонт" на период в который будет происходить ремонт и т.д.. Мне необходимо чтобы между датами где нет никаких состояний автоматически записывалось состояние " Свободен". Грубо говоря всегда стоит статус " Свободен" а документы вытесняют это значение на свое.
0
Миниатюры
Формирование движений  
11.05.2016, 15:38
GreenkA
Форумчанин
Эксперт 1С
3003 / 1923 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
11.05.2016, 15:52 5
Winlll, ну так в чем проблема? я все верно вам предложила.
Регистр будет иметь структуру: Период(периодический регистр), Автомобиль, Механик, Состояние.
1. Например, у вас машина отправила в рейс, в документе будут ДатаНачала = 01.05.2016, ДатаОкончания(прибытия) = 03.05.2016. Делаем этим документом две записи в регистр, первую на ДатуНачала, вторую на ДатуОкончания:
1C
1
2
3
4
5
6
7
8
9
10
11
Движение = Движения.СостояниеАвтомобиля.Добавить();
    Движение.Период = ДатаНачала;
    Движение.Автомобиль = Автомобиль;
    Движение.Механик = 1;
    Движение.Состояние = Перечисления.СостояниеАвтомобиля.ВРейсе;
 
Движение = Движения.СостояниеАвтомобиля.Добавить();
    Движение.Период = ДатаОкончания;
    Движение.Автомобиль = Автомобиль;
    Движение.Механик = 1;
    Движение.Состояние = Перечисления.СостояниеАвтомобиля.Свободен;
2. Потом машина была в ремонте с 05.05.2016(ДатаНачала документа) по 07.05.2016(ДатаОкончания), делаем и этим документов две записи в регистр:
1C
1
2
3
4
5
6
7
8
9
10
11
Движение = Движения.СостояниеАвтомобиля.Добавить();
    Движение.Период = ДатаНачала;
    Движение.Автомобиль = Автомобиль;
    Движение.Механик = 1;
    Движение.Состояние = Перечисления.СостояниеАвтомобиля.ВРемонте;
 
Движение = Движения.СостояниеАвтомобиля.Добавить();
    Движение.Период = ДатаОкончания;
    Движение.Автомобиль = Автомобиль;
    Движение.Механик = 1;
    Движение.Состояние = Перечисления.СостояниеАвтомобиля.Свободен;
Таким образом СрезПоследних() на даты 03.05.2016 - 04.05.2016 покажет статус - Свободен. с 05.05.2016 по 06.05.2016 - в ремонте, на сегодняшнюю дату - Свободен.

Добавлено через 3 минуты
Winlll, на всякий случай: покажите код заполнения диаграммы Ганта.
0
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
11.05.2016, 16:44  [ТС] 6
1C
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
32
33
34
35
36
37
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   СостояниеАвтомобиля.Автомобиль,
        |   СостояниеАвтомобиля.ДатаНачала,
        |   СостояниеАвтомобиля.ДатаОкончания,
        |   СостояниеАвтомобиля.Состояние
        |ИЗ
        |   РегистрСведений.СостояниеАвтомобиля КАК СостояниеАвтомобиля";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
 
    
     ДиаграммаГанта.АвтоОпределениеПолногоИнтервала=Ложь;
 
    ДиаграммаГанта.УстановитьПолныйИнтервал(НачалоМесяца(ТекущаяДата()),КонецМесяца(ТекущаяДата())); 
    
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Точка = ДиаграммаГанта.УстановитьТочку(ВыборкаДетальныеЗаписи.Автомобиль);
        Серия = ДиаграммаГанта.УстановитьСерию(ВыборкаДетальныеЗаписи.Состояние);
        
        Значение = ДиаграммаГанта.ПолучитьЗначение(Точка, Серия);
        Интервал = Значение.Добавить();
        
        
        Интервал.Начало = ВыборкаДетальныеЗаписи.ДатаНачала;
        Интервал.Конец  = ВыборкаДетальныеЗаписи.ДатаОкончания;
 
        //Интервал.Начало = НачалоМесяца(ТекущаяДата());
        //Интервал.Конец  = КонецМесяца(ТекущаяДата());
 
 
    КонецЦикла;
Диаграмма Ганта таким образом выглядит, но и все таки я никак не могу понять , где взять вторую дату, Дата начала документа и конец это да понятно, но как для второй записи в регистр конец и начало определить определить взять по идее следующюю возможную запись в регистре, но у меня не получается. Тоесть ремонт -свободен(До встретившейся записи "рейс или ремонт другой" )- что то никак до меня дойти не может как обратиться к регистру за строкой со следующей датой.
0
GreenkA
Форумчанин
Эксперт 1С
3003 / 1923 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
11.05.2016, 17:04 7
Winlll, попробуйте сделать движения, как я писала выше и диаграмму Ганта заполнять так(вынесите на форму поля для отбора по датам ДатаНачала и ДатаОкончания):
1C
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
32
33
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|   СостояниеАвтомобиля.Автомобиль,
|   СостояниеАвтомобиля.Период,
|   СостояниеАвтомобиля.Состояние
|ИЗ
|   РегистрСведений.СостояниеАвтомобиля КАК СостояниеАвтомобиля
|ГДЕ
|СостояниеАвтомобиля.Период >= &ДатаНачала И СостояниеАвтомобиля.Период <= &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
РезультатЗапроса = Запрос.Выполнить();
 
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ДиаграммаГанта.АвтоОпределениеПолногоИнтервала=Ложь;
 
ДиаграммаГанта.УстановитьПолныйИнтервал(ДатаНачала,ДатаОкончания); 
Интервал = Неопределено;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Если Интервал <> Неопределено Тогда
        Интервал.Конец  = ВыборкаДетальныеЗаписи.Период;
    КонецЕсли;
    
    Точка = ДиаграммаГанта.УстановитьТочку(ВыборкаДетальныеЗаписи.Автомобиль);
    Серия = ДиаграммаГанта.УстановитьСерию(ВыборкаДетальныеЗаписи.Состояние);     
    Значение = ДиаграммаГанта.ПолучитьЗначение(Точка, Серия);
    Интервал = Значение.Добавить();      
    Интервал.Начало = ВыборкаДетальныеЗаписи.Период;
КонецЦикла;
Если Интервал <> Неопределено Тогда
    Интервал.Конец  = ДатаОкончания;
КонецЕсли;
0
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
12.05.2016, 12:30  [ТС] 8
GreenkA, Извиняюсь конечно, но что то у меня не выходит сделать таким образом при формировании Диаграммы выдает ошибку
1C
1
ДиаграммаГанта.УстановитьПолныйИнтервал(ДатаНачала,ДатаОкончания);
"Неверно указаны параметры 1" изменил на конкретный интервал на текущий месяц
1C
1
ДиаграммаГанта.УстановитьПолныйИнтервал(НачалоМесяца(ТекущаяДата()),КонецМесяца(ТекущаяДата()));
, но при формировании диаграммы выходит ошибка невозможно осуществить вывод результата, а по регистру вроде все хорошо получается.
0
GreenkA
Форумчанин
Эксперт 1С
3003 / 1923 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
12.05.2016, 12:42 9
Winlll, это самописная конфигурация? можете выложить?
0
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
12.05.2016, 12:47  [ТС] 10
Да самописная.
0
Вложения
Тип файла: 7z 1c.8.3.UF.7z (3.82 Мб, 1 просмотров)
Xomych
814 / 621 / 102
Регистрация: 01.11.2012
Сообщений: 2,264
12.05.2016, 12:51 11
По хорошему у вас каждое изменение состояния должно отражаться документом. Ушёл в рейс один документ - состояние "в рейсе". Пришёл из рейса другой документ - состояние "Свободен". Аналогично с ремонтом.
А то предполагать одно, а в жизни всё по-другому. детали там не привезли или сломался в рейсе. Каждый раз документы будете переделывать?
По сути это в конфигурации может быть один вид документа, просто с разными видами (В рейсе, из рейса, в ремонт, из ремонта)
0
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
12.05.2016, 12:56  [ТС] 12
Xomych, я только начинаю, разберусь как делать так, а дальше буду улучшать и дорабатывать, а так это я все делал к тому чтобы можно было ориентировочно узнать в какие даты , автомобиль ( по плану ) в каком состоянии находится. Чтобы планировать к примеру диспетчеру работу.
0
GreenkA
Форумчанин
Эксперт 1С
3003 / 1923 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
12.05.2016, 13:31 13
Winlll, надо было перед формированием установить ДатаНачала и ДатаОкончания.

1C
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ДатаНачала = НачалоМесяца(ТекущаяДата());
    ДатаОкончания = КонецМесяца(ТекущаяДата());
    СформироватьДиаграмму();
КонецПроцедуры
 
&НаСервере
Процедура СформироватьДиаграмму()
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |   СостояниеАвтомобиля.Автомобиль,
    |   СостояниеАвтомобиля.Период,
    |   СостояниеАвтомобиля.Состояние
    |ИЗ
    |   РегистрСведений.СостояниеАвтомобиля КАК СостояниеАвтомобиля
    |ГДЕ
    |СостояниеАвтомобиля.Период >= &ДатаНачала И СостояниеАвтомобиля.Период <= &ДатаОкончания";
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    ДиаграммаГанта.АвтоОпределениеПолногоИнтервала=Ложь;
    
    ДиаграммаГанта.УстановитьПолныйИнтервал(ДатаНачала,ДатаОкончания); 
    
    Интервал = Неопределено;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если Интервал <> Неопределено Тогда
            Интервал.Конец  = ВыборкаДетальныеЗаписи.Период;
        КонецЕсли;
        
        Точка = ДиаграммаГанта.УстановитьТочку(ВыборкаДетальныеЗаписи.Автомобиль);
        Серия = ДиаграммаГанта.УстановитьСерию(ВыборкаДетальныеЗаписи.Состояние);     
        Значение = ДиаграммаГанта.ПолучитьЗначение(Точка, Серия);
        Интервал = Значение.Добавить();      
        Интервал.Начало = ВыборкаДетальныеЗаписи.Период;
    КонецЦикла;
    Если Интервал <> Неопределено Тогда
        Интервал.Конец  = ДатаОкончания;
    КонецЕсли;
КонецПроцедуры
 
&НаКлиенте
Процедура ДатаНачалаПриИзменении(Элемент)
    СформироватьДиаграмму();
КонецПроцедуры
 
&НаКлиенте
Процедура ДатаОкончанияПриИзменении(Элемент)
    СформироватьДиаграмму();
КонецПроцедуры
0
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
12.05.2016, 13:39  [ТС] 14
GreenkA, Спасибо большое думаю дальше разберусь как ни будь) вы очень помогли!
0
GreenkA
Форумчанин
Эксперт 1С
3003 / 1923 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
12.05.2016, 13:41 15
Winlll, только процедуру формирования лучше изменить: в запросе сделать итоги по авто и упорядочить по периоду. А то в диаграмме получается, обсекается интервал состояния, должен идти до конца периода, если ничего не изменилось:
1C
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
&НаСервере
Процедура СформироватьДиаграмму()
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |   СостояниеАвтомобиля.Автомобиль КАК Автомобиль,
    |   СостояниеАвтомобиля.Период КАК Период,
    |   СостояниеАвтомобиля.Состояние
    |ИЗ
    |   РегистрСведений.СостояниеАвтомобиля КАК СостояниеАвтомобиля
    |ГДЕ
    |   СостояниеАвтомобиля.Период >= &ДатаНачала
    |   И СостояниеАвтомобиля.Период <= &ДатаОкончания
    |
    |УПОРЯДОЧИТЬ ПО
    |   Автомобиль,
    |   Период
    |ИТОГИ ПО
    |   Автомобиль";
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    РезультатЗапроса = Запрос.Выполнить();
    
    Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    ДиаграммаГанта.АвтоОпределениеПолногоИнтервала=Ложь;
    
    ДиаграммаГанта.УстановитьПолныйИнтервал(ДатаНачала,ДатаОкончания); 
    
    Пока Выборка.Следующий() Цикл
        ВыборкаДетальныеЗаписи = Выборка.Выбрать();
        Интервал = Неопределено;
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Если Интервал <> Неопределено Тогда
                Интервал.Конец  = ВыборкаДетальныеЗаписи.Период;
            КонецЕсли;
            Точка = ДиаграммаГанта.УстановитьТочку(ВыборкаДетальныеЗаписи.Автомобиль);
            Серия = ДиаграммаГанта.УстановитьСерию(ВыборкаДетальныеЗаписи.Состояние);     
            Значение = ДиаграммаГанта.ПолучитьЗначение(Точка, Серия);
            Интервал = Значение.Добавить();      
            Интервал.Начало = ВыборкаДетальныеЗаписи.Период;
        КонецЦикла;
        Если Интервал <> Неопределено Тогда
            Интервал.Конец  = ДатаОкончания;
        КонецЕсли;
    КонецЦикла;
    Если Интервал <> Неопределено Тогда
        Интервал.Конец  = ДатаОкончания;
    КонецЕсли;
КонецПроцедуры
И на кнопку "Сформировать" повесить эту процедуру. У вас ничего не происходит по кнопке.
0
Winlll
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 12
12.05.2016, 13:47  [ТС] 16
GreenkA, Спасибо, я именно это сейчас и сделал.
0
12.05.2016, 13:47
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2016, 13:47

Задание условий для движений документа по регистрам
Друзья, помогите плиз! Имеется документ с двумя реквизитами, пусть будет РЕК1 и РЕК2 оба...

Как получить актуальные остатки по регистру накопления в обработке провед документа с учетом его движений
Народ, подскажите как при проведении документа через ОбработкуПроведения (процедура проведения в...

Визуализация движений
Дали задачу визуализировать физические упражнения (желательно в 3Д). Как это можно сделать, где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.