Код обработки автоматического создания объекта в справочнике

1. Nefilimus 75 18.05.19 18:54 Сейчас в теме
Здравствуйте уважаемые программисты. Это код для того, чтобы в БП 3.0 создавать договоры по имени клиента, если у него отсутствует договор. В БП информация ежедневно загружается из УТ. Поэтому и есть необходимость в такой обработке. Код запускается в БП 3.0

Суть проблемы: Если код создания объекта в цикле, то обработка вообще не работает, а если вытащить её из цикла, то пишет, что невозможно записать, так как не указан контрагент или указан неверно.
Прошу помочь.

&НаСервере
Процедура ОтборДоговораНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	СчетНаОплатуПокупателю.Ссылка КАК Ссылка,
	|	СчетНаОплатуПокупателю.ДоговорКонтрагента КАК ДоговорКонтрагента,
	|	СчетНаОплатуПокупателю.Контрагент.код КАК Контрагент,
	|	СчетНаОплатуПокупателю.Контрагент.Наименование КАК КонтрагентНаименование,
	|	СчетНаОплатуПокупателю.Организация КАК Организация
	|ИЗ
	|	Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
	|ГДЕ
	|	СчетНаОплатуПокупателю.ДоговорКонтрагента = НЕОПРЕДЕЛЕНО";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.следующий() Цикл 
		НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); 
		НовыйЭлемент.Наименование = ВыборкаДетальныеЗаписи.КонтрагентНаименование;
		НовыйЭлемент.Владелец = ВыборкаДетальныеЗаписи.Контрагент;
		//НовыйЭлемент.Контрагент = ВыборкаДетальныеЗаписи.Контрагент;
		НовыйЭлемент.ВидДоговора = "С Покупателем";
		НовыйЭлемент.Организация = ВыборкаДетальныеЗаписи.Организация;
		НовыйЭлемент.Записать(); 
		
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ОтборДоговора(Команда)
	ОтборДоговораНаСервере();
КонецПроцедуры
Показать


P.S. ВидДоговора - это перечисление
По теме из базы знаний
Найденные решения
2. tusv 211 18.05.19 19:13 Сейчас в теме
(1)Начнем с того, что Вы повелись на псевдоним Владельца. Правой кнопкой выбираем Стандартные реквизиты. Там Владелец обозначен Контрагент. И код Владельцу присваивать совершенно не уместно. В счет фактуре договор это
ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка")

В общем запрос для создания договора должен выглядеть так
Запрос.Текст = 
    "ВЫБРАТЬ
    |    СчетНаОплатуПокупателю.Контрагент КАК  Владелец
    |    СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
    |    СчетНаОплатуПокупателю.Организация КАК Организация
    |ИЗ
    |    Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
    |ГДЕ
    |    НЕ СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
Показать

Заметьте. Я получаю свойства нового договора прямо в запросе, чтобы потом написать
ЗаполнитьЗначенияСвойств(НовыйЭлемент , ВыборкаДетальныеЗаписи);
НовыйЭлемент .Записать();
Nefilimus; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tusv 211 18.05.19 19:13 Сейчас в теме
(1)Начнем с того, что Вы повелись на псевдоним Владельца. Правой кнопкой выбираем Стандартные реквизиты. Там Владелец обозначен Контрагент. И код Владельцу присваивать совершенно не уместно. В счет фактуре договор это
ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка")

В общем запрос для создания договора должен выглядеть так
Запрос.Текст = 
    "ВЫБРАТЬ
    |    СчетНаОплатуПокупателю.Контрагент КАК  Владелец
    |    СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
    |    СчетНаОплатуПокупателю.Организация КАК Организация
    |ИЗ
    |    Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
    |ГДЕ
    |    НЕ СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
Показать

Заметьте. Я получаю свойства нового договора прямо в запросе, чтобы потом написать
ЗаполнитьЗначенияСвойств(НовыйЭлемент , ВыборкаДетальныеЗаписи);
НовыйЭлемент .Записать();
Nefilimus; +1 Ответить
6. Nefilimus 75 18.05.19 19:30 Сейчас в теме
(2)
ра прямо в запросе, чтобы потом на


Благодарю за помощь! Огромное спасибо.

Получился такой код:
&НаСервере
Процедура ОтборДоговораНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = 
    "ВЫБРАТЬ
    |    СчетНаОплатуПокупателю.Контрагент КАК  Владелец,
    |    СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
    |    СчетНаОплатуПокупателю.Организация КАК Организация,
	|    Значение(Перечисление.ВидыДоговоров.СПокупателем) как ВидДоговора 
    |ИЗ
    |    Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
    |ГДЕ
    |    НЕ СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.следующий() Цикл 
		НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); 
	    ЗаполнитьЗначенияСвойств(НовыйЭлемент , ВыборкаДетальныеЗаписи);
НовыйЭлемент .Записать();
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ОтборДоговора(Команда)
	ОтборДоговораНаСервере();
КонецПроцедуры
Показать


но выдаёт такую ошибку:

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(15)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(5, 10)}: Неверные параметры "Перечисление.ВидыДоговоров.СПокупателем"
Значение(<<?>>Перечисление.ВидыДоговоров.СПокупателем) как ВидДоговора
8. tusv 211 18.05.19 19:35 Сейчас в теме
(6)Это Вы поторопились. Надо думать, а не исполнять сразу.1С конфиг много, мегет быть все по разному Смотрите в свойства.как на рисунке.
Так и должно обзываться в запросе. Единственное ПречислениеСсылка Ссылка лишнее слово. Будет ругаться
Я просто Вам показывал Ваши ошибки и путь решения. Остальное Вы сами:)
Прикрепленные файлы:
Nefilimus; +1 Ответить
4. tusv 211 18.05.19 19:26 Сейчас в теме
(1)
НовыйЭлемент.ВидДоговора = "С Покупателем";

Ну а если всеже кодом то
НовыйЭлемент.ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем

В БП Вид договора это ПеречислениеСсылка.ВидыДоговоровКонтрагентов. У Вас не знаю
Nefilimus; +1 Ответить
7. Nefilimus 75 18.05.19 19:35 Сейчас в теме
(4)
НовыйЭлемент.ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем

У меня виды договор с контрагентами. поменяю., но он поймёт, что нужно выбрать с покупателем?
10. tusv 211 18.05.19 19:48 Сейчас в теме
(7)Зырим в свойства договора в пофигураторе. В запросе назначаем псевдонимы те же(после КАК)
И штатный метод ЗаполнитьЗначенияСвойств схавает и за ушами трещать будет:)
Главное не обманывать типа:
Владелец = Контрагент.код

То молча будет пусто.
А подставишь свойство с нужным типом правильно. Все будет ОК
Nefilimus; +1 Ответить
11. tusv 211 18.05.19 19:59 Сейчас в теме
(7)ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем как ВидДоговора
Поймет. Кудаж Уан эзина денеться:)
Nefilimus; +1 Ответить
3. tusv 211 18.05.19 19:17 Сейчас в теме
И да. Забыл
Значение(Перечисление.ВидыДоговоров.СПокупателем) как ВидДоговора 

тоже в запрос
Nefilimus; +1 Ответить
5. tusv 211 18.05.19 19:30 Сейчас в теме
И чтоб было все чики пуки
НовыйЭлемент .УстановитьНовыйКод();
Nefilimus; +1 Ответить
9. tusv 211 18.05.19 19:43 Сейчас в теме
За здравие желаю, то есть плюсы спасибо. О результатах должить немедля.
Ну чтобы не наделать фатальных глупостей подскажу финт ушами
НачатьТранзакцию();
блабла код
ОтменитьТранзакцию();

Отдадили. Убираем
Nefilimus; +1 Ответить
12. Nefilimus 75 19.05.19 00:34 Сейчас в теме
(9) Прошу прощения за поздний ответ. Всё заработало. Спасибо Вам огромное за помощь =)
13. Nefilimus 75 19.05.19 00:36 Сейчас в теме
(9) но сейчас проблема... Если у одного клиента 2 заказа без договора попали, то он создаёт договор для каждого...
14. tusv 211 19.05.19 08:42 Сейчас в теме
(13)
но сейчас проблема... Если у одного клиента 2 заказа без договора попали, то он создаёт договор для каждого..

Теперь я Вас не понимаю. Можно как то в скринах. И код студию, ато висят на дубе две вишенки, особенно вторая.Тут все просто. Вопрос задан, ответ думаем. Каков вопрос, таков ответ. Тут надо по подробней
Откуда прилетело? Из попыток синхронизации? Я прав?
Nefilimus; +1 Ответить
15. tusv 211 19.05.19 09:29 Сейчас в теме
Вот смотри. У меня нет договора в счет фактуре. Что я делаю. Иду в Групповое изменение реквизитов.
Ставлю отбор на договоре пусто. и на На закладку произвольный код Повторю. Это разовый код, мне фиолетово на оптимизацию
Договор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем,,Объект.Контрагент);
Если Договор.Пустая() Тогда
//Выполнлняем, что вчера совместно придумали. Создание договора
Иначе
Объект.ДоговорКонтрагента = Договор;
КонецЕсли:
Объект.Записать();
Nefilimus; +1 Ответить
16. Nefilimus 75 19.05.19 13:14 Сейчас в теме
17. Nefilimus 75 19.05.19 17:58 Сейчас в теме
(15)
Выдаёт ошибку, что объект контрагент не обнаружен.

&НаСервере
Процедура ОтборДоговораНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|    СчетНаОплатуПокупателю.Контрагент КАК Владелец,
	|    СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
	|    СчетНаОплатуПокупателю.Организация КАК Организация,
	|    Значение(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) как ВидДоговора 
	|ИЗ                                   
	|	Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
	|ГДЕ
	|    СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	    	
	
	
	Договор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем,,Объект.Контрагент);
Если Договор.Пустая() Тогда 
		Пока Выборка.следующий() Цикл 
			НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); 
			ЗаполнитьЗначенияСвойств(НовыйЭлемент , Выборка);
			НовыйЭлемент.УстановитьНовыйКод();
			НовыйЭлемент.Записать();
		КонецЦикла;
		
	Иначе 
		Объект.ДоговорКонтрагента = Договор; 
	КонецЕсли; 
	Объект.Записать();
	
	
	
КонецПроцедуры

&НаКлиенте
Процедура ОтборДоговора(Команда)
	ОтборДоговораНаСервере();
КонецПроцедуры

Показать
18. Nefilimus 75 19.05.19 19:46 Сейчас в теме
(15)
Иначе
Объект.ДоговорКонтрагента = Договор;
КонецЕсли:
Объект.Записать();

Поменял код на такой, заработало всё. Но сейчас выдаёт ошибку, что "поле объекта не обнаружено (ДоговорКонтрагента)


&НаСервере
Процедура ОтборДоговораНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДоговорыКонтрагентов.Владелец КАК Владелец2,
	|	ДоговорыКонтрагентов.Ссылка КАК Ссылка, 	
	|    СчетНаОплатуПокупателю.Контрагент КАК Владелец,
	|    СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
	|    СчетНаОплатуПокупателю.Организация КАК Организация,
	|    Значение(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) как ВидДоговора 
	|ИЗ
	|	Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
	|		ПО СчетНаОплатуПокупателю.ДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка
	|ГДЕ
    |    СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
	РезультатЗапроса = Запрос.Выполнить();	
	Выборка = РезультатЗапроса.Выбрать();
		Пока Выборка.следующий() Цикл 
		Договор = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(Выборка.Владелец);
		Сообщить(Договор);
		Если Договор.Пустая() Тогда			
			НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); 
			ЗаполнитьЗначенияСвойств(НовыйЭлемент , Выборка); 
			НовыйЭлемент.УстановитьНовыйКод();
			НовыйЭлемент.Записать();Сообщить (НовыйЭлемент);
		Иначе 
		Объект.ДоговорКонтрагента = Договор; 
		КонецЕсли; 
		Объект.Записать();
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ОтборДоговора(Команда)
	ОтборДоговораНаСервере();
КонецПроцедуры
Показать
19. Nefilimus 75 20.05.19 10:31 Сейчас в теме
Всё, получилось, поменял сам)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот