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

Проблема с перезаписью документа

Автор JOG, 21 ноя 2014, 17:26

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

JOG

Всем привет! Прошу помочь. Проблема в следующем:
Я создаю документ Залог в нем есть реквизит НомерРКО. При записи очередного документа Залог у меня создаётся НовыйДокумент РКО. Где есть некоторые реквизиты, записанные из Залога. Если я перепровожу Документ Залога, у меня создаётся новый документ РКО(очередной), но мне нужно чтобы запись происходила именно того РКО номер которого указан в Залоге.
Я сделал вот таким образом:

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
//Запись в документ РКО
НовыйДокумент = Документы.РКО.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.НомерРКО = Объект.НомерРКО;
НовыйДокумент.Клиент = Объект.Клиент;
НовыйДокумент.Счет = Объект.Счет;
НовыйДокумент.СуммаРКО = Объект.СуммаКредита;
НовыйДокумент.Основание = "По З.Б." + Объект.НомерЗБ;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

в РКО при перепроводке\перезаписи Залога выходит то, что на скрине


А как сделать перезапись не пойму..
Пробовал делать условие на проведение, то есть

Если (Объект.Проведен <> Истина) Тогда
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Иначе
НовыйДокумент.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;


Но в этом случае залог проводится 1 раз, а если я допустим меняю сумму кредита в залоге и провожу, то в РКО суммакредита не занесётся, ибо документ залога уже был проведен.
То есть мне нужно чтобы при проведении данные из залога обновлялись и в РКО уже созданном, а если новый залог, то создавался новый РКО.

Есть мнение что надо написать условие существование Залог.НомерРКО = РКО.НомерЗалог, и от этого плясать? Но как проверить есть он или нет?


дфтын

НУ так вы с начало находите РКО, что то типа - РКО.НАйтипоНомеру(номер,ДАтаВкакомпериода);
А потом, найденный уже изменяйте

JOG

Цитата: дфтын от 21 ноя 2014, 17:31
НУ так вы с начало находите РКО, что то типа - РКО.НАйтипоНомеру(номер,ДАтаВкакомпериода);
А потом, найденный уже изменяйте

У меня проблема с этим,я не понимаю как этим пользоваться. Я так понимаю что функция НайтиПоНомеру выберет определенную строку. А мне нужно любую открываемую брать. Или вместо параметра номер вписать Объект.НомерРКО(то есть тот номер рко который прописан в залоге?)
Добавлено: 22 ноя 2014, 14:11


Цитата: JOG от 21 ноя 2014, 20:17
Цитата: дфтын от 21 ноя 2014, 17:31
НУ так вы с начало находите РКО, что то типа - РКО.НАйтипоНомеру(номер,ДАтаВкакомпериода);
А потом, найденный уже изменяйте

У меня проблема с этим,я не понимаю как этим пользоваться. Я так понимаю что функция НайтиПоНомеру выберет определенную строку. А мне нужно любую открываемую брать. Или вместо параметра номер вписать Объект.НомерРКО(то есть тот номер рко который прописан в залоге?)

