Ссылка на документ

1. sample_text 25.04.20 01:30 Сейчас в теме
Здравствуйте. Есть вопрос, касающийся ссылок на определенные документы. Задача выглядит такč

Когда проводим документ «Расходная накладная», должны совершаться движения «приход» в регистр «РасчетыСПокупателями». Контрагент берется из шапки, а документ расчетов — это ссылка на расходную накладную.
В документе «ОплатаОтПокупателя» при проведении должны совершаться движения «расход» в регистр «РасчетыСПокупателями». Контрагент берется из шапки, а документ расчетов должен вычисляться по методу ФИФО, аналогично тому, как это делается при списании партий товаров.

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

В итоге у меня есть две конфигурации - в одной реализовано списание по ФИФО, но именно материалов, а не задолженностей, вторая выполняет функции по увеличению и списанию задолженностей, подобные описанным выше, за одним исключением - там реализация идет по проектам, то есть у каждого проекта есть дата оплаты, которая указывается вручную в справочнике. Допустим на первый проект - 5 апреля, на второй - восьмое. И если проводить документ, уменьшающий долг контрагента, т.е. ПриходДенег, то сначала выбирается погашение по тому проекту, который датируется ранним числом в справочнике. Сейчас необходимо списывать с документов в порядке их проведения, первая появившаяся задолженность должна погашаться первой. И для этого в регистре используется измерение - ДокументРасчетов. Мне непонятно, какой тип должен быть у этого измерения, так как только учусь и приходилось работать только со справочниками, а также не понимаю, как именно дать ссылку на проводимый документ. Также, в конфигурации с движением денежных средств, аванс попадает в отдельную запись, но с пустым значением 'Проект', при списании аванса проходит движение в противоположном для аванса направлении, и он корректно списывается. В этой конфигурации, где необходимо выполнить задачу, должна подставляться ссылка на документ.
Выгрузки прилагаются. В первой выгрузке - конфигурация с движением денежных средств, она работает нормально. Второй файл - то, что имеется сейчас. Там много ошибок из-за измерения ДокументРасчетов, если расходная накладная работает нормально, если закомментировать все, касающееся этого измерения, то документ ОплатаОтПокупателя является буквально копией документа ПриходДенег из первой выгрузки, который я не могу переработать. Суть в том, что надо сохранить свойства первой конфигурации, при этом выполнить требования, предъявляемые ко второй, а именно ссылка на документ вместо проекта, при авансе подставить ссылку на текущий документ ОплатаОтПокупателя и первой погашается задолженность, появившаяся в регистре первой.
Прикрепленные файлы:
Задание 3.0.dt
Задание4.dt
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
11. OlgaZim 25.04.20 20:53 Сейчас в теме +0.2 $m
Добавьте во все записи движения, где используете.
Движение = Движения.РасчетыСПокупателями.ДобавитьРасход();
или
Движение = Движения.РасчетыСПокупателями.ДобавитьПриход();
ссылку на документ:
Движение.ДокументРасчетов = Ссылка;
И все появится.
В вашем примере проводка делается отсюда

Если СуммаКРаспределению > 0 Тогда

// Отнесение на аванс остатка денег после распределения по проектам
// увеличивает долг предприятия перед контрагентом
Движение = Движения.РасчетыСПокупателями.ДобавитьРасход();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
// А СЮДА ДОБАВИТЬ?
Движение.ДокументРасчетов = Ссылка;
//Движение.Проект = Справочники.Проекты.ПустаяСсылка(); // Аванс
Движение.Сумма = СуммаКРаспределению;
КонецЕсли;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. OlgaZim 25.04.20 10:28 Сейчас в теме
Добрый день! Конечно, чтобы все сделать, нужно понимать задачу целиком. Сейчас, если я правильно поняла, Ваш вопрос в том, чтобы сделать ссылку в проводке на текущий документ, так?

ДокументРасчетов = ЭтотОбъект;

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

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = ДокументРасчетов;
Движение.Сумма = СуммаПоДокументу;

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

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = ДокументРасчетов;
Движение.Сумма = СуммаПоДокументу;

И тогда по регистру в измерении ДокументРасчетов запишется данный документ
Прикрепленные файлы:
3. sample_text 25.04.20 16:46 Сейчас в теме
(2) А какого типа должно быть измерение ДокументРасчетов? Сейчас у меня все равно значение не появляется
4. OlgaZim 25.04.20 18:07 Сейчас в теме
(3) Тип измерения - ДокументСсылка. А у Вас документ этот проводится или выдает ошибку? Просто в вашей выгрузке мне пришлось закомментировать кучу строк и ввести значения по умолчанию, прежде чем он начал проводиться
5. sample_text 25.04.20 19:16 Сейчас в теме
(4)С типом я угадал. Документ РасходнаяНакладная проводится без комментирования. Я добавил установку параметра Дата после одного из запросов, а также исправил значение ДокументРасчетов так, как это было сделано у Вас, т.е. ЭтотОбъект. И документ нормально проводится, только значение все равно не попадает в поле
6. sample_text 25.04.20 19:17 Сейчас в теме
(4)
Модуль документа РасходнаяНакладная выглядит у меня так
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Запрос = Новый Запрос("ВЫБРАТЬ
| ВЫБОР
| КОГДА МетодСписанияТоваров.МетодСписания = ЗНАЧЕНИЕ(Перечисление.ВидУчета.ФИФО)
| ТОГДА ""ВОЗР""
| КОНЕЦ КАК МетодСписания
|ИЗ
| РегистрСведений.МетодСписанияТоваров.СрезПоследних(&Период, ) КАК МетодСписанияТоваров");
Запрос.УстановитьПараметр("Период", Дата);

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Отказ = Истина;
Сообщить("Не указан метод списания в учетной политике!!!");

Возврат;
КонецЕсли;

Выборка = Результат.Выбрать();
Выборка.Следующий();
МетодСписания = Выборка.МетодСписания;

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

Выборка = Запрос2.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока Выборка.Следующий() Цикл
Если Выборка.Количество > Выборка.Остаток Тогда
Отказ = Истина;
Сообщить("Остатка для товара """ + Выборка.Материал + """ не хватает." +
" Требуется: " + Выборка.Количество +
" Остаток: " + Выборка.Остаток);
Продолжить;
КонецЕсли;

КРаспределениюПоПартиям = Выборка.Количество;

Обход = Выборка.Выбрать();

Пока Обход.Следующий() И НЕ КРаспределениюПоПартиям = 0 Цикл
Запись = Движения.ОстаткиМатериалов.Добавить();

ЗаполнитьЗначенияСвойств(Запись, Обход);
Запись.ВидДвижения = ВидДвиженияНакопления.Расход;

Если КРаспределениюПоПартиям >= Обход.Остаток Тогда
Запись.Количество = Обход.Остаток;
Запись.Стоимость = Обход.Стоимость;

КРаспределениюПоПартиям = КРаспределениюПоПартиям - Обход.Остаток;
Иначе
Запись.Количество = КРаспределениюПоПартиям;
Запись.Стоимость = Обход.Стоимость / Обход.Остаток * КРаспределениюПоПартиям;

КРаспределениюПоПартиям = 0;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Движения.РасчетыСПокупателями.Записывать = Истина;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетыСПокупателямиОстатки.Контрагент КАК Контрагент,
| -РасчетыСПокупателямиОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.РасчетыСПокупателями.Остатки(&МоментВремениОстатков, Контрагент = &Контрагент) КАК РасчетыСПокупателямиОстатки
|ГДЕ
| РасчетыСПокупателямиОстатки.СуммаОстаток < 0";

Запрос.УстановитьПараметр("Контрагент" , Контрагент);
Запрос.УстановитьПараметр("МоментВремениОстатков",
Новый Граница(МоментВремени(), ВидГраницы.Включая));

РезультатЗапроса = Запрос.Выполнить().Выбрать();
ДокументРасчетов = ЭтотОбъект;
Если РезультатЗапроса.Следующий() Тогда
Если РезультатЗапроса.СуммаОстаток >= СуммаПоДокументу Тогда
//сумму расхода закрывает аванс
Движение = Движения.РасчетыСПокупателями.ДобавитьПриход(); //добавим задолженность

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = ДокументРасчетов;
Движение.Сумма = СуммаПоДокументу;

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

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = ДокументРасчетов;
Движение.Сумма = СуммаПоДокументу;


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

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = ДокументРасчетов;
Движение.Сумма = СуммаПоДокументу;

иначеЕсли РезультатЗапроса.СуммаОстаток < СуммаПоДокументу Тогда
//сумма расхода больше аванса и частично пойдет на расход
Движение = Движения.РасчетыСПокупателями.ДобавитьПриход(); //добавим задолженность

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = ДокументРасчетов;
Движение.Сумма = СуммаПоДокументу;

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

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = ДокументРасчетов;
Движение.Сумма = РезультатЗапроса.СуммаОстаток;

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

КонецЕсли;
Иначе //аванс отсутствует
Движение = Движения.РасчетыСПокупателями.ДобавитьПриход();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = ДокументРасчетов;
Движение.Сумма = СуммаПоДокументу;
КонецЕсли;
Движения.РасчетыСПокупателями.Записать();
КонецПроцедуры
7. OlgaZim 25.04.20 20:19 Сейчас в теме
Смотрите, и в вашем модуле документ попадает в регистр
1.
Прикрепленные файлы:
8. OlgaZim 25.04.20 20:19 Сейчас в теме
2
Прикрепленные файлы:
9. OlgaZim 25.04.20 20:20 Сейчас в теме
Тогда я не понимаю, про какое "поле" вы говорите?
"только значение все равно не попадает в поле"
10. OlgaZim 25.04.20 20:24 Сейчас в теме
А все, поняла, это другое поле регистратор. ДокументРасчетов спрятался ) Сейчас гляну.
11. OlgaZim 25.04.20 20:53 Сейчас в теме +0.2 $m
Добавьте во все записи движения, где используете.
Движение = Движения.РасчетыСПокупателями.ДобавитьРасход();
или
Движение = Движения.РасчетыСПокупателями.ДобавитьПриход();
ссылку на документ:
Движение.ДокументРасчетов = Ссылка;
И все появится.
В вашем примере проводка делается отсюда

Если СуммаКРаспределению > 0 Тогда

// Отнесение на аванс остатка денег после распределения по проектам
// увеличивает долг предприятия перед контрагентом
Движение = Движения.РасчетыСПокупателями.ДобавитьРасход();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
// А СЮДА ДОБАВИТЬ?
Движение.ДокументРасчетов = Ссылка;
//Движение.Проект = Справочники.Проекты.ПустаяСсылка(); // Аванс
Движение.Сумма = СуммаКРаспределению;
КонецЕсли;
12. sample_text 25.04.20 21:01 Сейчас в теме
(11)Да, отлично, все появилось
13. sample_text 25.04.20 21:05 Сейчас в теме
(11)Думаю, что во втором документе, так как у меня списание идет поочередно, я избавлюсь от первой части кода, где условием являлось указание проекта и оставлю только ту часть, где его не указывают, так как этой функции теперь не должно быть
14. sample_text 25.04.20 21:11 Сейчас в теме
(11)Все заработало более-менее нормально. Дальше я смогу сам, спасибо огромное за потраченное время и за то, что замечательно все объяснили.
15. OlgaZim 25.04.20 21:28 Сейчас в теме
16. sample_text 25.04.20 21:32 Сейчас в теме
(15)Да, прошу прощения, последний вопрос
17. sample_text 25.04.20 21:36 Сейчас в теме
Для уменьшения аванса в другой конфигурации, использующей пустую ссылку для записей аванса, я делал так

Движение = Движения.Взаиморасчеты.ДобавитьПриход(); //уменьшим аванс на сумму документа

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Проект = Справочники.Проекты.ПустаяСсылка();
Движение.Сумма = СуммаПоДокументу;
Сейчас мне нужна вместо пустой ссылки ссылка, ведущая к документу ОплатаОтПокупателя, так как аванс теперь находится там
18. OlgaZim 25.04.20 21:42 Сейчас в теме
А что за конфигурация? В конф3 только приход и расход денег
19. sample_text 25.04.20 21:49 Сейчас в теме
(18)Вторая
Там похожий пункт, который сейчас выглядит вот так:

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

Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.ДокументРасчетов = Ссылка;
Движение.Сумма = СуммаПоДокументу;
В ссылку должен попадать документ ОплатаОтПОкупателя, так как из него происходит списание аванса
20. OlgaZim 25.04.20 21:49 Сейчас в теме
Это та же конфа?
Так аналогично, у Вас есть запрос остатков
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| РасчетыСПокупателямиОстатки.СуммаОстаток КАК СуммаОстаток,
| РасчетыСПокупателямиОстатки.ДокументРасчетов КАК ДокументРасчетов
|ИЗ
| РегистрНакопления.РасчетыСПокупателями.Остатки(
| &МоментВремениОстатков,
| Контрагент = &Контрагент
| ) КАК РасчетыСПокупателямиОстатки
|УПОРЯДОЧИТЬ ПО
| РасчетыСПокупателямиОстатки.ДокументРасчетов.Дата";

В нем есть ДокументРасчетов который мы заполнили.

Значит, просто указываем в цикле

Если Не РезультатЗапроса.Пустой() Тогда

Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() И СуммаКРаспределению > 0 Цикл

СуммаКСписанию = Мин(СуммаКРаспределению, Выборка.СуммаОстаток);

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

СуммаКРаспределению = СуммаКРаспределению - СуммаКСписанию;
КонецЦикла;
КонецЕсли;

Проведение не проверяла, вы проверьте еще логику.
21. sample_text 25.04.20 21:51 Сейчас в теме
(20)Все, спасибо, понял, что тут нужна выборка.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот