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

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

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

Автор: Ученик_Покачто 11.01.11, 11:34

Есть документ ВводОстатковВзаиморасчетов. При проведении надо чтоб долг контрагента обнулялся на дату проведения, а новое значение записывалось как долг. Подскажите, как обнулить... вот процедура

Процедура ОбработкаПроведения(Отказ, Режим)
    
    // регистр ВзаиморасчетыСКонтрагентами Приход

    Движение = Движения.ВзаиморасчетыСКонтрагентами.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    
    Движение.СуммаВзаиморасчетов = Долг;
    Движение.СуммаУпр = Долг;
    Движение.Период = Дата;
    Движение.ДоговорКонтрагента = ДоговорКонтрагента;
  
    
// регистр РасчетыСКонтрагентами Приход

    Движение = Движения.РасчетыСКонтрагентами.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    
    Движение.Период = Дата;
    Движение.ДоговорКонтрагента = ДоговорКонтрагента;
    Движение.СуммаВзаиморасчетов = Долг;
    Движение.СуммаУпр = Долг;

    // записываем движения регистров

    Движения.ВзаиморасчетыСКонтрагентами.Записать();
    Движения.РасчетыСКонтрагентами.Записать();
    
КонецПроцедуры

Автор: Fynjy 11.01.11, 11:37

Получить данные долга - записать их в регистр с обратным знаком. Далее записать данные указанные в документе корректировка долга ...

Автор: Batchir 11.01.11, 11:39

Наболело. Использовать тег Код при публикации текста модуля религия не позволяет? Сколько можно исправлять Ваши сообщения.

Автор: awp 11.01.11, 11:42

1. Получить сумму долга либо запросом либо напрямую вытянуть из регистра.
2.Сделать движение в минус аналогично Вашей процедуре

Вообще вроде есть документ КорректировкаВзаморасчетов, точно не помню думаю что лучше чтобы он делал списание задолженности.

Автор: Ученик_Покачто 11.01.11, 12:05

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

по поводу получения данных и записания их с обратным знаком :

Движение.СуммаВзаиморасчетов = -РегистрыНакопления.ВзаиморасчетыСКонтрагентами.суммавзаиморасчетов ;

как-то так?

Извините, если задаю тупые вопросы, просто недавно только начал 8ку изучать, учусь...

Автор: AlenaS 11.01.11, 12:24

Цитата(Ученик_Покачто @ 11.01.11, 13:05) *
по поводу получения данных и записания их с обратным знаком :

Движение.СуммаВзаиморасчетов = -РегистрыНакопления.ВзаиморасчетыСКонтрагентами.суммавзаиморасчетов ;

как-то так?


В движениях так, но получение данных скорее всего нужно бы выполнить запросом, а потом просто выгрузить в таблицу движений, чтобы учесть правильно остатки по всем измерениям регистра

Автор: Ученик_Покачто 11.01.11, 12:27

Цитата(AlenaS @ 11.01.11, 13:24) *
В движениях так, но получение данных скорее всего нужно бы выполнить запросом, а потом просто выгрузить в таблицу движений, чтобы учесть правильно остатки по всем измерениям регистра


хмм... а для чайника можно?

Автор: AlenaS 11.01.11, 13:02

Примерно так:

    НаборДвижений = Движения.ВзаиморасчетыСКонтрагентами;
    ТаблицаДвижений = НаборДвижений.Выгрузить();
    ТаблицаДвижений.Очистить();
Запрос.Текст = "ВЫБРАТЬ
|    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента,
|    ВзаиморасчетыСКонтрагентамиОстатки.Сделка,
|    ВзаиморасчетыСКонтрагентамиОстатки.Организация,
|    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент,
|    -ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетов,
|    -ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпр
|ИЗ
|    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаКон, Контрагент = &Контрагент) КАК ВзаиморасчетыСКонтрагентамиОстатки";
    
    ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
    ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаОстатков, ТаблицаДвижений);

Автор: awp 11.01.11, 13:04

Цитата(Ученик_Покачто @ 11.01.11, 13:05) *
Корректировка долга хороший документ, но надо вручную выщитывать разницу между фактическим долгом и долгом по базе и добавлять в поле уменьшение или увеличение долга... у нас очень много контрагентов и реально очень много времени на это потратится((


При проведении документа создать документ корректировка передать в него контрагентов и договора. В самом документе корректировка есть кнопка мол заполнить по остаткам - выполнить тот код и провести документ.

Автор: Ученик_Покачто 11.01.11, 13:04

Цитата(AlenaS @ 11.01.11, 14:02) *
Примерно так:
    НаборДвижений = Движения.ВзаиморасчетыСКонтрагентами;
    ТаблицаДвижений = НаборДвижений.Выгрузить();
    ТаблицаДвижений.Очистить();
Запрос.Текст = "ВЫБРАТЬ
|    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента,
|    ВзаиморасчетыСКонтрагентамиОстатки.Сделка,
|    ВзаиморасчетыСКонтрагентамиОстатки.Организация,
|    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент,
|    ВзаиморасчетыСКонтрагентамиОстатки.ВидДеятельности,
|    -ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетов,
|    -ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпр
|ИЗ
|    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаКон, Контрагент = &Контрагент) КАК ВзаиморасчетыСКонтрагентамиОстатки";
    
    ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
    ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаОстатков, ТаблицаДвижений);



Спасибо! даже больше чем спасибо, спасибище))) icon_beer17.gif

Автор: AlenaS 11.01.11, 13:11

Да на здоровье smile.gif ... только не используется полностью запрос, проанализируйте измерения в регистре Взаиморасчеты вашей конфигурации.. я вот только заметила , что ВидДеятельности - это добавленное мною измерение, в типовой его нет... в вашей конфе могут быть другие различия

Автор: Vofka 11.01.11, 13:13

И для "спасибо" у нас есть кнопка "+СПС". Где она находится - НЕ СПРАШИВАТЬ, уже миллион раз говорили!

Автор: Ученик_Покачто 11.01.11, 13:16

Цитата(AlenaS @ 11.01.11, 14:11) *
Да на здоровье smile.gif ... только не используется полностью запрос, проанализируйте измерения в регистре Взаиморасчеты вашей конфигурации.. я вот только заметила , что ВидДеятельности - это добавленное мною измерение, в типовой его нет... в вашей конфе могут быть другие различия



Вставил запрос - все равно не обнуляет icon_cuss.gif(( переделал под всои измерения... щас буду пробовать что-нить изменить((

Автор: Ученик_Покачто 11.01.11, 13:17

Цитата(Vofka @ 11.01.11, 14:13) *
И для "спасибо" у нас есть кнопка "+СПС". Где она находится - НЕ СПРАШИВАТЬ, уже миллион раз говорили!



Хех) уже нажал на кнопку))

Автор: AlenaS 11.01.11, 19:51

Цитата(Ученик_Покачто @ 11.01.11, 14:16) *
Вставил запрос - все равно не обнуляет


Словно с кассовым аппаратом работаете smile.gif ... Движение с минусом делает документ?
Просмотрите по отчету по взаиморасчетам почему вылазят остатки, может не все измерения учли, с датой(временем) что-то не так

Автор: Ученик_Покачто 12.01.11, 10:19

Цитата(AlenaS @ 11.01.11, 20:51) *
Словно с кассовым аппаратом работаете smile.gif ... Движение с минусом делает документ?
Просмотрите по отчету по взаиморасчетам почему вылазят остатки, может не все измерения учли, с датой(временем) что-то не так


в том то и дело, что не делает(( уже и с конструктором запросов делал запрос, все равно ничего((( продолжаю експеременты))

Автор: AlenaS 12.01.11, 14:05

Цитата(Ученик_Покачто @ 12.01.11, 11:19) *
в том то и дело, что не делает(( уже и с конструктором запросов делал запрос, все равно ничего((( продолжаю експеременты))


Сам по себе запрос движений и не должен делать . Он после оператора Запрос.Выполнить().Выгрузить(); должен дать Вам таблицу по остаткам, если они есть.
Проверьте этот момент в отладчике.
А движения делает оператор Движения.ВзаиморасчетыСКонтрагентами.Записать();

Сейчас привожу полную конструкцию.
       НаборДвижений = Движения.ВзаиморасчетыСКонтрагентами;
    ТаблицаДвижений = НаборДвижений.Выгрузить();
    ТаблицаДвижений.Очистить();
     Запрос.Текст = "ВЫБРАТЬ
       |    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента,
       |    ВзаиморасчетыСКонтрагентамиОстатки.Сделка,
       |    ВзаиморасчетыСКонтрагентамиОстатки.Организация,
       |    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент,
       |    -ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетов,
       |    -ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпр
       |ИЗ
       |    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаКон, Контрагент = &Контрагент) КАК ВзаиморасчетыСКонтрагентамиОстатки";
    
    ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
    ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаОстатков, ТаблицаДвижений);

//сюда нужно добавить строку в таблицу движений с новыми значениями регистра

    НаборДвижений.мПериод          = Дата;
    НаборДвижений.мТаблицаДвижений = ТаблицаДвижений;
    
    Движения.ВзаиморасчетыСКонтрагентами.ВыполнитьПриход();
    Движения.ВзаиморасчетыСКонтрагентами.Записать();



До этого, я выкладывала только кусок, который формирует остатки таблицей и заносит ее в таблицу движений, но не записывает сами движения. Я предполагала, что запись движений Вы уже сделаете самостоятельно, после того, как добавите в таблицу движений ещё и движения по новым значения регистра.
Если причина всё же не в этом, то приведите здесь свой кусок кода полностью. Так ведь долго можно гадать, что же там не так ...

Автор: Ученик_Покачто 12.01.11, 14:44

Цитата(AlenaS @ 12.01.11, 15:05) *
Сам по себе запрос движений и не должен делать . Он после оператора Запрос.Выполнить().Выгрузить(); должен дать Вам таблицу по остаткам, если они есть.
Проверьте этот момент в отладчике.
А движения делает оператор Движения.ВзаиморасчетыСКонтрагентами.Записать();

Сейчас привожу полную конструкцию.
       НаборДвижений = Движения.ВзаиморасчетыСКонтрагентами;
    ТаблицаДвижений = НаборДвижений.Выгрузить();
    ТаблицаДвижений.Очистить();
    Запрос.Текст = "ВЫБРАТЬ
       |    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента,
       |    ВзаиморасчетыСКонтрагентамиОстатки.Сделка,
       |    ВзаиморасчетыСКонтрагентамиОстатки.Организация,
       |    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент,
       |    -ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетов,
       |    -ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпр
       |ИЗ
       |    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаКон, Контрагент = &Контрагент) КАК ВзаиморасчетыСКонтрагентамиОстатки";
    
    ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
    ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаОстатков, ТаблицаДвижений);

//сюда нужно добавить строку в таблицу движений с новыми значениями регистра

    НаборДвижений.мПериод          = Дата;
    НаборДвижений.мТаблицаДвижений = ТаблицаДвижений;
    
    Движения.ВзаиморасчетыСКонтрагентами.ВыполнитьПриход();
    Движения.ВзаиморасчетыСКонтрагентами.Записать();



До этого, я выкладывала только кусок, который формирует остатки таблицей и заносит ее в таблицу движений, но не записывает сами движения. Я предполагала, что запись движений Вы уже сделаете самостоятельно, после того, как добавите в таблицу движений ещё и движения по новым значения регистра.
Если причина всё же не в этом, то приведите здесь свой кусок кода полностью. Так ведь долго можно гадать, что же там не так ...



Написал следующее:

НаборДвижений = Движения.ВзаиморасчетыСКонтрагентами;
    ТаблицаДвижений = НаборДвижений.Выгрузить();
    ТаблицаДвижений.Очистить();
    Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетов,
               |    ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпр
               |ИЗ
               |    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&Дата,
               |                        ДоговорКонтрагента = &ДоговорКонтрагента) КАК ВзаиморасчетыСКонтрагентамиОстатки";
Запрос.УстановитьПараметр("Дата", Новый Граница(Дата, ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ДоговорКонтрагента", ДоговорКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Движение = Движения.ВзаиморасчетыСКонтрагентами.Добавить();
    Движение.ВидДвижения         = ВидДвиженияНакопления.Расход;
    Движение.Период         = Дата;
    Движение.ДоговорКонтрагента     = ДоговорКонтрагента;
    Движение.СуммаВзаиморасчетов     = Выборка.СуммаВзаиморасчетов;
    Движение.СуммаУпр         = Выборка.СуммаУпр;
КонецЕсли;
// Приход
Движение = Движения.ВзаиморасчетыСКонтрагентами.Добавить();
Движение.ВидДвижения         = ВидДвиженияНакопления.Приход;
Движение.Период         = Дата;
Движение.ДоговорКонтрагента     = ДоговорКонтрагента;
Движение.СуммаВзаиморасчетов     = Долг;
Движение.СуммаУпр         = Долг;



заработало

Автор: AlenaS 12.01.11, 15:35

Думаю, что Вы всё равно придете к варианту с выгрузкой в таблицу. У Контрагента может быть несколько догооров и также ещё разрезы Сделка, Организация, которые вы не учитываете. Обнуляется сумма в целом, но не закрываются измерения, что приведет в дальнейшем к неверным взаиморасчетам по этим разрезам..

Автор: Batchir 12.01.11, 16:52

Ученик_Покачто, во что верим? какую религию проповедуем?

Прочтите сообщение №3, посмотрите сообщение №8 и №17. Сделайте выводы и примените их к сообщению №18.

Автор: Vofka 13.01.11, 10:30

И прочтите http://pro1c.org.ua/index.php?showtopic=2314 тему

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