Заполнить реквизиты документа программно

1. aritochka777 30.10.25 15:14 Сейчас в теме
1с Документооборот 3.0
При заполнении документа выбирается контрагент.

Далее при запуске документа в обработку отрабатывает скрипт, который должен заполнить реквизит "Подписал" (контактное лицо контрагента) - Скрин1.

Сам скрипт

Документ = Параметры.ОбработкаОбъект.Владелец;
Если Документ.ВидДокумента.Наименование = "СЗ на закупку" Тогда
 
 ДокОбъект = Документ.ПолучитьОбъект();

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

Результат = Запрос.Выполнить();
	Если Не Результат.Пустой() Тогда 
		Выборка = Результат.Выбрать();
		Выборка.Следующий();
		П = Выборка.КонтактноеЛицо;
Иначе Сообщить("У контрагента " + Документ.Контрагент + " не заполнено контактное лицо!");
	КонецЕсли;

ДокОбъект.ПодписалОтКонтрагента = П;

ДокОбъект.ПодписанВсеми = Истина;
ДокОбъект.ПодписанУтвержден = "Подписан";
 ДокОбъект.Записать();

КонецЕсли;
Показать


Реквизит "ПодписалОтКонтрагента" заполняется значением.
И в момент записи (строка ДокОбъект.Записать()) очищается и не сохраняется.

Что исправить? Почему значение не сохраняется?
Помогите, пжлст)
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
12. Tommy82 66 05.11.25 17:10 Сейчас в теме
(9)

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

Показать


попробуйте
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Tommy82 66 31.10.25 11:43 Сейчас в теме
(1) Вы сидите на форме.

у Вас разница в значениях между объектом и объектом формы.
т.е. вы открываете одну версию, потом программно записываете в значение объекта, но реквизит формы объекта "подписалОтКонтрагента" пустой, его необходимо обновить, чтобы открытая форма знала о нём.
Модифицированность записывает значение с формы, если прям грубо так описывать. Поэтому форму перечитать надо.

Понимаете?

чтобы ПередЗаписью отработала корректно либо заполняете ЭтотОбъект.ПодписалОтКонтрагента либо ЭтаФорма.ОбновитьРеквизитыФормы()
6. aritochka777 01.11.25 13:26 Сейчас в теме
(4) Спасибо, конечно.

Но проблема, наверное, в другом.

Если я таким путем присвою значение др. реквизиту, то все благополучно сохраняется и записывается.

Дело скорее всего в самом реквизите.
М.б. он защищен от записи...
не пойму где это посмотреть и как правильно сделать.
7. Tommy82 66 01.11.25 16:06 Сейчас в теме
(6) Давайте так
&НаКлиенте
Процедура ПодписалОтКонтрагентаПриИзменении(Элемент)

	СкопироватьКонтрагентаИзРеквизитовВСписок();

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


&НаКлиенте
Процедура СкопироватьКонтрагентаИзРеквизитовВСписок(УстановитьОсновноеКонтактноеЛицо = Ложь)

	Объект.Контрагенты.Очистить();
	Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
		Возврат;
	КонецЕсли;

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

	РаботаСКорреспонденциейКлиент.СкопироватьКонтрагентаИзРеквизитовВСписок(ЭтотОбъект, Строка);
	
КонецПроцедуры
Показать


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


Посмотрите внимательно на логику
8. Tommy82 66 01.11.25 16:07 Сейчас в теме
(6) Запрос можно заменить на типовое определение. так будет читабельнее и профессиональнее.
Вам необходимо обновить по строке в ТЧ "Контрагенты" реквизит "ПодписалОтКонтрагента"
9. aritochka777 05.11.25 00:39 Сейчас в теме
(8)
Запрос можно заменить на типовое определение. так будет читабельнее и профессиональнее.

Имеете ввиду это определение?
РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента(Строка.Контрагент)


И как дальше быть?
Скрипт не отладить никак...

Документ = Параметры.ОбработкаОбъект.Владелец;

ДокОбъект = Документ.ПолучитьОбъект();

И Документ, и ДокОбъект заполняю реквизит ПодписалОтКонтрагента, но при записи очищается.

Может еще подскажете, что сделать?
Как в скрипте получить форму и обновить ее перед записью?
11. Tommy82 66 05.11.25 11:03 Сейчас в теме
ожидайте, пожалуйста, чуть позже выложу
12. Tommy82 66 05.11.25 17:10 Сейчас в теме
(9)

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

Показать


попробуйте
13. aritochka777 06.11.25 16:03 Сейчас в теме
Это рабочий алгоритм, все заполнилось.

Только Форму не перечитал, ошибка на скрине.
Но и без этой строки все работает.
Спасибо Вам огромное за помощь!!!
Прикрепленные файлы:
15. Tommy82 66 06.11.25 18:48 Сейчас в теме
(13) не за что, коллега.
есть ошибки в переменных, но видимо Вы их исправили.

"ОшибкаКомпиляции..." из-за того, что у Вас скрипт внутри схемы, а я имитировал при нажатии на кнопку "Начать обработку". Внутри схемы, конечно, не будет никакой Формы.
Помните, контактное лицо должно иметь признак "Основное" иначе РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента вернёт пустую ссылку.
2. Avatarzorro 66 31.10.25 03:01 Сейчас в теме
глядя на этот код и контекст который ты дал советую тебе поднять руки, медленно положить мышку на стол и бежать, т.к. ствол на тебя уже направлен

Либо давай нормальный контекст и тогда может и поможем
5. aritochka777 31.10.25 17:31 Сейчас в теме
(2) А вы вчитайтесь, прежде чем умничать и указывать кому куда бежать)

Скрипт в документообороте при обработке документа!!
10. Avatarzorro 66 05.11.25 03:08 Сейчас в теме
(5) в том то и дело чувак. что ты даже сам не понимаешь чего ты хочешь и не можешь это нормально спросить.

Если Документ.ВидДокумента.Наименование = "СЗ на закупку" Тогда

А вот это указывает на то, что погроммист ты максимально плохой.

Поэтому я и спрашиваю полный контекст
14. aritochka777 06.11.25 16:05 Сейчас в теме
(10) Чувак, добра тебе несусветного.
Контекст ты не увидел или не заметил, ибо способен только оценки раскидывать.
Тебе просили о помощи, а ты тыкать начал.
Ну лады, хорошо, что ты максимально хорош)
16. Tommy82 66 06.11.25 19:00 Сейчас в теме
(10) к сожалению в конфигурации 1С:Документооборот 3.0 только так и можно сделать в данном случае, да, собственно, и в других тоже ибо реквизит "Код" в справочник.ВидыДокументов не используется.
Можно было извратиться и через массив наименований и даже ПолучитьСсылку(), но зачем!?
Прикрепленные файлы:
3. RoyFincher 4 31.10.25 11:06 Сейчас в теме
Отправь имя события с помощью оповестить. В своей форме отлови это событие в ОбработкаОповещения и выполни ЭтотОбъект.Прочитать();
Для отправки сообщения требуется регистрация/авторизация

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