Имя: Пароль:
1C
1C 7.7
v7: Получить параметр из обработки.
0 Пенза58
 
06.11.13
13:58
Из документа открываю обработку и надо получить из нее параметр.
1 Wobland
 
06.11.13
13:58
что планируешь делать?
2 Пенза58
 
06.11.13
14:01
(1) просто передаю параметр он там обрабатывается и надо получить результат.
3 Guk
 
06.11.13
14:03
(2) обратно в параметр и передай...
4 Aprobator
 
06.11.13
14:08
(0) в типовых примера куча. Ну взять к примеру туже обработку РедактированиеКонтактнойИнформации.
5 dk
 
06.11.13
14:08
тока тогда открытьмодально надо запускать
6 Aprobator
 
06.11.13
14:09
(5) да ладно.
7 dk
 
06.11.13
14:11
(6) если там не в приоткрытии все отрабатывает и закрывает конечно
8 Aprobator
 
06.11.13
14:18
(7) если при открытии обработки правильно указан элемент владелец, то значение из обработки будет передано непосредственно в него. Например:

Процедура ПриНачалеВыбора(Элемент, СтандартнаяОбработка)
      СтандартнаяОбработка = Ложь;
      ИспользуемаяОбработка = Обработки.ИмяОбработки.Создать();
      ФормаОбработки = ИспользуемаяОбработка.ПолучитьФорму(,Элемент);
ИспользуемаяОбработка.ОткрытьФорму();  
КонецПроцедуры


Ну и в самой обработке прописать ОповеститьОВыборе(ВозвращаемоеЗначение)
9 Aprobator
 
06.11.13
14:19

Процедура ПриНачалеВыбора(Элемент, СтандартнаяОбработка)
      СтандартнаяОбработка = Ложь;
      ИспользуемаяОбработка = Обработки.ИмяОбработки.Создать();
      ФормаОбработки = ИспользуемаяОбработка.ПолучитьФорму(,Элемент);
ИспользуемаяОбработка.Открыть();  
КонецПроцедуры
10 oslokot
 
06.11.13
14:20
(9) речь о клюшках )
11 Cthulhu
 
06.11.13
14:20
ежели модально ея открываешь - то через параметр.
ежели не модально - то сложнее но тоже можно:
1) вызваЮЩая процедура:
1.1) +(невидимый) реквизит "строка неогр.длины многострочный" на морду;
1.2) процедура, которая:
1.2.1) отрубает обработку ожидания (Форма.ОбработкаОжидания("",0);
1.2.2) из реквизита п.1.1 получает (с помощью (ЗначениеИзСтрокиВнутр()) и как надо обрабатывает всё, что вернула открытая обработка
1.3) При открытии формы (немодальном) - передать в параметре свой (открываЮЩей формы) контекст
2) вызваЕМая обработка, при закрытии и по факту необходимости вернуть значение, инициировав действия в отрываЮЩей эту обработку форме:
2.1) Через контекст открываЮЩей формы, дёрнутый из параметра при открытии - иницииорвать в открываЮЩей форме выполнение процедуры п.1.2 обработкой ожинания в 1 секунду - типа "КонтВызываЮЩейФормыИзПараметра.Форма.ОбработкаОжидания("ТаСамаяПроцедураСмПункт1точка2",1);"
2.2) Через тот же контекст открываЮЩей формы, дёрнутый из параметра при открытии - установить в реквизит п.1.1 значение, равное внутреннему представлению объекта (обычно - СЗ), содержащено всьо, что надо вернуть - типа "КонтВызываЮЩейФормыИзПараметра.ТотСамыйРеквизитСмПункт1точка1=ЗначениеВСтрокуВнутр(ОбъектВКоторомВсёШоНадоВернутьОткываЮЩейФормы);"
12 dk
 
06.11.13
14:20
(8) не смущает что тема про 7.7 ? )
13 Aprobator
 
06.11.13
14:21
(10) а, млин ))))
14 Aprobator
 
06.11.13
14:21
+(13) уже фиг знает сколько времени их не использую )
15 Cthulhu
 
06.11.13
14:23
(11)+: опционально (и как правило! мавр сделал своё дело типа):
2.3) Форма.Закрыть(0);
16 Cthulhu
 
06.11.13
14:23
(14): нам всем тут охрененть как интересно знать о твоих личных привязанностях...
17 1dvd
 
06.11.13
14:26
(11) к чему такие сложности?
18 Aprobator
 
06.11.13
14:27
(16) так же как и мне - твое мнение о моих привязанностях. Тебя местные тролли покусали что ли?
19 Пенза58
 
06.11.13
14:27
Проще глобальую переменную добавить.
20 Cthulhu
 
06.11.13
14:32
(17): потому что через переменную не получится. даже через переменную модуля. не веришь - проверь.
и это - вполне себе не сложно и один раз применив уже на автомате и бысто употребимо.
21 Cthulhu
 
06.11.13
14:34
(19) для каждого взаимодействия строго говоря любой пары обработок - корячить глобальник - некрасиво.
использовать только сами обработки - правильнее.
22 Cthulhu
 
06.11.13
14:35
(18): а при условии, что я тут по теме излагаю мнения, а ты топыришь пальцы - угадай, кому из нас с тобой логичнее было бы сдриснуть из этого разговора в пешее эротическое?.. да, ты угадал - тебе.
23 Пенза58
 
06.11.13
14:37
(21) Да это понятно, но такая обработка одна будет.
24 oslokot
 
06.11.13
14:39
(23) дык а модально тебе подойдет иль нет?
25 Aprobator
 
06.11.13
14:39
(22) хамло ты обыкновенное и это безусловно.
26 Пенза58
 
06.11.13
14:43
(24) модально - нет, там чистый код, без форм
27 Cthulhu
 
06.11.13
14:43
(25): ошибаешься, я - гораздо хуже.
28 Aprobator
 
06.11.13
14:48
(26) хм - и что экспортную функцию в обработку, которая возвращает результат работы обработки не впихнуть?
29 oslokot
 
06.11.13
14:50
(26) то есть ты хочешь извне документа обработать некий код и вернуть результат обратно?
30 Aprobator
 
06.11.13
15:18
(27) судя по фигне, предложенной тобой в (11), полностью с тобой согласен.
31 Cthulhu
 
06.11.13
15:55
(30): судя по тупости, не позволяющей тебя осознать прочитанное при рвущем пукан желании потяффкать - тебя можно разве что пожалеть.
32 Aprobator
 
06.11.13
15:58
(31) себя пожалей. Чудо. А вонять вообще на мусорку топай, где тебе самое и место.
33 Aprobator
 
06.11.13
16:09
экспортная функция в данном контексте и все дела.
34 Guk
 
06.11.13
16:41
почитал, интересно тут у вас. короче, правильный ответ в (3).
при открытии формы обработки передается переменная в качестве параметра открытой формы. в самой обработке этот параметр доступен как Форма.Параметр. в него же и записывается результат работы обработки. после закрытия обработки результат доступен в документе в переменной, которую передавали при открытии формы обработки...
35 Aprobator
 
06.11.13
16:46
(34) см (26). Ответ из (3) не катит.
36 Aprobator
 
06.11.13
16:47
+(35) поскольку формы тупо нет.
37 Guk
 
06.11.13
16:49
(36) пришли пожалуйста пример обработки для 7.7 без формы. интересно посмотреть...
38 oslokot
 
06.11.13
16:49
(36) да не, все правильно в (34)
Просто в при открытии делаем Форма.Закрыть() чтоб не маячила
39 Guk
 
06.11.13
16:51
(38) достаточно в ПриОткрытии сделать СтатусВозврата (0)...
40 oslokot
 
06.11.13
16:51
(39) ну да, или так...
41 Aprobator
 
06.11.13
16:52
(37) не помню уже ) А под рукой нет. Кроме того, насколько мне помнится при использовании ОткрытьФормуМодально() там можно вернуть в результат работы этого метода все. Только вот в самой обработке надо для этого что то прописать. Типа Закрыть(ВозвращаемыйРезультат). Но, точно утверждать не берусь. Давненько это было )
42 Aprobator
 
06.11.13
16:54
+(41) а вообще, походу ты прав. Неужели 7 ку еще используете?
43 Guk
 
06.11.13
16:55
(41) понятно, мы говорим о разных вещах. ты говоришь о визуализации для пользователя, а я про форму в конфигураторе. просто я считал, что для действий описанных в (0) не надо уточнять, что визуально форма естественно не открывается...
44 Guk
 
06.11.13
16:55
(42) 2 года не пользую...
45 Aprobator
 
06.11.13
16:59
(44) фига се. Я в свое время с 7 ки специально во франь свалил, чтобы 8 ку освоить. С тех пор так редко редко, что то по мелочи перепадало. Если в руки то взять - вспомню конечно. Но, потихоньку все стирается.
46 Cthulhu
 
06.11.13
17:39
(39): не-а. при статусвозврата(0) в параметре в место вызова останется ровно то, что передавали в форму. такая вот инструментальная тонкость. не веришь - проверь. ;)
47 Torquader
 
07.11.13
00:18
(46) Параметр корректно работает только при ОткрытьФормуМодально, в противном случае, система создаёт копию параметра.

Да и вообще, если в параметр передавать список или таблицу значений, то её содержимое прекрасно меняется вне зависимости от того, как вызывали форму.
Только при вызове нужно сначала скопировать таблицу в локальную переменную, чтобы не затереть основную.
48 1dvd
 
07.11.13
07:43
(34) Просто, при закрытии обработки в основной форме никакое событие не срабатывает.
49 Andreyyy
 
07.11.13
08:28
(0) Передать параметры через ОткрытьПодбор("Твоя обработка", Параметры)
В обработке передать результат через Форма.ВыполнитьВыбор(Результат)
Получить результат через ОбработкаПодбора(Результат)
50 Guk
 
07.11.13
09:02
(49) в данном случае откроется форма обработки, а автору этого не надо...
51 1dvd
 
07.11.13
09:08
(50) тогда я вообще не пониманю нафига всё это. Чем модальный режим не угодил?
52 Guk
 
07.11.13
09:09
(51) см. (26). автор не хочет модально ;)...
53 Пенза58
 
07.11.13
12:15
(49) Это не подбор.
54 Пенза58
 
07.11.13
12:20
(33)
Сейчас передаю значение через глобальную переменную: гэлДокРасписанияПриЗаполнении=ДокРасп.ТекущийДокумент();

Как правильно было написать?
Вот код обработки:

перем ВызванИзДокумента;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////              
Функция КодПрепода(Препод)
    КодТекПрепод="ххх";
    Если ПустоеЗначение(Препод)=0 тогда
        Если ПустоеЗначение(Препод.Работник)=0 тогда
            КодТекПрепод=Препод.Работник.Код;
        КонецЕсли;
    КонецЕсли;  
    
    Возврат КодТекПрепод;
КонецФункции              
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////              
Функция КодМеста(Место)
    КодТекМеста="ххх";
    Если ПустоеЗначение(Место)=0 тогда
        КодТекМеста=Место.Код;
    КонецЕсли;  
    
    Возврат КодТекМеста;
КонецФункции
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Функция ЭлементВСкобки(ТекЭлемент)
    
    Возврат "["+СокрЛп(Строка(ТекЭлемент))+"];"
    
КонецФункции
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Функция ПолучитьИНдекс(индКодПрепода,индДень, индЧас)
    
    Возврат ЭлементВСкобки(индКодПрепода)+ЭлементВСкобки(индДень)+ЭлементВСкобки(индЧас);
    
КонецФункции

