Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > запись в справочник документом


Автор: Materium 30.1.2007, 18:56
Всё оч просто. Хочу с помощью документа сделать новую запись сотрудника в справочнике.

Код

Процедура ОбработкаПроведения()

Приём=СоздатьОбъект("Справочник.Сотрудники");
Приём.Новый();
Приём.Наименование=ФИО;
Приём.Должность=Должность;
Приём.Оклад=Оклад;
Приём.ДатаПриёма=ДатаПриёма;
Приём.Записать();

КонецПроцедуры


Данная процедура не ругается, но записывает в справочник пустую строку. Подскажите почему?
Реквизиты ФИО, Должность, Оклад, ДатаПриёма берутся из табличной части ввода.

Автор: _Valery_ 30.1.2007, 20:58
Materium, некоторые реквизиты являются периодическими. К примеру, оклад и должность. Для их записи недостаточно просто операции присваивания. Надо использовать метод Установить(<Дата>,<Значение>). По идее, даже пустая строка появляться не должна, потому как непонятно на какую дату устанавливаются периодические реквизиты. Это, естественно, в том случае, если вы дописываете какую-либо из типовых конфигураций. Или у Вас самописная?...Закомментируйте Должность и Оклад и проверьте - остальные реквизиты заполнятся...?

Автор: Materium 31.1.2007, 16:55
Самописная конфа.
Попробую закоментировать, отпишусь позже что получилось.

Автор: Materium 31.1.2007, 18:32
_Valery_,  нет всё закоментировал кроме фио всё равно создаётся пустая строка, без фио, даты, должности и оклада!!!

Автор: _Valery_ 31.1.2007, 20:34
 smile 
Если вышлешь md-файл, посмотрю в чем трабл...))
e-mail: valeria_safina@mail.ru

Автор: Materium 31.1.2007, 23:02
я отправил ))) благодарю. жду

Автор: _Valery_ 1.2.2007, 00:17
to Materium:
Получила. Посмотрела. Комментарии будут в ответном письме... smile 

Автор: stron 1.2.2007, 01:02
Было бы здорово здесь описать решение проблемы - может ещё кому-нибудь пригодится

Автор: Materium 1.2.2007, 21:21
Код

Процедура ОбработкаПроведения() 
Приём=СоздатьОбъект("Справочник.Сотрудники"); 
ТаблицаДокумента = СоздатьОбъект("ТаблицаЗначений"); 
ВыгрузитьТабличнуюЧасть(ТаблицаДокумента); 
ТаблицаДокумента.ВыбратьСтроки(); 
Пока ТаблицаДокумента.ПолучитьСтроку() = 1 Цикл 
Приём.Новый(); 
Приём.Наименование=ТаблицаДокумента.ФИО; 
Приём.Должность=ТаблицаДокумента.Должность; 
Приём.Оклад=ТаблицаДокумента.Оклад; 
Приём.ДатаПриёма=ТаблицаДокумента.ДатаПриёма; 
Приём.Записать(); 
КонецЦикла; 
КонецПроцедуры 


Я вводил данные не в шапке, а в таблице, а цикл перебора строк таблицы не организовал!!! )))
Вверху правильный код!

Автор: stron 1.2.2007, 21:59
Materium, думаю Валерия заслуживает плюса  smile 

Автор: Scatman 9.6.2007, 08:24
Скажите при создании документа с таблицей тоже не чего не вставляется кроме номера документа и даты

Код

              док.Новый();
              док.УстановитьНовыйНомер("СТ-");
              док.ДатаДок = РабочаяДата();
              Для СР = 1 По КолРекв Цикл
       СтрокаАтрибут =  Сз1.ПолучитьЗначение(СчетчикРеквизитов,"");
       док.УстановитьАтрибут(Метаданные.Документ(док.Вид()).РеквизитШапки(СР).Идентификатор,СтрокаАтрибут);
             КонецЦикла;
            
             док.ЗагрузитьТабличнуюЧасть(Тз);    

Документ произвольный.

Автор: SaschaL 14.6.2007, 09:07
Хотелось уточнить, документ создает

Автор: SaschaL 14.6.2007, 16:35
Не могли ли вы уточнить что конкретно пытаетесь добиться данным фрагментом программного года?

Автор: Scatman 18.6.2007, 14:34
Мне надо написать функции по копированию всех данных из выбранного документа в новый.
Для это го я все значения реквезитов заношу в список значений а табличные части в таблицу значений. 
может кто что подскажет по этому поводу

Автор: SaschaL 19.6.2007, 06:49
Добавлено @ 06:52
Есть способ ввести на основании одного д

Добавлено @ 06:52
Есть способ ввести на основании одного документа другой
ниже пример кода:
Код

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


Добавлено @ 06:58
Подобным способом можно вводить один вид докуме

Добавлено @ 06:58
Подобным способом можно вводить один вид документа на основании нескольких видов, предварительно добавив условия для этого, если вы имели ввиду не такой способ, пишите, что нибудь придумаем.

Автор: Scatman 19.6.2007, 09:42
у меня есть функция для создания нового документа 
Код

Процедура Создать(Элемент)
    спр = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
    спр.Дата = ТекущаяДата();
    спр.Номер = "МК-00001";
    спр.Организация = "Мебельный комбинат";
                спр[ИмяРеквизита] = сз.ВыбратьЭлемент(счШапка)
    спр.Записать();
КонецПроцедуры

создается документ в нем содержится номер и дата.
мне надо что то типа вот такого но данный код не работает

Автор: SaschaL 19.6.2007, 17:07
А документ каким одразом выбираешь из которого данные должны перебрасываться во вновь создаваемый?
Существует реквизит подбора, если он существет, то в качестве источника нужно указать именно документ, для позиционирования на нем. При этом можно будет выбирать по дпнной позиции реквизиты.
Может у тетя есть обработка, или выгрузи документ обработкой и вышли очень интересно посмотреть что пытаешься навоять, да и визуально как то проще уловить мысль...

Автор: Scatman 20.6.2007, 13:17
Как зная документ, получить тип его реквизитов и, если тип объектный - получить соответствующий объект
если написать 
Тип = док.Организация.Тип
Надо что то подобное
спр = Справочник[Тип]

Автор: SaschaL 20.6.2007, 19:52
Документ можешь сохнанить как внешний отчет или обработку и прислать, я бы взланул?
Да может еще кому интерсно станет посмотреть на нестандартный подход к программированию!

Автор: Scatman 23.6.2007, 10:53
Найдите ошибку пожалуйста
Код

Процедура ЗагрузитьФайл(Кнопка)
    Т = Новый ТекстовыйДокумент;
    Т.Прочитать(АдресФайла);
    
    СтрокаФ = Т.ПолучитьСтроку(1);
    ДлинаСтроки = СтрДлина(СтрокаФ);
    РезультатСтрока = СтрЗаменить(СтрокаФ,", ",Символы.ПС);
    
    //создаем список значений
    Для х = 1 по СтрЧислоСтрок(РезультатСтрока) Цикл
        сз.Добавить(СтрПолучитьСтроку(РезультатСтрока,х));    
    КонецЦикла;
    
    //создаем документ который будем заполнять
    спр = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
    
    //Получение количество реквизитов
    КолШапка =спр.Метаданные().Реквизиты.Количество();
    // Заполнение документами
    спр.Дата = ТекущаяДата();
    спр.Номер = "МК-00011";
    //------------------------------разбиение реквизитов на группы------------------------------------------//
    Для х = 0 по КолШапка-1 Цикл
        СтрТип = Строка(Спр.Метаданные().Реквизиты[х].Тип); //Получаем тип текущего реквизита
        ИмяРеквизита = спр.Метаданные().Реквизиты[х].Имя;   //Получаем имя реквезита
        
        Если Найти(стрТип,"ссылка")= 0 Тогда                //Проверяем простой или ссылочный тип 
             стрЗначение = СтрПолучитьСтроку(РезультатСтрока,(х+1)); // если простой тогда получаем значения для этого реквизита и заполняем его
             спр[ИмяРеквизита] = стрЗначение;    
        Иначе Если (Найти(стрТип,"Справочник")<>0) и (Найти(стрТип,"Документ")<>0) Тогда //Иначе проверяем на всевозможные объекты
            
              Иначе Если СтрЧислоВхождений(стрТип,",") = 0 ТОгда  //Проверяем на составной тип 
                         ТипЗначения = ТипЗнч(спр[ИмяРеквизита]);
                         докстр = Метаданные.НайтиПоТипу(ТипЗначения).ПолноеИмя();
                         докстр = СтрЗаменить(докстр,".", Символы.ПС);
                         
                         Если Найти(стрТип,"Документ") <>0 Тогда 
                              НовыйДокумент = Документы.ЗарплатаКВыплатеОрганизаций.НайтиПоНомеру(СтрПолучитьСтроку(РезультатСтрока,(х+1)));
                              спр[ИмяРеквизита] = НовыйДокумент;
                                    
                         Иначе Если Найти(стрТип,"План счетов")<>0 Тогда 
                                    НовыйПланСчетов = ПланыСчетов[СтрПолучитьСтроку(докстр,2)];
                                    стрЗначение = СтрПолучитьСтроку(РезультатСтрока,(х+1));
                                    спр[ИмяРеквизита] = НовыйПланСчетов.НайтиПоНаименованию(стрЗначение);
                                    
                               Иначе Если Найти(стрТип,"Перечисление")<>0 Тогда 
                                          НовоеПеречисление = Перечисления[СтрПолучитьСтроку(докстр,2)];
                                          кх = НовоеПеречисление.Количество();
                                          Для с=0 по кх-1 Цикл
                                              НовоеПеречислениеИмя = НовоеПеречисление.Получить(с);
                                              Если Строка(НовоеПеречислениеИмя) = СтрПолучитьСтроку(РезультатСтрока,(х+1)) ТОгда
                                                   спр[ИмяРеквизита] = НовоеПеречисление.Получить(с);
                                                   Сообщить(спр[ИмяРеквизита] + "   :" + НовоеПеречисление.Получить(с));
                                              КонецЕсли;
                                           КонецЦикла;
                                           
                                      Иначе Если Найти(стрТип,"Справочник")<>0 Тогда 
                                                НовыйСправочник = Справочники[СтрПолучитьСтроку(докстр,2)];
                                                стрЗначение = СтрПолучитьСтроку(РезультатСтрока,(х+1));
                                                спр[ИмяРеквизита] = НовыйСправочник.НайтиПоНаименованию(стрЗначение);
                                            КонецЕсли;
                                      КонецЕсли;
                                КонецЕсли;
                          КонецЕсли;
                    КонецЕсли;
              КонецЕсли;
        КонецЕсли;
    КонецЦикла;
        спр.Записать();
    КонецПроцедуры


PS только просьба не издеваться над кодом smile 
процедура должна выгружать из файла значения реквизитов и  заполнять документ. но не которые реквизиты не заполняются(или заполняются не правильно)

Автор: SaschaL 26.6.2007, 19:20
все это интересно, фал то какого формата? Экселевкий?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)