Версия для печати темы (https://pro1c.org.ua/index.php?s=4ba931608245aae3962e439266f822f5&showtopic=9392)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Определение партии приходной накладной

Автор: GoDammeD 16.10.12, 16:03

Доброго всем времени суток=)
Появилась необходимость заполнения поля "Партия" Расходная накладной, созданной на основании Приходной накладной, но как установить нужную партию понятия не имею.
Буду благодарен за любую помощь в решении задачи.

P.S.
Конфигурация: "Бухгалтерский учёт" для Украины (7.70.282)

Автор: alex040269 16.10.12, 16:12

Если в РН будет та же партия, что и в ПН, то все просто. В тех строках, где присваивается ТМЦ , присвоить и партию. Ну а если нет, то алгоритмы расчета у бухов. Какой вариант парионного учета?

ЗЫ.
Конфа доработана? В стандартной нельзя создать РН на основании ПН!

Автор: Cthulhu 16.10.12, 17:10

282-го под рукой нет, но в 538-м партий как таковых не наблюдается совсем.

Автор: alex040269 16.10.12, 18:45

538 - это не российский случайно?

Автор: mister-x 16.10.12, 19:33

Цитата(Cthulhu @ 16.10.12, 18:10) http://pro1c.org.ua/index.php?act=findpost&pid=58519

Автор: igmig65 16.10.12, 20:36

Цитата(GoDammeD @ 16.10.12, 17:03) *
Появилась необходимость заполнения поля "Партия" Расходная накладной

Телепатирую: изменился вариант списания ТМЦ, возможно был ФИФО, теперь сделали по партиям. Соответственно партии приходится выбирать ручками. Так потому что такой метод сами выбрали.
А так как документ доработан, на основании ПН, то это недоработана процедура ВводНаОсновании() самой РН, где нужно дописать присваивание партии, созданной этой ПН(основанием).

Автор: GoDammeD 16.10.12, 23:41

Цитата(igmig65 @ 16.10.12, 20:36) *
где нужно дописать присваивание партии, созданной этой ПН(основанием).

Вы правы, именно это и нужно, но что дописывать - без понятия.


Автор: Ardi 16.10.12, 23:44

ВыбратьЭлементыПоРеквизиту(<?>,,,)
Синтаксис:
ВыбратьЭлементыПоРеквизиту(<ИмяРеквизита>,<Значение>,<РежимИерархии>,<РежимГрупп>)
Назначение:
Открыть выборку элементов справочника по значению реквизита.
Возвращает: 1 - если действие выполнено и в выборке есть хотя бы один элемент;
0 - если действие не выполнено или в выборке нет ни одного элемента.
Параметры:
<ИмяРеквизита> - строка с именем реквизита, по которому выполняется выборка;
<Значение> - значение реквизита для выборки;
<РежимИерархии> - как выбирать:
1 - выбирать элементы с учетом иерархии,
0 - выбирать элементы без учета иерархии (необязателен, по умолчанию - 1);
<РежимГрупп> - что выбирать:
1 - выбирать среди групп справочника,
0 - выбирать только среди элементов справочника.
Замечание:
Метод можно использовать только для реквизитов с установленным признаком ''Сортировка''.
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.

Автор: alex040269 17.10.12, 7:00

Цитата(GoDammeD @ 17.10.12, 0:41) *
Вы правы, именно это и нужно, но что дописывать - без понятия.

В РН есть процеддура ВВодНаОсновании(???)

В ней есть строка Пока ???.ПолучитьСтроку() = 1 Цикл
ниже ТМЦ = ???.ТМЦ;
нужно добавить строку
Партия = ???.Партия;

ЗЫ.

обратитесь к специалисту.


Автор: GoDammeD 17.10.12, 14:52

Цитата(alex040269 @ 17.10.12, 8:00) http://pro1c.org.ua/index.php?act=findpost&pid=58543
Партия = ???.Партия;

Хотел так сделать, но к сожалению в приходной накладной нету реквизита "Партия", в РН этот реквизит ссылается на "Справочник.Партии", кстати, в котором есть реквизит "Докуент", где храниться номер Приходной накладной, возможно стоит это использовать? Но каким именно методом к сожалению не знаю...

Цитата(Ardi @ 17.10.12, 0:44) *
ВыбратьЭлементыПоРеквизиту(<?>,,,)


Я так понимаю использовать её нужно следующим образом:
Партия.ВыбратьЭлементПоРеквизиту("Документ",ДокОсн.НомерПриходнойНакладной,1,0)


Автор: Ardi 17.10.12, 17:39

Потом перебрать полученые записи и найти партию с текущим товаром.
Полученую партию вставить в реализацию.

И так по всем строкам.

Автор: igmig65 17.10.12, 23:43

Цитата(GoDammeD @ 17.10.12, 15:52) *
Партия.ВыбратьЭлементПоРеквизиту("Документ",ДокОсн.НомерПриходнойНакладной,1,0)

Реквизит "Документ" это именно документ, соответственно фильтр должен быть по документу, в вашем случае ДокОсн, тогда
Партия.ВыбратьЭлементПоРеквизиту("Документ",ДокОсн,1,0);

предварительно создав Партия, и применив Партия.ИспользоватьВладельца(ДокОсн.ТМЦ)

Автор: GoDammeD 18.10.12, 15:09

Цитата(igmig65 @ 18.10.12, 0:43) *
Партия.ВыбратьЭлементПоРеквизиту("Документ",ДокОсн,1,0);


предварительно создав Партия, и применив Партия.ИспользоватьВладельца(ДокОсн.ТМЦ)


Выдает следующую ошибку:
ПартияВыбор.ВыбратьЭлементПоРеквизиту("Док",Док,1,0);

{Документ.РасходнаяНакладная.Форма.Модуль(430)}: Поле агрегатного объекта не обнаружено (ВыбратьЭлементПоРеквизиту)

Автор: mister-x 18.10.12, 15:25

такое есть

ПартияВыбор = СоздатьОбъект("Справочник.ИмяСправочника");
?

Автор: GoDammeD 18.10.12, 15:58

Да, есть:

ПартияВыбор = СоздатьОбъект("Справочник.Партии");

Автор: Cthulhu 18.10.12, 16:51

Цитата(GoDammeD @ 18.10.12, 15:09) *
Поле агрегатного объекта не обнаружено (ВыбратьЭлементПоРеквизиту)

не поверишь. такое в ответ на такой код - у всех бы выдало.
недорого продам синтакс-помощник. ну или научу нажимать клавиши Ctrl+F1, в том числе ключевых словах встроенного языка 1с.

Автор: GoDammeD 19.10.12, 15:37

Спасибо за совет=)
В Синтаксис-помощнике нашел ВыбратьЭлементыПоРеквизиту(<?>,,,)
Исправил ошибку(?) в итоге получился следующий код:

Пока Док.ПолучитьСтроку() = 1 
   Цикл
     ...
     ПартияВыбор = СоздатьОбъект("Справочник.Партии");
     ПартияВыбор.ИспользоватьВладельца(Док.ТМЦ);
     Партия = ПартияВыбор.ВыбратьЭлементыПоРеквизиту("Док",Док,1,0);
    КонецЦикла;


Ну и как я понимаю это естественно, что у меня ничего не присваивается happy.gif

Автор: alex040269 19.10.12, 15:49

ПартияВыбор.ВыбратьЭлементыПоРеквизиту("Док",Док,1,0);
Пока ПартияВыбор.ПолучитьЭлемент() = 1 Цикл
.....
КонецЦикла;


ПартияВыбор.ВыбратьЭлементыПоРеквизиту("Док",Док,1,0) возвращает 0 или 1.

Автор: igmig65 20.10.12, 15:42

Непонимаю зачем вообще это ВыбратьЭлементыПоРеквизиту(...). ПН является партеобразующим документом, тоесть для 1 ТМЦ по 1 ПН обычно только 1 элемент должен быть. Вот и используйте цепочку:
1. Нужно ограничить по конкретному ТМЦ: ПартияВыбор.ИспользоватьВладельца(ДокОсн.ТМЦ)
2. Ищем и присваиваем, если находим:

Если ПартияВыбор.НайтиПоРеквизиту("Документ",ДокОсн,0)=1
     Партия = ПартияВыбор.ТекущийЭлемент();

Автор: Cthulhu 20.10.12, 16:26

Цитата(igmig65 @ 20.10.12, 15:42) *
ПН является партеобразующим документом, тоесть ...

Если ПН возвратная, то процитированное - неверно.

Автор: igmig65 20.10.12, 16:53

Цитата(Cthulhu @ 20.10.12, 17:26) *
Если ПН возвратная, то процитированное - неверно.

Да по большому счету установка партий должна проводиться по политике учета. И если учет непартионный, а ФИФО, ЛИФО, то партия определяется согласно этой политики. Но так как такое реализовано, то это предполагает партионный учет в этой ситуации. Тоесть если РН вводится на основании ПН, то предполагается что списывается именно эта партия. Ну а в возвратной, введенной на основании этой же ПН партия будет таже. Тоесть возвратная ПН уже не партиобразующая, а просто уменьшающая оборот по партии ПН.

Автор: Zaval 20.10.12, 21:55

"Ты на мене не обижяйся, но я тебе умный вещь скажу" х/ф "Мимино"

Хотите выполнить работу - начните с выбора инструмента. Бухгалтерии это нафиг не нужно - и там ловить нечего, независимо от релиза.
Посмотрите ПакетныйВводРасходныхРеализатора в ТиС.

Есть альтер вариант - ручной выбор партий.

Автор: GoDammeD 22.10.12, 14:59

Всем огромное Спасибо!
Так как фирма использует именно партийный учёт, написал следующим образом:

Если Док.Вид() = "ПриходнаяНакладная" Тогда
        ...
                ПартияВыбор = СоздатьОбъект("Справочник.Партии");
                ПартияВыбор.ИспользоватьВладельца(Док.ТМЦ);
        Пока Док.ПолучитьСтроку() = 1 Цикл
            ...
            Если ПартияВыбор.НайтиПоРеквизиту("Док",Док,0)=1 Тогда
                     Партия = ПартияВыбор.ТекущийЭлемент();
             КонецЕсли;
        КонецЦикла;

Всё отлично работает, ещё раз всем спасибо за помощь!

Автор: Vofka 22.10.12, 15:45

GoDammeD, жмите палец всем, кто помогал.

Автор: igmig65 22.10.12, 19:18

Цитата(GoDammeD @ 22.10.12, 15:59) *
Так как фирма использует именно партийный учёт, написал следующим образом:
Если Док.Вид() = "ПриходнаяНакладная" Тогда
        ...
                ПартияВыбор = СоздатьОбъект("Справочник.Партии");
                ПартияВыбор.ИспользоватьВладельца(Док.ТМЦ);
        Пока Док.ПолучитьСтроку() = 1 Цикл
            ...
            Если ПартияВыбор.НайтиПоРеквизиту("Док",Док,0)=1 Тогда
                     Партия = ПартияВыбор.ТекущийЭлемент();
             КонецЕсли;
        КонецЦикла;

Всё отлично работает, ещё раз всем спасибо за помощь!


Все неправильно..... Сначала используете ПартияВыбор.ИспользоватьВладельца(Док.ТМЦ);
потом Док.ПолучитьСтроку(), где док - ПН.
А Док.ТМЦ, что вы используете как параметр вы сможете получить только после Док.ПолучитьСтроку()
icon_cuss.gif
А так:
Если Док.Вид() = "ПриходнаяНакладная" Тогда
        ...
                ПартияВыбор = СоздатьОбъект("Справочник.Партии");
        Пока Док.ПолучитьСтроку() = 1 Цикл
                ПартияВыбор.ИспользоватьВладельца(Док.ТМЦ);
            ...
            Если ПартияВыбор.НайтиПоРеквизиту("Док",Док,0)=1 Тогда
                     Партия = ПартияВыбор.ТекущийЭлемент();
             КонецЕсли;
        КонецЦикла;

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua