Заполнить реквизиты документа программно
1с Документооборот 3.0
При заполнении документа выбирается контрагент.
Далее при запуске документа в обработку отрабатывает скрипт, который должен заполнить реквизит "Подписал" (контактное лицо контрагента) - Скрин1.
Сам скрипт
Реквизит "ПодписалОтКонтрагента" заполняется значением.
И в момент записи (строка ДокОбъект.Записать()) очищается и не сохраняется.
Что исправить? Почему значение не сохраняется?
Помогите, пжлст)
При заполнении документа выбирается контрагент.
Далее при запуске документа в обработку отрабатывает скрипт, который должен заполнить реквизит "Подписал" (контактное лицо контрагента) - Скрин1.
Сам скрипт
Документ = Параметры.ОбработкаОбъект.Владелец;
Если Документ.ВидДокумента.Наименование = "СЗ на закупку" Тогда
ДокОбъект = Документ.ПолучитьОбъект();
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| КонтактныеЛица.Ссылка КАК КонтактноеЛицо
|ИЗ
| Справочник.КонтактныеЛица КАК КонтактныеЛица
|ГДЕ
| КонтактныеЛица.Владелец = &Владелец
| И (НЕ КонтактныеЛица.ПометкаУдаления)";
Запрос.УстановитьПараметр("Владелец", Документ.Контрагент);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
П = Выборка.КонтактноеЛицо;
Иначе Сообщить("У контрагента " + Документ.Контрагент + " не заполнено контактное лицо!");
КонецЕсли;
ДокОбъект.ПодписалОтКонтрагента = П;
ДокОбъект.ПодписанВсеми = Истина;
ДокОбъект.ПодписанУтвержден = "Подписан";
ДокОбъект.Записать();
КонецЕсли; ПоказатьРеквизит "ПодписалОтКонтрагента" заполняется значением.
И в момент записи (строка ДокОбъект.Записать()) очищается и не сохраняется.
Что исправить? Почему значение не сохраняется?
Помогите, пжлст)
Прикрепленные файлы:
По теме из базы знаний
- Дополнительные реквизиты документов и справочников
- Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2/3.0
- Заполняем по шаблону (по умолчанию)
- Заполнение дополнительных реквизитов в модуле на сервере, в правилах КД 2.0, в модуле внешней обработки
- Пример написания универсального кода. Задача выгрузки и загрузки произвольного документа
Найденные решения
(9)
попробуйте
НекийДокумент = Параметры.ОбработкаОбъект.Владелец;
Если НекийДокумент.ВидДокумента.Наименование = "СЗ на закупку" Тогда
ДокОбъект = НекийДокумент.ПолучитьОбъект();
НекоеКонтактноеЛицо = НекийДокумент.КонтактноеЛицо;
Если ЗначениеЗаполнено(НекийДокумент.Контрагент) Тогда
Если Не ЗначениеЗаполнено(НекийДокумент.КонтактноеЛицо) Тогда
НекоеКонтактноеЛицо = РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента(НекийДокумент.Контрагент);
Если НЕ ЗначениеЗаполнено(НекоеКонтактноеЛицо) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("...");
ВызватьИсключение ("...");
КонецЕсли;
КонецЕсли;
КонецЕсли;
НекийОбъект.Контрагенты[0].КонтактноеЛицо = НекоеКонтактноеЛицо;
НекийОбъект.Контрагенты[0].ПодписалОтКонтрагента = НекоеКонтактноеЛицо;
НекийОбъект.Записать();
ДокОбъект.ПодписанВсеми = Истина;
ДокОбъект.ПодписанУтвержден = "Подписан";
ДокОбъект.Записать();
ЭтаФорма.Прочитать();
КонецЕсли;
Показатьпопробуйте
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Вы сидите на форме.
у Вас разница в значениях между объектом и объектом формы.
т.е. вы открываете одну версию, потом программно записываете в значение объекта, но реквизит формы объекта "подписалОтКонтрагента" пустой, его необходимо обновить, чтобы открытая форма знала о нём.
Модифицированность записывает значение с формы, если прям грубо так описывать. Поэтому форму перечитать надо.
Понимаете?
чтобы ПередЗаписью отработала корректно либо заполняете ЭтотОбъект.ПодписалОтКонтрагента либо ЭтаФорма.ОбновитьРеквизитыФормы()
у Вас разница в значениях между объектом и объектом формы.
т.е. вы открываете одну версию, потом программно записываете в значение объекта, но реквизит формы объекта "подписалОтКонтрагента" пустой, его необходимо обновить, чтобы открытая форма знала о нём.
Модифицированность записывает значение с формы, если прям грубо так описывать. Поэтому форму перечитать надо.
Понимаете?
чтобы ПередЗаписью отработала корректно либо заполняете ЭтотОбъект.ПодписалОтКонтрагента либо ЭтаФорма.ОбновитьРеквизитыФормы()
(4) Спасибо, конечно.
Но проблема, наверное, в другом.
Если я таким путем присвою значение др. реквизиту, то все благополучно сохраняется и записывается.
Дело скорее всего в самом реквизите.
М.б. он защищен от записи...
не пойму где это посмотреть и как правильно сделать.
Но проблема, наверное, в другом.
Если я таким путем присвою значение др. реквизиту, то все благополучно сохраняется и записывается.
Дело скорее всего в самом реквизите.
М.б. он защищен от записи...
не пойму где это посмотреть и как правильно сделать.
(6) Давайте так
Посмотрите внимательно на логику
&НаКлиенте
Процедура ПодписалОтКонтрагентаПриИзменении(Элемент)
СкопироватьКонтрагентаИзРеквизитовВСписок();
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьКонтрагентаИзРеквизитовВСписок(УстановитьОсновноеКонтактноеЛицо = Ложь)
Объект.Контрагенты.Очистить();
Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
Возврат;
КонецЕсли;
Строка = Объект.Контрагенты.Добавить();
Строка.Контрагент = Объект.Контрагент;
Если Не ЗначениеЗаполнено(Объект.КонтактноеЛицо) И УстановитьОсновноеКонтактноеЛицо Тогда
Объект.КонтактноеЛицо = РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента(Строка.Контрагент);
КонецЕсли;
Строка.КонтактноеЛицо = Объект.КонтактноеЛицо;
Строка.ПодписалОтКонтрагента = Объект.ПодписалОтКонтрагента;
Строка.ЗапретУдаления = Элементы.Контрагент.ТолькоПросмотр;
РаботаСКорреспонденциейКлиент.СкопироватьКонтрагентаИзРеквизитовВСписок(ЭтотОбъект, Строка);
КонецПроцедуры
ПоказатьПроцедура СкопироватьКонтрагентаИзРеквизитовВСписок(Форма, СтрКонтрагент) Экспорт
ВидДокументаКэш = Форма.ВидДокументаКэш;
Если Не ВидДокументаКэш.ЯвляетсяИсходящейКорреспонденцией Тогда
Возврат;
КонецЕсли;
СтрКонтрагент.ДатаОтправки = Форма.ДатаОтправки;
СтрКонтрагент.ВходящийНомер = Форма.ВходящийНомер;
СтрКонтрагент.ВходящаяДата = Форма.ВходящаяДата;
СтрКонтрагент.Отправлен = Форма.Отправлен;
СтрКонтрагент.СпособОтправки = Форма.СпособОтправки;
КонецПроцедуры
ПоказатьПосмотрите внимательно на логику
(8)
Имеете ввиду это определение?
РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента(Строка.Контрагент)
И как дальше быть?
Скрипт не отладить никак...
Документ = Параметры.ОбработкаОбъект.Владелец;
ДокОбъект = Документ.ПолучитьОбъект();
И Документ, и ДокОбъект заполняю реквизит ПодписалОтКонтрагента, но при записи очищается.
Может еще подскажете, что сделать?
Как в скрипте получить форму и обновить ее перед записью?
Запрос можно заменить на типовое определение. так будет читабельнее и профессиональнее.
Имеете ввиду это определение?
РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента(Строка.Контрагент)
И как дальше быть?
Скрипт не отладить никак...
Документ = Параметры.ОбработкаОбъект.Владелец;
ДокОбъект = Документ.ПолучитьОбъект();
И Документ, и ДокОбъект заполняю реквизит ПодписалОтКонтрагента, но при записи очищается.
Может еще подскажете, что сделать?
Как в скрипте получить форму и обновить ее перед записью?
(9)
попробуйте
НекийДокумент = Параметры.ОбработкаОбъект.Владелец;
Если НекийДокумент.ВидДокумента.Наименование = "СЗ на закупку" Тогда
ДокОбъект = НекийДокумент.ПолучитьОбъект();
НекоеКонтактноеЛицо = НекийДокумент.КонтактноеЛицо;
Если ЗначениеЗаполнено(НекийДокумент.Контрагент) Тогда
Если Не ЗначениеЗаполнено(НекийДокумент.КонтактноеЛицо) Тогда
НекоеКонтактноеЛицо = РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента(НекийДокумент.Контрагент);
Если НЕ ЗначениеЗаполнено(НекоеКонтактноеЛицо) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("...");
ВызватьИсключение ("...");
КонецЕсли;
КонецЕсли;
КонецЕсли;
НекийОбъект.Контрагенты[0].КонтактноеЛицо = НекоеКонтактноеЛицо;
НекийОбъект.Контрагенты[0].ПодписалОтКонтрагента = НекоеКонтактноеЛицо;
НекийОбъект.Записать();
ДокОбъект.ПодписанВсеми = Истина;
ДокОбъект.ПодписанУтвержден = "Подписан";
ДокОбъект.Записать();
ЭтаФорма.Прочитать();
КонецЕсли;
Показатьпопробуйте
Это рабочий алгоритм, все заполнилось.
Только Форму не перечитал, ошибка на скрине.
Но и без этой строки все работает.
Спасибо Вам огромное за помощь!!!
Только Форму не перечитал, ошибка на скрине.
Но и без этой строки все работает.
Спасибо Вам огромное за помощь!!!
Прикрепленные файлы:
(13) не за что, коллега.
есть ошибки в переменных, но видимо Вы их исправили.
"ОшибкаКомпиляции..." из-за того, что у Вас скрипт внутри схемы, а я имитировал при нажатии на кнопку "Начать обработку". Внутри схемы, конечно, не будет никакой Формы.
Помните, контактное лицо должно иметь признак "Основное" иначе РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента вернёт пустую ссылку.
есть ошибки в переменных, но видимо Вы их исправили.
"ОшибкаКомпиляции..." из-за того, что у Вас скрипт внутри схемы, а я имитировал при нажатии на кнопку "Начать обработку". Внутри схемы, конечно, не будет никакой Формы.
Помните, контактное лицо должно иметь признак "Основное" иначе РаботаСКонтрагентамиВызовСервера.ОсновноеКонтактноеЛицоКонтрагента вернёт пустую ссылку.
глядя на этот код и контекст который ты дал советую тебе поднять руки, медленно положить мышку на стол и бежать, т.к. ствол на тебя уже направлен
Либо давай нормальный контекст и тогда может и поможем
Либо давай нормальный контекст и тогда может и поможем
(5) в том то и дело чувак. что ты даже сам не понимаешь чего ты хочешь и не можешь это нормально спросить.
А вот это указывает на то, что погроммист ты максимально плохой.
Поэтому я и спрашиваю полный контекст
Если Документ.ВидДокумента.Наименование = "СЗ на закупку" Тогда
А вот это указывает на то, что погроммист ты максимально плохой.
Поэтому я и спрашиваю полный контекст
(10) к сожалению в конфигурации 1С:Документооборот 3.0 только так и можно сделать в данном случае, да, собственно, и в других тоже ибо реквизит "Код" в справочник.ВидыДокументов не используется.
Можно было извратиться и через массив наименований и даже ПолучитьСсылку(), но зачем!?
Можно было извратиться и через массив наименований и даже ПолучитьСсылку(), но зачем!?
Прикрепленные файлы:
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот