Имя: Пароль:
1C
 
Регистр сведений. Ошибка при вызове метода контекста (Записать)
,
0 pro3ri
 
10.11.15
08:12
Добрый день!
Есть такой код:

    Набор =  РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    Набор.Прочитать();
    Если Набор.Количество()>0 Тогда
        Набор.Отбор.Дата.ЗначениеС = НачалоПериода;
        Набор.Отбор.Дата.ЗначениеПо = КонецПериода;
        Набор.Отбор.Дата.Использование = Истина;
        Набор.Прочитать();
        Набор.Очистить();
        
        //Если Набор.Количество()>0 Тогда
        //    Добавлять = Ложь;
        //Иначе  
        //    Добавлять = Истина;
        //КонецЕсли;
    //Иначе
    //    Добавлять = Ложь;
    КонецЕсли;
    
    Если ТипГрафика = Справочники.ТипыГрафиков.НайтиПоНаименованию("Пятидневка") Тогда
        
        ТекущаяДата = НачалоДня(НачалоПериода);
        Пока ТекущаяДата<=КонецПериода Цикл
            Если ДеньНедели(ТекущаяДата)<6 Тогда
            
                Запись = Набор.Добавить();
                Запись.Дата = ТекущаяДата;
                Запись.Значение = 1;
                Запись.График = ТипГрафика;
            Иначе
                Запись = Набор.Добавить();
                Запись.Дата = ТекущаяДата;
                Запись.Значение = 0;
                Запись.График = ТипГрафика;
            
            КонецЕсли;
            
            ТекущаяДата = ТекущаяДата + 60*60*24;
        КонецЦикла;
    ИначеЕсли ТипГрафика = Справочники.ТипыГрафиков.НайтиПоНаименованию("Шестидневка") Тогда
            
        ТекущаяДата = НачалоДня(НачалоПериода);
        Пока ТекущаяДата<=КонецПериода Цикл
            Если ДеньНедели(ТекущаяДата)<7 Тогда
            
                Запись = Набор.Добавить();
                Запись.Дата = ТекущаяДата;
                Запись.Значение = 1;
                Запись.График = ТипГрафика;
            Иначе
                Запись = Набор.Добавить();
                Запись.Дата = ТекущаяДата;
                Запись.Значение = 0;
                Запись.График = ТипГрафика;
            
            КонецЕсли;
            
            ТекущаяДата = ТекущаяДата + 60*60*24;    
        КонецЦикла;    
    
    КонецЕсли;

        Набор.Записать(Ложь);

на моменте Записи выдает ошибку, {Обработка.ЗаполнениеГрафика.Форма.Форма.Форма(69)}: Ошибка при вызове метода контекста (Записать)
        Набор.Записать(Ложь);
по причине:
Запись не верна! Значение поля не соответствует установленному отбору: ГрафикиРаботы: Шестидневка, 01.01.2010 0:00:00 (Регистр сведений: Графики работы; Номер строки: 1; Поле: Дата)

Смотрю отладчиком, у меня на момент записи по Отбору Дата Свойство Использование установлено в положение Истина. Как побороть?
1 NcSteel
 
10.11.15
08:15
А причем тут использовать? Речь об "ГрафикиРаботы"
2 cw014
 
10.11.15
08:16
У отбора регистра сведений можно использовать только вид сравнения "равно" на сколько я помню
3 pro3ri
 
10.11.15
09:12
(2) разве?, в регистре сведений есть записи https://s.mail.ru/qrYRcsnvYHEB/img-2015-11-10-11-09-57.png

в обработке пишу

&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервере(НачалоПериода, КонецПериода, ТипГрафика)
    
    Набор =  РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    
    Набор.Отбор.Дата.Использование = Истина;
    Набор.Отбор.Дата.ЗначениеС = НачалоПериода;
    Набор.Отбор.Дата.ЗначениеПо = КонецПериода;
    Набор.Прочитать();

тут в наборе уже пусто (смотрел отладчиком). А вот если забить код:
//Набор.Отбор.Дата.Установить(НачалоПериода);
//Набор.Прочитать();
тут все по отбору Дата = НачалоПериода

Почему не работает отбор ЗначениеС  и ЗначениеПо?
4 cw014
 
10.11.15
09:13
(3) Потому что (2)
5 pro3ri
 
10.11.15
09:28
А как тогда решить следующую задачу:

При нажатии на кнопку «Заполнить» система создает
записи в регистре сведений. Последовательно заполните графики пятидневка и шестидневка за
2009 и 2010 годы. При этом учтите, что при заполнении за 2010 год, данные предыдущего года не
должны удаляться. Пользователь может перезаполнить записи 2009 и 2010 года нажав на кнопку «Заполнить», и указав другой график.

Понятно, первая часть решается Записать (ложь);
а как быть со второй?
6 patria0muerte
 
10.11.15
09:33
(5) Для этих целей в типовых добавляется измерение Год
7 patria0muerte
 
10.11.15
09:35
Т.е. ты в идеале - указываешь в отборе РС - Год и График. Очищаешь и пишешь заполняешь новый график на год.
8 patria0muerte
 
10.11.15
09:35
Вообще - гляди как в типовых сделан РегламентированныйПроизводственныйКалендарь
9 pro3ri
 
10.11.15
09:35
по-моему такой код вообще неоптимален - ракета по воробъям
&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервере(НачалоПериода, КонецПериода, ТипГрафика)
    
    Набор =  РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    //Набор.Прочитать();
    //Если Набор.Количество()>0 Тогда
    
    ТекущаяДата = НачалоДня(НачалоПериода);
    Пока ТекущаяДата<=КонецПериода Цикл
        Набор.Отбор.Дата.Установить(ТекущаяДата);
        ТекущаяДата = ТекущаяДата + 60*60*24;
        Набор.Прочитать();
        Набор.Очистить();
        Набор.Записать();
        Набор.Отбор.Дата.Установить(ТекущаяДата,Ложь);
    КонецЦикла;
    //Набор.Отбор.Дата.Использование = Истина;
    //Набор.Отбор.Дата.ЗначениеС = НачалоПериода;
    //Набор.Отбор.Дата.ЗначениеПо = КонецПериода;
    //Набор.Прочитать();
    //    
    //    //Набор.Отбор.Дата.Установить(НачалоПериода);
    //    //Набор.Прочитать();
    //    Набор.Очистить();
    //    Набор.Записать();
    //    Набор.Отбор.Дата.Использование = Ложь;
    //    //Если Набор.Количество()>0 Тогда
        //    Добавлять = Ложь;
        //Иначе  
        //    Добавлять = Истина;
        //КонецЕсли;
    //Иначе
    //    Добавлять = Ложь;
    //КонецЕсли;
    
    Если ТипГрафика = Справочники.ТипыГрафиков.НайтиПоНаименованию("Пятидневка") Тогда
        
        ТекущаяДата = НачалоДня(НачалоПериода);
        Пока ТекущаяДата<=КонецПериода Цикл
            Если ДеньНедели(ТекущаяДата)<6 Тогда
            
                Запись = Набор.Добавить();
                Запись.Дата = ТекущаяДата;
                Запись.Значение = 1;
                Запись.График = ТипГрафика;
            Иначе
                Запись = Набор.Добавить();
                Запись.Дата = ТекущаяДата;
                Запись.Значение = 0;
                Запись.График = ТипГрафика;
            
            КонецЕсли;
            
            ТекущаяДата = ТекущаяДата + 60*60*24;
        КонецЦикла;
    ИначеЕсли ТипГрафика = Справочники.ТипыГрафиков.НайтиПоНаименованию("Шестидневка") Тогда
            
        ТекущаяДата = НачалоДня(НачалоПериода);
        Пока ТекущаяДата<=КонецПериода Цикл
            Если ДеньНедели(ТекущаяДата)<7 Тогда
            
                Запись = Набор.Добавить();
                Запись.Дата = ТекущаяДата;
                Запись.Значение = 1;
                Запись.График = ТипГрафика;
            Иначе
                Запись = Набор.Добавить();
                Запись.Дата = ТекущаяДата;
                Запись.Значение = 0;
                Запись.График = ТипГрафика;
            
            КонецЕсли;
            
            ТекущаяДата = ТекущаяДата + 60*60*24;    
        КонецЦикла;    
    
    КонецЕсли;
    
    //Если Добавлять Тогда
    
        //Набор.Записать(Ложь);
    //Иначе
        Набор.Записать(Ложь);
    
    //КонецЕсли;
    //Набор.Записать(Ложь);

КонецПроцедуры

&НаКлиенте
Процедура Заполнить(Команда)
    ЗаполнитьНаСервере(Объект.НачалоДатыЗаполнения, Объект.КонецДатыЗаполнения, Объект.ТипГрафика);
КонецПроцедуры
10 pro3ri
 
10.11.15
09:45
Благодарю за совет!
(7) а если это будет не год? Если пятидневка 3 мес и шестидневка 9 мес?
11 patria0muerte
 
10.11.15
10:11
Ну бери период какой тебе надо.
Если помесячно график надо заполнять, то можешь еще измерение с номером месяца добавить. С кварталом также.

Т.е. если просто, то структура регистра такая получается:

Измерения:
- ДатаКалендаря
- Год
- Квартал //Если нужно
- График
Ресурсы:
- Значение (тут или кол-во часов, или булево или что угодно)
12 patria0muerte
 
10.11.15
10:12
В УПП 1.2 сделано вот так:

Измерения:
- ДатаКалендаря
- Год
Ресурсы:
- Пятидневка
- Шестидневка
- КалендарныеДни
- ВидДня
13 pro3ri
 
10.11.15
11:07
спасибо!