Как вставить организацию в созданный договор

1. alexey0702 07.06.19 10:08 Сейчас в теме
Здравствуйте, уважаемые форумчане. Конфа Бухгалтерия предприятия, редакция 3.0 (3.0.70.33)
Сразу отмечу что я бухгалтер, 1С программированию не учился.
Но возникла необходимость доделки имеющейся обработки.
В кратце.
В 1С загружается массив данных и создается документ со всей имеющейся информацией. Дальше обработки подтягивают данные из этого документа.
Так вот всегда была одна проблема. Создавался контрагент, к нему создавался реализация либо документы выписки, и договор, но в договоре не проставлялась организация. Поэтому после обработки приходится ручками пробегать и в договоре довставлять организауию.
На картинке видно, что в загруженном документе информация об организации указана (Организаций в 1С несколько, в принципе как и у всех).
И вот в принципе и обращение, помогите, пожалуйста, дописать процедуру, чтобы обработка выставляла организацию либо подскажите как тыкнуть код в это место, а дальше я как-нибудь дойду методом проб и ошибок.
Сам код выглядит так
СозданныйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();			
			СозданныйДоговор.Дата = ДоговорКонтрагента.ДатаДоговора;
			СозданныйДоговор.Номер = СокрЛП(ДоговорКонтрагента.НомерДоговора);
			СозданныйДоговор.Наименование = СокрЛП(ДоговорКонтрагента.ИмяДоговора);
			СозданныйДоговор.Владелец = СозданныйКонтрагент.Ссылка;
			СозданныйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить();
			СозданныйДоговор.УстановитьНовыйКод();
			СозданныйДоговор.Организация =
Показать

Пробовал по всякому прописывать код, но все не то. ЛИбо задаю жесткий поиск, по которому всегда выбирается одна из организаций, либо различного рода ошибки (в основное "поле объекта не обнаружено")
Заранее спасибо за уделенное время
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
21. user613191_olgargor 27.06.19 13:36 Сейчас в теме
чтобы понять как сослаться на что-=то , Вы должны понять как эти объекты взаимосвязаны. Те, с которыми Вы сейчас работаете и этот справочник , в котором хранится нужный вам ИНН.

Вам по сути, имея некие связи между этими объектами найти нужный вам элемент справочника "А2ДокументыКомДэк". По каким полям и каким значениям в них Вам нужно его искать - это только Вы можете понять, видя всю структуру данных и их взаимосвязи. Как только Вы поймете, по каким полям этого справочника вам нужно искать какие значения, чтобы выбрать нужный элемент этого справочника - находите его по этим полям. Вот у Вас я так поняла перебираются строки какой то таблицы "ДоговораКонтрагента ", очевидно в этих строках есть данные, необходимые для того, чтобы по ним найти соответствующий им элемент этого справочника. Я не знаю, какие там поля в этих строках, и как они связаны с вашим справочником "А2ДокументыКомДэк", это знаете только Вы и не хотите в этом признаваться :)

Типа
НайденныйЭлементА2ДокументыКомДэк = НайтиЭлементСправочника(ПараметрыПоиска);
,

где НайтиЭлементСправочника - это будет Вами написанная функция в которой Вы ищете элемент справочника исходя из того как он связан с данными строки из ДоговораКонтрагента!
(кроме Вас структуру данных вашей самописной части конфигурации знать никто не может, изучайте связи! это трудно, но необходимо сделать, если Вы и дальше хотите поддерживать эту конфигурацию.), а ПараметрыПоиска- это некие данные вашей строки из ДоговораКонтрагента , необходимые для поиска элемента справочника , хранящего искомый ИНН).

а потом ссылкой на найденный элемент находите инн
НайденныйЭлементА2ДокументыКомДэк .ИНН
и подставляете его в вашу функцию, где сейчас костыль. Там правда надо еще смотреть, что кроме ИНН в нее подается, там ведь не один параметр закостылен...

Извините, если непонятно объясняю, больше врядли чем-то смогу помочь. Изучайте взаимосвязи таблиц Ваших и тогда Вы сразу поймете откуда и что брать.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. dandykry 10 07.06.19 10:14 Сейчас в теме
(1) Приложите обработку или всю процедуру или функцию создания договора. Нужно видеть весь код, чтобы понять откуда взять организацию
alex-l19041; +1 Ответить
7. alexey0702 10.06.19 01:52 Сейчас в теме
(2) Здравствуйте.
Ниже весь код создания договора.
Процедура СоздатьДоговораКонтрагента (СозданныйКонтрагент)

Для Каждого ДоговорКонтрагента Из ЭтотОбъект.ДоговораКонтрагента Цикл
		//	Если договор уже связан, пропускаем
		Если ЗначениеЗаполнено(ДоговорКонтрагента.Договор1С) Тогда
			Продолжить;
		КонецЕсли;		
		//	Если организация договора не нужная, пропускаем его в обработке
		//Если СокрЛП(ДоговорКонтрагента.ИНН) <> "2539038819" Тогда
		//	Сообщить("Найден договор не с Сервер-Центром, данный договор не будет добавлен");
		//	Продолжить;
		//КонецЕсли;
		НайденныеДоговора = А2ОбменКомДЭК.НайтиДоговор(СокрЛП(ДоговорКонтрагента.НомерДоговора), ДоговорКонтрагента.ДатаДоговора, СозданныйКонтрагент.Ссылка);
		Если НайденныеДоговора.Количество() = 1 Тогда
			//	Найден один договор
			ДоговорКонтрагента.Договор1С = НайденныеДоговора.Получить(0).Ссылка;
		ИначеЕсли НайденныеДоговора.Количество() > 1 Тогда
			ВызватьИсключение "Найдено слишком много (" + НайденныеДоговора.Количество() + ") договоров с указанным номером (" + СокрЛП(ДоговорКонтрагента.НомерДоговора) + "), датой (" + ДоговорКонтрагента.ДатаДоговора + ") и владельцем (" + СозданныйКонтрагент.Ссылка + ")";
		ИначеЕсли НайденныеДоговора.Количество() = 0 Тогда
			//	Договоров не найдено, создаем новый
			СозданныйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();			
			СозданныйДоговор.Дата = ДоговорКонтрагента.ДатаДоговора;
			СозданныйДоговор.Номер = СокрЛП(ДоговорКонтрагента.НомерДоговора);
			СозданныйДоговор.Наименование = СокрЛП(ДоговорКонтрагента.ИмяДоговора);
			СозданныйДоговор.Владелец = СозданныйКонтрагент.Ссылка;
			СозданныйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить();
			СозданныйДоговор.УстановитьНовыйКод();
			//СозданныйДоговор.Организация = Справочники.Организации.ОрганизацияПоУмолчанию();
			СозданныйДоговор.Организация = справочники.А2КонтрагентыКомДЭК.НайтиПоРеквизиту("Организация".
			//НайденныеОрганизации = А2ОбменКомДЭК.НайтиОрганизацию(ЭтотОбъект.ИННОрганизации, ЭтотОбъект.КППОрганизации, "Организации");
			//НайденныеОрганизации = А2ОбменКомДЭК.НайтиОрганизацию("2539038819", "253601001", "Организации");
			//НайденныеОрганизации = А2ОбменКомДЭК.НайтиОрганизацию("2536161885", "253601001", "Организации");
			//Если НайденныеОрганизации.Количество() = 0 Тогда
			//	ВызватьИсключение "Не найдена организация для заключения договора с указанными ИНН (2539038819) и КПП (253601001)";
			//ИначеЕсли НайденныеОрганизации.Количество() = 1 Тогда
			//	СозданныйДоговор.Организация = НайденныеОрганизации.Получить(0).Ссылка;
			//ИначеЕсли НайденныеОрганизации.Количество() > 1 Тогда
			//	ВызватьИсключение "Найдено слишком много (" + НайденныеОрганизации.Количество() + ") организаций для заключения договора с указанными ИНН (2539038819) и КПП (253601001)";
			//КонецЕсли;
			Если СокрЛП(ДоговорКонтрагента.ТипДоговора) = "договора с клиентами" Тогда
				СозданныйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
			ИначеЕсли СокрЛП(ДоговорКонтрагента.ТипДоговора) = "договора с поставщиками" Тогда
				СозданныйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком;
			Иначе
				ВызватьИсключение "Неизвестный тип договора при обработке: " + СокрЛП(ДоговорКонтрагента.ТипДоговора);
			КонецЕсли;
			//	Определяем вид взаиморасчетов по договору
			СтрокаСоответствие = А2ОбменКомДЭК.НайтиСоответствиеВидВзаиморасчета(СокрЛП(ДоговорКонтрагента.ИдВидДог), СокрЛП(ДоговорКонтрагента.ИмяВидаДог));
			СозданныйДоговор.ВидВзаиморасчетов = СтрокаСоответствие.ВидВзаиморасчетов;
			СозданныйДоговор.Записать();
			//	Связываем созданный договор с загруженным
			ДоговорКонтрагента.Договор1С = СозданныйДоговор.Ссылка;
		Иначе
			//	Блок, в который никогда не должен попасть алгоритм
			ВызватьИсключение "Найдено странное количество договоров контрагента: " + НайденныеДоговора.Количество();
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры
Показать
8. dandykry 10 10.06.19 07:10 Сейчас в теме
(7)
ЭтотОбъект.ДоговораКонтрагента


Так понимаю это табличная часть в самой обработке. В этой табличной части есть Организация?
user613191_olgargor; +1 Ответить
14. user613191_olgargor 10.06.19 20:13 Сейчас в теме
(7)
СозданныйДоговор.Организация = справочники.А2КонтрагентыКомДЭК.НайтиПоРеквизиту
так писать неправильно, слева от равно у вас один тип данных (справочникСсылкаОрганизация), а справа будет тип данных "СправочникСсылка.А2КонтрагентыКомДЭК". Их невозможно приравнивать.
3. alex-l19041 8 07.06.19 10:32 Сейчас в теме
(1) что содержится в
ДоговорКонтрагента
?
5. alexey0702 10.06.19 01:42 Сейчас в теме
(3)Здравствуйте, там в принципе все содержится стандартно, туда правки не вносились. Т.е. сама форма элемента не изменялась, и код, как я понимаю, тоже не изменялся.

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ПриКопировании(ОбъектКопирования)
	
	Если НЕ ЭтоГруппа Тогда
		ФайлДоговора = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

// Процедура вызывается перед записью элемента справочника.
//
Процедура ПередЗаписью(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ ЭтоГруппа Тогда
		ВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить();
		Валютный      = (ВалютаВзаиморасчетов <> ВалютаРегламентированногоУчета);
		ОплатаВВалюте = (ВалютаВзаиморасчетов <> ВалютаРегламентированногоУчета) И НЕ РасчетыВУсловныхЕдиницах;
		
		Если ПустаяСтрока(Наименование) Тогда
			Наименование = ПечатьДоговоровКлиентСервер.РеквизитыДоговораСтрокой(Номер, Дата);
			Если ПустаяСтрока(Наименование) Тогда
				Наименование = ПечатьДоговоровКлиентСервер.НаименованиеПоУмолчаниюБезРеквизитов();
			КонецЕсли;
		КонецЕсли;
		
		Если ВидДоговора <> Перечисления.ВидыДоговоровКонтрагентов.СПокупателем 
			И УчетАгентскогоНДСПокупателем = Истина Тогда 
			УчетАгентскогоНДСПокупателем  = Ложь;
		КонецЕсли;
		
		Если НЕ БухгалтерскийУчетПереопределяемый.ИспользуетсяОбратноеНачислениеНДС()
			И ВидАгентскогоДоговора = Перечисления.ВидыАгентскихДоговоров.РеализацияТоваров Тогда
			
			ТекстСообщения = НСтр("ru = 'Вид агентского договора ""Реализация товаров (п.8 ст.161 НК РФ)"" недоступен в данной версии программы'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "ВидАгентскогоДоговора", "Объект", Отказ);
			Возврат;
		КонецЕсли;
		
	КонецЕсли;

	ВыполнитьПроверкуКлючевыхРеквизитов(Отказ);

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

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	Если ЭтоГруппа Тогда
		Возврат;
	КонецЕсли;
	
	// Если учет по договорам не ведется, 
	// то первый созданный договор устанавливаем основным
	// Это требуется для ручных документов расчетов, 
	// программного создания договоров в обработке Клиент-банка
	// В формах, где не скрыт учет по договорам (Операция, 
	// ввод начальных остатков по прочим дебиторам и кредиторам и т.д.)
	Если НЕ ПолучитьФункциональнуюОпцию("ВестиУчетПоДоговорам") Тогда
		ОсновнойДоговор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
		// Найдем основной договор данного вида в данной организации
		Если Не РаботаСДоговорамиКонтрагентовБП.УстановитьДоговорКонтрагента(ОсновнойДоговор, Владелец, Организация, ВидДоговора) Тогда
			// Если основной договор не найден, тогда установим этот договор как основной
			РаботаСДоговорамиКонтрагентовБП.УстановитьОсновнойДоговорКонтрагента(ЭтотОбъект.Ссылка);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

	КешОбработкиЗаполнения = Неопределено;
	
	Справочники.ДоговорыКонтрагентов.УстановитьДоступныеВидыДоговора(ДанныеЗаполнения);

	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
		ЗаполнениеДокументов.ЗаполнитьПоСтруктуре(ЭтотОбъект, ДанныеЗаполнения);
		
		// При групповом создании договоров (например, при загрузке из клиент-банка)
		// может быть передана структура для кеширования в ней данных, используемых в нескольких договорах.
		Если ДанныеЗаполнения.Свойство("КешОбработкиЗаполнения") Тогда
			КешОбработкиЗаполнения = ДанныеЗаполнения.КешОбработкиЗаполнения;
		КонецЕсли;
	КонецЕсли;

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

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	МассивНепроверяемыхРеквизитов = Новый Массив;
	
	Если ЗначениеЗаполнено(Дата) И ЗначениеЗаполнено(СрокДействия)
		И Дата > СрокДействия Тогда
	
		ТекстСообщения = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("Поле", "Корректность",
			НСтр("ru = 'Срок действия до'"), , , 
			НСтр("ru = 'Срок действия договора должен быть больше или равен дате договора.'"));
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "СрокДействия", "Объект", Отказ);
		
	КонецЕсли;
	
	Если ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем
	 ИЛИ ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.Прочее
	 ИЛИ ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомитентомНаЗакупку Тогда
		МассивНепроверяемыхРеквизитов.Добавить("СпособЗаполненияСтавкиНДС");
	Конецесли;
	
	ЭтоПлатежныйАгент = (НЕ ЭтоГруппа И ПлатежныйАгент);
	
	Если НЕ ЭтоПлатежныйАгент Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ПризнакАгента");
	КонецЕсли;
	
	Если ЭтоПлатежныйАгент 
		И (ПризнакАгента = ПредопределенноеЗначение("Перечисление.ПризнакиАгента.БанковскийПлатежныйАгент") 
			ИЛИ (ПризнакАгента = ПредопределенноеЗначение("Перечисление.ПризнакиАгента.БанковскийПлатежныйСубагент")))
		И ЗначениеЗаполнено(ИННОператораПеревода) Тогда
		РезультатПроверки = ИдентификационныеНомераНалогоплательщиков.ПроверитьСоответствиеТребованиямИНН(ИННОператораПеревода, Истина);
		Если НЕ РезультатПроверки.СоответствуетТребованиям Тогда
			ТекстСообщения = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("Поле", "Корректность","ИНН оператора перевода",,,РезультатПроверки.ОписаниеОшибки);
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "ИННОператораПеревода", "Объект", Отказ);
		КонецЕсли;
	КонецЕсли; 
	
	Если ЗначениеЗаполнено(ВидОбеспеченияОбязательствИПлатежей) Тогда
		Если НЕ ЗначениеЗаполнено(ОбеспечениеПредоставил) Тогда
			ТекстОшибки = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("Поле", "Заполнение",
				НСтр("ru='Кто предоставил'"));
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект.Ссылка, "ОбеспечениеПредоставил", , Отказ);
		КонецЕсли;
		
		Если НЕ ЗначениеЗаполнено(ОбеспечениеПолучил) Тогда
			ТекстОшибки = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("Поле", "Заполнение",
				НСтр("ru='В чью пользу'"));
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект.Ссылка, "ОбеспечениеПолучил", , Отказ);
		КонецЕсли;
		
		Если НЕ ЗначениеЗаполнено(ОбеспечениеВыданоЗа) Тогда
			ТекстОшибки = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("Поле", "Заполнение",
				НСтр("ru='За кого'"));
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект.Ссылка, "ОбеспечениеВыданоЗа", , Отказ);
		КонецЕсли;
		
	КонецЕсли;
	
	ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
	
КонецПроцедуры

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ВыполнитьПроверкуКлючевыхРеквизитов(Отказ)

	Если ЭтоНовый() тогда
		//В случае нового договора не производить проверку
		Возврат;
	КонецЕсли;

	// Получим значения реквизитов договора из информационной базы
	РеквизитыДоговораИзИБ = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка,
		"ПометкаУдаления, Владелец, ВалютаВзаиморасчетов, ВидДоговора,
		|Организация, РасчетыВУсловныхЕдиницах, УчетАгентскогоНДС, ЭлектронныеУслуги,
		|УчетАгентскогоНДСПокупателем, СчетаФактурыОтИмениОрганизации");
	
	Если ПометкаУдаления <> РеквизитыДоговораИзИБ.ПометкаУдаления тогда
		//В случае установки или снятия пометки удаления не производить проверку
		Возврат;
	КонецЕсли;

	// Проверим, можно ли изменять реквизиты договора.

	УстановитьПривилегированныйРежим(Истина);

	Если ЭтоГруппа Тогда

		// Для группы владельца менять нельзя
		Если Владелец <> РеквизитыДоговораИзИБ.Владелец Тогда
			ТекстСообщения = НСтр("ru = 'Нельзя изменять контрагента для группы договоров.'"); 
			ТекстСообщения = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("Поле", "Корректность", 
								НСтр("ru = 'Контрагент'"), , , ТекстСообщения);
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "Владелец", "Объект", Отказ);
		КонецЕсли;

	Иначе

		// Для элемента нужно получить документы, в которых использован договор:
		ЕстьПроведенныеДокументыПоДоговору = Ложь;
		ЕстьОформленныеДокументыПоДоговору = Ложь;
		
		НеобходимаПроверка = ОпределитьНеобходимостьПроверки(РеквизитыДоговораИзИБ, 
			ЕстьПроведенныеДокументыПоДоговору, ЕстьОформленныеДокументыПоДоговору);
		
		Если НеобходимаПроверка Тогда

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

		КонецЕсли;

	КонецЕсли;

	УстановитьПривилегированныйРежим(Ложь);

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

Функция ОпределитьНеобходимостьПроверки(РеквизитыДоговораИзИБ, ЕстьПроведенныеДокументыПоДоговору, ЕстьОформленныеДокументыПоДоговору)

	ЕстьПроведенныеДокументыПоДоговору = Ложь;
	ЕстьОформленныеДокументыПоДоговору = Ложь;
	
	Если Владелец <> РеквизитыДоговораИзИБ.Владелец
		ИЛИ ВалютаВзаиморасчетов <> РеквизитыДоговораИзИБ.ВалютаВзаиморасчетов 
		ИЛИ ВидДоговора <> РеквизитыДоговораИзИБ.ВидДоговора
		ИЛИ Организация <> РеквизитыДоговораИзИБ.Организация
		ИЛИ РасчетыВУсловныхЕдиницах <> РеквизитыДоговораИзИБ.РасчетыВУсловныхЕдиницах 
		ИЛИ УчетАгентскогоНДС <> РеквизитыДоговораИзИБ.УчетАгентскогоНДС
		ИЛИ ЭлектронныеУслуги <> РеквизитыДоговораИзИБ.ЭлектронныеУслуги
		ИЛИ УчетАгентскогоНДСПокупателем <> РеквизитыДоговораИзИБ.УчетАгентскогоНДСПокупателем
		ИЛИ СчетаФактурыОтИмениОрганизации <> РеквизитыДоговораИзИБ.СчетаФактурыОтИмениОрганизации Тогда

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

	Иначе

		// Проверку запускать не надо, ключевые реквизиты не менялись
		Возврат Ложь;

	КонецЕсли;

КонецФункции

Процедура СообщитьОНекорректномРеквизите(ИмяРеквизита, СинонимРеквизита, ШаблонСообщения, Отказ)

	Если ЭтотОбъект[ИмяРеквизита] <> Ссылка[ИмяРеквизита] Тогда
		ТекстСообщения = СтрЗаменить(ШаблонСообщения, "%2", СинонимРеквизита);
		ТекстСообщения = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("Поле", "Корректность", 
			СинонимРеквизита, , , ТекстСообщения);
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, ИмяРеквизита, "Объект", Отказ);
	КонецЕсли;

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

#КонецОбласти

#КонецЕсли
Показать
Прикрепленные файлы:
9. alex-l19041 8 10.06.19 08:46 Сейчас в теме
(3) получаете же ДоговорКонтрагента.ДатаДоговора... а какие еще данные содержатся в ДоговорКонтрагента ?
12. user613191_olgargor 10.06.19 19:53 Сейчас в теме
(1)
СозданныйДоговор.Организация = Объект.Организация
4. YannikAlx 43 07.06.19 17:03 Сейчас в теме
ну как минимум вы сами сначала должны понимать Откуда берете организацию, и вот оттуда ее и вставляйте , если бы она была одна, то
СозданныйДоговор.Организация =Справочники.Организации.ОрганизацияПоУмолчанию();
6. alexey0702 10.06.19 01:49 Сейчас в теме
(4) Здравствуйте. Откуда я то понимаю, и по умолчанию проставить то получается. но загвоздка в том, что в базе несколько компаний, и документы по разным компаниям. И получается что выбор должен нужно делать основываясь по ИНН, указанный в загруженном документе. И вот как раз на это поле я не могу сослаться.
Загруженные документы создаются как элементы справочника, куда переносится массив информации и дальше вся работа идет с данными из этого справочника. и вроде все хорошо получилось, контрагент цепляется, сумма, счет, субконто все берется, а вот Организацию никак.
по умолчанию берет.
По поиск организации по заранее указанному ИНН берет.
А вот задать условие самому находить ИНН в конкретной строке и по нему искать в справочнике Организация- никак не могу сообразить как задать.
10. alex-l19041 8 10.06.19 08:48 Сейчас в теме
(6)
создаются как элементы справочника, куда переносится массив информации и дальше вся работа идет с данными из этого справочника.
- т.е. ИНН туда не переносится ?
11. alex-l19041 8 10.06.19 09:02 Сейчас в теме
(6)
Загруженные документы создаются как элементы справочника
- какие данные там хранятся ?
13. user613191_olgargor 10.06.19 20:02 Сейчас в теме
(6)
СозданныйДоговор.Организация = справочники.Организации.НайтиПоРеквизиту("ИНН", ДоговорКонтрагента.ИНН);


если в поле ДоговорКонтрагента.ИНН хранится именно ИНН организации, и в справочнике "Организации" есть реквизит ИНН - тогда так.


Если у вас организация хранится в готовом виде в договореКонтрагента (строка табличной части вашего объекта), тогда вы по идее можете по ИНН вообще ничего не искать, а взять сразу организацию из Догвора:
СозданныйДоговор.Организация = ДоговорКонтрагента.Организация;


В общем весь смысл в том, чтобы понять, какие поля у вас хранятся в табличной части этой, которую Вы перебираете. Есть ли там Организация или там есть ИНН? как называются эти поля? Вы не предоставили скрина с полями табличной части "Этого объекта". Мы его не видели в ветке форума. Поэтому можем только гадать и писать Вам варианты "Если - то..."
15. alexey0702 13.06.19 07:51 Сейчас в теме
(13)
Здравствуйте.
Спасибо за уделяемое время.
Хранится все в справочнике, который создан для хранения данных из массива, чтобы на основании этих данных делать все манипуляции в 1С. Обозвали его "А2ДокументыКомДэк". В нем есть элемент "ИННОрганизации". По сути из него должно браться ИНН, чтобы понять какой из Организаций будет принадлежать договор контрагента.
Форма же самого договора контрагента стандартная из стандартной конфы.
Как происходит процесс.
Массив данных грузится и создается элемент справочника "А2ДокументыКомДэк". Там данные с каким контрагентом какой бух.документ (реализация, касса, банк, бух.справка) на какую сумму по какой из Организаций.
На основании данных справочника "А2ДокументыКомДэк" создается Контрагент с ИНН и КПП самого контрагента
К Контрагенту создается договор. В договоре из справочника "А2ДокументыКомДэк" подбираются №, дата. А вот Организация не проставляется, т.к. я не могу сделать отсылку к элементу справочника "А2ДокументыКомДэк" который называется ИННОрганизации.
Т.е. из-за этой ошибки у Контрагента договор создается, но Организации в нем нет. И когда уже в самой 1С делаешь какой-нибудь новый документ, то договор не виден для выбора, т.к. в договоре нет Организации.
Прикрепленные файлы:
16. user613191_olgargor 13.06.19 09:17 Сейчас в теме
(15) предоставьте код функции А2ОбменКомДЭК.НайтиДоговор(). А хотя не, не надо, это ж не используется в дальнейшем коде. .. Минутку...
17. user613191_olgargor 13.06.19 09:29 Сейчас в теме
Вы четко опять не написали, в каком месте работет Ваш код, но я осмелюсь предположить, что это модуль объекта вашего справочника "А2ДокументыКомДэк"........и Вы перебираете табличную часть "ДоговораКонтрагента" некоего элемента справочника "А2ДокументыКомДэк".

(если вышенаписанное неверно мной понято значит ниженаписанное тоже будет неверным)

если так - тогда: ЭтотОбъект.ИННОрганизации - это то, где как я поняла у Вас хранится ИННОрганизации, значит вам нужно в справочнике Организации найти организацию с таким ИНН, а значит:
справочники.Организации.НайтиПоРеквизиту("ИНН", ЭтотОбъект.ИННОрганизации);

Если же на самом деле этот код выдернут из модуля вашей обработки или из модуля формы вашей обработки какой-то - тогда Этот Объект - это ваша обработка или ваша форма обработки и тогда надо знать, на основании чего строится форма, и где в ней лежит ИННОрганизации :)
18. user613191_olgargor 13.06.19 09:40 Сейчас в теме
Опять же мои предположения, но все же.... т.к. вряд ли это был модуль объекта справочника...
ПРедположу, что у вас в этой же процедуре, но строками выше создается элемент справочника "А2ДокументыКомДэк". Тогда ИННОрганизации ленжит именно в нем и ссылаться на него вы сможете по ссылке на него, как бы это ни было банально.
Например у вас там написано что-то вроде

НовыйА2ДокументыКомДэк = Справочники.А2ДокументыКомДэк.СоздатьЭлемент()
НовыйА2ДокументыКомДэк.ИННОрганизации = "1234569871"; //например



тогда чтобы получить из этого объекта ИННОрганизации вы пишете :
НовыйА2ДокументыКомДэк.ИННОрганизации;



короче не весь код опять есть и я сижу гадаю на кофейной гуще, чтобы вам помочь
20. alexey0702 27.06.19 01:59 Сейчас в теме
(18)
Здравствуйте, вы правы, хоть это и банально, ИННОрганизации является полем справочника А2ДокмуентыКомДэк и создается следующим кодом через обмен

ЧтениеХмл = Новый ЧтениеXML;	
	ЧтениеХмл.ОткрытьФайл(ЭтотОбъект.ФайлОбменаНаСервере);	
	ЗаписиФайла = ФабрикаXDTO.ПрочитатьXML(ЧтениеХмл);	
	
	ИННОрганизации = А2ОбменКомДЭК.ПолучитьДанныеХдто(ЗаписиФайла.owner_inn);	
	КППОрганизации = А2ОбменКомДЭК.ПолучитьДанныеХдто(ЗаписиФайла.owner_kpp);	
	НаименованиеОрганизации = А2ОбменКомДЭК.ПолучитьДанныеХдто(ЗаписиФайла.owner_name);	
	
	Для Каждого Запись из А2ОбменКомДЭК.ОбработатьДанныеХдто(ЗаписиФайла.rec_data) Цикл	
	
		Если А2ОбменКомДЭК.ЗагруженныйДокументСуществует(Число(А2ОбменКомДЭК.ПолучитьДанныеХдто(Запись.id))) Тогда
	
		КонецЕсли;
		НовыйДокумент = Справочники.А2ДокументыКомДЭК.СоздатьЭлемент();
	
		НовыйДокумент.ИННОрганизации = ИННОрганизации;
		НовыйДокумент.КППОрганизации = КППОрганизации;
Показать

, но в том и проблема, что у меня не получается на него сослаться.
21. user613191_olgargor 27.06.19 13:36 Сейчас в теме
чтобы понять как сослаться на что-=то , Вы должны понять как эти объекты взаимосвязаны. Те, с которыми Вы сейчас работаете и этот справочник , в котором хранится нужный вам ИНН.

Вам по сути, имея некие связи между этими объектами найти нужный вам элемент справочника "А2ДокументыКомДэк". По каким полям и каким значениям в них Вам нужно его искать - это только Вы можете понять, видя всю структуру данных и их взаимосвязи. Как только Вы поймете, по каким полям этого справочника вам нужно искать какие значения, чтобы выбрать нужный элемент этого справочника - находите его по этим полям. Вот у Вас я так поняла перебираются строки какой то таблицы "ДоговораКонтрагента ", очевидно в этих строках есть данные, необходимые для того, чтобы по ним найти соответствующий им элемент этого справочника. Я не знаю, какие там поля в этих строках, и как они связаны с вашим справочником "А2ДокументыКомДэк", это знаете только Вы и не хотите в этом признаваться :)

Типа
НайденныйЭлементА2ДокументыКомДэк = НайтиЭлементСправочника(ПараметрыПоиска);
,

где НайтиЭлементСправочника - это будет Вами написанная функция в которой Вы ищете элемент справочника исходя из того как он связан с данными строки из ДоговораКонтрагента!
(кроме Вас структуру данных вашей самописной части конфигурации знать никто не может, изучайте связи! это трудно, но необходимо сделать, если Вы и дальше хотите поддерживать эту конфигурацию.), а ПараметрыПоиска- это некие данные вашей строки из ДоговораКонтрагента , необходимые для поиска элемента справочника , хранящего искомый ИНН).

а потом ссылкой на найденный элемент находите инн
НайденныйЭлементА2ДокументыКомДэк .ИНН
и подставляете его в вашу функцию, где сейчас костыль. Там правда надо еще смотреть, что кроме ИНН в нее подается, там ведь не один параметр закостылен...

Извините, если непонятно объясняю, больше врядли чем-то смогу помочь. Изучайте взаимосвязи таблиц Ваших и тогда Вы сразу поймете откуда и что брать.
19. alexey0702 26.06.19 11:16 Сейчас в теме
Здравствуйте. Это пройедура создания договора как выглядит сейчас. В кратце в нее "костылем" вшито отбирать Организацию с определенным ИНН и если он есть, создавать договор, если этого ИНН нет, то не создавать договор (код процедуры ниже). Так было сделано, потому что раньше была всего одна организация. Сейчас расширились, организаций стало больше, а договор все равно создается только по одной из организаций



Процедура СоздатьДоговораКонтрагента (СозданныйКонтрагент)
	
	Для Каждого ДоговорКонтрагента Из ЭтотОбъект.ДоговораКонтрагента Цикл
		//	Если договор уже связан, пропускаем
		Если ЗначениеЗаполнено(ДоговорКонтрагента.Договор1С) Тогда
			Продолжить;
		КонецЕсли;		
		//	Если организация договора не Сервер-Центр, пропускаем его в обработке
		Если СокрЛП(ДоговорКонтрагента.ИНН) <> "2539038819" Тогда
			Сообщить("Найден договор не с Сервер-Центром, данный договор не будет добавлен");
			Продолжить;
		КонецЕсли;
		НайденныеДоговора = А2ОбменКомДЭК.НайтиДоговор(СокрЛП(ДоговорКонтрагента.НомерДоговора), ДоговорКонтрагента.ДатаДоговора, СозданныйКонтрагент.Ссылка);
		Если НайденныеДоговора.Количество() = 1 Тогда
			//	Найден один договор
			ДоговорКонтрагента.Договор1С = НайденныеДоговора.Получить(0).Ссылка;
		ИначеЕсли НайденныеДоговора.Количество() > 1 Тогда
			ВызватьИсключение "Найдено слишком много (" + НайденныеДоговора.Количество() + ") договоров с указанным номером (" + СокрЛП(ДоговорКонтрагента.НомерДоговора) + "), датой (" + ДоговорКонтрагента.ДатаДоговора + ") и владельцем (" + СозданныйКонтрагент.Ссылка + ")";
		ИначеЕсли НайденныеДоговора.Количество() = 0 Тогда
			//	Договоров не найдено, создаем новый
			СозданныйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();			
			СозданныйДоговор.Дата = ДоговорКонтрагента.ДатаДоговора;
			СозданныйДоговор.Номер = СокрЛП(ДоговорКонтрагента.НомерДоговора);
			СозданныйДоговор.Наименование = СокрЛП(ДоговорКонтрагента.ИмяДоговора);
			СозданныйДоговор.Владелец = СозданныйКонтрагент.Ссылка;
			СозданныйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить();
			СозданныйДоговор.УстановитьНовыйКод();
			НайденныеОрганизации = А2ОбменКомДЭК.НайтиОрганизацию("2525252525", "25252525", "Организации");
			Если НайденныеОрганизации.Количество() = 0 Тогда
				ВызватьИсключение "Не найдена организация для заключения договора с указанными ИНН (2525252525) и КПП (25252525)";
			ИначеЕсли НайденныеОрганизации.Количество() = 1 Тогда
				СозданныйДоговор.Организация = НайденныеОрганизации.Получить(0).Ссылка;
			ИначеЕсли НайденныеОрганизации.Количество() > 1 Тогда
				ВызватьИсключение "Найдено слишком много (" + НайденныеОрганизации.Количество() + ") организаций для заключения договора с указанными ИНН (2539038819) и КПП (253601001)";
			КонецЕсли;
			Если СокрЛП(ДоговорКонтрагента.ТипДоговора) = "договора с клиентами" Тогда
				СозданныйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
			ИначеЕсли СокрЛП(ДоговорКонтрагента.ТипДоговора) = "договора с поставщиками" Тогда
				СозданныйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком;
			Иначе
				ВызватьИсключение "Неизвестный тип договора при обработке: " + СокрЛП(ДоговорКонтрагента.ТипДоговора);
			КонецЕсли;
			//	Определяем вид взаиморасчетов по договору
			СтрокаСоответствие = А2ОбменКомДЭК.НайтиСоответствиеВидВзаиморасчета(СокрЛП(ДоговорКонтрагента.ИдВидДог), СокрЛП(ДоговорКонтрагента.ИмяВидаДог));
			СозданныйДоговор.ВидВзаиморасчетов = СтрокаСоответствие.ВидВзаиморасчетов;
			СозданныйДоговор.Записать();
			//	Связываем созданный договор с загруженным
			ДоговорКонтрагента.Договор1С = СозданныйДоговор.Ссылка;
		Иначе
			//	Блок, в который никогда не должен попасть алгоритм
			ВызватьИсключение "Найдено странное количество договоров контрагента: " + НайденныеДоговора.Количество();
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры
Показать
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день