Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Новичок. Процедура ОбработкаПроведения()  (Прочитано 29416 раз)
0 Пользователей и 9 Гостей смотрят эту тему.
Nodir2525
Участник

Offline Offline

« : 21-09-2010 05:51 » 

Конфигурация
   - Справочники
      - Контрагент                                 
                                               - Фамилия       
                 - Имя
         - Отчество
                                  - ДокументНомер
                                     
Документы
        - ВводНовыхКлиентов
   - Шапка
                                - Фамилия   
                - Имя
       - Отчество
      - ДокументНомер        
--------------------------------------------------------------------------------------------------

- Модуль Документа- Документ.ВводНовыхКлиентов
-------------------------------------------------------------------------------------------------
Процедура ОбработкаПроведения()

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

КонецПроцедуры
------------------------------------------------------------------------------------------------
У меня такой Вапрос?
Когда Я водил нового клиента он создавался на справочнике.
Но база ведает ошибку.

СпрК.Записать();
{Документ.ВводНовыхКлиентов.Модуль Документа(14)}: Не определена дата! Элемент не может быть записан!
Записан
kiser
Участник

by
Offline Offline

« Ответ #1 : 21-09-2010 10:54 » 

Может среди реквизитов справочника есть периодические?
Записан
Nodir2525
Участник

Offline Offline

« Ответ #2 : 21-09-2010 13:00 » 

На Свойства Реквизита стоит галочка "Периодический, Изменяется Документами"
Я хочу только водили новых клиентов через "ВводНовыхКлиентов" и делали изменение только через Конфигурацию - Документы - ИзменениеДанныхКлиентов!!!
Чтобы через Справочник - Контрагент - не смогли водит и изменят данный!!!
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 21-09-2010 18:48 » 

Nodir2525, Проведение документа - в общем случае операция не разовая, а у тебя при каждом проведении будет создаваться новый элемент справочника. Нужно добавить дополнительные проверки чтобы элемент не создавался повторно.
Если у реквизита справочника установлены такие параметры, как ты описал (и снят флажок Ручное изменение) - то правильно устанавливать реквизит нужно с помощью процедуры УстановитьРеквизитСправочника();
Записан
Nodir2525
Участник

Offline Offline

« Ответ #4 : 21-09-2010 20:05 » 

Kivals
процедуры УстановитьРеквизитСправочника();
можно пример написать
Записан
AndyG
Постоялец

by
Offline 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
Участник

by
Offline Offline

« Ответ #6 : 22-09-2010 12:16 » 

ИМХО надо так:
Код:
Процедура ОбработкаПроведения()

СпрК=СоздатьОбъект("Справочник.Контрагент");
СпрК.Новый();
УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок);
УстановитьРеквизитСправочника(СпрК,"Имя",Имя,ДатаДок);
УстановитьРеквизитСправочника(СпрК,"Отчество",Отчество,ДатаДок);
//если остальные реквизиты не периодические, то так и останутся
СпрК.ДокументНомер=ДокументНомер;
СпрК.ДокументДатаВыдачи=ДокументДатаВыдачи;
СпрК.ДокументКемВыдан=ДокументКемВыдан;
СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество);
//если хочешь использовать СпрК.Фамилия, СпрК.Имя и СпрК.Отчество тогда
//СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок));
//поскольку периодические реквизиты не только записываются по дате, но и читаются
СпрК.Записать();

КонецПроцедуры
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 22-09-2010 14:49 » 

Код:
...
СпрК.Новый();
УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок);
...
Не прокатит. Нужно так:
Код:
...
СпрК.Записать();
УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок);
...
Записан
Nodir2525
Участник

Offline Offline

« Ответ #8 : 23-09-2010 05:40 » 

KISER
Я попробовал, как ты написал. Но у меня не получается.
У меня на конфигурации только это написано.
Может куда та что-то надо писать.
Записан
Nodir2525
Участник

Offline Offline

« Ответ #9 : 23-09-2010 05:49 » 