Как ни пробовал, не выходит цветочек:(
Может кто поможет?
Грубо говоря надо наверное проверку на существование документа проверять и чтобы у этого документа реквизит НомерРКО совпадал с Залог.НомерРКО. И потом если существует, то сделать "обновление реквизитов". С этим тоже вопрос как обновить реквизиты данными из Залога?
Хоть почитать где скажите..
Добавлено: 23 ноя 2014, 14:58


Цитата: JOG от 21 ноя 2014, 20:17
Цитата: дфтын от 21 ноя 2014, 17:31
НУ так вы с начало находите РКО, что то типа - РКО.НАйтипоНомеру(номер,ДАтаВкакомпериода);
А потом, найденный уже изменяйте

У меня проблема с этим,я не понимаю как этим пользоваться. Я так понимаю что функция НайтиПоНомеру выберет определенную строку. А мне нужно любую открываемую брать. Или вместо параметра номер вписать Объект.НомерРКО(то есть тот номер рко который прописан в залоге?)
Добавлено: 22 ноя 2014, 14:11


Цитата: JOG от 21 ноя 2014, 20:17
Цитата: дфтын от 21 ноя 2014, 17:31
НУ так вы с начало находите РКО, что то типа - РКО.НАйтипоНомеру(номер,ДАтаВкакомпериода);
А потом, найденный уже изменяйте

У меня проблема с этим,я не понимаю как этим пользоваться. Я так понимаю что функция НайтиПоНомеру выберет определенную строку. А мне нужно любую открываемую брать. Или вместо параметра номер вписать Объект.НомерРКО(то есть тот номер рко который прописан в залоге?)

Как ни пробовал, не выходит цветочек:(
Может кто поможет?
Грубо говоря надо наверное проверку на существование документа проверять и чтобы у этого документа реквизит НомерРКО совпадал с Залог.НомерРКО. И потом если существует, то сделать "обновление реквизитов". С этим тоже вопрос как обновить реквизиты данными из Залога?
Хоть почитать где скажите..

Всё, победил. Сделал через НайтиПоРеквизиту) Долго пытал, но результат получил какой нада)
если может кому понадобится.
Суть в том чтобы при проводке 1 документа 2ой не перепроводился, а обновлялся.

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

cska-fanat-kz

1. Зачем документу РКО отдельный реквизит НомерРКО? Ведь есть же стандартный реквизит Номер. И соответственно НайтиПоНомеру()
2. Ладно, пусть будет НайтиПоРеквизиту()... Документ нашелся. Какой сакральный смысл в
    Выборка = ДокРКО.Выбрать();
    Пока Выборка.Следующий() Цикл
        ...
??
Документ нашелся. ОДИН. Зачем тогда гонять цикл по ВСЕМ документам РКО и проводить N раз ОДИН ЕДИНСТВЕННЫЙ документ?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

JOG

Цитата: cska-fanat-kz от 23 ноя 2014, 18:12
1. Зачем документу РКО отдельный реквизит НомерРКО? Ведь есть же стандартный реквизит Номер. И соответственно НайтиПоНомеру()
2. Ладно, пусть будет НайтиПоРеквизиту()... Документ нашелся. Какой сакральный смысл в
    Выборка = ДокРКО.Выбрать();
    Пока Выборка.Следующий() Цикл
        ...
??
Документ нашелся. ОДИН. Зачем тогда гонять цикл по ВСЕМ документам РКО и проводить N раз ОДИН ЕДИНСТВЕННЫЙ документ?

С номером.. так рука взяла)
А по поводу зачем перепроводить, ибо пишу для людей, а люди тыкают "перепроводить". То есть в Залоге могут поменять сумму кредита чисто случайно\специально, а мне нужно чтобы сумма залога отражалась в документеРКО. Стало быть я перепровожу Залог и с ним РКО перепроведется с новой суммой. Не пинайте сильна, учусь жи..:dfbbdrfb:
Добавлено: 29 ноя 2014, 17:15


С другой стороны, про НомерРКО. Как же его не использовать, если у меня НомерРКО в документе ЗАЛОГ и НомерРКО в документе РКО должны быть одинаковыми, поэтому и будет работать НайтиПоРеквизиту. А если НайтиПоНомеру, то как процедуру построить если у меня Номер в Документ.Залог один, а Номер в Документ.РКО другой? если поможете, буду очень благодарен! Или хотя бы разъясните. Я вот честно не понимаю как использовать функцию НайтиПоНомеру. Она работать будет, если вводить фиксированное значение, то есть НайтиПОНомеру(1, 12112008) тогда найдётся документ с номером один по определенной дате. А мне надо найти Номер документа, который появился на основании Залога. Как тогда переписать правильно?

cska-fanat-kz

Цитата: JOG от 29 ноя 2014, 16:50появился на основании Залога

вот она - ключевая фраза!
механизм ввода на основании реализуется обычно с помощью реквизита ДокументОснование (в данном случае у РКО) соответствующего типа (в данном случае ДокументСсылка.Залог). С помощью него получаете железобетонную и однозначную связку через ссылку, в то время как номер - штука крайне не надежная....
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Цитата: JOG от 29 ноя 2014, 16:50А по поводу зачем перепроводить, ибо пишу для людей, а люди тыкают "перепроводить". То есть в Залоге могут поменять сумму кредита чисто случайно\специально, а мне нужно чтобы сумма залога отражалась в документеРКО. Стало быть я перепровожу Залог и с ним РКО перепроведется с новой суммой.

Цель - понятна. Вопрос вызвала реализация.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

JOG

Цитата: cska-fanat-kz от 02 дек 2014, 08:31
Цитата: JOG от 29 ноя 2014, 16:50появился на основании Залога

вот она - ключевая фраза!
механизм ввода на основании реализуется обычно с помощью реквизита ДокументОснование (в данном случае у РКО) соответствующего типа (в данном случае ДокументСсылка.Залог). С помощью него получаете железобетонную и однозначную связку через ссылку, в то время как номер - штука крайне не надежная....

То есть получается при создании документа залог, в ДокументеРКО, у меня будет сразу прописываться Залог.Ссылка в реквизите РКО ДокументОснование? И тогда можно проверять если ДокументОснование = ПустаяСсылка, тогда создать РКО, а если не пустая, то обновить, так? Или надо всё таки через конструктор ввода на основании прописывать все условия?

Я не особо разобрался, как работает Ввод на основании:(
Добавлено: 05 дек 2014, 13:09


А мне наверное не подойдёт создание на основании документа. Как я понял "на основании" документ всё равно придётся создавать вручную? а мне нужно чтоб он автоматически формировался ведь.:xfbnsdfb:

cska-fanat-kz

Ввод на основании - механизм сугубо условный.
Если например не прописать код в ОбработкеЗаполнения() у РКО, то ваще ничего не произойдет, хотя вроде как бы кнопка ввода на основании имеется. И связь между документами платформой не отслеживается ваще никак. Не пропишете в ОбработкеЗаполнения() заполнения реквизита ДокументОснование - ваще никак не узнаете из какого документа РКО создан.

Т.е. что хочу сказать... Ключевое - реализовать связь, чтобы РКО знал, из какого Залога он создан. Соответственно по ссылке на Залог можно было найти дочерние РКО...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

JOG

Оно?

Если РезультатПоискаПоРеквизиту = ДокРКО.ПустаяСсылка() Тогда   
НовыйДокумент = Документы.РКО.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.НомерРКО = Объект.НомерРКО;
НовыйДокумент.Клиент = Объект.Клиент;
НовыйДокумент.Счет = Объект.Счет;
НовыйДокумент.СуммаРКО = Объект.СуммаКредита;
НовыйДокумент.Основание = "По З.Б." + Объект.НомерЗБ;
НовыйДокумент.ДокументОснование = Объект.Ссылка; // вот тут добавил
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Выборка = ДокРКО.Выбрать();
Пока Выборка.Следующий() Цикл
    ВыборкаОбъект = РезультатПоискаПоРеквизиту.ПолучитьОбъект();
ВыборкаОбъект.Дата = Объект.Дата;
ВыборкаОбъект.НомерРКО = Объект.НомерРКО;
ВыборкаОбъект.Клиент = Объект.Клиент;
ВыборкаОбъект.Счет = Объект.Счет;
ВыборкаОбъект.СуммаРКО = Объект.СуммаКредита;
ВыборкаОбъект.Основание = "По З.Б." + Объект.НомерЗБ;
ВыборкаОбъект.ДокументОснование = Объект.Ссылка; //и тут
ВыборкаОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
КонецЕсли;


А это вывод значений из документа РКО

Добавлено: 05 дек 2014, 16:20


Не, наверное не оно <_<

Вопрос на засыпку, как проверить создавался ли документ с текущей датой или нет?
Мне просто надо записать расход приход в документ отдельный в табличную часть. И вот я хочу проверить если "сегодня" документ уже создавался, то дописать расходы приходы в таб часть, а если не создавался, то создать.
Что-то в роде НайтиПоРеквизиту(дата) но ругается, говорит нельзя так:dfbsdfbsdf:
Добавлено: 05 дек 2014, 16:30


А может через пустую дату проверить? о_О

Теги:

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

Рейтинг@Mail.ru

Поиск