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

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

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

В итоге у меня есть две конфигурации - в одной реализовано списание по ФИФО, но именно материалов, а не задолженностей, вторая выполняет функции по увеличению и списанию задолженностей, подобные описанным выше, за одним исключением - там реализация идет по проектам, то есть у каждого проекта есть дата оплаты, которая указывается вручную в справочнике. Допустим на первый проект - 5 апреля, на второй - восьмое. И если проводить документ, уменьшающий долг контрагента, т.е. ПриходДенег, то сначала выбирается погашение по тому проекту, который датируется ранним числом в справочнике. Сейчас необходимо списывать с документов в порядке их проведения, первая появившаяся задолженность должна погашаться первой. И для этого в регистре используется измерение - ДокументРасчетов. Мне непонятно, какой тип должен быть у этого измерения, так как только учусь и приходилось работать только со справочниками, а также не понимаю, как именно дать ссылку на проводимый документ. Также, в конфигурации с движением денежных средств, аванс попадает в отдельную запись, но с пустым значением 'Проект', при списании аванса проходит движение в противоположном для аванса направлении, и он корректно списывается. В этой конфигурации, где необходимо выполнить задачу, должна подставляться ссылка на документ.
Выгрузки прилагаются. В первой выгрузке - конфигурация с движением денежных средств, она работает нормально. Второй файл - то, что имеется сейчас. Там много ошибок из-за измерения ДокументРасчетов, если расходная накладная работает нормально, если закомментировать все, касающееся этого измерения, то документ ОплатаОтПокупателя является буквально копией документа ПриходДенег из первой выгрузки, который я не могу переработать. Суть в том, что надо сохранить свойства первой конфигурации, при этом выполнить требования, предъявляемые ко второй, а именно ссылка на документ вместо проекта, при авансе подставить ссылку на текущий документ ОплатаОтПокупателя и первой погашается задолженность, появившаяся в регистре первой.
---
Добавьте во все записи движения, где используете.
   Движение = Движения.РасчетыСПокупателями.ДобавитьРасход();
или
   Движение = Движения.РасчетыСПокупателями.ДобавитьПриход();
ссылку на документ:
Движение.ДокументРасчетов = Ссылка;
И все появится.
В вашем примере проводка делается отсюда

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   КонецЕсли;
  Иначе //аванс отсутствует
   Движение = Движения.РасчетыСПокупателями.ДобавитьПриход();
   Движение.Период = Дата;
   Движение.Контрагент = Контрагент;
   Движение.ДокументРасчетов = ДокументРасчетов;
   Движение.Сумма = СуммаПоДокументу;
  КонецЕсли;
  Движения.РасчетыСПокупателями.Записать();
КонецПроцедуры
---
Смотрите, и в вашем модуле документ попадает в регистр
1.
---
2
---
Тогда я не понимаю, про какое "поле" вы говорите?
"только значение все равно не попадает в поле"
---
А все, поняла, это другое поле регистратор. ДокументРасчетов спрятался ) Сейчас гляну.
---
Добавьте во все записи движения, где используете.
   Движение = Движения.РасчетыСПокупателями.ДобавитьРасход();
или
   Движение = Движения.РасчетыСПокупателями.ДобавитьПриход();
ссылку на документ:
Движение.ДокументРасчетов = Ссылка;
И все появится.
В вашем примере проводка делается отсюда

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

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

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

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

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

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

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

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

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

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

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

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

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

Проведение не проверяла, вы проверьте еще логику.
---
Все, спасибо, понял, что тут нужна выборка.