Имя: Пароль:
1C
1С v8
Запись на форме элемента справочника.
0 Barry
 
25.11.22
00:52
Не получается записать данные на форму элемента справочника. Дата срока годности, автоматом меняется в табличной части на заданную, но ничего не происходит. При выборе снова этого же документа, дата срока годности возвращается в исходной положение. Подскажите пожалуйста , что не так?((( Вот кусок кода:

ТЧИнфо = Объект.Инфо;  
ДокВыборка = Справочники.СерииНоменклатуры.Выбрать();
  Пока ДокВыборка.Следующий() Цикл
      ДокОбъект = ДокВыборка.ПолучитьОбъект();
    Для каждого СтрокиТабличнойЧасти из ТЧИнфо  Цикл
            СтрокиТабличнойЧасти.ГоденДо = Объект.СрокГодности;
              ДокОбъект.ГоденДо = СтрокиТабличнойЧасти.ГоденДо;

    КонецЦикла;

  КонецЦикла;
  
Попытка    
      ДокОбъект.Записать();
Исключение
    Сообщить (ОписаниеОшибки());
КонецПопытки
1 Ryzeman
 
25.11.22
02:04
ОФ\УФ? Конфа?

Ну и как минимум ты записываешь объект вне цикла, то есть самый последний.

Ну и вообще, не в обиду, но выглядит очень криво. ДокВыборка, ДокОбъект, Объект тебе самому удобно так когда работаешь с разными документами?

ТЧИнфо = Объект.Инфо;  
ВыборкаСерийНоменклатуры = Справочники.СерииНоменклатуры.Выбрать();
  Пока ВыборкаСерийНоменклатуры.Следующий() Цикл
      СерияНоменклатурыОбъект = ВыборкаСерийНоменклатуры.ПолучитьОбъект();
    Для каждого СтрокаТЧ из ТЧИнфо  Цикл
            СтрокаТЧ.ГоденДо = Объект.СрокГодности;
            СерияНоменклатурыОбъект.ГоденДо = СтрокаТЧ.ГоденДо;

    КонецЦикла;

  КонецЦикла;
  
Попытка    
      СерияНоменклатурыОбъект.Записать();
Исключение
    Сообщить (ОписаниеОшибки());
КонецПопытки

Видишь, сразу же удобнее? Плюс сразу видно логическую ошибку самого алгоритма. Зачем ты в двойном цикле перепереписываешь все строки твоего документа и в одинарном пытаешься переписывать все серииноменклатуры? Тут явно где-то ошибка.
2 Barry
 
25.11.22
23:35
(1) Чуть проще сделал но хз почему всеравно не записывает(

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

ТЧСрокГодности = Объект.Инфо;

Для Каждого Стр Из ТЧСрокГодности Цикл
    Стр.ГоденДо = Объект.СрокГодности;
КонецЦикла;

ДокОбъект.Записать();
3 Barry
 
25.11.22
23:39
(1) Здесь просто в самом документе, реквизит Годен до хранится в справочнике серии и запись происходит на форме элемента. Я не понимаю как это можно правильно записать.
Вот скрин: https://prnt.sc/Tz7wfN4KmAnb
4 Тындр
 
25.11.22
23:41
(2) Разве не очевидно, что вместо "ТЧСрокГодности = Объект.Инфо;"  нужно юзать "ТЧСрокГодности = ДокОбъект.Инфо;"?
5 Тындр
 
25.11.22
23:42
+4 Ну или как-то так. Меняешь ты один объект, а записываешь другой в итоге
6 Barry
 
26.11.22
00:03
(5) Так это моя табличная часть которую я создал в обработке, чтобы выводить в нее данные. Ну тогда так:

ТЧСрокГодности = Объект.Инфо;
ТЧСрокГодности = ДокОбъект.Товары;

Пишет теперь вот что:
Поле объекта недоступно для записи (ГоденДо)
{ВнешняяОбработка.Корректировка.Форма.Форма.Форма(55)}:Стр.Серия.ГоденДо = Объект.СрокГодности;
7 Тындр
 
26.11.22
00:04
+5 Если непонятно выразился, поясню: Изменяешь ты объект Объект "ТЧСрокГодности = Объект.Инфо;"
А записываешь ДокОбъект "ДокОбъект = Объект.Документ.ПолучитьОбъект()"
Это если не поймешь, то то хана. Не преодолел порог вхождения ((
8 Barry
 
26.11.22
00:06
(7) Вот скрин: https://prnt.sc/Tz7wfN4KmAnb мне нужно на эту форму элемента дать запись, а не в сам документ. Я и спрашиваю как это сделать.
9 Тындр
 
26.11.22
00:09
(8) Соединение сброшено.
10 GedKo
 
26.11.22
00:10
вчитайтесь в описание ошибки (6). там же ясно написано что в ссылке попытка изменить значение
11 Тындр
 
26.11.22
00:15
(10) Тут главное понять что нужно сделать, а потом понять как это сделать.
90% что не получится, но нужно стараться.
Предлагаю Барри сформулировать задачу простым языком, например,  - "на форме обработки  вводятся некотрые значения, которые потом записываются в базу данных в справочник такой-то"
Иначе я просто не понимаю, что происходит ))
12 GedKo
 
26.11.22
00:17
есть документ-ссылка с табличной частью.
в строках табличной части есть справочник-ссылка "серия", в которой нужно поменять значение реквизита.

вопрос - для какой ссылки надо .ПолучитьОбъект() и .Записать() ? :))
13 Barry
 
26.11.22
00:20
(11) Есть обработка. В ней выбирается документ приходный ордер. Далее указываем дату Годен До (Хранится в справочнике Серии). Нажимаем получить, в табличную часть прилетает для визуального восприятия, нужные нам реквизиты, главный из них Годен до. Далее с помощью кнопки Записать, происходит замена для каждой строчки реквизита Годен До, на тот что указали в шапке. Все.
14 Barry
 
26.11.22
00:22
Если бы мне нужна была запись самого документа приходный ордер, то мой код отработал бы на все 100%. Но мне нужна запись на форме элемента справочника, на скрине указал.
15 GedKo
 
26.11.22
00:23
нда :(
16 Тындр
 
26.11.22
00:33
(13) Хорошо.
Действующие лица:
Реквизиты обработки:
- ПриходныйОрдер
- НоваяДатаГоденДо
- ТабличнаяЧастьДляВизуальногоВосприятия
Основной реквизит "Объект", как я понимаю, это тип "ОбработкаОбъект".
ПиходныйОрдер это ссылка на документ в базе.
НоваяДатаГоденДо - это Дата
ТабличнаяЧастьДляВизуальногоВосприятия - это копия структуры табличной части "Товары" приходного ордера.

Как я понял, с чтением из базы и заполнением ТабличнаяЧастьДляВизуальногоВосприятия вопросов не возникло.
Продолжаем.
Тогда нам нужно просто записать новый срок годности в табличную часть ордера:
ДокОбъект = Объект.ПриходныйОрдер.ПолучитьОбъект();
Для каждого СтрокаДокумента из ДокОбъект.Товары Цикл
СтрокаДокумента.ГоденДо = Объект.НоваяДатаГоденДо;
КонецЦикла;
Док.Объект.Записать();
17 Тындр
 
26.11.22
00:36
+(16) не "Док.Объект.Записать();" а "ДокОбъект.Записать();"
Извините
18 Barry
 
26.11.22
00:40
(17) Нет. Тоже самое пишет: Поле объекта недоступно для записи (ГоденДо)
19 Barry
 
26.11.22
00:42
(17) посмотрите скрин, который я кидал выше и станет ясно, что я хочу записать и где.
20 Тындр
 
26.11.22
00:43
(14) Запись элемента справочника чего?
Справочника серий?
До этого шла речь о форме обработки.
Форма обработки и форма справочника серий - это разные формы.
Похоже все же порог вхождения таки ой.
А скрин не открывается.
"Не удается получить доступ к сайту Соединение сброшено."
21 Тындр
 
26.11.22
00:44
(19) см (20)
22 GedKo
 
26.11.22
00:45
пока дошло() = ложь цикл
Читать12сообщение(); //там написано, что на форме отображается значение ссылки
конецЦикла;
23 GedKo
 
26.11.22
00:45
*значение реквизита ссылки
24 Barry
 
26.11.22
00:45
(20) Все верно, через документ приходный ордер, нужно записать изменения в справочнике серии на форме элемента.
25 GedKo
 
26.11.22
00:48
феерично! :)
26 Barry
 
26.11.22
00:51
(12) для справочник-ссылка "серия"
27 Тындр
 
26.11.22
00:56
(24) Жоско.
Конечно, Киркоров - один фиг румын, но форма обработки это не форма элемента справочника серии.
Ладно, у нас есть форма обработки.
На ней есть ссылка на ордер.
Далее нужно обновить справочник серии, а именно реквизит ГоденДо, исходя из значений реквизита ГоденДо табличной части Товары документа Ордер?
Все, телепатические способности покинули меня.
Но было интересно
28 GedKo
 
26.11.22
01:02
(26) так ты понял свою ошибку? :)
29 Barry
 
26.11.22
01:03
(27) именно так)
30 Barry
 
26.11.22
01:05
(28) ошибку понял, но не совсем понимаю как ее исправить
31 GedKo
 
26.11.22
01:07
плохо :( ПолучитОбъект() - делаем к ссылке, в которой меняем значение

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

ТЧСрокГодности = Объект.Инфо;

Для Каждого Стр Из ТЧСрокГодности Цикл
о = стр.Серия.ПолучитьОбъект();
    //Стр.ГоденДо = Объект.СрокГодности;
о.ГоденДо = Объект.СрокГодности;
о.Записать();
КонецЦикла;

//ДокОбъект.Записать();
32 Тындр
 
26.11.22
01:18
(31) Есть замечание - не называть переменные однобуквами. И плохой тон, и не понятно, и опасно.
Особенно для новичков
33 Barry
 
26.11.22
01:22
(31) Немного подправил и понял теперь чего не хватало. Мне просто в цикле нужно было еще раз обратиться к методу "Получить объект" для серии. Спасибо вам за помощь!)
34 Тындр
 
26.11.22
01:25
(33) Значит таки порог вхождения преодолен. Велкам!
35 GedKo
 
26.11.22
01:44
(32) в этом коде столько прекрасного - что "о" нужно замечать в самую последнюю очередь. ну или другие недостатки не видны :))
36 Тындр
 
26.11.22
01:55
(35) Пофиг. Барри понял - это главное. ))
37 GedKo
 
26.11.22
02:00
>нужно было *еще раз* обратиться к методу "Получить объект"

ни черта он не понял :)

я уж не говорю про n-ую перезапись серии, если она в нескольких строках встречается
38 Barry
 
26.11.22
02:15
(37) так мне и нужно было сделать перезапись во всех строках табличной части)
39 GedKo
 
26.11.22
02:41
т.е. если в документе серия встречается 1000 раз - мы тысячу раз выполним одно и тоже? нормально, да.
и вообще, никакой перезаписи строк табличной части ты не делаешь. используй (22). только честно - т.е. выход из цикла только когда дойдет :)
40 Остап Ибрагимович
 
26.11.22
05:37
При чем тут форма?
Вам надо изменить данные. Перебрать строки таб.части документа, по каждой строке таб.части:
1) найти объект прописанной в этой строке ссылки на Серию (элемент справочника, судя по скрину)
2) в этом объекте установить в реквизит ГоденДо значение, прописанное в реквизите ГоденДо этой строки табличной части документа
3) сохранить измененный таким образом объект.
Только вот если вдруг какой-то документ тоже изменит эти же самые элементы справочника - как вы определите, какие изменения "правильнее"?
41 Barry
 
26.11.22
14:24
(39) Да, но мы же в рамках одного документа. Но вот насчет того, что в самой табличной части дата не поменялась здесь вы правы) В серию то записалась, но в табличной части документа остался висеть старый срок годности.
42 Barry
 
26.11.22
18:28
(39) Сделал проще. Вывел на форму выбор серии, циклом прошелся для каждой строчки. Метод ПолучитьОбъект() присвоил для своего документа который указывал на форме и запись. Итог запись пошла срока годности как и в саму серию так и в табличную часть документа. Вопрос закрыт! Всем спасибо!)