Имя: Пароль:
1C
1С v8
Решение расчетных задач.
0 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)).Пометка = Истина;
   КонецЦикла;
   
   //Выставляем отбор в списке дней календаря(регистр сведений)

   //отбираем дни нашего графика

   
   Календарь.Отбор.ГрафикРаботы.Установить(Ссылка);
   
   //отбираем дни текущего месяца

   УстановитьОтборВКалендаре(НачалоМесяца(ТекущаяДата()),КонецМесяца(ТекущаяДата()));
   
КонецПроцедуры

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

   Если ИнтервалПоказа.Редактировать() Тогда
       ЗаполнитьКалендарьЗаИнтервал(ИнтервалПоказа);
   Иначе
       Возврат;
   КонецЕсли;
   
КонецПроцедуры


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

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

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

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

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