Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Решение расчетных задач.

Решение расчетных задач.
Я
   leslie197
 
27.12.12 - 01:37
Добрый день. Столкнулся с такой проблемой. При записи в регистр сведений 1С вылетает с ошибкой:Ошибка при вызове метода контекста(Записать)в модуле Справочник.ГрафикиРаботы.Модульобъекта. Бьюсь длительное время,не могу понять в чем дело. Я в этом деле начинаю, надеюсь на помощь. Листинги кода прилагаю.

Процедура ЗаполнитьКалендарьЗаИнтервал(Интервал) Экспорт
    сДлинаСуток =86400;//в секундах
 
    ДатаНачалаИнтервала=Интервал.ПолучитьДатуНачала();
    ДатаОкончанияИнтервала=Интервал.ПолучитьДатуОкончания();
    текущийДень=ДатаНачалаИнтервала;
    НаборЗаписейКалендарь=РегистрыСведений.ГрафикРаботы.СоздатьНаборЗаписей();
    НаборЗаписейКалендарь.Отбор.ГрафикРаботы.Использование=Истина;
    НаборЗаписейКалендарь.Отбор.Дата.Использование=Истина;
        НаборЗаписейКалендарь.Прочитать();
    ЗаписейВНаборе=НаборЗаписейКалендарь.Количество()-1;
    Для инд=0 по ЗаписейВНаборе цикл
        ДеньКалендаря=НаборЗаписейКалендарь[инд];
        если ДеньКалендаря.Дата<ДатаНачалаИнтервала тогда
            продолжить;
        иначеесли ДеньКалендаря.Дата=ТекущийДень тогда
            если ДеньЯвляетсяРабочим(текущийДень) тогда
            ДеньКалендаря.Значение = 1;
        иначе 
            ДеньКалендаря.Значение=0;
        КонецЕсли;
        текущийДень=текущийДень+сДлинаСуток;
        
    иначе
        пока текущийДень<Мин(ДеньКалендаря.Дата,ДатаОкончанияИнтервала) цикл
            НовыйДень=НаборЗаписейКалендарь.Добавить();
            НовыйДень.ГрафикРаботы=Ссылка;
            НовыйДень.Дата=текущийДень;
            Если ДеньЯвляетсяРабочим(текущийДень) тогда
                НовыйДень.ЗначениеГрафика=1 ;
            Иначе
                НовыйДень.ЗначениеГрафика=0  ;
            КонецЕсли;
            текущийДень=текущийДень+сДлинаСуток;
        КонецЦикла;
        если ДеньКалендаря.Дата>ДатаОкончанияИнтервала тогда
            прервать
            
        иначеесли ДеньЯвляетсяРабочим(текущийДень) тогда
            ДеньКалендаря.ЗначениеГрафика =1
        Иначе
            ДеньКалендаря.ЗначениеГрафика=0
        КонецЕсли;
        текущийДень=текущийДень+сДлинаСуток;
        КонецЕсли;
    КонецЦикла;
    пока текущийДень<ДатаОкончанияИнтервала цикл
        НовыйДень=НаборЗаписейКалендарь.Добавить();
        НовыйДень.ГрафикРаботы=Ссылка;
        если ДеньЯвляетсяРабочим(текущийДень) Тогда 
            НовыйДень.ЗначениеГрафика=1;
        Иначе
            НовыйДень.ЗначениеГрафика=0;
        КонецЕсли;
        НовыйДень.Дата=текущийДень;
        текущийДень=текущийДень+сДлинаСуток;
        
    КонецЦикла;
      НаборЗаписейКалендарь.Записать();
    
   КонецПроцедуры
Функция ДеньЯвляетсяРабочим(ПроверяемаяДата)
    Возврат   ?(Найти(ВыходныеДни,Строка(деньнедели(ПроверяемаяДата))) >0,Ложь,Истина);
КонецФункции

НаборЗаписейКалендарь.Записать();-в этом месте и вылетает по ошибке. Код размещен в модуле объекта. Вот остальные процедуры,в модуле формы,на всякий случай:


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




 ///////////////////
 
 
Процедура ДниНеделиПриИзмененииПометки(Элемент)
    ЭлементСписка = Элемент.ТекущаяСтрока;
    Если ЭлементСписка.Пометка Тогда
        Если Найти(ВыходныеДни,ЭлементСписка.Значение) = 0 Тогда
            ВыходныеДни = ВыходныеДни + ЭлементСписка.Значение;
        КонецЕсли;
    Иначе
        ВыходныеДни = СтрЗаменить(ВыходныеДни,ЭлементСписка.Значение,"");
    КонецЕсли;
КонецПроцедуры


 //////////////////////
 
 
ПРоцедура УстановитьОтборВКалендаре(ДатаНачалаИнтервалаКалендаря,ДатаОкончанияКалендаря)
    
    Календарь.Отбор.Дата.ЗначениеС = ДатаНачалаИнтервалаКалендаря;
    Календарь.Отбор.Дата.ЗначениеПо = ДатаОкончанияКалендаря;
    Если НЕ ЗначениеЗаполнено(ДатаНачалаИнтервалаКалендаря) и НЕ ЗначениеЗаполнено(ДатаОкончанияКалендаря) Тогда
        Календарь.Отбор.Дата.Использование = Ложь;
    Иначе
        Если НЕ ЗначениеЗаполнено(ДатаНачалаИнтервалаКалендаря) Тогда
            Календарь.Отбор.Дата.ВидСравнения = ВидСравнения.МеньшеИЛИРавно;
        ИначеЕсли Не ЗначениеЗаполнено(ДатаОкончанияКалендаря) Тогда
            Календарь.Отбор.Дата.ВидСравнения = ВидСравнения.БольшеИлиРавно;
        Иначе
            Календарь.Отбор.Дата.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
        КонецЕсли;
        Календарь.Отбор.Дата.Использование = Истина;
    КонецЕсли;
    
    
КонецПроцедуры
 /////////////////////////
 
 

Процедура ПриОткрытии()
    ТекущийДень = НачалоНедели(ТекущаяДата())// начнем с понедельника
 
 
    сДлинаСуток = 86400;//в секундах
 
 
    Для Сч = 1 по 7 Цикл
        НазваниеДняНедели = Формат(ТекущийДень,"ДФ=дддд");
        ДниНедели.Добавить(Строка(ДеньНедели(ТекущийДень)),Врег(Лев(НазваниеДняНедели,1))+Сред(НазваниеДняНедели,2));
        ТекущийДень = ТекущийДень + сДлинаСуток;
    КонецЦикла;
    
   // расставляем пометки для выходных дней графика
 
 
    
    Для Сч=1 ПО СтрДлина(ВыходныеДни) Цикл
        ДниНедели.НайтиПоЗначению(Сред(ВыходныеДни,Сч,1)).Пометка = Истина;
    КонецЦикла;
    
   //Выставляем отбор в списке дней календаря(регистр сведений)
 
 
   //отбираем дни нашего графика
 
 
    
    Календарь.Отбор.ГрафикРаботы.Установить(Ссылка);
    
   //отбираем дни текущего месяца
 
 
    УстановитьОтборВКалендаре(НачалоМесяца(ТекущаяДата()),КонецМесяца(ТекущаяДата()));
    
КонецПроцедуры

Процедура КоманднаяПанельКалендаряЗаполнить(Элемент)
Если ЭтоНовый() Тогда
        Предупреждение("Перед заполнением график необходимо записать!");
        Возврат
    КонецЕсли;
    ИнтервалПоказа = Новый НастройкаПериода();
    ИнтервалПоказа.ДатаНачала = Календарь.Отбор.Дата.ЗначениеС;
    ИнтервалПоказа.ДатаОкончания = Календарь.Отбор.Дата.ЗначениеПо;
    ИнтервалПоказа.ВариантНачала = ВариантГраницыИнтервала.КонкретнаяДата;
    ИнтервалПоказа.ВариантОкончания = ВариантГраницыИнтервала.КонкретнаяДата;
   //Вызываем диалог длч выбора интервала
 
 
    Если ИнтервалПоказа.Редактировать() Тогда
        ЗаполнитьКалендарьЗаИнтервал(ИнтервалПоказа);
    Иначе
        Возврат;
    КонецЕсли;
    
КонецПроцедуры


Заранее спасибо за помощь.
 
 
   mistеr
 
1 - 27.12.12 - 01:56
Что за ошибка-то? Кнопку Подробно не нажимал?
   leslie197
 
2 - 27.12.12 - 09:20
Если с остановкой отладки при ошибке-ошибка времени выполнения:Ошибка при вызове метода контекста(Записать)в модуле Справочник.ГрафикиРаботы.Модульобъекта.

Если убрать остановку по ошибке:{Справочник.ГрафикиРаботы.МодульОбъекта(152)}: Ошибка при вызове метода контекста (Записать)
      НаборЗаписейКалендарь.Записать();
по причине:
Запись не верна! Значение поля не соответствует установленному отбору: ГрафикРаботы: 01.01.2012 0:00:00, Пятидневка (Регистр сведений: График работы; Поле: Дата).

Но никаких записей в регистре нет. По идее,где то раньше ошибка?
   samozvanec
 
3 - 27.12.12 - 09:28
На поле дата обрати внимание, как оно заполняется
   Axel2009
 
4 - 27.12.12 - 09:31
(0) хыхы. тебе надо записывать каждую дату в отдельности, а не после всего
   leslie197
 
5 - 27.12.12 - 09:37
Я так понял, запись в регистр загнать в цикл? С датой все нормально, значение есть,тип дата(правда одно,а не список).
   Axel2009
 
6 - 27.12.12 - 09:38
(5) да, записи в регистр работают по одному строгому отбору. там нельзя указать список значений.
   Buster007
 
7 - 27.12.12 - 09:39
НаборЗаписейКалендарь.Отбор.ГрафикРаботы.Использование=Истина;

вместо этого, лучше использовать НаборЗаписейКалендарь.Отбор.ГрафикРаботы.Установить(ЗначениеОтбора)

А так у тебя ещё одной строки не хватает НаборЗаписейКалендарь.Отбор.ГрафикРаботы.Значение = КакоеТоЗначениеОтбора;
   leslie197
 
8 - 27.12.12 - 20:15
Всем спасибо! Все получилось!

Список тем форума
Рекламное место пустует  Рекламное место пустует
Программист всегда исправляет последнюю ошибку.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует