Имя: Пароль:
1C
1С v8
v8: не генерит справочник автоматически
0 Ilias54rus
 
03.07.13
08:20
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   Если ЗначениеНеЗаполнено(ДатаВступления) Тогда
       Предупреждение("Не заполнена дата вступления приказа на стоимость обучения. Проведение документа отменено");
       Отказ = Истина;
       Возврат;
   КонецЕсли;
           
   Для каждого Строка из Товары  Цикл
       
       Если ЗначениеНеЗаполнено(ВУЗ) или ЗначениеНеЗаполнено(Строка.ПрограммаОбучения) или ЗначениеНеЗаполнено(Строка.ФормаОбучения) или ЗначениеНеЗаполнено(Строка.Специальность)
           или ЗначениеНеЗаполнено(Строка.Сумма)  или ЗначениеНеЗаполнено(Строка.Валюта) или ЗначениеНеЗаполнено(Строка.ПериодичностьОплаты) Тогда
           Предупреждение("В строке "+Строка.НомерСтроки+" не установлены все реквизиты для установки стоимости обучения");
           Если ЭтотОбъект.Проведен Тогда
               ЭтотОбъект.Проведен = Ложь;
               ЭтотОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
           КонецЕсли;    
           Прервать;
       КонецЕсли;    
       
       Запрос = Новый Запрос;
       Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
       |    ПриказПоСтоимостиОбучения.Ссылка,
       |    ПриказПоСтоимостиОбучения.Товары.(
       |        Справочник
       |    ),
       |    СтоимостьОбучения.Ссылка КАК СсылкаСправочник
       |ИЗ
       |    Документ.ПриказПоСтоимостиОбучения КАК ПриказПоСтоимостиОбучения
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СтоимостьОбучения КАК СтоимостьОбучения
       |        ПО ПриказПоСтоимостиОбучения.Товары.Справочник = СтоимостьОбучения.Ссылка    
       |ГДЕ
       |    СтоимостьОбучения.ВУЗ = &ВУЗ
       |    И СтоимостьОбучения.ФормаОбучения = &ФормаОбучения
       |    И СтоимостьОбучения.ПрограммаОбучения = &ПрограммаОбучения
       |    И СтоимостьОбучения.Специальность = &Специальность
       |    И СтоимостьОбучения.ДатаВступления = &Дата";
       
       Запрос.УстановитьПараметр("ВУЗ", ВУЗ);
       Запрос.УстановитьПараметр("ФормаОбучения",Строка.ФормаОбучения);
       Запрос.УстановитьПараметр("ПрограммаОбучения", Строка.ПрограммаОбучения);
       Запрос.УстановитьПараметр("Специальность", Строка.Специальность);
       Запрос.УстановитьПараметр("Дата", ДатаВступления);
       
       Результат = Запрос.Выполнить();
       Выборка = Результат.Выбрать();
       
       Если Выборка.Следующий() Тогда
           СправочникСсылка = Выборка.СсылкаСправочник.ПолучитьОбъект();
       Иначе
           СправочникСсылка = Справочники.СтоимостьОбучения.СоздатьЭлемент();
       КонецЕсли;
       
       СправочникСсылка.ВУЗ = ВУЗ;
       СправочникСсылка.ФормаОбучения = Строка.ФормаОбучения;
       СправочникСсылка.ПрограммаОбучения = Строка.ПрограммаОбучения;
       СправочникСсылка.Специальность = Строка.Специальность;
       СправочникСсылка.Сумма = Строка.Сумма;
       СправочникСсылка.Валюта = Строка.Валюта;
       СправочникСсылка.ПериодичностьОплаты = Строка.ПериодичностьОплаты;
       СправочникСсылка.НомерПриказа = НомерПриказа;
       СправочникСсылка.ДатаВступления = ДатаВступления;
       СправочникСсылка.Наименование = СокрЛП(Строка.ПрограммаОбучения)+" "+СокрЛП(Строка.Специальность)+" "+СокрЛП(Строка.ФормаОбучения)+" "+СокрЛП(ВУЗ)+" "+Формат(ДатаВступления, "ДФ=dd.MM.yyyy");
       СправочникСсылка.Записать();
       Строка.Справочник = СправочникСсылка.Ссылка;
       
       //Запись истории номенклатуры
       Запрос2 = Новый Запрос;
       Запрос2.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
       |    Номенклатура.Ссылка
       |ИЗ
       |    Справочник.Номенклатура КАК Номенклатура
       |ГДЕ
       |    Номенклатура.Группы.ПрограммаОбучения = &ПрограммаОбучения
       |    И Номенклатура.Группы.ВУЗ = &ВУЗ
       |    И Номенклатура.Группы.ФормаОбучения = &ФормаОбучения
       |    И Номенклатура.Группы.Специальность = &Специальность";
       
       Запрос2.УстановитьПараметр("ВУЗ", ВУЗ);
       Запрос2.УстановитьПараметр("ПрограммаОбучения", Строка.ПрограммаОбучения);
       Запрос2.УстановитьПараметр("ФормаОбучения", Строка.ФормаОбучения);
       Запрос2.УстановитьПараметр("Специальность", Строка.Специальность);
       
       Результат = Запрос2.Выполнить();
       НоменклатураВыборка = Результат.Выбрать();
       
       Пока НоменклатураВыборка.Следующий() Цикл
           
           
           ПолеТаблица = Новый ТаблицаЗначений;
           
           ПолеТаблица.Колонки.Добавить("ДатаВступления");
           ПолеТаблица.Колонки.Добавить("Валюта");
           ПолеТаблица.Колонки.Добавить("Сумма");
           Запрос = Новый Запрос;
           Запрос.Текст = "ВЫБРАТЬ
           |    СтоимостьОбучения.Ссылка,
           |    СтоимостьОбучения.ВУЗ,
           |    СтоимостьОбучения.ФормаОбучения,
           |    СтоимостьОбучения.ПрограммаОбучения,
           |    СтоимостьОбучения.Специальность,
           |    СтоимостьОбучения.Сумма,
           |    СтоимостьОбучения.Валюта,
           |    СтоимостьОбучения.ПериодичностьОплаты,
           |    СтоимостьОбучения.Номенклатура,
           |    СтоимостьОбучения.НомерПриказа,
           |    СтоимостьОбучения.ДатаВступления
           |ИЗ
           |    Справочник.СтоимостьОбучения КАК СтоимостьОбучения
           |ГДЕ
           |    СтоимостьОбучения.ВУЗ = &ВУЗ
           |    И СтоимостьОбучения.ФормаОбучения = &ФормаОбучения
           |    И СтоимостьОбучения.ПрограммаОбучения = &ПрограммаОбучения
           |    И СтоимостьОбучения.Специальность = &Специальность";
           
           
           Запрос.УстановитьПараметр("ВУЗ", ВУЗ);
           Запрос.УстановитьПараметр("ПрограммаОбучения", Строка.ПрограммаОбучения);
           Запрос.УстановитьПараметр("ФормаОбучения", Строка.ФормаОбучения);
           Запрос.УстановитьПараметр("Специальность", Строка.Специальность);
           
           Результат = Запрос.Выполнить();
           Выборка = Результат.Выбрать();
           Если Выборка.Количество() = 0 Тогда
               
               Продолжить;
           КонецЕсли;
           Пока Выборка.Следующий() Цикл
               НоваяСтрока = ПолеТаблица.Добавить();
               НоваяСтрока.ДатаВступления = Выборка.ДатаВступления;
               НоваяСтрока.Валюта = Выборка.Валюта;
               НоваяСтрока.Сумма = Выборка.Сумма;
           КонецЦикла;    
           Для каждого СтрокаСтоимости из ПолеТаблица Цикл
               НоваяДата = СтрокаСтоимости.ДатаВступления;
               НоваяВалюта = СтрокаСтоимости.Валюта;
               НоваяСумма = СтрокаСтоимости.Сумма;
               
               Запрос1 = Новый Запрос;
               Запрос1.Текст = "ВЫБРАТЬ
               |    ЦеныНоменклатуры.Период КАК Период,
               |    ЦеныНоменклатуры.Регистратор,
               |    ЦеныНоменклатуры.Номенклатура,
               |    ЦеныНоменклатуры.Валюта,
               |    ЦеныНоменклатуры.Цена,
               |    ЦеныНоменклатуры.ТипЦен
               |ИЗ
               |    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
               |ГДЕ
               |    ЦеныНоменклатуры.Период = &Дата
               |    И ЦеныНоменклатуры.Валюта = &Валюта
               |    И ЦеныНоменклатуры.Цена = &Сумма
               |    И ЦеныНоменклатуры.Номенклатура = &Номенклатура";
               
               Запрос1.УстановитьПараметр("Номенклатура", НоменклатураВыборка.Ссылка);
               Запрос1.УстановитьПараметр("Дата", НоваяДата);
               Запрос1.УстановитьПараметр("Валюта", НоваяВалюта);
               Запрос1.УстановитьПараметр("Сумма", НоваяСумма);
               
               Результат = Запрос1.Выполнить();
               Выборка = Результат.Выбрать();
               Если Выборка.Количество() = 0 Тогда        
                   ПерСтоим =  Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
                   ПерСтоим.Дата = НоваяДата;
                   
                   Если НоваяВалюта.Пустая() Тогда
                       Сообщить("Не установлена валюта стоимости. Принята валюта руб!");
                       НоваяВалюта = Справочники.Валюты.НайтиПоКоду("810");
                       СпрЦенТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Основной в РУБ");
                       СпрСтоимТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Основной в РУБ");
                   КонецЕсли;
                   СпрСтоимВалюта = НоваяВалюта.Ссылка;
                   Если Найти(ВРег(НоваяВалюта), "РУБ") <> 0 Тогда
                       СпрСтоимТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Основной в РУБ");
                       СпрЦенТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Основной в РУБ");
                   ИначеЕсли Найти(ВРег(НоваяВалюта), "USD") <> 0  Тогда
                       СпрСтоимТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Основной в USD");
                       СпрЦенТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Основной в USD");
                   ИначеЕсли Найти(ВРег(НоваяВалюта), "УЕ") <> 0 Тогда
                       СпрСтоимТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Основной в УЕ");
                       СпрЦенТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Основной в УЕ");
                   КонецЕсли;
                   СпрСтоимЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("год");
                   СпрСтоим = ПерСтоим.Товары.Добавить();  
                   СпрЦен = ПерСтоим.ТипыЦен.Добавить();
                   СпрЦен.ТипЦен = СпрЦенТипЦен;
                   СпрСтоим.ТипЦен = СпрСтоимТипЦен;
                   СпрСтоим.Цена = НоваяСумма;
                   СпрСтоим.Валюта = СпрСтоимВалюта;
                   СпрСтоим.ЕдиницаИзмерения = СпрСтоимЕдиницаИзмерения;
                   СпрСтоим.Номенклатура = НоменклатураВыборка.Ссылка;
                   Попытка
                       ПерСтоим.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
                       Сообщить("Создан документ "+СокрЛП(ПерСтоим)+" для записи истории номенклатуры!");
                   Исключение
                       Сообщить("Документ установки цен номенклатуры с такими параметрами уже существует");
                   КонецПопытки;
               КонецЕсли;
           КонецЦикла;
           
       КонецЦикла;
   КонецЦикла;
   ЭтотОбъект.Записать(РежимЗаписиДокумента.Запись);
   
КонецПроцедуры
код процедуры проведения при проведении возникают следующие ошибки
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ПриказПоСтоимостиОбучения.МодульОбъекта(64)}: Ошибка при вызове метода контекста (Записать)

по причине:

по причине:
В данной транзакции уже происходили ошибки!
И еще одна при генерации справочника стоимостьобучения
СправочникСсылка.Записать();
<Объект не найден> (77:8a9f001a4bf17cb111e2e38db6904be4)
вот брать информацию должен из документа Приказобстомостиобучения и его табличной части товары
1 Галахад
 
гуру
03.07.13
08:31
Транзакция отменилась - справочник не записался.
2 Рэйв
 
03.07.13
08:31
У тебя гдето битая ссылка. скорее всего из-за нее выпадает в ошибку
3 Галахад
 
гуру
03.07.13
08:33
А зачем записывать документ во время его же проведения я вообще не понял.
4 butterbean
 
03.07.13
08:34
(0) у тебя СправочникСсылка — это почти наверняка пустая ссылка, т.к. запрос у тебя не к таб части документа, а к шапке...
5 Ilias54rus
 
03.07.13
08:34
знаю что битая ссыль как её выпасти и исправить
6 Ilias54rus
 
03.07.13
08:38
и еще вопрос как организовать запрос к табличной части документа и к кое каким реквизитам документа
7 Ilias54rus
 
03.07.13
08:46
так нашел где он должен получить Обьект выбора
но он его не получает
8 Ilias54rus
 
03.07.13
08:48
Галхад это уже не комне а к разработчикам системы Управление Образовательным Учереждением 2.0
9 Ilias54rus
 
03.07.13
08:49
СправочникСсылка = Выборка.СсылкаСправочник.ПолучитьОбъект();
но проблема явно в этой строке
10 George Wheels
 
03.07.13
08:49
(6) ВЫБРАТЬ Док.Ссылка.РеквизитДокумента
Док.РеквизитТабличнойЧасти
ИЗ
Документ.КакойТо КАК Док
11 George Wheels
 
03.07.13
08:50
(6) ВЫБРАТЬ Док.Ссылка.РеквизитДокумента
Док.РеквизитТабличнойЧасти
ИЗ
Документ.КакойТо.ТабличнаяЧасть КАК Док
12 Ilias54rus
 
03.07.13
08:53
Георгий я вас понял а дальше выбор по строкам чтоб читал
13 George Wheels
 
03.07.13
09:24
(5) Администрирование - Тестирование и исправление
14 Ilias54rus
 
03.07.13
10:33
Такс провел тест мда при смене версии не все правильно перенеслось
15 cw014
 
03.07.13
10:43
1) За использование зарезервированных слов в качестве переменных - расстрел через повешание
2) ЭтотОбъект.Проведен = Ложь;
ЭтотОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);

Если делаешь запись через отмену проведения - признак "Проведен" взводить не нужно. Тем более использование отмены проведения в обработке проведения карается ч0рным властелином...

3) За запросы в цикле - пожизненный эцих с гвоздями. А у тебя два вложенных цикла

4) Первый запрос вообще эпичен - я не понял его цель. В нем кстати глюк твой и присутствует
16 acsent
 
03.07.13
10:45
исключение при записи отменяет всю транзакцию. неважно в попытке или нет
17 Ilias54rus
 
03.07.13
10:57
Cw14 Тогда как создавать Справочник с параметрами из табличной части документа если не в цикле второй ответ на твой вопрос первый запрос как я понял это и есть создание справочника а второй Цен номенклатуры и Эцих не мне а фирме Infosuite которая разрабатывала эту конфигурацию
18 rbcvg
 
03.07.13
11:10
Автор, запятых тебе отсыпать? Читать невозможно.
19 Ilias54rus
 
03.07.13
11:19
Извините меня двоечника по русскому языку.
20 Ilias54rus
 
03.07.13
13:51
Выяснил Справочник генерируеться но не записываеться
21 hhhh
 
03.07.13
14:35
(20) за создание справочника из документа надо расстреливать, потом тело сжечь, и то, что осталось, утопить.
22 Ilias54rus
 
03.07.13
14:42
(21) Ты не прав это что Всех студентов вручную им стоимость прописывать и считать всех за 5 лет на кыркуляторе
23 Ilias54rus
 
03.07.13
14:46
Меня же деканаты вместе с бухгалтерами сьедят тогда
2 + 2 = 3.9999999999999999999999999999999...