Из запроса по тч документа вставить значение в поле тч
Здравствуйте! Подскажите пожалуйста. Есть ТЧ документа. В нем есть реквизит "Номер Инвойса" - текстовый. Так же есть реквизит "Справочник Номер Инвойса" - ссылка на справочник. Вот, я пытаюсь из поля "Номер Инвойса" значение вставить в поле "Справочник Номер Инвойса". но как не сделаю пишет : Поле объекта недоступно для записи (СправочникНомерИнвойса)
{ВнешняяОбработка.Инвойс.Форма.Форма.Форма(48)}:Стр.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(Выборка.НомерИнвойса);
{ВнешняяОбработка.Инвойс.Форма.Форма.Форма(57)}:ПускНаСервере();
Делаю это через обработку по кнопке пуск. За ранее спасибо за помощь!
Еще пытался так: ошибка та же
{ВнешняяОбработка.Инвойс.Форма.Форма.Форма(48)}:Стр.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(Выборка.НомерИнвойса);
{ВнешняяОбработка.Инвойс.Форма.Форма.Форма(57)}:ПускНаСервере();
Делаю это через обработку по кнопке пуск. За ранее спасибо за помощь!
&НаСервере
Процедура ПускНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПоставщикуТовары.НомерИнвойса КАК НомерИнвойса,
| ЗаказПоставщикуТовары.Ссылка КАК Ссылка,
| ЗаказПоставщикуТовары.Ссылка.Партнер КАК Партнер,
| ЗаказПоставщикуТовары.СправочникНомерИнвойса КАК СпрНомерИнвойса
|ИЗ
| Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
|ГДЕ
| ЗаказПоставщикуТовары.НомерИнвойса <> """" ";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ПолучитьОбъектТч = Выборка.Ссылка.Товары;
Стр = ПолучитьОбъектТч.Найти(Выборка.НомерИнвойса, "НомерИнвойса");
Стр.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(Выборка.НомерИнвойса);
КонецЦикла;
КонецПроцедуры
ПоказатьЕще пытался так: ошибка та же
Выборка.СправочникНомерИнвойса = Выборка.НомерИнвойса;
// И так то же самое
Выборка.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(Выборка.НомерИнвойса);
По теме из базы знаний
- Выгрузка-загрузка любых данных из 1С (и измененных) в XML между похожими конфигурациями (ФАЙЛ, HTTP, COM) ЛЮБЫХ баз 1С 8.1-8.3 с обработкой и поиском данных по произвольным полям поиска
- Получение списка родительских и подчиненных документов из структуры подчиненности
- Программное открытие отчета
- Пример создания документа с движениями в ERP 2.5.7
- Отчеты с общей формой отчета. Типовые сценарии
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
У вас есть выборка, которая попадает в переменную Выборка. Далее вы к каждому полю выборки обращаетесь через точку. В первом варианте вы пытаетесь результату поля СправочникНомерИнвойса присвоить значение результата поля НомерИнвойса. Во втором вы так же пытаетесь присвоить полю выборки, но уже ссылку на объект.
Если реквизит, в который нужно вставить значение выборки находится в ТЧ документа, то необходимо присвоить Объекту ТЧ результат выборки
В модуле формы:
Объект.<ТабличнаяЧасть>.<Реквизит> = Выборка.<Нужное поле выборки>
В модуле объекта: <ТабличнаяЧасть>.<Реквизит> = Выборка.<Нужное поле выборки>
В первом коде где запрос вы получаете только ссылку. Чтобы получить Объект для изменения необходимо использовать метод ПолучитьОбъект()
Объект = Ссылка.ПолучитьОбъект()
Если я правильно понял, то вам вообще достаточно обойти в цикле табличную часть без запроса:
На форме:
Для Каждого СтрокаТЧ ИЗ Объект.<ТабличнаяЧасть> Цикл
СтрокаТЧ.СправочникНомерИнвойса = Справочники.СправочникНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
КонецЦикла
А в дальнейшем, если будут в ручную вводится номера, лучше вообще это обработать в событии ПриИзменении реквизита НомерИнвойса
Если реквизит, в который нужно вставить значение выборки находится в ТЧ документа, то необходимо присвоить Объекту ТЧ результат выборки
В модуле формы:
Объект.<ТабличнаяЧасть>.<Реквизит> = Выборка.<Нужное поле выборки>
В модуле объекта: <ТабличнаяЧасть>.<Реквизит> = Выборка.<Нужное поле выборки>
В первом коде где запрос вы получаете только ссылку. Чтобы получить Объект для изменения необходимо использовать метод ПолучитьОбъект()
Объект = Ссылка.ПолучитьОбъект()
Если я правильно понял, то вам вообще достаточно обойти в цикле табличную часть без запроса:
На форме:
Для Каждого СтрокаТЧ ИЗ Объект.<ТабличнаяЧасть> Цикл
СтрокаТЧ.СправочникНомерИнвойса = Справочники.СправочникНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
КонецЦикла
А в дальнейшем, если будут в ручную вводится номера, лучше вообще это обработать в событии ПриИзменении реквизита НомерИнвойса
(3) Во-первых, что вы хотите сделать?
Во-вторых, у вас какой-то круговорот инвойса в 1С происходит)
У вас сейчас есть табличная часть где заполнен строковый реквизит НомерИнвойса, но не заполнен реквизит с ссылкой на справочник с номерами инвойсов. Вы нажимаете кнопку, программа на сервере делает запрос к БД, где берет вообще все данные всех табличных частей, которые есть в системе. Далее вы, обходя каждую строку запроса, пытаетесь получить объект по ссылке и найти строку для изменения. Это какая-то ерунда
Для чего вы вообще используете запрос? Запросом можно только получить данные, но не менять их. Табличная часть документа для обработки у вас доступна при обращении к Объект.Товары.
Во-вторых, у вас какой-то круговорот инвойса в 1С происходит)
У вас сейчас есть табличная часть где заполнен строковый реквизит НомерИнвойса, но не заполнен реквизит с ссылкой на справочник с номерами инвойсов. Вы нажимаете кнопку, программа на сервере делает запрос к БД, где берет вообще все данные всех табличных частей, которые есть в системе. Далее вы, обходя каждую строку запроса, пытаетесь получить объект по ссылке и найти строку для изменения. Это какая-то ерунда
Для чего вы вообще используете запрос? Запросом можно только получить данные, но не менять их. Табличная часть документа для обработки у вас доступна при обращении к Объект.Товары.
(2) Я делал через цикл
Если я правильно понял, то вам вообще достаточно обойти в цикле табличную часть без запроса:
На форме:
Для Каждого СтрокаТЧ ИЗ Объект.<ТабличнаяЧасть> Цикл
СтрокаТЧ.СправочникНомерИнвойса = Справочники.СправочникНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
КонецЦикла
Вот так:
Но ошибка "Поле объекта не обнаружено (СправочникНомерИнвойса)"
Если я правильно понял, то вам вообще достаточно обойти в цикле табличную часть без запроса:
На форме:
Для Каждого СтрокаТЧ ИЗ Объект.<ТабличнаяЧасть> Цикл
СтрокаТЧ.СправочникНомерИнвойса = Справочники.СправочникНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
КонецЦикла
Вот так:
Для Каждого СтрокаТч Из Метаданные.Документы.ЗаказПоставщику.ТабличныеЧасти.Товары.Реквизиты Цикл
СтрокаТч.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
КонецЦикла;
Но ошибка "Поле объекта не обнаружено (СправочникНомерИнвойса)"
Было первоначально поле "Номер инвойса" оно текстовое, в него вносились номера. Потом захотели добавить поле чтобы туда можно было вносить и дату и комментарий, по этому был создан справочник с формой, а в табличной части реквизит "СправочникНомерИнвойса". В этот справочник я обработкой уже перенес все существующие инвойсы, теперь пытаюсь добавить в поле табличной части СправочникНомерИнвойса = Номер инвойса , чтобы потом удалить поле "Номер инвойса" окончательно
(15)Да, сделал уже всё успешно. Спасибо за помощь!
Пока Выборка.Следующий() Цикл
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
Для Каждого СтрокаТч Из ДокументОбъект.Товары Цикл
СтрокаТч.СправочникНомерИнвойса = Справочники.СпрНомерИнвойса.НайтиПоНаименованию(СтрокаТЧ.НомерИнвойса);
КонецЦикла;
ДокументОбъект.Записать();
КонецЦикла;
Показать
(16)
&НаСервере
Процедура ПускНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СправочникНомера = Справочники.НомерИнвойса;
Пока Выборка.Следующий() Цикл
Ссылка = Выборка.Ссылка;
ДокОбъект = Ссылка.ПолучитьОбъект();
Для Каждого Строка Из ДокОбъект.Товары Цикл
Строка.СсылкаНомераИнвойса = СправочникНомера.НайтиПоНаименованию(Строка.НомерИнвойса);
КонецЦикла;
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение); //РежимЗаписиДокумента.Запись
КонецЦикла;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот