Имя: Пароль:
1C
1С v8
книга Решение расчетных задач не хватает памяти
0 lesstat
 
13.05.12
10:08
проц Core 2 Duo памяти 2 гига.  По книге "Конфигурирование в системе 1с:предприятие 8 решение расчетных задач" создал справочник "график работы" далее по книге его просят заполнить  за 2006 и 2007 годы, там кнопка есть для этого, но когда запускаю аполнение выходит ошибка не хватает памяти. пробывал даже за неделю заполнить , все равно такая же ошибка. Кто с этим сталкивался, ведь многие наверное учились по этой книге?
1 lesstat
 
13.05.12
10:08
зы движок 1С 8.2 , управляемое приложение отключил
2 НовыйАдмин
 
13.05.12
10:13
Скорее всего зацикливание где-то у тебя. Скинь код кнопки, искать книжку долго.
3 lesstat
 
13.05.12
10:22
////СамаКнопка
Процедура КоманднаяПанельКалендаряЗаполнитьНажатие(Элемент)
   
   Если ЭтоНовый() Тогда
       Предупреждение("Перед заполнением график необходимо записать!");
       Возврат
   КонецЕсли;
   ИнтервалПоказа = Новый НастройкаПериода();
   ИнтервалПоказа.ДатаНачала = Календарь.Отбор.Дата.ЗначениеС;
   ИнтервалПоказа.ДатаОкончания = Календарь.Отбор.Дата.ЗначениеПо;
   ИнтервалПоказа.ВариантНачала = ВариантГраницыИнтервала.КонкретнаяДата;
   ИнтервалПоказа.ВариантОкончания = ВариантГраницыИнтервала.КонкретнаяДата;
   //Вызываем диалог длч выбора интервала
   Если ИнтервалПоказа.Редактировать() Тогда
       ЗаполнитьКалендарьЗаИнтервал(ИнтервалПоказа);
   Иначе
       Возврат;
   КонецЕсли;
КонецПроцедуры

/////ОстальныеПроцедуры в этой же форме

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



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

Функция ДеньЯвляетсяРабочим(ПроверяемаяДата)
   Возврат   ?(Найти(ВыходныеДни,Строка(деньнедели(ПроверяемаяДата))) >0,Ложь,Истина);
КонецФункции



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


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

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

Пока ТекущийДень < ДатаОкончанияИнтервала Цикл                                    
   НовыйДень = НаборЗаписейКалендарь.Добавить();
   НовыйДень.ГрафикРаботы = Ссылка;
   Если деньЯвляетсярабочим(ТекущийДень) Тогда
       НовыйДень.Значение = 1;
   Иначе
       НовыйДень.Значение = 0;
   КонецЕсли;
   НовыйДень = ТекущийДень+сДлинаСуток;
КонецЦикла;

В конце НовыйДень присваиваешь, а цикл по переменной ТекущийДень
6 lesstat
 
13.05.12
10:29
спасибо посмотрю, отпишусь
7 lesstat
 
14.05.12
16:35
(5) Изменил, всеравно вылетает не хватает памяти
8 aleks-id
 
14.05.12
16:37
(7) код в студию
9 aleks-id
 
14.05.12
16:38
по идее надо
ТекущийДень = КонецДня(ТекущийДень)+1;
10 lesstat
 
14.05.12
17:45
Капец, куда смотрел когда с книги код переписывал не знаю, надо было

НаборЗаписейКалендаь.Записать()


толко теперь при нажатии заполнитть выходит сообщение (причем за любой период)
запись с такими ключевыми полями уже существует ГрафикРаботы(Это регистр сведений) номер строки 2, хотя захожу в этот регистр а он вообще пустой нет там записей вообще
11 НовыйАдмин
 
14.05.12
19:13
Так поставь в отладчике остановку по ошибке и посмотри что за значения для начала.
12 lesstat
 
14.05.12
19:55
все решилось
13 НовыйАдмин
 
14.05.12
20:23
В чем был косяк нашел или просто заново написал по книге?