[ОТВЕТИТЬ]
30.12.2015 12:55
KirillHome
 
В принципе - новшеств много (см. вложение), но то, с чем довелось напрямую столкнуться - в справочнике "Контрагенты" пропал реквизит "ОсновойДоговорКонтрагента" (точнее, его переименовали в "УдалитьОсновнойДоговорКонтрагента").

Это изменение произошло из-за того, что с одним и тем же контрагентом могут быть разные взаимоотношения (с поставщиком, с покупателем, с комиссионером и т.д.) и по каждому типу взаимоотношений теперь может быть основной договор (ранее - только по одному типу взаимоотношений).

Для работы с этой новой сущностью теперь служит регистр сведений "ОсновныеДоговорыКонтрагентов".
А для получения основного договора использовал функцию общего модуля РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента
Вложения
Тип файла: pdf Новое в версиях 3.0.43.pdf (87.1 Кб, 240 просмотров)
31.12.2015 09:48
MWWRuza
 
Ага... У меня перестала работать моя самописная обработка выгрузки проводок из ККС-Магазина в Бух-3.0, поле агрегатного объекта не найдено "ОсновнойДоговор"... Думаю, че за нах...??? Полез разбираться, а там такие новшества Переделал... Зато, решился вопрос с установкой основного договора, при создании в процессе переноса новых элементов справочников Контрагенты и Договоры. Раньше, нужно было после записи нового элемента в справочник владелец(Контрагенты), записывать реквизит(Основной Договор), со ссылкой на вновь созданный Договор(можно было, конечно через принудительное формирование GUID еще не записанного элемента Договоры сделать, но лениво...), тоесть повторная запись, а теперь все проще и правильнее решается через регистр.
08.02.2016 14:21
JuliaL
 
Добрый день! У меня есть дбф, я загружаю по реквизитам документы, нахожу контарегента по коду. и в поле договор - основной договор.
НоваяСтрока.ДоговорКонтрагента = Контрагент.ОсновнойДоговорКонтрагента; Теперь все усложняется и надо переписать все обработки. Вместо одной этой строки процедура что ль должна быть?! Помогите пожалуйста примерно как решали эту проблему(( 1С:Предприятие 8.3 (8.3.7.1790)
Бухгалтерия предприятия, редакция 3.0 (3.0.43.29)
08.02.2016 14:22
JuliaL
 
И если можно расскажите как в обработках использовали функцию общего модуля РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента на примере?((
08.02.2016 15:28
KirillHome
 
Используется так

Код:
КонтрВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком;

НовДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
МассивВидовДоговоров = Новый Массив;
МассивВидовДоговоров.Добавить(КонтрВидДоговора);
РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(НовДок.ДоговорКонтрагента,	НовДок.Контрагент, НовДок.Организация, МассивВидовДоговоров);
Если НовДок.ДоговорКонтрагента <> Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
	НайденДоговор = Истина;
КонецЕсли;
Всё это в директиве &НаСервере
08.02.2016 16:16
JuliaL
 
А в обработке есть наСервере?!!!
08.02.2016 16:17
JuliaL
 
У меня внешняяОбработка
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
08.02.2016 16:37
KirillHome
 
У меня - обработка с формой, соответственно, в модуле формы - есть как директива &НаКлиенте, так и директива &НаСервере.
08.02.2016 16:45
JuliaL
 
У меня все в модуле объекта происходит.. (( Может поэтому.. не выполняется((

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

НовДок = Документы.ПриходныйКассовыйОрдер1.СоздатьДокумент();
МассивВидовДоговоров = Новый Массив;
МассивВидовДоговоров.Добавить(ДоговорКонтрагента);
РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(НовДок.ДоговорКонтрагента, НовДок.Контрагент, НовДок.Организация, МассивВидовДоговоров);
Если НовДок.ДоговорКонтрагента <> Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
НайденДоговор = Истина;
КонецЕсли;
.......
НоваяСтрока.ДоговорКонтрагента=НайденДоговор;
Вот мой кусок модуля
08.02.2016 16:58
KirillHome
 
Цитата:
JuliaL У меня все в модуле объекта происходит.. (( Может поэтому.. не выполняется((

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

НовДок = Документы.ПриходныйКассовыйОрдер1.СоздатьДокумент();
МассивВидовДоговоров = Новый Массив;
МассивВидовДоговоров.Добавить(ДоговорКонтрагента);
РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(НовДок.ДоговорКонтрагента, НовДок.Контрагент, НовДок.Организация, МассивВидовДоговоров);
Если НовДок.ДоговорКонтрагента <> Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
НайденДоговор = Истина;
КонецЕсли;
.......
НоваяСтрока.ДоговорКонтрагента=НайденДоговор;
Вот мой кусок модуля
Так ошибка то в другом :)

Код:
 ДоговорКонтрагента = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
			  
			  НовДок = Документы.ПриходныйКассовыйОрдер1.СоздатьДокумент();
			  МассивВидовДоговоров = Новый Массив;
			  МассивВидовДоговоров.Добавить(ДоговорКонтрагента);
			  РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(НовДок.ДоговорКонтрагента,	НовДок.Контрагент, НовДок.Организация, МассивВидовДоговоров);
			  Если НовДок.ДоговорКонтрагента <> Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
			      НайденДоговор = Истина;
			  КонецЕсли;
.......
Если НайденДоговор Тогда
НоваяСтрока.ДоговорКонтрагента=НовДок.ДоговорКонтрагента;
КонецЕсли;
Т.е. я обходил ситуацию, когда есть несколько договоров с контрагентом указанного вида и ни один из них не является основным.
Из процедуры РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(НовДок.ДоговорКонтрагента, НовДок.Контрагент, НовДок.Организация, МассивВидовДоговоров) мы получаем НовДок.ДоговорКонтрагента, если договор по данному виду один или есть тот, что является основным по данному виду, иначе - получаем пустую ссылку Справочники.ДоговорыКонтрагентов.ПустаяСсылка()
08.02.2016 17:01
JuliaL
 
ДоговорКонтрагента= Контрагент.ОсновнойДоговорКонтрагента;
ДоговорКонтрагента = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;

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


//
НоваяСтрока = НовыйДокумент.РасшифровкаПлатежа.Добавить();

//НоваяСтрока.ДоговорКонтрагента = Контрагент.ОсновнойДоговорКонтрагента;
НоваяСтрока.ДоговорКонтрагента = НайденДоговор;


т.е. равно поставить?!.. не соображу совсем..(((((((((((((
08.02.2016 17:07
JuliaL
 
{ВнешняяОбработка.ЗагрузкаДокументовИзСТЕК.МодульОбъекта(142)}: Преобразование значения к типу Булево не может быть выполнено
Если НайденДоговор Тогда
08.02.2016 17:08
KirillHome
 
Ещё раз :)
НайденДоговор - булево. Имеет значение "Истина" если РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента нам НЕ вернулась пустая ссылка

Код:
НайденДоговор = Ложь;
....
....
РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(НовДок.ДоговорКонтрагента,	НовДок.Контрагент, НовДок.Организация, МассивВидовДоговоров);
Если НовДок.ДоговорКонтрагента <> Справочники.ДоговорыКонтрагентов.ПустаяСсылка() ТОГДА
	НайденДоговор = Истина;
КонецЕсли;
Т.е. ссылка на основной (единственный) договор с контрагентом содержится в НовДок.ДоговорКонтрагента.
А вот если с контрагентом несколько договоров, и ни один из них не является главным, то тогда будет
Код:
НайденДоговор = Ложь;
И дальше уже это можно обрабатывать (к примеру - создавать договор с контрагентом, выбирать первый (последний?) из всех договоров и т.д.).
08.02.2016 17:18
JuliaL
 
ДоговорКонтрагента = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;

НовДок = Документы.ПриходныйКассовыйОрдер1.СоздатьДокумент();
МассивВидовДоговоров = Новый Массив;
МассивВидовДоговоров.Добавить(ДоговорКонтрагента);
РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(НовДок.ДоговорКонтрагента, НовДок.Контрагент, НовДок.Организация, МассивВидовДоговоров);
Если НовДок.ДоговорКонтрагента <> Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
НайденДоговор = Истина
Иначе
НайденДОговор = Ложь;
КонецЕсли;



//
НоваяСтрока = НовыйДокумент.РасшифровкаПлатежа.Добавить();

//НоваяСтрока.ДоговорКонтрагента = Контрагент.ОсновнойДоговорКонтрагента;
Если НайденДоговор Тогда
НоваяСтрока.ДоговорКонтрагента=НовДок.ДоговорКонтрагента
Иначе
НоваяСтрока.ДоговорКонтрагента= "";
КонецЕсли;



Сделала уже итак.. Ошибок нет, но и основной договор не находит.. т.е. получается все ЛОжь(( я уже ничего не понимаю.. Помогите, пжл.. все сроки горят.. хоть релиз откатывай..
08.02.2016 17:30
KirillHome
 
Первое - у данного контрагента есть хоть один договор по виду договора "С покупателем"?
Второе - сколько у данного контрагента есть договоров по виду "С покупателем"?
Третье - у данного контрагента есть какой-либо договор, который указан как основной по виду договора - "С покупателем"?

Т.е. что может быть:
1) Нет договора совсем
2) Договоров несколько (больше одного), и нет основного
В этом случае, конечно, нам не вернётся договор.

Если договор один (без разницы - указан ли он как основной или нет), или договоров несколько, но есть основной - то обязан вернуться.

ПриходныйКассовыйОрдер1 - это какой-то свой документ?

Что бы сделал я - это попробовал бы в эту обработку подсунуть контрагента с одним договором.
Конечно, включил бы отладку - посмотреть, что передаётся в РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента, что там происходит и что возвращается.
08.02.2016 17:34
JuliaL
 
ДОговор с покупателем есть 100% и основной тож.. но видит он((
08.02.2016 17:37
KirillHome
 
Выложи обработку, попробую посмотреть, понять (хотя новый вид документа - ПриходныйКассовыйОрдер1 - меня смущает).
08.02.2016 17:55
KirillHome
 
Так, стоп!
А где после
Код:
НовДок = Документы.ПриходныйКассовыйОрдер1.СоздатьДокумент();
происходит объявление НовДок.Контрагент и НовДок.Организация???
08.02.2016 18:18
JuliaL
 
а как выложить обработку? Почту?
08.02.2016 18:24
JuliaL
 
Все спасибо!!!!!!!!!!!!!!!!!!)))))))) Новдок не надо было второй раз создавать.. у меня ж было там НовыйДОкумент.Создать))))

МассивВидовДоговоров = Новый Массив;
МассивВидовДоговоров.Добавить(ДоговорКонтрагента);
НайденДОговор = Ложь;

РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(НовыйДокумент.ДоговорКонтрагента, НовыйДокумент.Контрагент, НовыйДокумент.Организация, МассивВидовДоговоров);
Если НовыйДокумент.ДоговорКонтрагента <> Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
НайденДоговор = Истина;
КонецЕсли;



//
НоваяСтрока = НовыйДокумент.РасшифровкаПлатежа.Добавить();

//НоваяСтрока.ДоговорКонтрагента = Контрагент.ОсновнойДоговорКонтрагента;
Если НайденДоговор=Истина Тогда
НоваяСтрока.ДоговорКонтрагента=НовыйДокумент.ДоговорКонтрагента;
//Иначе
// НоваяСтрока.ДоговорКонтрагента= НовДок.ДоговорКонтрагента.ВидДоговора.Пустая();
КонецЕсли;
08.02.2016 18:33
KirillHome
 
Заходите ещё
10.02.2016 01:14
MWWRuza
 
То, что закомментировано - было, то, что без комментариев - стало.
Код:
// НайдКонтр.ОсновнойДоговорКонтрагента = ОснДоговор.Ссылка; //Потом надо переделать через GUID
// НайдКонтр.Записать();
РаботаСДоговорамиКонтрагентовБП.УстановитьОсновнойДоговорКонтрагента(ОснДоговор.Ссылка);
Как видите, все элементарно, даже на одну строку меньше
Когда мы передаем ссылку на договор, то автоматически определяется его владелец(Контрагент), и ему присваевается этот договор как основной... При этом, основных может быть несколько - по каждому виду, который определяется в самом договоре...
10.02.2016 09:46
KirillHome
 
Это - установка основного договора, а перед этим говорили о получении уже установленного :)
Но всё равно - спасибо (я как-то в эту сторону и не смотрел).
10.02.2016 11:24
MWWRuza
 
А... Понятно... Я не внимательно читал смысл проблемы... У себя в обработке, когда столкнулся с этим - некогда было сильно разбираться, я сделал так:
Код:
&НаСервере
Функция ПолучитьОсновнойДоговорКонтрагента(ТекКонтрагент)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	ОсновныеДоговорыКонтрагента.Контрагент,
		|	ОсновныеДоговорыКонтрагента.Договор КАК ОсновнойДоговор
		|ИЗ
		|	РегистрСведений.ОсновныеДоговорыКонтрагента КАК ОсновныеДоговорыКонтрагента
		|ГДЕ
		|	ОсновныеДоговорыКонтрагента.Контрагент = &Контрагент";
	
	Запрос.УстановитьПараметр("Контрагент", ТекКонтрагент);

	РезультатЗапроса = Запрос.Выполнить();

	Выб = РезультатЗапроса.Выбрать();

	Пока Выб.Следующий() Цикл
		ТекДоговорКонтрагента = Выб.ОсновнойДоговор;
	КонецЦикла;
	Возврат ТекДоговорКонтрагента;
КонецФункции
Это, с точки зрения использования функций типовой конфигурации не совсем правильно(точнее - совсем не правильно), но работает, в тот момент, мне быстрее было так сделать, думал потом переделаю, когда разберусь, что там в типовой наворотили, но, так и потом не стал переписывать - работает и фиг с ним, договоры с контрагентами на тот момент были одного вида
Надо будет переделать, но, пока не жаловались... А просто так некогда, сейчас все время ЕГАИСом занято...
10.02.2016 11:42
MWWRuza
 
Вся функция поиска/создания контрагента при загрузке проводок, может кому пригодится:
Код:
//Находит контрагента по ИНН, если не находит - создает нового, вместе с ОсновнымДоговором
&НаСервере
Функция НайтиИлиСоздатьКонтрагента(ИНН,Наим,КПП)
	Если ИНН = "БОНУС" Тогда
		НайдКонтр = Бонус;
		Возврат НайдКонтр;
	ИначеЕсли ИНН = "РОЗНИЦА" Тогда
		НайдКонтр = РознПродажа;
		Возврат НайдКонтр;
	ИначеЕсли СокрЛП(ИНН) = "" Тогда
		НайдКонтр = КонтрБезИНН;
		Возврат НайдКонтр;
	Иначе	
		НайдКонтр = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",ИНН);
		Если НЕ НайдКонтр = Справочники.Контрагенты.ПустаяСсылка() Тогда
			Возврат НайдКонтр;
		Иначе
			НайдКонтр = Справочники.Контрагенты.СоздатьЭлемент();	
			НайдКонтр.Наименование = СокрЛП(Наим);
		                     НайдКонтр.НаименованиеПолное = СокрЛП(Наим);
			НайдКонтр.ИНН = ИНН;
			НайдКонтр.КПП = КПП;
			НайдКонтр.Родитель = ГруппаПоставщиков;
			Если СтрДлина(ИНН) = 10 Тогда
				НайдКонтр.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
			Иначе
			    НайдКонтр.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо;
			КонецЕсли;
			НайдКонтр.Записать();
			ОснДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
			ОснДоговор.Наименование = "ОсновнойДоговор";
			ОснДоговор.Организация = Организация;
			ОснДоговор.Владелец = НайдКонтр.Ссылка;
			ОснДоговор.Номер = "1";
			Осндоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком;
			ОснДоговор.Валютный = Ложь;
			ОснДоговор.ВалютаВзаиморасчетов = Справочники.Валюты.НайтиПоКоду("643");
			ОснДоговор.Записать();
	//		НайдКонтр.ОсновнойДоговорКонтрагента = ОснДоговор.Ссылка; //Потом надо переделать через GUID
	//		НайдКонтр.Записать();
			РаботаСДоговорамиКонтрагентовБП.УстановитьОсновнойДоговорКонтрагента(ОснДоговор.Ссылка);
			Возврат НайдКонтр.Ссылка;
		КонецЕсли;
	КонецЕсли;	
КонецФункции
Но, тут надо понимать, что писалось это "под себя", никакой универсальности не предусматривалось, поэтому, учитывая, что это просто загрузка проводок из торговой конфигурации 7.7, которая чисто розница с продажами через ККМ, никакие другие договора, кроме договоров с поставщиком оттуда не переносятся - они просто там только такие, а "Покупатель" и его договор, это розничный покупатель, он как-бы предопределен заранее и просто выбран в диалоге обработки... Синхронизация контрагентов выполняется по ИНН...
Опции темы


Часовой пояс GMT +3, время: 14:20.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.