Kivals,
Код:
...
СпрК.Новый();
УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок);
...Не прокатит. Нужно так:

Код:
...
СпрК.Записать();
УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок);
...


Мне надо так писат!!!

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

КонецПроцедуры
Записан
kiser
Участник

by
Offline Offline

« Ответ #10 : 23-09-2010 05:51 » 

Так последний вариант работает?
Записан
Nodir2525
Участник

Offline Offline

« Ответ #11 : 23-09-2010 06:10 » 

Последний вариант работает
Но в Контрагенте в Наименование не чего нету пуста.

СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок));
не работает на верно.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 23-09-2010 13:35 » new

Код:
Процедура ОбработкаПроведения()
    СпрК=СоздатьОбъект("Справочник.Контрагент");
    СпрК.Новый();
    СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок));
    СпрК.Записать();     
    УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок);
    УстановитьРеквизитСправочника(СпрК,"Имя",Имя,ДатаДок);
    УстановитьРеквизитСправочника(СпрК,"Отчество",Отчество,ДатаДок);
    УстановитьРеквизитСправочник(СпрК,"ДокументНомер",ДокументНомер,ДатаДок);
    УстановитьРеквизитСправочника(СпрК,"ДокументДатаВыдачи",ДокументДатаВыдачи,ДатаДок);
    УстановитьРеквизитСправочника(СпрК,"ДокументКемВыдан",ДокументКемВыдан,ДатаДок);
КонецПроцедуры
Записан
Nodir2525
Участник

Offline Offline

« Ответ #13 : 24-09-2010 06:47 » 

Серавно!!!

СпрК.Наименование=СокрЛП(СпрК.Фамилия.Получить(ДатаДок))+" "+СокрЛП(СпрК.Имя.Получить(ДатаДок))+" "+СокрЛП(СпрК.Отчество.Получить(ДатаДок));
не работает на верно.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 24-09-2010 11:20 » 

Сори - не глянул (естественно эти реквизиты еще не установлены)
Вот так долно быть:
СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество);
где Фамилия, Имя, Отчество - это реквизиты документа
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 24-09-2010 11:21 » 

Суть моего изменения кода была в том, что присвоить СпрК.Наименование нужно до того, как записывать (или же записать еще раз, но это не совсем верно)
Записан
Nodir2525
Участник

Offline Offline

« Ответ #16 : 27-09-2010 09:13 » 

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

В чем разница с вашим модулем.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 27-09-2010 09:59 » 

Разница в том, что твой вариант просто устанавливает реквизиты на указанную даты (не привязывая их к документу), что имеет свои минусы:
0. Такой режим предусматривает ручное изменение периодических реквизитов - в некоторых случаях это недопустимо
1. На каждую дату можно установить только одно значение - значит 2 документа в один день сделать нельзя, точнее можно, но первое значение будет "затерто".
3. Значение не привязано к документу, т.е. нельзя просто посмотреть в историю реквизита и узнать каким документом изменение внесено
4. При отмене проведения документа значения реквизитов не отменятся.

Возможно для твоей задачи это и приемлемо, но это неправильный подход (ИМХО)
Записан
Nodir2525
Участник

Offline Offline

« Ответ #18 : 28-09-2010 06:58 » 

Сори - не глянул (естественно эти реквизиты еще не установлены)
Вот так долно быть:
СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество);
где Фамилия, Имя, Отчество - это реквизиты документа

Да это плохо.
На Вашем варианте
СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество);
Не работает
Записан
kiser
Участник

by
Offline Offline

« Ответ #19 : 28-09-2010 07:55 » 

Код:
Процедура ОбработкаПроведения()
    //Проверка на наличие такого
Спр1 = СоздатьОбъект("Справочник.Контрагент");
Спр1.ВыбратьЭлементы();
Если Спр1.НайтиПоНаименованию(СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество),0,1) = 1 тогда
Если Вопрос("Такой контрагент есть! Добавить этого?", "Да+Нет") = "Нет" Тогда
Возврат;
КонецЕсли;
КонецЕсли;
    