//*******************************************
Процедура Сформировать()
    
    НачТекГода=НачГода(ОснДокПротокол.ДатаНач);
    НачТек=ОснДокПротокол.ДатаНач;
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    тзРаботникЧасов=СоздатьОбъект("ТаблицаЗначений");
    тзРаботникЧасов.НоваяКолонка("Работник");
    тзРаботникЧасов.НоваяКолонка("ОтработаноЧасов");
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    
    тзРаспЗанДень=СоздатьОбъект("ТаблицаЗначений");
    
    
    тзРасписаниеЗанятий=СоздатьОбъект("ТаблицаЗначений");
    тзРасписаниеЗанятий.НоваяКолонка("Дата");
    тзРасписаниеЗанятий.НоваяКолонка("Класс");
    тзРасписаниеЗанятий.НоваяКолонка("Смена");
    тзРасписаниеЗанятий.НоваяКолонка("КолЗанятий");
    
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    ДокРасп=СоздатьОбъект("Документ.Расписание");
    ДокПрот=СоздатьОбъект("Документ.Протокол");  
    ТзРасп=СоздатьОбъект("ТаблицаЗначений");
    /////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    
    спИндексов=СоздатьОбъект("СписокЗначений");
    спИндексовМест=СоздатьОбъект("СписокЗначений");
    ДокРас=СоздатьОбъект("Документ.Расписание");
    ДокРас.ВыбратьДокументы(,);                                            
    Пока ДокРас.ПолучитьДокумент()=1 цикл            
        Если  ((ДокРас.Проведен()=1) и (ДокРас.КПротоколу.ТекущийДокумент()<>ОснДокПротокол.ТекущийДокумент())) тогда
            ДокРас.ВыбратьСтроки();
            Пока ДокРас.ПолучитьСтроку()=1 Цикл
                Для НомЧаса=1 по 16 Цикл
                    СтрЧаса="Час"+?(НомЧаса<10,"0","")+СокрЛП(Строка(НомЧаса));
                    Если ПустоеЗначение(ДокРас.ПолучитьАтрибут(СтрЧаса))=0 тогда                    
                        КодТекПрепод=КодПрепода(ДокРас.Преподаватель);
                        КодТекМеста=КодМеста(ДокРас.МестоПроведения);
                        
                        Индекс=ПолучитьИНдекс(КодТекПрепод,ДокРас.ДатаДень, НомЧаса);
                        ИндексМеста=ПолучитьИНдекс(КодТекМеста,ДокРас.ДатаДень, НомЧаса);
                        
                        спИндексов.ДобавитьЗначение(Индекс);
                        спИндексовМест.ДобавитьЗначение(ИндексМеста);
                        
                        
                        Если ДокРас.ДатаДень>=НачТекГода Тогда
                            тзРаботникЧасов.НоваяСтрока();
                            тзРаботникЧасов.Работник=ДокРас.Преподаватель.Работник.ТекущийЭлемент();
                            тзРаботникЧасов.ОтработаноЧасов=ДокРас.Часов;
                        КонецЕсли;                            
                        
                        Если ДокРас.ДатаДень>=НачТек Тогда
                            тзРасписаниеЗанятий.НоваяСтрока();
                            тзРасписаниеЗанятий.Дата=ДокРас.ДатаДень;
                            тзРасписаниеЗанятий.Класс=ДокРас.МестоПроведения;
                            тзРасписаниеЗанятий.Смена=ДокРас.Смена;
                            тзРасписаниеЗанятий.КолЗанятий=0;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
    
    
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////
    
    спМеста=СоздатьОбъект("СписокЗначений");  
    спСтрМест=СоздатьОбъект("СписокЗначений");  
    
    спОснКлассов=СоздатьОбъект("СписокЗначений");
    спрКлассов=СоздатьОбъект("Справочник.МестаОбучения");
    спрКлассов.ВыбратьЭлементы();
    Пока спрКлассов.ПолучитьЭлемент()=1 Цикл
        Если спрКлассов.ОсновнойКласс=1 Тогда
            спОснКлассов.ДобавитьЗначение(спрКлассов.ТекущийЭлемент());
        КонецЕсли;
    КонецЦикла;
    КолОснКлассов=спОснКлассов.РазмерСписка();
    
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    тзРасписаниеЗанятий.Свернуть("Дата,Класс,Смена","КолЗанятий");
    
    
    спЕстьПустойКласс=СоздатьОбъект("СписокЗначений");
    
    тзРасписаниеЗанятий.Выгрузить(тзРаспЗанДень,);
    тзРаспЗанДень.Свернуть("Дата","КолЗанятий");
    
    тзРаспЗанДень.ВыбратьСтроки();
    Пока тзРаспЗанДень.ПолучитьСтроку()=1 Цикл
        спЕстьПустойКласс.УдалитьВсе();
        
        тзРасписаниеЗанятий.ВыбратьСтроки();
        Пока тзРасписаниеЗанятий.ПолучитьСтроку()=1 Цикл
            Если тзРасписаниеЗанятий.Дата=тзРаспЗанДень.Дата Тогда
                Если тзРасписаниеЗанятий.Класс.ОсновнойКласс=1 ТОгда
                    Если спЕстьПустойКласс.НайтиЗначение(тзРасписаниеЗанятий.Класс)=0 Тогда
                        спЕстьПустойКласс.ДобавитьЗначение(тзРасписаниеЗанятий.Класс);
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        
        РазмСпис=спЕстьПустойКласс.РазмерСписка();
        тзРасписаниеЗанятий.ВыбратьСтроки();
        Пока тзРасписаниеЗанятий.ПолучитьСтроку()=1 Цикл          
            Если тзРасписаниеЗанятий.Дата=тзРаспЗанДень.Дата Тогда
                Если РазмСпис>=КолОснКлассов Тогда  
                    //Все классы заполнены
                    тзРасписаниеЗанятий.КолЗанятий=0.01;
                Иначе
                    тзРасписаниеЗанятий.КолЗанятий=0;
                КонецЕсли;    
            КонецЕСли;
        КонецЦикла;
    КонецЦикла;
    
    
    тзРасписаниеЗанятий.ВыбратьСтроки();
    Пока тзРасписаниеЗанятий.ПолучитьСтроку()=1 Цикл
        Если Найти(тзРасписаниеЗанятий.Смена,"Днев")<>0 ТОгда
            тзРасписаниеЗанятий.КолЗанятий=тзРасписаниеЗанятий.КолЗанятий+1;
        КонецЕсли;
        Если Найти(тзРасписаниеЗанятий.Смена,"Вече")<>0 ТОгда
            тзРасписаниеЗанятий.КолЗанятий=тзРасписаниеЗанятий.КолЗанятий+1;
        КонецЕсли;
    КонецЦикла;    
    
    тзРасписаниеЗанятий.Выгрузить(тзРаспЗанДень,);
    
    тзРаспЗанДень.Свернуть("Дата","КолЗанятий");
    
    
    
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////
    тзРаботникЧасов.Свернуть("Работник","ОтработаноЧасов");    
    
    тзПрепДисц=СоздатьОбъект("ТаблицаЗначений");
    тзПрепДисц.НоваяКолонка("Дисциплина");
    тзПрепДисц.НоваяКолонка("Препод0");
    тзПрепДисц.НоваяКолонка("Препод1");
    тзПрепДисц.НоваяКолонка("Препод2");
    тзПрепДисц.НоваяКолонка("Препод3");
    тзПрепДисц.НоваяКолонка("Препод4");
    тзПрепДисц.НоваяКолонка("Препод5");
    тзПрепДисц.НоваяКолонка("Препод6");
    тзПрепДисц.НоваяКолонка("Препод7");
    тзПрепДисц.НоваяКолонка("Препод8");
    тзПрепДисц.НоваяКолонка("Препод9");
    
    
    ТЗпреподПриоритет=СоздатьОбъект("ТаблицаЗначений");
    ТЗпреподПриоритет.НоваяКолонка("Препод");
    ТЗпреподПриоритет.НоваяКолонка("Приоритет");
    
    СпрПрепод=СоздатьОбъект("Справочник.ПреподРаздела");
    СпрРазд=СоздатьОбъект("Справочник.РазделДисциплины");
    СпрРазд.ВыбратьЭлементы();
    Пока СпрРазд.ПолучитьЭлемент()=1 Цикл
        тзПрепДисц.НоваяСтрока();
        тзПрепДисц.Дисциплина=СпрРазд.ТекущийЭлемент();
        
        ТЗпреподПриоритет.УдалитьСтроки();
        
        СпрПрепод.ИспользоватьВладельца(СпрРазд.ВидРаздела);
        
        СпрПрепод.ВыбратьЭлементы();
        Пока СпрПрепод.ПолучитьЭлемент()=1 Цикл
            ТЗпреподПриоритет.НоваяСтрока();
            ТЗпреподПриоритет.Препод=СпрПрепод.ТекущийЭлемент();  
            
            
            тзРаботникЧасов.ВыбратьСтроки();
            НомСтрРаботЧасов=0;
            тзРаботникЧасов.НайтиЗначение(СпрПрепод.Работник.ТекущийЭлемент(),НомСтрРаботЧасов,"Работник");
            Если НомСтрРаботЧасов=0 Тогда  
                ТекПриоритет=СпрПрепод.Приоритет
            Иначе  
                ТекПриоритет=тзРаботникЧасов.ПолучитьЗначение(НомСтрРаботЧасов,"ОтработаноЧасов");
            КонецЕсли;
            
            ТЗпреподПриоритет.Приоритет=ТекПриоритет;
        КонецЦикла;        
        
        ТЗпреподПриоритет.Сортировать("Приоритет");
        НомПрепод=0;
        ТЗпреподПриоритет.ВыбратьСтроки();
        Пока ТЗпреподПриоритет.ПолучитьСтроку()=1 Цикл
            
            тзПрепДисц.УстановитьЗначение(тзПрепДисц.КоличествоСтрок(),"Препод"
            +СокрЛп(Строка(НомПрепод)),ТЗпреподПриоритет.Препод.ТекущийЭлемент());
            
            НомПрепод=НомПрепод+1;
            Если НомПрепод>9 тогда
                Прервать;
            КонецЕсли;    
        КонецЦикла;
    КонецЦикла;
    
    
    
    
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////
    
    ТЗДниЗанятий=СоздатьОбъект("ТаблицаЗначений");
    ТЗДатаЗанятий=СоздатьОбъект("ТаблицаЗначений");
    ТЗПротМесто=СоздатьОбъект("ТаблицаЗначений");
    ТЗДниЗанятий.НоваяКолонка("ИндПротДень");
    ТЗДниЗанятий.НоваяКолонка("СтарДень");
    ТЗДниЗанятий.НоваяКолонка("НачПрот");
    ТЗДниЗанятий.НоваяКолонка("День");
    ТЗДниЗанятий.НоваяКолонка("ДокПрото");
    ТЗДниЗанятий.НоваяКолонка("Класс");
    ТЗДниЗанятий.НоваяКолонка("Смена");
    ТЗДниЗанятий.НоваяКолонка("КолЗанятий");
    ТЗДниЗанятий.НоваяКолонка("КолЧасов");
    ТЗДниЗанятий.НоваяКолонка("БылЭкзамен");
    ТЗДниЗанятий.НоваяКолонка("БылДлинныйДень");
    
    
    Если ПустоеЗначение(ОснДокПротокол.Расписание)=1 Тогда
        ДокРасп.Новый();
    Иначе        
        ДокРасп.НайтиДокумент(ОснДокПротокол.Расписание);
        ДокРасп.СделатьНеПроведенным();
    КонецЕСли;
    
    
    гэлРассчетЗначений(ОснДокПротокол.ТекущийДокумент());
    
    ДокРасп.КПротоколу=ОснДокПротокол.ТекущийДокумент();
    ДокРасп.ДатаДок=ОснДокПротокол.ДатаДОк;
    ДокРасп.НомерДок=ОснДокПротокол.НомерДок;
    ДокРасп.УдалитьСтроки();
    
    ЕстьОшибка=0;
    
    гэлТЗКурс.ВыбратьСтроки();
    Пока гэлТЗКурс.ПолучитьСтроку()=1 Цикл
        ДокРасп.НоваяСтрока();
        ДокРасп.Раздел=гэлТЗКурс.Раздел;
        ДокРасп.Дисциплина=гэлТЗКурс.Дисциплина;
        ДокРасп.ДатаДень=гэлТЗКурс.Дата;
        ДокРасп.Часов=гэлТЗКурс.Часов;
        ДокРасп.ВидОбучения=гэлТЗКурс.ВидОбучения;
        ДокРасп.МестоПроведения=гэлТЗКурс.МестоПроведения;
        ДокРасп.День=гэлТЗКурс.День;
        ДокРасп.Часы=гэлТЗКурс.Часы;
        
        ТЗДниЗанятий.НоваяСтрока();
        ТЗДниЗанятий.День=гэлТЗКурс.Дата;
        ТЗДниЗанятий.ДокПрото=ОснДокПротокол.ТекущийДокумент();
        ТЗДниЗанятий.Класс="";
        ТЗДниЗанятий.Смена="";
        ТЗДниЗанятий.СтарДень=гэлТЗКурс.Дата;
        ТЗДниЗанятий.НачПрот=НачТек;
        ТЗДниЗанятий.КолЗанятий=0;
        ТЗДниЗанятий.КолЧасов=гэлТЗКурс.Часов;
        ТЗДниЗанятий.ИндПротДень= ЭлементВСкобки(ОснДокПротокол.ТекущийДокумент().НомерДок)
        +ЭлементВСкобки(ОснДокПротокол.ТекущийДокумент().ДатаДок)
        +ЭлементВСкобки(гэлТЗКурс.Дата);    
        
        ТЗДниЗанятий.БылЭкзамен=?(гэлТЗКурс.ВидОбучения=Перечисление.ВидОбучения.Экзамен,1,0);
        ТЗДниЗанятий.БылДлинныйДень=0;
    КонецЦикла;
    
    УдалосьЗаписать=0;
    Попытка
        ДокРасп.Записать();
        гэлДокРасписанияПриЗаполнении=ДокРасп.ТекущийДокумент();
        УдалосьЗаписать=1;
    Исключение      
        Сообщить("Не удалось запистаь расписание:"+ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    ТЗДниЗанятий.Свернуть("НачПрот,СтарДень,День,ДокПрото,Класс,Смена,КолЗанятий,ИндПротДень","КолЧасов,БылЭкзамен,БылДлинныйДень");
    ТЗДниЗанятий.ВыбратьСтроки();
    Пока ТЗДниЗанятий.ПолучитьСтроку()=1 Цикл
        Если ТЗДниЗанятий.КолЧасов>8 Тогда    
            ТЗДниЗанятий.КолЗанятий=2;
            ТЗДниЗанятий.БылДлинныйДень=1;
        Иначе
            ТЗДниЗанятий.КолЗанятий=1;  
            ТЗДниЗанятий.БылДлинныйДень=0;
        Конецесли;                        
    КонецЦикла;  
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    выполнять=1;
    Пока выполнять=1 Цикл  
        /////////////////////////////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////////////
        ТЗДниЗанятий.Сортировать("День,НачПрот-");
        ТЗДниЗанятий.Выгрузить(ТЗДатаЗанятий,,,);
        
        ТЗДатаЗанятий.Сортировать("День+");
        деньМин=ТЗДатаЗанятий.ПолучитьЗначение(1,"День");
        ТЗДатаЗанятий.Сортировать("День-");
        деньМакс=ТЗДатаЗанятий.ПолучитьЗначение(1,"День");
        
        деньМакс=деньМакс+365;
        
        ТекДень=деньМин;
        Пока ТекДень<=деньМакс Цикл
            ТЗДатаЗанятий.НоваяСтрока();                                                              
            ТЗДатаЗанятий.День=ТекДень;
            ТЗДатаЗанятий.КолЗанятий=0;    
            ТЗДатаЗанятий.БылДлинныйДень=0;    
            ТЗДатаЗанятий.БылЭкзамен=0;    
            
            ТекДень=ТекДень+1;
        КонецЦикла;
        
        ТЗДатаЗанятий.Свернуть("День","КолЗанятий,БылЭкзамен,БылДлинныйДень");
        
        ТЗДатаЗанятий.НоваяКолонка("ЭтоСуббота");    
        ТЗДатаЗанятий.НоваяКолонка("ЭтоВоскресенье");
        
        ТЗДатаЗанятий.ВыбратьСтроки();
        Пока ТЗДатаЗанятий.ПолучитьСтроку()=1 Цикл
            Если НомерДняНедели(ТЗДатаЗанятий.День)=6 ТОгда
                ТЗДатаЗанятий.ЭтоСуббота=1;
            КонецЕсли;
            
            Если НомерДняНедели(ТЗДатаЗанятий.День)=7 ТОгда
                ТЗДатаЗанятий.ЭтоВоскресенье=1;
            КонецЕсли;
        КонецЦикла;
        
        ТЗДатаЗанятий.Сортировать("День");
        /////////////////////////////////////////////////////////////////////////////////////////////////        
        /////////////////////////////////////////////////////////////////////////////////////////////////        
        БылиДни=0;
        ТЗДниЗанятий.ВыбратьСтроки();
        Пока ТЗДниЗанятий.ПолучитьСтроку()=1 Цикл
            
            тзРаспЗанДень.ВыбратьСтроки();
            НомСтрДня=0;
            тзРаспЗанДень.НайтиЗначение(ТЗДниЗанятий.День,НомСтрДня,"Дата");
            Если НомСтрДня>0 Тогда
                ТекКолДней=ТЗДатаЗанятий.ПолучитьЗначение(НомСтрДня,"КолЗанятий");
            Иначе
                ТекКолДней=0;
            КонецЕсли;
            
            ТекКолЗанятийДня=ТЗДниЗанятий.КолЗанятий;
            
            
            Если (ТекКолДней+ТекКолЗанятийДня)>КолОснКлассов*2 тогда
                ТекПрото=ТЗДниЗанятий.ДокПрото.ТекущийДокумент();
                ТекДень=ТЗДниЗанятий.День;
                БылиДни=1;    
                
                НомСтрТЗДней=ТЗДниЗанятий.НомерСТроки;
                Сообщить("Обрабатывается день:"+ТекДень+"("+НомСтрТЗДней+")"+"х"+ТЗДниЗанятий.ДокПрото+"ххх");
                прервать;
            КонецЕсли;
        КонецЦикла;    
        
        Выполнять=БылиДни;
        
        Если Выполнять=1 Тогда  
            /////////////////////////////////////////////////////////////////////////////////////////////////    
            /////////////////////////////////////////////////////////////////////////////////////////////////
            /////////////////////////////////////////////////////////////////////////////////////////////////    
            ТЗДатаЗанятий.Сортировать("День");
            
            ТекКодПроток=СокрЛП(ТЗДниЗанятий.ДокПрото.НомерДок);    
            
            РазмерРазрыва=0;
            ОченьБолшойРазрывИспользуемСубботы=0;
            /////////////////////////////////////////////////////////////////////////////////////////////////        
            БылНайденРазрыв=0;
            ТЗДатаЗанятий.ВыбратьСтроки();
            Пока ТЗДатаЗанятий.ПолучитьСтроку()=1 Цикл      
                Если  ((ТЗДатаЗанятий.ЭтоСуббота=1) или (ТЗДатаЗанятий.ЭтоВоскресенье=1)) ТОгда
                    Продолжить;
                КонецЕсли;
                
                РазмерРазрыва=ТЗДатаЗанятий.День-ТекДень;
                
                деньМин1=ТекДень;
                деньМакс1=ТЗДатаЗанятий.День;
                счТекДень1=деньМин1;
                Пока счТекДень1<=деньМакс1 Цикл
                    Если ((НомерДняНедели(счТекДень1)=7) или (НомерДняНедели(счТекДень1)=6)) Тогда
                        РазмерРазрыва=РазмерРазрыва-1;
                    КонецЕсли;
                    счТекДень1=счТекДень1+1;
                КонецЦикла;
                
                Если РазмерРазрыва>3 ТОгда
                    ОченьБолшойРазрывИспользуемСубботы=1;  
                    Сообщить("ОченьБолшойРазрывИспользуемСубботы");
                    Прервать;
                КонецЕсли;
                
                тзРаспЗанДень.ВыбратьСтроки();
                НомСтрДня=0;
                тзРаспЗанДень.НайтиЗначение(ТЗДатаЗанятий.День,НомСтрДня,"Дата");
                Если НомСтрДня>0 Тогда
                    ТекКолДней=ТЗДатаЗанятий.ПолучитьЗначение(НомСтрДня,"КолЗанятий");
                Иначе
                    ТекКолДней=0;
                КонецЕсли;
                
                
                
                Если ((ТЗДатаЗанятий.День>ТекДень) и (ТекКолДней+ТекКолЗанятийДня<=КолОснКлассов*2)) тогда
                    ТекРазрыв=ТЗДатаЗанятий.День-ТекДень;
                    
                    Сообщить("Найден день"+ТЗДатаЗанятий.День);
                    БылНайденРазрыв=1;  
                    Прервать;
                КонецЕсли;
            КонецЦикла;                
            /////////////////////////////////////////////////////////////////////////////////////////////////
            /////////////////////////////////////////////////////////////////////////////////////////////////
            РазмерРазрыва=0;
            ОченьБолшойРазрывИспользуемВоскресенья=0;
            Если ОченьБолшойРазрывИспользуемСубботы=1 Тогда
                БылНайденРазрыв=0;
                ТЗДатаЗанятий.ВыбратьСтроки();
                Пока ТЗДатаЗанятий.ПолучитьСтроку()=1 Цикл      
                    
                    Если  ТЗДатаЗанятий.ЭтоВоскресенье=1 ТОгда
                        Продолжить;
                    КонецЕсли;
                    
                    РазмерРазрыва= ТЗДатаЗанятий.День-ТекДень;
                    
                    деньМин1=ТекДень;
                    деньМакс1=ТЗДатаЗанятий.День;
                    
                    счТекДень1=деньМин1;
                    Пока счТекДень1<=деньМакс1 Цикл
                        Если ((НомерДняНедели(счТекДень1)=7)) Тогда
                            РазмерРазрыва=РазмерРазрыва-1;
                        КонецЕсли;
                        
                        счТекДень1=счТекДень1+1;
                    КонецЦикла;
                    
                    
                    Если РазмерРазрыва>3 ТОгда        
                        Сообщить("ОченьБолшойРазрывИспользуемВоскресенья");
                        ОченьБолшойРазрывИспользуемВоскресенья=1;
                        Прервать;
                    КонецЕсли;    
                    
                    тзРаспЗанДень.ВыбратьСтроки();
                    НомСтрДня=0;
                    тзРаспЗанДень.НайтиЗначение(ТЗДатаЗанятий.День,НомСтрДня,"Дата");
                    Если НомСтрДня>0 Тогда
                        ТекКолДней=ТЗДатаЗанятий.ПолучитьЗначение(НомСтрДня,"КолЗанятий");
                    Иначе
                        ТекКолДней=0;
                    КонецЕсли;
                    
                    
                    Если ((ТЗДатаЗанятий.День>ТекДень) и (ТекКолДней+ТекКолЗанятийДня<=КолОснКлассов*2)) тогда
                        ТекРазрыв=ТЗДатаЗанятий.День-ТекДень;
                        Сообщить("Найден день"+ТЗДатаЗанятий.День);
               &nb
55 Пенза58
 
07.11.13
12:23
Весь код не залез продолжение:

        Пока ТЗДниЗанятий.ПолучитьСтроку()=1 Цикл
                спМеста.УдалитьВсе();
                спСтрМест.УдалитьВсе();  
                КоличествоДвухСмен=0;
                КоличествоДвухЭкзаменов=0;
                
                спЕстьПустойКласс.УдалитьВсе();
                
                тзРасписаниеЗанятий.ВыбратьСтроки();
                Пока тзРасписаниеЗанятий.ПолучитьСтроку()=1 Цикл
                    Если ТЗДниЗанятий.День=тзРасписаниеЗанятий.Дата Тогда
                        Если Найти(тзРасписаниеЗанятий.Смена,"Днев")<>0 ТОгда
                            ИндКласса=СокрЛп(Строка(тзРасписаниеЗанятий.Класс.Код))+"Дневная";
                            спМеста.ДобавитьЗначение(ИндКласса,);    
                            //Сообщить("-*-"+ТЗДниЗанятий.День+" "+ИндКласса);
                        КонецЕсли;
                        Если Найти(тзРасписаниеЗанятий.Смена,"Вече")<>0 ТОгда
                            ИндКласса=СокрЛп(Строка(тзРасписаниеЗанятий.Класс.Код))+"Вечерняя";
                            спМеста.ДобавитьЗначение(ИндКласса,);
                        //    Сообщить("*-*"+ТЗДниЗанятий.День+" "+ИндКласса);
                        КонецЕсли;  
                        
                        Если тзРасписаниеЗанятий.Класс.ОсновнойКласс=1 ТОгда
                            Если спЕстьПустойКласс.НайтиЗначение(тзРасписаниеЗанятий.Класс)=0 Тогда
                                спЕстьПустойКласс.ДобавитьЗначение(тзРасписаниеЗанятий.Класс);
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
                
            
                
                
                Если ТЗДниЗанятий.БылДлинныйДень>0 Тогда
                    времтекласс="";
                    Для НомерКласса=1 По КолОснКлассов Цикл  
                        
                        времтекласс=спОснКлассов.ПолучитьЗначение(НомерКласса).ТекущийЭлемент();
                        
                        Если спЕстьПустойКласс.НайтиЗначение(тзРасписаниеЗанятий.Класс.ТекущийЭлемент())=0 Тогда
                            Прервать;
                        КонецЕсли;  
                        времтекласс="";
                    КонецЦикла;
                    
                    ИндКласса=СокрЛп(Строка(времтекласс.Код))+"Дневная";
                    спМеста.ДобавитьЗначение(ИндКласса,);
                    ИндКласса=СокрЛп(Строка(времтекласс.Код))+"Вечерняя";
                    спМеста.ДобавитьЗначение(ИндКласса,);
                    
                //    Сообщить("ххх3ххх"+" "+времтекласс.ТекущийЭлемент()+" "+"Дневная/Вечерняя");
                    
                    ТЗДниЗанятий.Класс=времтекласс.ТекущийЭлемент();
                    ТЗДниЗанятий.Смена="Дневная/Вечерняя";
                    
                ИНаче
                    
                    /////////////////////////////////////////////////////////////////////////////////////////////////                
                    
                //    Для НосСтрМеста=1 по спСтрМест.РазмерСписка() Цикл
                        ТекДокПро=ТЗДниЗанятий.ДокПрото;
                        
                        ТЗПротМесто.ВыбратьСтроки();
                        НомСтрМеста=0;
                        ТЗПротМесто.НайтиЗначение(ТекДокПро.ТекущийДокумент(),НомСтрМеста,"ДокПрото");
                    //    Сообщить("йййййййййй"+ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Класс"));
                        Если ПустоеЗначение(ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Класс"))=0 Тогда
                            ИндКласса=СокрЛп(Строка(ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Класс").Код))
                            +СокрЛп(Строка(+ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Смена")));
                            
                            Если спМеста.НайтиЗначение(ИндКласса)=0 ТОгда
                                спМеста.ДобавитьЗначение(ИндКласса,);
                                ВзятьИзОсновнонго=1;
                            Иначе
                                ВзятьИзОсновнонго=2;
                            КонецЕСли;
                        Иначе
                            ВзятьИзОсновнонго=0;
                        КонецЕсли;
                //    КонецЦикла;
                    
                    /////////////////////////////////////////////////////////////////////////////////////////////////
                    
                    
                    ТЗДниЗанятийДокПрото=ТЗДниЗанятий.ДокПрото;
                    
                    Если ВзятьИзОсновнонго=1 Тогда
                        ТЗПротМесто.ВыбратьСтроки();
                        НомСтрМеста=0;
                        ТЗПротМесто.НайтиЗначение(ТЗДниЗанятийДокПрото,НомСтрМеста,"ДокПрото");
                        Если  ПустоеЗначение(ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Класс"))=0 Тогда
                            ТЗДниЗанятий.Класс=ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Класс").ТекущийЭлемент();
                            ТЗДниЗанятий.Смена=ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Смена");
                            
                            //    Сообщить("ххх1ххх"+ " "+ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Класс").ТекущийЭлемент()+" "+ТЗПротМесто.ПолучитьЗначение(НомСтрМеста,"Смена"));
                            //продолжить;
                        КонецЕсли;
                    Иначе
                        Найден=0;
                        ТекСмена="Дневная";
                        Пока ТекСмена<>"" Цикл
                            Для НомКласса=1 по КолОснКлассов Цикл
                                ТекКласс=спОснКлассов.ПолучитьЗначение(НомКласса).ТекущийЭлемент();    
                                ИндКласса=СокрЛп(Строка(ТекКласс.Код))+СокрЛп(Строка(ТекСмена));
                                
                                
                                Если спМеста.НайтиЗначение(ИндКласса)=0 Тогда    
                                    спМеста.ДобавитьЗначение(ИндКласса);    
                                    
                                    ТЗДниЗанятий.Класс=ТекКласс.ТекущийЭлемент();
                                    ТЗДниЗанятий.Смена=ТекСмена;
                                    
                                    
                                    Если ВзятьИзОсновнонго=2 Тогда
                                        //Сообщить("ххх2ххх"+ " "+ТекКласс.ТекущийЭлемент()+" "+ТекСмена);
                                    Иначе
                                        ТЗПротМесто.ВыбратьСтроки();
                                        НомСтрМеста=0;
                                        ТЗПротМесто.НайтиЗначение(ТЗДниЗанятийДокПрото,НомСтрМеста,"ДокПрото");  
                                        
                                        //Сообщить("ххх0ххх"+ " "+ТекКласс.ТекущийЭлемент()+" "+ТекСмена);
                                        
                                        ТЗПротМесто.УстановитьЗначение(НомСтрМеста,"Смена",ТекСмена);
                                        ТЗПротМесто.УстановитьЗначение(НомСтрМеста,"Класс",ТекКласс.ТекущийЭлемент());
                                    КонецЕсли;
                                    
                                    Найден=1;
                                    прервать;
                                КонецЕсли;
                            КонецЦикла;
                            Если Найден=1 Тогда
                                прервать;
                            КонецЕсли;
                            ТекСмена=?(ТекСмена="Вечерняя","","Вечерняя");
                            Если Найден=1 Тогда
                                прервать;
                            КонецЕсли;    
                        КонецЦикла;
                    КонецЕСли;
                    ///////////////////////////////////////////////////////////////////////
                КонецЕсли;
                
                ///////////////////////////////////////////////////////////////////////
                
                
            КонецЦикла;
        КонецЕСли;
    КонецЦикла;
    
    
    
    //***********************************************************************************************
    //***********************************************************************************************
    //***********************************************************************************************
    
    
    ДокРасп.ВыгрузитьТабличнуюЧасть(ТзРасп,);        
    ЕстьОшибка=0;
    ТзРасп.Сортировать("ДатаДень+");
    
    
    
    ТзРасп.ВыбратьСтроки();
    Пока ТзРасп.ПолучитьСтроку()=1 Цикл
        
        ИндПротДень= ЭлементВСкобки(ОснДокПротокол.ТекущийДокумент().НомерДок)+
        ЭлементВСкобки(ОснДокПротокол.ТекущийДокумент().ДатаДок)+
        ЭлементВСкобки(ТзРасп.ДатаДень);
        
        ТЗДниЗанятий.ВыбратьСтроки();
        НомСтрМеста=0;
        ТЗДниЗанятий.НайтиЗначение(ИндПротДень,НомСтрМеста,"ИндПротДень");
        
        ТзРасп.ДатаДень=ТЗДниЗанятий.ПолучитьЗначение(НомСтрМеста,"День");
        
        ТекКласс=ТЗДниЗанятий.ПолучитьЗначение(НомСтрМеста,"Класс").ТекущийЭлемент();
        ТекСмена=ТЗДниЗанятий.ПолучитьЗначение(НомСтрМеста,"Смена");
        
        
        ТзРасп.МестоПроведения=ТекКласс.ТекущийЭлемент();                              
        ТзРасп.Смена=ТекСмена;
    КонецЦикла;  
    ТзРасп.Сортировать("ДатаДень+");
    
    
    НомерДня="";
    Если Найти(ТекСмена,"Дневная")<>0 Тогда
        НомерЧаса=1;
    Иначе          
        НомерЧаса=9;
    КонецЕсли;
    
    ТзРасп.ВыбратьСтроки();
    Пока ТзРасп.ПолучитьСтроку()=1 Цикл
        ТекСмена=СокрЛП(ТзРасп.Смена);  
        Если НомерДня<>ТзРасп.ДатаДень Тогда
            Если Найти(ТекСмена,"Дневная")<>0 Тогда
                НомерЧаса=1;
            Иначе                    
                НомерЧаса=9;
            КонецЕсли;
            НомерДня=ТзРасп.ДатаДень;
        КонецЕсли;
        
        ТекЧасы=ТзРасп.Часов;
        Если ((НомерЧаса<0) или (НомерЧаса>16) или ((НомерЧаса+ТекЧасы-1)>16)  или ((НомерЧаса+ТекЧасы-1)<0)) Тогда
            сообщить("В документет "+ОснДокПротокол.ТекущийДокумент()+" курс "+ОснДокПротокол.Курс+" в день "
            +ТзРасп.ДатаДень+" часы за пределами диапазона, начало урочас час №"+НомерЧаса+" оконочание урока час №"+Строка(НомерЧаса+ТекЧасы-1));
            ЕстьОшибка=1;
            продолжить;
        КонецЕсли;        
        
        ТзРасп.ВремяНачала=гэлНачалоЧаса[НомерЧаса];
        ТзРасп.ВремяОкночения=гэлКонецЧаса[НомерЧаса+ТекЧасы-1];
        
        
        Для НомЧаса=1 по 16 Цикл
            СтрЧаса="Час"+?(НомЧаса<10,"0","")+СокрЛП(Строка(НомЧаса));    
            ТзРасп.УстановитьЗначение(ТзРасп.НомерСтроки,СтрЧаса,0);
        КонецЦикла;
        
        Для НомЧаса=НомерЧаса по НомерЧаса+ТекЧасы-1 Цикл
            СтрЧаса="Час"+?(НомЧаса<10,"0","")+СокрЛП(Строка(НомЧаса));    
            ТзРасп.УстановитьЗначение(ТзРасп.НомерСтроки,СтрЧаса,1);  
        КонецЦикла;    
        
        тзПрепДисц.ВыбратьСтроки();
        НомСтрПрепДисц=0;
        тзПрепДисц.НайтиЗначение(ТзРасп.Дисциплина.Раздел,НомСтрПрепДисц,"Дисциплина");
        Если НомСтрПрепДисц<>0 Тогда
            Для НомПрепода=0 по 9 Цикл
                ТекПреподДисц=тзПрепДисц.ПолучитьЗначение(НомСтрПрепДисц,"Препод"+СокрЛп(Строка(НомПрепода)));
                
                Если ПустоеЗначение(ТекПреподДисц)=1 Тогда  
                    ЕстьОшибка=1;
                    Прервать;
                КонецЕсли;
                
                ПодходитПоДатам=1;
                Если ПустоеЗначение(ТекПреподДисц.Работник.ДатаПриема)=0 Тогда
                    Если ТекПреподДисц.Работник.ДатаПриема>ТзРасп.ДатаДень Тогда
                        ПодходитПоДатам=0;
                    КонецЕсли;
                КонецЕсли;
                
                Если ПустоеЗначение(ТекПреподДисц.Работник.ДатаУвольнения)=0 Тогда
                    Если ТекПреподДисц.Работник.ДатаУвольнения<ТзРасп.ДатаДень Тогда
                        ПодходитПоДатам=0;
                    КонецЕсли;
                КонецЕсли;
                
                Если ПодходитПоДатам=0 Тогда
                    ЭтотПреподПодъодит=0;
                Иначе
                    ЭтотПреподПодъодит=1;
                    
                    Для НомЧаса=НомерЧаса по НомерЧаса+ТекЧасы-1 Цикл
                        КодТекПрепод=КодПрепода(ТекПреподДисц);
                        Индекс=ПолучитьИНдекс(КодТекПрепод,ТзРасп.ДатаДень, НомЧаса);
                        
                        Если спИндексов.НайтиЗначение(Индекс)<>0 Тогда  
                            ЭтотПреподПодъодит=0;
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
                
                Если ЭтотПреподПодъодит=1 Тогда  
                    ТзРасп.Преподаватель= ТекПреподДисц.ТекущийЭлемент();  
                    
                    тзРаботникЧасов.НоваяСтрока();
                    тзРаботникЧасов.Работник=ТзРасп.Преподаватель.Работник.ТекущийЭлемент();
                    тзРаботникЧасов.ОтработаноЧасов=ТзРасп.Часов;
                    прервать;
                Иначе
                    Если НомПрепода=9 Тогда
                        ЕстьОшибка=1;
                        Прервать;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        Иначе    
            ЕстьОшибка=1;
        КонецЕсли;
        
        НомерЧаса=НомерЧаса+ТекЧасы;  
    КонецЦикла;                    
    
    //ТзРасп.ВыбратьСтроку();
    ДокРасп.ЗагрузитьТабличнуюЧасть(ТзРасп);
    
    УдалосьЗаписать=0;
    Попытка
        ДокРасп.Записать();
        УдалосьЗаписать=1;
    Исключение      
        Сообщить("Не удалось запистаь расписание:"+ОписаниеОшибки());
        возврат;
    КонецПопытки;
    
    Если  ((УдалосьЗаписать=1) и (ЕстьОшибка=0)) Тогда
        УдалосьПровести=0;
        Попытка
            УдалосьПровести=ДокРасп.Провести(,);
        Исключение      
            Сообщить("Не удалось запистаь расписание:"+ОписаниеОшибки());
            Возврат;
        КонецПопытки;
    КонецЕсли;
              
    ЕСли ВызванИзДокумента=0 ТОгда
        ДокПрот.НайтиДокумент(ОснДокПротокол);
        
        ДокПрот.Расписание=ДокРасп.ТекущийДокумент();
        Попытка
            ДокПрот.Записать();
        Исключение      
            Сообщить("Не удалось запистаь протокол:"+ОписаниеОшибки());    
            Возврат;
        КонецПопытки;  
    КонецЕсли;
    
    
    
КонецПроцедуры



Процедура ПриОткрытии()  
    ВызванИзДокумента=0;
    
    Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
        ОснДокПротокол=Форма.Параметр.ПолучитьЗначение(1);  
        ВызванИзДокумента=1;
        Сформировать();
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры
56 Ёпрст
 
07.11.13
12:31
Смело всё в топку
57 Ёпрст
 
07.11.13
12:32
вообще конечно, зачетно выбирать все документы из базы, даже одного вида.. смотреть в тч дока.. лепить какие то тз..
Но ничего , с годами это пофигизм проходит.
58 1dvd
 
07.11.13
13:02
(56) ты реально всё это прочитал???
59 Ёпрст
 
07.11.13
13:04
(58) так, вскользь
60 Пенза58
 
07.11.13
15:48
(57) Расскажи про свой вариант.
61 Ёпрст
 
07.11.13
16:03
(60) Задачу то целиком озвуь, мне как-то смотреть простынню и вникать в суть не улыбает.
62 Пенза58
 
07.11.13
16:09
(61) Общая задача учет расписания преподавателей и классов.

Есть некоторое количество классов и две смены.

Создается учебная группа и надо, чтобы её урокам поставились классы, время занятий и преподаватели.

В частности  "выбирать все документы" аналог регистра сведений.
63 Ёпрст
 
07.11.13
16:39
Один хрен, твой код в топку.. слишком не оптимально и медленно всё.. теже выборки из ТЗ для поиска по 2-м колонкам.
64 Пенза58
 
07.11.13
16:43
(63) 1. Это ты о чем?
2. Как по-другому сделать?
65 Ёпрст
 
07.11.13
16:49
(64) чтобы ответить на этот вопрос нужно знать структуру хранения данных.

Один хрен, выборки из тз, перебор всех документов за период.. это всё очень медленно.
66 Ёпрст
 
07.11.13
16:50
ну а преобразование ссылки в строку..это вообще моветон
67 Пенза58
 
07.11.13
16:56
(65) > структуру хранения данных

Какую структуру ты предложишь.

Вот надо хранить данные о расписании.

Есть группа надо знать в какой день, в каком классе, в какой час(можно упростить пускай будет хотя бы смена вечерняя или дневная), какой преподаватель, будет проводить занятия.

Как предлагаешь это хранить?

> выборки из тз

Что с ними не так? Как по другому?

> перебор всех документов за период

Альтернативой является работа с периодическими реквизитами справочников.

Но тут опять же надо перебирать все группы, и искать были у них занятия в интересующем периоде или нет.

Предложи свой вариант, как получить дни в которые были занятия и кто вел и в какое время.
68 Пенза58
 
07.11.13
16:57
(66)
> ну а преобразование ссылки в строку..это вообще моветон

Почему? Эти же данные нигде не хранятся постоянно.
69 Ёпрст
 
07.11.13
17:15
(68) изменили представление элемента  - твой алгоритм коту под хвост
70 Ёпрст
 
07.11.13
17:15
(67) для начала надо свою озвучить
71 Ёпрст
 
07.11.13
17:16
структуру
72 Пенза58
 
07.11.13
17:17
(69) > изменили представление элемента

Как это так?
73 Ёпрст
 
07.11.13
17:18
(72) если основное представление элемента - наименование, то
Строка(ЭлементТвой) = ЭлементТвой.Наименование (или =код, или = основной реквизит справочника, если длина кода и наименования =0)

Дык вот, изменили наименование - п..ц котёнку.
74 Пенза58
 
07.11.13
17:19
75 Пенза58
 
07.11.13
17:20
(73) Где ты у меня такой код нашел?
76 Ёпрст
 
07.11.13
17:21
(74) аа... весь учет на одном документе построен ?
:)
77 Пенза58
 
07.11.13
17:21
(76) Учет расписания - да.

А что не так?
78 Ёпрст
 
07.11.13
17:23
Возврат "["+СокрЛп(Строка(ТекЭлемент))+"];"
79 Ёпрст
 
07.11.13
17:23
(77) ну, по мне, так всё..
80 Ёпрст
 
07.11.13
17:23
а где часы с 17 по 24 ? :)))
81 Ёпрст
 
07.11.13
17:24
Ну и что есть ВремяОкночения ?
82 Пенза58
 
07.11.13
17:26
(78) Туда никогда не передается ссылка в чистом виде.

Ссылка предварительно обрабатывается
Функция КодПрепода(Препод)
    КодТекПрепод="ххх";
    Если ПустоеЗначение(Препод)=0 тогда
        Если ПустоеЗначение(Препод.Работник)=0 тогда
            КодТекПрепод=Препод.Работник.Код;
        КонецЕсли;
    КонецЕсли;  
    
    Возврат КодТекПрепод;
КонецФункции              
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////              

Функция КодМеста(Место)
    КодТекМеста="ххх";
    Если ПустоеЗначение(Место)=0 тогда
        КодТекМеста=Место.Код;
    КонецЕсли;  
    
    Возврат КодТекМеста;
КонецФункции
83 Пенза58
 
07.11.13
17:27
(81) ВремяОкончания.

(80) а где часы с 17 по 24 - там вообще не астрономические часы.
84 Ёпрст
 
07.11.13
17:29
(83) :))))))))
реквизиты Час01-17 какой тип то имеют хоть ?
Чего, нельзя было один реквизит Час сделать ?
85 Ёпрст
 
07.11.13
17:30
ДатаДень нахрена ?
ДатаДок не есть тоже самое ?
Нужно новвое расписание - новый документ, не ?
Или вы всегда одним документом всё делаете ?
86 Пенза58
 
07.11.13
17:31
(79) Предложи свой вариант?

Есть задача учета расписания группы, с классами и преподавателями.

И есть задача автоматического заполнения расписания, причем если класс занят, то искался другой класс, если в дневную смену все классы заняты, искался, в вечернюю, если все занято день занятий перносился на другую дату.

Когда дата и класс определены подобрать преподавателя который будет вести занятия и который в это время свободен.
87 Пенза58
 
07.11.13
17:33
(85)
> ДатаДень нахрена ?
> ДатаДок не есть тоже самое ?

Разумеется нет. Это дата занятия, группа учится может неделями.

И в тч, могут быть десятки дат, связи с датой документа вообще никакой.
88 Пенза58
 
07.11.13
17:33
> Нужно новвое расписание - новый документ, не ?

Для каждой группы свой документ и в нем свое расписание.
89 Ёпрст
 
07.11.13
17:36
Ну ладно, зачем тебе 17 реквизитов Час ?




Это еще посмотри на досуге, хотя на инфопомойке еще была куча поделок на 7.7
http://infostart.ru/public/139090/
90 Пенза58
 
07.11.13
17:36
(84)
> реквизиты Час01-17 какой тип то имеют хоть ?

Можно сказать булево 1-0

> Чего, нельзя было один реквизит Час сделать ?

Как это так?

Урок может быть на несколько часов.
91 Пенза58
 
07.11.13
17:40
92 Пенза58
 
07.11.13
17:44
(89) Это на 8-ке.

На восьмерке понятно было бы все по-другому.
93 Пенза58
 
07.11.13
17:48
(89) Я там не увидел про функцию автоматического создания расписания.

Т.е. там человек сидит и сочиняет расписание, здесь же программа автоматически это делает.
94 Torquader
 
07.11.13
21:13
Всё в одном документе - это очень плохо.
Особенно плохо - делить часы на параметры табличной части.
Что такое расписание - это связь "кто кого когда и где", то есть соединение четырёх сущностей:
1) Преподаватель (в справочнике)
2) Группа студентов (в справочнике)
3) Аудитория (в справочнике)
4) Время проведения занятия (число).
Также можно рассматривать дату, как пятый параметр, но она есть в шапке документа.
Что мешает сделать табличную часть, где задавать все четыре параметра, связанные друг с другом ?
Конечно, более правильно будет преподавателя или группу перенести вообще в шапку документа, чтобы в одном документе задавалось расписание для одного преподавателя (или группы).
95 Пенза58
 
08.11.13
08:05
(94)
> Всё в одном документе - это очень плохо.

Почему? И как по-другому?

> Особенно плохо - делить часы на параметры табличной части.

Почему? И как по-другому?

> 4) Время проведения занятия (число).

Ты не путай теплое с мягким, Дата занятия это одно, время занятия это другое.

Например на одну и ту же дату может быть и физ подготовка и право - эти дисциплины ведут разные преподаватели.

> Также можно рассматривать дату, как пятый параметр, но она есть в шапке документа.

Т.е. ты предлагаешь на каждый учебный день отдельный документ?

И в этом документе будут все группы учащихся?

Т.е. когда создается расписание для группы - то открывать и закрывать десятки документов вместо одного?

Что-то я сомневаюсь, что это хорошая идея.

>  чтобы в одном документе задавалось расписание для одного преподавателя (или группы).

У меня сейчас 1 группа - 1 документ.

Группа может учится и пять дней и три месяца (или даже больше), допустим в среднем дней двадцать.

Ты предлагаешь создать двадцать документов вместо одного?
96 ADirks
 
08.11.13
09:04
(95) Тебе документов жалко что-ли? Можно вообще запилить 1 док - одно занятие.
Ты же ведь не станешь заставлять пользователей эти документы редактировать?
97 Пенза58
 
08.11.13
09:26
(96) По идее возможно и редактирование
98 ADirks
 
08.11.13
09:58
(97) В таких случаях для редактирования делается отдельный интерфейс. Редактировать непосредственно документы - издевательство над людями.
99 Пенза58
 
08.11.13
11:02
(98)  > В таких случаях для редактирования делается отдельный интерфейс. Редактировать непосредственно документы - издевательство над людями.

Согласен, но можно и так.
100 Пенза58
 
08.11.13
16:16
100
101 Torquader
 
09.11.13
00:19
(95) Одна форма - это точно. Причём листаться форма должна по дням или неделям. А уже как и что записать, лучше смотреть по частоте выборки.
Если идём от преподавателей, то лучше делать один документ на день занятий преподавателя (их там обычно несколько, но немного), чтобы в нём писалось кого и где он будет вести.
Где (то есть комнаты) нам важны только тогда, когда мы ищем свободную, а это будет делать обработка (то есть их по барабану - в одном документе или вообще в текстовом файле).
Расписание для групп будет составляться сразу на неделю - в этом случае - тоже выбирать всё будет обработка.

Нет, конечно, если очень хочется в одном документе (но сначала вспомним, что в документе не более 9999 строк в dbf-версии), то пожалуйста - пять параметров:
Дата, час (пара) занятия, преподаватель, группа, кабинет.
102 andrewalexk
 
09.11.13
00:27
:) столько инФЫ...проблема...
103 Desna
 
09.11.13
01:33
форма.параметр
104 xenos
 
09.11.13
03:25
(101)

> Одна форма - это точно. Причём листаться форма должна по дням или неделям. А уже как и что записать, лучше смотреть по частоте выборки.

Не совсем понял о чем речь.

вроде речь о том как хранить данные, а не как их выводить.

> Если идём от преподавателей, то лучше делать один документ на день занятий преподавателя (их там обычно несколько, но немного), чтобы в нём писалось кого и где он будет вести.

Идем от группы.

Надо печатать расписания  типа: http://s017.radikal.ru/i435/1311/f9/382dbf9d54ac.jpg

> Где (то есть комнаты) нам важны только тогда, когда мы ищем свободную, а это будет делать обработка (то есть их по барабану - в одном документе или вообще в текстовом файле).

Еще они важны при печати.

> Расписание для групп будет составляться сразу на неделю - в этом случае - тоже выбирать всё будет обработка.

Почему на неделю? Почему не на весь период обучения?

> Нет, конечно, если очень хочется в одном документе (но сначала вспомним, что в документе не более 9999 строк в dbf-версии), то пожалуйста - пять параметров:
Дата, час (пара) занятия, преподаватель, группа, кабинет.

Ну пускай самый большой курс на 100 дней, пускай в среднем по 3-4 урока в день. Итого максимум 300-400 строк.
105 Andreyyy
 
09.11.13
05:51
(50)(53) В ПриОткрытии() СтатусВозврата(0) и дальше все нужные манипуляции, в конце заканчивающиеся Форма.ВыполнитьВыбор(Результат)
106 Злопчинский
 
10.11.13
01:15
..или как вариант - при завершении дочерней обработки (которая немодальная) - вызов незакрытой родительской обработки - в ней отработает ПриПовторномОткрытии() - где можно получить Форма.Параметр... если родительская обработка закрыта - откроется и отработает ПриОткрытии() с получением тгже самого Форма.параметр
.
пример подробней можно посмотреть здесь http://infostart.ru/public/17037/
107 Torquader
 
10.11.13
01:22
(106) Это называется оповещение, только не всегда можно открыть родительскую обработку, так как нужно знать её строку открытия (ИмяОбработки#УникальныйНомер)
108 Злопчинский
 
10.11.13
01:34
(107) ну, без пруда не выловишь и рыбку оттудова... ;-)
109 Torquader
 
10.11.13
02:14
(108) Везде соломки не подстелишь.
110 Cthulhu
 
11.11.13
00:12
(107),(106): через контекст вызвать 1ску-обработку ожидания процедуры модуля вызвавшей формы и закрыться. предварительно засунув куда надо что надо. см.(11).
бег по кругу?..
111 Torquader
 
11.11.13
21:43
(110) Она отрабатывает с ожидаем в пол-секунды, если "зверь" шустрый, то "намышковать" успеет несколько раз.
112 Cthulhu
 
13.11.13
15:55
(111): во-первых, не успеет. статистиццки.
во-вторых подстраховаться ни полраза не проблема - табло "падажжblтеееее" с авто-закрытием или тупо в лоб предупреждение...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший