Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 06:34

ЭтотОбъект не найден при программном создании документа

Автор Marksman, 18 янв 2017, 18:36

0 Пользователей и 1 гость просматривают эту тему.

Marksman

Здравствуйте!
1С:Предприятие 8.3 (8.3.9.2033) УТ 10.3
Есть задача. При проведении документа Реализация должен создаваться документ Перемещения и каждую номенклатуру, при нехватке, перекидывать на соответствующий склад, если есть что перекидывать.
Соответственно, в процедуру "ПередЗаписью" Реализации добавляю Процедуру Перемещения, которая получает
а) Ссылку, на только что созданный и записанный документ Перемещения, либо ссылку на уже существующий документ, если таковой уже был создан.
б) ТаблицуПеремещений, в которой хранится инфа по номенклатурам и по количеству сколько перемещать.

В Процедуре Перемещения делается:

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

Что происходит. Юзер заводит реализацию, для простоты, с одной номенклатурой. Остаток по Складу, указанному в реализации - 2 штуки. Дополнительно на другом складе еще 1 штука этой же номенклатуры. Юзер пишет в строке в столбце количество - 3 штуки. Нажимает "Провести". Создается документ Перемещения, открывается (документ на этот момент почему-то даже не записан и ошибок не показывает). Потом выскакивает ошибка, что Проведение Реализации невозможно, т.к. отгружаемое количество больше, чем остаток. Естественно.  Далее нажимаем Ок и пытаемся провести только что созданный документ Перемещения, но он не проводится. Потратив 4 часа понял, что проблема в том, что документ Перемещения не знает что такое "ЭтотОбъект". Если написать Сообщить(ЭтотОбъект); "ПередЗаписью" в документе Перемещения, то выводится сообщение "<Объект не найден> (188:b605000c2935c4c911e6dd91fa512026)". Если документ Перемещения создать с нуля руками, то все хорошо проводится. Соответственно, по логике, моя проблема в том, что я неправильно создаю документ? Подскажите, плиз, почему теряется "ЭтотОбъект"?

Marksman

47 просмотров, ни одного ответа.
Ответ настолько очевиден, что никто его даже писать не хочет? Или никто не знает/не хочет говорить?

depb

 ты пытаешься обратиться к документу, который еще не записан в базе. Само собой у тебя выдает сообщение, объект не найден. Попробуй создавать документ перемещения после записи документа отгрузки

Marksman

Цитата: depb от 19 янв 2017, 09:52
ты пытаешься обратиться к документу, который еще не записан в базе. Само собой у тебя выдает сообщение, объект не найден. Попробуй создавать документ перемещения после записи документа отгрузки

Почему не записан? Документ Перемещения либо уже существует, либо создается новый и сразу записывается и потом ссылка на один из этих двух вариантов передается в Процедуру.
Если речь идет о "незаписанности" документа Реализации, то его записать и не получится до момента пока товар не перемещен на склад. Т.к. пока товар не перемещен получается, что мы хотим отгрузить больше, чем есть на складе. Соответственно, Перемещение должно быть создано и проведено ДО проведения Реализации.

depb

ДокументПеремещения.СозданНаОсновании = ЭтотОбъект.Ссылка;

ЭтотОбъект.Ссылка что это?

Запись и проведение документа это разные вещи. При записи создается объект в базе, с которым ты уже потом можешь работать, при проведении происходят движения, в твоем случае, списывается товар. Тебе ничто не мешает сначала записать документ реализации программно, а потом обращаться к нему. Сейчас у тебя получается, что документа реализации еще нет, он не создан физически в базе, а ты пытаешься операровать его данными. Используй вызов процедуры создания перемещения не ПередЗаписью, а после

Marksman

Цитата: depb от 19 янв 2017, 11:54
ДокументПеремещения.СозданНаОсновании = ЭтотОбъект.Ссылка;

ЭтотОбъект.Ссылка что это?

Это ссылка на реализацию, которая подставляется в документ Перемещения. С этим проблем нет. Ссылка подставляется. Кроме того, когда срабатывает строка открытия формы я вижу, что Организация, Склад и прочие реквизиты корректно заполнены.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск