8.х Как программно обратиться к связанным документам

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Diablero, 18 фев 2011.

  1. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Всем доброго времени суток! Я новичок в программировании на встроенном языке 1С, но сейчас возникла задача, которую нужно решить безотлагательно. Поэтому надеюсь на вашу помощь. :angry: Мне нужно написать обработку для конфигурации УТ, которая проходила бы по приходным ордерам на товары и восстанавливала бы правильную временнУю последовательность связанных документов: заказ поставщику->приходный ордер->поступление товаров и услуг. Вопрос в следующем: как программно обратиться из приходного ордера к двум другим документам? Заранее благодарю за ответы!:)
  2. yzek
    Offline

    yzek Опытный в 1С

    Регистрация:
    13 окт 2010
    Сообщения:
    713
    Симпатии:
    0
    Баллы:
    26
    Попробуйте использовать конструцию НайтиПоСсылкам().
  3. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Извиняюсь, что поторопился с вопросом. Тут всё банально - через реквизиты поступления обращаюсь к соответствующим документам, те заказу и приходнику. Теперь вопрос в другом: код ниже

    Код:
    Список=Новый СписокЗначений;
    Документ=Документы.ПоступлениеТоваровУслуг.Выбрать(НачПериода,КонПериода);
    Пока Документ.Следующий() Цикл 
    Если Документ.ВидПоступления = Перечисления.ВидыПоступленияТоваров.ПоОрдеру Тогда
    Если Документ.СкладОрдер.Склад.Наименование<>ПолеВводаСклада.Наименование //Отбор по складу
    Тогда Продолжить;
    КонецЕсли;
    Список.Добавить(Документ.Ссылка);
    КонецЕсли;
    КонецЦикла;
    Для А=0 по Список.Количество()-1 Цикл
    Список[А].Значение.ПолучитьОбъект().Дата=Список[А].Значение.ПолучитьОбъект().СкладОрдер.Дата+1;
    КонецЦикла;
    
    
    не меняет даты поступлений, хотя по логике вещей должен переносить поступления на 1 сек позже приходников. Подскажите, пожалуйста, что я здесь не учёл.
  4. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Документ надо записать (провести) после того как дату поменял.
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А записать документ после присвоения новой даты?
    Код:
    ДокОбъект = Список[А].Значение.ПолучитьОбъект();
    ДокОбъект.Дата=ДокОбъект.СкладОрдер.Дата + 1;
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    
    


    И потом, так, в общем: старайтесь не работать с объектной моделью. Для получения данных по возможности используйте запросы.
  6. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Всё работает! Спасибо!!! :angry:
  7. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Ещё вопросик есть. Как правильно поменять дату у заказа поставщика из поступления? При выполнении кода:
    Код:
    ДокОбъект.Сделка.Дата=ДокОбъект.СкладОрдер.Дата - 1;
    ДокОбъект.Сделка.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    
    Программа ругается на недоступность поля:

    Поле объекта недоступно для записи (Дата)
    ДокОбъект.Сделка.Дата=ДокОбъект.СкладОрдер.Дата - 1;

    А если я напишу
    Код:
    ДокОбъект.Сделка.ПолучитьОбъект().Дата=ДокОбъект.СкладОрдер.Дата - 1;
    ДокОбъект.Сделка.ПолучитьОбъект().Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    
    то дата не меняется, и документ не записывается (то есть отсутствует попытка записать его)
  8. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Что такое Сделка? Если ДокОбъект имеет тип значения ДокументОбъект, то можно так попробовать
    Код:
    ДокОбъект.Дата=ДокОбъект.СкладОрдер.Дата - 1;
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
    ДокСделка = ДокОбъект.Сделка.ПолучитьОбъект();
    ДокСделка.Дата = ДокОбъект.СкладОрдер.Дата - 1;
    ДокСделка.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    
    
  10. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    В данном случае ДокОбъект - это документ Поступление товаров и услуг. Мне нужно каким-то образом добраться до заказа поставщику, с которым это поступление связано
  11. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    А сделка тогда что? Приходный кассовый ордер? Просто в УТ мало работал. А как вводите ПТиУ?
  12. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    ПТиУ ввожу на основании приходного ордера на товары. Сделка - это поле ввода, тип значения которого есть список ДокументСсылка.ВозвратТоваровОтПокупателя,...,ДокументСсылка.ЗаказПоставщику.

    Меня интересуют только даты заказов поставщику
  13. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Хм, у приходного ордера на товары даже нет реквизита ДокументОснование. Либо у меня старый релиз. Так что даже не знаю как добраться до заказа поставщику.Ну как вариант можно добавить реквизит и добавить строчку в обработку заполнения.
  14. yzek
    Offline

    yzek Опытный в 1С

    Регистрация:
    13 окт 2010
    Сообщения:
    713
    Симпатии:
    0
    Баллы:
    26
    А если так:
    Код:
    ДокОбъект.Сделка.Дата.Значение =ДокОбъект.СкладОрдер.Дата.Значение - 1;
    
    ?
  15. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Ну да, приходный ордер не вводится на основании чего-то. Вводится поступление на основании ордера.

    Не:

    Значение не является значением объектного типа (Значение)
    ДокОбъект.Сделка.Дата.Значение =ДокОбъект.СкладОрдер.Дата.Значение - 1;

    :(
  16. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Если только вводить приходный ордер и ПТиУ на основании заказа поставщику. Тогда в реквизите Сделка ПТиУ будет заказ поставщику
  17. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1

    Так в том-то и проблема, что документы уже созданы, и требуется их коррекция
  18. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Diablero, тот код который я вам привел не работает что-ли?
  19. TopicStarter Overlay
    Diablero
    Offline

    Diablero

    Регистрация:
    18 фев 2011
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Извиняюсь, пропустил ваш пост, но как раз он и оказался решением :=). За что вам огромное спасибо!
    Для интересующихся привожу полный текст обработки:
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка) 
    Список=Новый СписокЗначений;
    Документ=Документы.ПоступлениеТоваровУслуг.Выбрать(НачПериода,КонПериода);
    Пока Документ.Следующий() Цикл 
    Если Документ.ВидПоступления = Перечисления.ВидыПоступленияТоваров.ПоОрдеру Тогда
    Если Документ.СкладОрдер.Склад.Наименование<>ПолеВводаСклада.Наименование или Документ.Проведен=Ложь Тогда
    Продолжить;
    КонецЕсли;
    Список.Добавить(Документ.Ссылка);   
    КонецЕсли;
    КонецЦикла;
    Для А=0 по Список.Количество()-1 Цикл
    ДокОбъект=Список[А].Значение.ПолучитьОбъект();
    ДокСделка = ДокОбъект.Сделка.ПолучитьОбъект();
    ДокСделка.Дата = ДокОбъект.СкладОрдер.Дата - 1;
    ДокСделка.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    ДокОбъект.Дата=ДокОбъект.СкладОрдер.Дата + 1;
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    КонецЦикла;
    КонецПроцедуры
    

Поделиться этой страницей