Nodir2525
Участник
Offline
|
|
« : 21-09-2010 05:51 » |
|
Конфигурация - Справочники - Контрагент - Фамилия - Имя - Отчество - ДокументНомер Документы - ВводНовыхКлиентов - Шапка - Фамилия - Имя - Отчество - ДокументНомер --------------------------------------------------------------------------------------------------
- Модуль Документа- Документ.ВводНовыхКлиентов ------------------------------------------------------------------------------------------------- Процедура ОбработкаПроведения()
СпрК=СоздатьОбъект("Справочник.Контрагент"); СпрК.Новый(); СпрК.Фамилия=Фамилия; СпрК.Имя=Имя; СпрК.Отчество=Отчество; СпрК.ДокументНомер=ДокументНомер; СпрК.ДокументДатаВыдачи=ДокументДатаВыдачи; СпрК.ДокументКемВыдан=ДокументКемВыдан; СпрК.Наименование=СокрЛП(СпрК.Фамилия)+" "+СокрЛП(СпрК.Имя)+" "+СокрЛП(СпрК.Отчество); СпрК.Записать();
КонецПроцедуры ------------------------------------------------------------------------------------------------ У меня такой Вапрос? Когда Я водил нового клиента он создавался на справочнике. Но база ведает ошибку.
СпрК.Записать(); {Документ.ВводНовыхКлиентов.Модуль Документа(14)}: Не определена дата! Элемент не может быть записан!
|
|
|
Записан
|
|
|
|
kiser
Участник
Offline
|
|
« Ответ #1 : 21-09-2010 10:54 » |
|
Может среди реквизитов справочника есть периодические?
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #2 : 21-09-2010 13:00 » |
|
На Свойства Реквизита стоит галочка "Периодический, Изменяется Документами" Я хочу только водили новых клиентов через "ВводНовыхКлиентов" и делали изменение только через Конфигурацию - Документы - ИзменениеДанныхКлиентов!!! Чтобы через Справочник - Контрагент - не смогли водит и изменят данный!!!
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #3 : 21-09-2010 18:48 » |
|
Nodir2525, Проведение документа - в общем случае операция не разовая, а у тебя при каждом проведении будет создаваться новый элемент справочника. Нужно добавить дополнительные проверки чтобы элемент не создавался повторно. Если у реквизита справочника установлены такие параметры, как ты описал (и снят флажок Ручное изменение) - то правильно устанавливать реквизит нужно с помощью процедуры УстановитьРеквизитСправочника();
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #4 : 21-09-2010 20:05 » |
|
Kivals процедуры УстановитьРеквизитСправочника(); можно пример написать
|
|
|
Записан
|
|
|
|
AndyG
Постоялец
Offline
|
|
« Ответ #5 : 22-09-2010 05:32 » |
|
Открываем Стандартную конфигурацию и смотрим обработку "ПервыйЗапуск" там есть примеры, вот кусок:
Валюты = СоздатьОбъект("Справочник.Валюты"); Валюты.Новый(); Валюты.Код = "0"; Валюты.Наименование = "Руб"; Валюты.ПолнНаименование = "Рубли"; Валюты.Записать(); Валюты.Кратность.Установить('01.01.1980',1); //периодический Валюты.Курс.Установить('01.01.1980',1);//периодический
Но как правильно заметил Kivals, возможно элемент справочника уже присутствует, тогда следует написать проверку дублирования, и если есть элемент, то спозиционироваться на нем и код будет несколько другой: УстановитьРеквизитСправочника(<ЭлементСправочника>,<НазваниеРеквизита>,<Значение>,<ДатаУстановки>,<ИмяТипа>,<Длина>,<Точность>) Хотя я использовал в доках и вариант 1, те Спр.Реквизит.Установить(дата, значение)
|
|
« Последнее редактирование: 22-09-2010 08:46 от AndyG »
|
Записан
|
|
|
|
kiser
Участник
Offline
|
|
« Ответ #6 : 22-09-2010 12:16 » |
|
ИМХО надо так: Процедура ОбработкаПроведения()
СпрК=СоздатьОбъект("Справочник.Контрагент"); СпрК.Новый(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Имя",Имя,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Отчество",Отчество,ДатаДок); //если остальные реквизиты не периодические, то так и останутся СпрК.ДокументНомер=ДокументНомер; СпрК.ДокументДатаВыдачи=ДокументДатаВыдачи; СпрК.ДокументКемВыдан=ДокументКемВыдан; СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество); //если хочешь использовать СпрК.Фамилия, СпрК.Имя и СпрК.Отчество тогда //СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок)); //поскольку периодические реквизиты не только записываются по дате, но и читаются СпрК.Записать();
КонецПроцедуры
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #7 : 22-09-2010 14:49 » |
|
... СпрК.Новый(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); ... Не прокатит. Нужно так: ... СпрК.Записать(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); ...
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #8 : 23-09-2010 05:40 » |
|
KISER Я попробовал, как ты написал. Но у меня не получается. У меня на конфигурации только это написано. Может куда та что-то надо писать.
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #9 : 23-09-2010 05:49 » |
|
Kivals, Код: ... СпрК.Новый(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); ...Не прокатит. Нужно так:
Код: ... СпрК.Записать(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); ...
Мне надо так писат!!!
Процедура ОбработкаПроведения() СпрК=СоздатьОбъект("Справочник.Контрагент"); СпрК.Новый(); СпрК.Записать(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Имя",Имя,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Отчество",Отчество,ДатаДок); УстановитьРеквизитСправочник(СпрК,"ДокументНомер",ДокументНомер,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументДатаВыдачи",ДокументДатаВыдачи,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументКемВыдан",ДокументКемВыдан,ДатаДок); СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок));
КонецПроцедуры
|
|
|
Записан
|
|
|
|
kiser
Участник
Offline
|
|
« Ответ #10 : 23-09-2010 05:51 » |
|
Так последний вариант работает?
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #11 : 23-09-2010 06:10 » |
|
Последний вариант работает Но в Контрагенте в Наименование не чего нету пуста.
СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок)); не работает на верно.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #12 : 23-09-2010 13:35 » |
|
Процедура ОбработкаПроведения() СпрК=СоздатьОбъект("Справочник.Контрагент"); СпрК.Новый(); СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок)); СпрК.Записать(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Имя",Имя,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Отчество",Отчество,ДатаДок); УстановитьРеквизитСправочник(СпрК,"ДокументНомер",ДокументНомер,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументДатаВыдачи",ДокументДатаВыдачи,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументКемВыдан",ДокументКемВыдан,ДатаДок); КонецПроцедуры
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #13 : 24-09-2010 06:47 » |
|
Серавно!!!
СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок)); не работает на верно.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #14 : 24-09-2010 11:20 » |
|
Сори - не глянул (естественно эти реквизиты еще не установлены) Вот так долно быть: СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество); где Фамилия, Имя, Отчество - это реквизиты документа
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #15 : 24-09-2010 11:21 » |
|
Суть моего изменения кода была в том, что присвоить СпрК.Наименование нужно до того, как записывать (или же записать еще раз, но это не совсем верно)
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #16 : 27-09-2010 09:13 » |
|
нашло такой. Процедура ОбработкаПроведения() СпрК=СоздатьОбъект("Справочник.Контрагент"); СпрК.ИспользоватьДату(ДатаДок); СпрК.Новый(); СпрК.Фамилия=Фамилия; СпрК.Имя=Имя; СпрК.Отчество=Отчество; СпрК.ДокументНомер=ДокументНомер; СпрК.ДокументДатаВыдачи=ДокументДатаВыдачи; СпрК.ДокументКемВыдан=ДокументКемВыдан; СпрК.Наименование=СокрЛП(СпрК.Фамилия)+" "+СокрЛП(СпрК.Имя)+" "+СокрЛП(СпрК.Отчество); СпрК.Записать(); КонецПроцедуры
В чем разница с вашим модулем.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #17 : 27-09-2010 09:59 » |
|
Разница в том, что твой вариант просто устанавливает реквизиты на указанную даты (не привязывая их к документу), что имеет свои минусы: 0. Такой режим предусматривает ручное изменение периодических реквизитов - в некоторых случаях это недопустимо 1. На каждую дату можно установить только одно значение - значит 2 документа в один день сделать нельзя, точнее можно, но первое значение будет "затерто". 3. Значение не привязано к документу, т.е. нельзя просто посмотреть в историю реквизита и узнать каким документом изменение внесено 4. При отмене проведения документа значения реквизитов не отменятся.
Возможно для твоей задачи это и приемлемо, но это неправильный подход (ИМХО)
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #18 : 28-09-2010 06:58 » |
|
Сори - не глянул (естественно эти реквизиты еще не установлены) Вот так долно быть: СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество); где Фамилия, Имя, Отчество - это реквизиты документа
Да это плохо. На Вашем варианте СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество); Не работает
|
|
|
Записан
|
|
|
|
kiser
Участник
Offline
|
|
« Ответ #19 : 28-09-2010 07:55 » |
|
Процедура ОбработкаПроведения() //Проверка на наличие такого Спр1 = СоздатьОбъект("Справочник.Контрагент"); Спр1.ВыбратьЭлементы(); Если Спр1.НайтиПоНаименованию(СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество),0,1) = 1 тогда Если Вопрос("Такой контрагент есть! Добавить этого?", "Да+Нет") = "Нет" Тогда Возврат; КонецЕсли; КонецЕсли; //Добавление нового СпрК=СоздатьОбъект("Справочник.Контрагент"); СпрК.Новый(); СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество); СпрК.Записать(); ТекСпр = СпрК.ТекущийЭлемент(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Имя",Имя,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Отчество",Отчество,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументНомер",ДокументНомер,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументСерия",ДокументСерия,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументДатаВыдачи",ДокументДатаВыдачи,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументКемВыдан",ДокументКемВыдан,ДатаДок);
КонецПроцедуры
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #20 : 28-09-2010 11:38 » |
|
Если Вопрос("Такой контрагент есть! Добавить этого?", "Да+Нет") = "Нет" kiser, не рекомендую использовать интерактивные функции при проведении. В крайнем случае (если уж очень хочется) - то с установленным таймаутом (обычно - последний параметр). Причина: например есть 100 000 документов, которые надо перепровести чтобы исправить последовательность. Запускаем вечером, смотрим что первые 100 документов проводятся нормально и уходим домой, предполагая, что за ночь все проведется. Утром видим картину: на 200-м документе у нас завис вопрос и все остановилось Проверять результат ГрупповаяОбработка() - не выход, т.к. документы могут массово проводиться и самонаписаной обработкой.
|
|
« Последнее редактирование: 28-09-2010 11:43 от Kivals »
|
Записан
|
|
|
|
kiser
Участник
Offline
|
|
« Ответ #21 : 28-09-2010 12:22 » |
|
Если Вопрос("Такой контрагент есть! Добавить этого?", "Да+Нет") = "Нет" kiser, не рекомендую использовать интерактивные функции при проведении. В крайнем случае (если уж очень хочется) - то с установленным таймаутом (обычно - последний параметр). Причина: например есть 100 000 документов, которые надо перепровести чтобы исправить последовательность. Запускаем вечером, смотрим что первые 100 документов проводятся нормально и уходим домой, предполагая, что за ночь все проведется. Утром видим картину: на 200-м документе у нас завис вопрос и все остановилось Проверять результат ГрупповаяОбработка() - не выход, т.к. документы могут массово проводиться и самонаписаной обработкой. Спасибо за совет. Ну это пример проверки на наличие, а кусок кода с вопросом можно заменить уже по выбору разработчика. Например на отмену проведения или перезапись существующего.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #22 : 28-09-2010 13:15 » |
|
Согласен, просто посчитал нужным написать это рядом с кодом: чтобы использующие этот код новички не взяли такой подход за правило.
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #23 : 06-10-2010 06:52 » |
|
СПАСИБО!!! ПОЛУЧИЛСЯ!!!
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #24 : 06-10-2010 13:08 » |
|
Процедура ОбработкаПроведения() СпрК=СоздатьОбъект("Справочник.Контрагент"); СпрК.Новый(); СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество); СпрК.Записать(); УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Имя",Имя,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Отчество",Отчество,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументНомер",ДокументНомер,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументСерия",ДокументСерия,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументДатаВыдачи",ДокументДатаВыдачи,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ДокументКемВыдан",ДокументКемВыдан,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ЮридическиеАдрес",ЮридическиеАдрес,ДатаДок); УстановитьРеквизитСправочника(СпрК,"КодСОАТОЮрАдрес",КодСОАТОЮрАдрес,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ПочтовыйИндексЮр",ПочтовыйИндексЮр,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Страна",Страна,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ПочтовыйАдрес",КодСОАТОПочАдрес,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ПочтовыйАдрес",КодСОАТОПочАдрес,ДатаДок); УстановитьРеквизитСправочника(СпрК,"ПочтовыйАдрес",КодСОАТОПочАдрес,ДатаДок); УстановитьРеквизитСправочника(СпрК,"Регион",Регион,ДатаДок); КонецПроцедуры
ОШИБКА!!! СпрК.Записать(); {Документ.ВводНовыхКлиентФиз.Модуль Документа(28)}: Неверно задан код!
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #25 : 06-10-2010 15:03 » |
|
Для справочника Контрагент: Какой тип и длина кода? Установлен ли флаг автонумерации?
|
|
|
Записан
|
|
|
|
Nodir2525
Участник
Offline
|
|
« Ответ #26 : 07-10-2010 04:37 » |
|
ДА!!! СПАСИБО!!!
|
|
|
Записан
|
|
|
|
|