//Добавление нового
СпрК=СоздатьОбъект("Справочник.Контрагент");
СпрК.Новый();
СпрК.Наименование=СокрЛП(Фамилия)+" "+СокрЛП(Имя)+" "+СокрЛП(Отчество);  
СпрК.Записать();
ТекСпр =  СпрК.ТекущийЭлемент();
УстановитьРеквизитСправочника(СпрК,"Фамилия",Фамилия,ДатаДок);
УстановитьРеквизитСправочника(СпрК,"Имя",Имя,ДатаДок);
УстановитьРеквизитСправочника(СпрК,"Отчество",Отчество,ДатаДок);
УстановитьРеквизитСправочника(СпрК,"ДокументНомер",ДокументНомер,ДатаДок);
УстановитьРеквизитСправочника(СпрК,"ДокументСерия",ДокументСерия,ДатаДок);
УстановитьРеквизитСправочника(СпрК,"ДокументДатаВыдачи",ДокументДатаВыдачи,ДатаДок);
УстановитьРеквизитСправочника(СпрК,"ДокументКемВыдан",ДокументКемВыдан,ДатаДок);

КонецПроцедуры
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 28-09-2010 11:38 » 

Цитата
Если Вопрос("Такой контрагент есть! Добавить этого?", "Да+Нет") = "Нет"
kiser, не рекомендую использовать интерактивные функции при проведении. В крайнем случае (если уж очень хочется) - то с установленным таймаутом (обычно - последний параметр).
Причина: например есть 100 000 документов, которые надо перепровести чтобы исправить последовательность. Запускаем вечером, смотрим что первые 100 документов проводятся нормально и уходим домой, предполагая, что за ночь все проведется. Утром видим картину: на 200-м документе у нас завис вопрос и все остановилось Жаль
Проверять результат ГрупповаяОбработка() - не выход, т.к. документы могут массово проводиться и самонаписаной обработкой.
« Последнее редактирование: 28-09-2010 11:43 от Kivals » Записан
kiser
Участник

by
Offline Offline

« Ответ #21 : 28-09-2010 12:22 » 

Цитата
Если Вопрос("Такой контрагент есть! Добавить этого?", "Да+Нет") = "Нет"
kiser, не рекомендую использовать интерактивные функции при проведении. В крайнем случае (если уж очень хочется) - то с установленным таймаутом (обычно - последний параметр).
Причина: например есть 100 000 документов, которые надо перепровести чтобы исправить последовательность. Запускаем вечером, смотрим что первые 100 документов проводятся нормально и уходим домой, предполагая, что за ночь все проведется. Утром видим картину: на 200-м документе у нас завис вопрос и все остановилось Жаль
Проверять результат ГрупповаяОбработка() - не выход, т.к. документы могут массово проводиться и самонаписаной обработкой.
Спасибо за совет.
Ну это пример проверки на наличие, а кусок кода с вопросом можно заменить уже по выбору разработчика. Например на отмену проведения или перезапись существующего.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 28-09-2010 13:15 » 

Согласен, просто посчитал нужным написать это рядом с кодом: чтобы использующие этот код новички не взяли такой подход за правило.
Записан
Nodir2525
Участник

Offline Offline

« Ответ #23 : 06-10-2010 06:52 » 

СПАСИБО!!!
ПОЛУЧИЛСЯ!!!
Записан
Nodir2525
Участник

Offline Offline

« Ответ #24 : 06-10-2010 13:08 » 

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

ОШИБКА!!!
СпрК.Записать();     
{Документ.ВводНовыхКлиентФиз.Модуль Документа(28)}: Неверно задан код!
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 06-10-2010 15:03 » 

Для справочника Контрагент:
Какой тип и длина кода?
Установлен ли флаг автонумерации?
Записан
Nodir2525
Участник

Offline Offline

« Ответ #26 : 07-10-2010 04:37 » 

ДА!!!
СПАСИБО!!!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines