|
Решение расчетных задач. | ☑ | ||
---|---|---|---|---|
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
|
Всем спасибо! Все получилось!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |