Всем привет! В УНФ есть процедура по заполнению документа "Приходная накладная" на основании "Заказа поставщику". Не могу понять почему нельзя было напрямую обратиться к остаткам регистра и заполнить ТЧ по ним? Есть ли в этом какой то смысл? Поясните, пожалуйста.

```1c
    Процедура ЗаполнитьПоЗаказуПоставщику(ДанныеЗаполнения) Экспорт

    // Основание и настройка документа.
    МассивЗаказов = Новый Массив;
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("МассивЗаказовПоставщикам") Тогда
    МассивЗаказов = ДанныеЗаполнения.МассивЗаказовПоставщикам;
    ПоложениеЗаказаПоставщику = Перечисления.ПоложениеРеквизитаНаФорме.ВТабличнойЧасти;
    Иначе
    МассивЗаказов.Добавить(ДанныеЗаполнения.Ссылка);
    ПоложениеЗаказаПоставщику = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеНастройки("ПоложениеЗаказаПоставщикуВДокументахПоступления");
    Если НЕ ЗначениеЗаполнено(ПоложениеЗаказаПоставщику) Тогда
    ПоложениеЗаказаПоставщику = Перечисления.ПоложениеРеквизитаНаФорме.ВШапке;
    КонецЕсли;
    Если ПоложениеЗаказаПоставщику = Перечисления.ПоложениеРеквизитаНаФорме.ВШапке Тогда
    Заказ = ДанныеЗаполнения;
    КонецЕсли;
    КонецЕсли;
    ПоложениеСклада = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеНастройки("ПоложениеСкладаВДокументахПоступления");

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

    Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
    Запрос.УстановитьПараметр("ДатаДокумента", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДата()));

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

    ЗаполнитьЗначенияСвойств(ЭтотОбъект, Выборка);

    Если МассивЗаказов.Количество() = 1 Тогда
    ЭтотОбъект.ДокументОснование = МассивЗаказов[0];
    КонецЕсли;

    // Заполнение документа.
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | ЗаказыОстатки.ЗаказПоставщику КАК ЗаказПоставщику,
    | ЗаказыОстатки.Номенклатура КАК Номенклатура,
    | ЗаказыОстатки.Характеристика КАК Характеристика,
    | СУММА(ЗаказыОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |ИЗ
    | (ВЫБРАТЬ
    | ЗаказыОстатки.ЗаказПоставщику КАК ЗаказПоставщику,
    | ЗаказыОстатки.Номенклатура КАК Номенклатура,
    | ЗаказыОстатки.Характеристика КАК Характеристика,
    | ЗаказыОстатки.КоличествоОстаток КАК КоличествоОстаток
    | ИЗ
    | РегистрНакопления.ЗаказыПоставщикам.Остатки(
    | ,
    | ЗаказПоставщику В (&МассивЗаказов)
    | И (Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Запас)
    | ИЛИ Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
    | ИЛИ Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.ПодарочныйСертификат))) КАК ЗаказыОстатки
    |
    | ОБЪЕДИНИТЬ ВСЕ
    |
    | ВЫБРАТЬ
    | ДвиженияДокументаЗаказыПоставщикам.ЗаказПоставщику,
    | ДвиженияДокументаЗаказыПоставщикам.Номенклатура,
    | ДвиженияДокументаЗаказыПоставщикам.Характеристика,
    | ВЫБОР
    | КОГДА ДвиженияДокументаЗаказыПоставщикам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    | ТОГДА ЕСТЬNULL(ДвиженияДокументаЗаказыПоставщикам.Количество, 0)
    | ИНАЧЕ -ЕСТЬNULL(ДвиженияДокументаЗаказыПоставщикам.Количество, 0)
    | КОНЕЦ
    | ИЗ
    | РегистрНакопления.ЗаказыПоставщикам КАК ДвиженияДокументаЗаказыПоставщикам
    | ГДЕ
    | ДвиженияДокументаЗаказыПоставщикам.Регистратор = &Ссылка) КАК ЗаказыОстатки
    |
    |СГРУППИРОВАТЬ ПО
    | ЗаказыОстатки.ЗаказПоставщику,
    | ЗаказыОстатки.Номенклатура,
    | ЗаказыОстатки.Характеристика
    |
    |ИМЕЮЩИЕ
    | СУММА(ЗаказыОстатки.КоличествоОстаток) > 0
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | ВЫБОР
    | КОГДА ФункциональнаяОпцияРезервированиеЗапасов.Значение
    | ТОГДА ЗаказПоставщикуЗапасы.ЗаказПокупателя
    | ИНАЧЕ ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
    | КОНЕЦ КАК ЗаказПокупателя,
    | ЗаказПоставщикуЗапасы.Ссылка.СтруктурнаяЕдиница КАК СтруктурнаяЕдиницаРасход,
    | ЗаказПоставщикуЗапасы.Номенклатура КАК Номенклатура,
    | ЗаказПоставщикуЗапасы.Номенклатура.СтранаПроисхождения КАК СтранаПроисхождения,
    | ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
    | ЗаказПоставщикуЗапасы.Номенклатура.СчетУчетаЗатрат.ТипСчета КАК ТипСчета,
    | ЗаказПоставщикуЗапасы.Номенклатура.Склад КАК СтруктурнаяЕдиница,
    | ЗаказПоставщикуЗапасы.Номенклатура.Ячейка КАК Ячейка,
    | ЗаказПоставщикуЗапасы.Характеристика КАК Характеристика,
    | ВЫБОР
    | КОГДА ТИПЗНАЧЕНИЯ(ЗаказПоставщикуЗапасы.ЕдиницаИзмерения) = ТИП(Справочник.КлассификаторЕдиницИзмерения)
    | ТОГДА 1
    | ИНАЧЕ ЗаказПоставщикуЗапасы.ЕдиницаИзмерения.Коэффициент
    | КОНЕЦ КАК Коэффициент,
    | СУММА(ЗаказПоставщикуЗапасы.Количество) КАК Количество,
    | ЗаказПоставщикуЗапасы.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    | ЗаказПоставщикуЗапасы.Цена КАК Цена,
    | СУММА(ЗаказПоставщикуЗапасы.Сумма) КАК Сумма,
    | ЗаказПоставщикуЗапасы.СтавкаНДС КАК СтавкаНДС,
    | СУММА(ЗаказПоставщикуЗапасы.СуммаНДС) КАК СуммаНДС,
    | СУММА(ЗаказПоставщикуЗапасы.Всего) КАК Всего,
    | ПОДСТРОКА(ЗаказПоставщикуЗапасы.Содержание, 1, 1024) КАК Содержание,
    | ЗаказПоставщикуЗапасы.Ссылка КАК ЗаказОснование,
    | ЗаказПоставщикуЗапасы.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки,
    | СУММА(ЗаказПоставщикуЗапасы.СуммаСкидкиНаценки) КАК СуммаСкидкиНаценки,
    | МИНИМУМ(ЗаказПоставщикуЗапасы.НомерСтроки) КАК НомерСтроки
    |ИЗ
    | Документ.ЗаказПоставщику.Запасы КАК ЗаказПоставщикуЗапасы,
    | Константа.ФункциональнаяОпцияРезервированиеЗапасов КАК ФункциональнаяОпцияРезервированиеЗапасов
    |ГДЕ
    | ЗаказПоставщикуЗапасы.Ссылка В(&МассивЗаказов)
    | И (ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
    | ИЛИ ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Запас)
    | ИЛИ ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.ПодарочныйСертификат))
    |
    |СГРУППИРОВАТЬ ПО
    | ЗаказПоставщикуЗапасы.Ссылка,
    | ЗаказПоставщикуЗапасы.Характеристика,
    | ЗаказПоставщикуЗапасы.Номенклатура,
    | ЗаказПоставщикуЗапасы.ЕдиницаИзмерения,
    | ЗаказПоставщикуЗапасы.СтавкаНДС,
    | ЗаказПоставщикуЗапасы.Цена,
    | ЗаказПоставщикуЗапасы.ПроцентСкидкиНаценки,
    | ВЫБОР
    | КОГДА ФункциональнаяОпцияРезервированиеЗапасов.Значение
    | ТОГДА ЗаказПоставщикуЗапасы.ЗаказПокупателя
    | ИНАЧЕ ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
    | КОНЕЦ,
    | ЗаказПоставщикуЗапасы.Ссылка.СтруктурнаяЕдиница,
    | ЗаказПоставщикуЗапасы.Номенклатура.СтранаПроисхождения,
    | ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры,
    | ЗаказПоставщикуЗапасы.Номенклатура.СчетУчетаЗатрат.ТипСчета,
    | ЗаказПоставщикуЗапасы.Номенклатура.Склад,
    | ЗаказПоставщикуЗапасы.Номенклатура.Ячейка,
    | ПОДСТРОКА(ЗаказПоставщикуЗапасы.Содержание, 1, 1024),
    | ВЫБОР
    | КОГДА ТИПЗНАЧЕНИЯ(ЗаказПоставщикуЗапасы.ЕдиницаИзмерения) = ТИП(Справочник.КлассификаторЕдиницИзмерения)
    | ТОГДА 1
    | ИНАЧЕ ЗаказПоставщикуЗапасы.ЕдиницаИзмерения.Коэффициент
    | КОНЕЦ
    |
    |УПОРЯДОЧИТЬ ПО
    | НомерСтроки";

    Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
    Запрос.УстановитьПараметр("ДатаДокумента", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДата()));
    Запрос.УстановитьПараметр("Ссылка", Ссылка);

    МассивРезультатов = Запрос.ВыполнитьПакет();
    ТаблицаОстатков = МассивРезультатов[0].Выгрузить();
    ТаблицаОстатков.Индексы.Добавить("ЗаказПоставщику,Номенклатура,Характеристика");

    Запасы.Очистить();
    Расходы.Очистить();
    Если ТаблицаОстатков.Количество() > 0 Тогда

    Выборка = МассивРезультатов[1].Выбрать();
    Пока Выборка.Следующий() Цикл

    СтруктураДляПоиска = Новый Структура;
    СтруктураДляПоиска.Вставить("ЗаказПоставщику", Выборка.ЗаказОснование);
    СтруктураДляПоиска.Вставить("Номенклатура", Выборка.Номенклатура);
    СтруктураДляПоиска.Вставить("Характеристика", Выборка.Характеристика);

    МассивСтрокОстатков = ТаблицаОстатков.НайтиСтроки(СтруктураДляПоиска);
    Если МассивСтрокОстатков.Количество() = 0 Тогда
    Продолжить;
    КонецЕсли;

    Если Выборка.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
    НоваяСтрока = Расходы.Добавить();
    НоваяСтрока.ЗаказПоставщику = Выборка.ЗаказОснование;
    НоваяСтрока.СтруктурнаяЕдиница = Выборка.СтруктурнаяЕдиницаРасход;
    Если ЗначениеЗаполнено(Выборка.ЗаказПокупателя)
    И (Выборка.ТипСчета = Перечисления.ТипыСчетов.Расходы
    ИЛИ Выборка.ТипСчета = Перечисления.ТипыСчетов.КосвенныеЗатраты
    ИЛИ Выборка.ТипСчета = Перечисления.ТипыСчетов.НезавершенноеПроизводство) Тогда
    НоваяСтрока.Заказ = Выборка.ЗаказПокупателя;
    КонецЕсли;
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка,,"СтруктурнаяЕдиница");
    Иначе
    НоваяСтрока = Запасы.Добавить();
    НоваяСтрока.Заказ = Выборка.ЗаказОснование;
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
    Если ПоложениеСклада<>Перечисления.ПоложениеРеквизитаНаФорме.ВТабличнойЧасти Тогда
    НоваяСтрока.СтруктурнаяЕдиница = СтруктурнаяЕдиница;
    КонецЕсли;
    КонецЕсли;

    КоличествоКСписанию = Выборка.Количество * Выборка.Коэффициент;
    МассивСтрокОстатков[0].КоличествоОстаток = МассивСтрокОстатков[0].КоличествоОстаток - КоличествоКСписанию;
    Если МассивСтрокОстатков[0].КоличествоОстаток < 0 Тогда

    КоличествоКСписанию = (КоличествоКСписанию + МассивСтрокОстатков[0].КоличествоОстаток) / Выборка.Коэффициент;

    СтруктураДанных = УправлениеНебольшойФирмойСервер.ПолучитьСуммуСтрокиТабличнойЧасти(
    Новый Структура("Количество, Цена, Сумма, СтавкаНДС, СуммаНДС, СуммаВключаетНДС, Всего",
    КоличествоКСписанию, Выборка.Цена, 0, Выборка.СтавкаНДС, 0, СуммаВключаетНДС, 0));

    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураДанных);

    КонецЕсли;

    Если МассивСтрокОстатков[0].КоличествоОстаток <= 0 Тогда
    ТаблицаОстатков.Удалить(МассивСтрокОстатков[0]);
    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры // ЗаполнитьПоЗаказПоставщику()
```
---
Остатки берутся без учета даты, если документ уже проведен, то при повторном заполнении/перезаполнении эти товары удалятся из него, поэтому система берет остатки (в них не будет движений этого документа) и клеит к нему движения этого документа. Это и логично для новых документов, которые вводятся на основании, и логично если заполнение происходит программно, к примеру по кнопке "добавить из документа" - в этом случае массив заказов будет пополняться и заполнение будет проходить корректно.
---
Остатки берутся без учета даты, если документ уже проведен, то при повторном заполнении/перезаполнении эти товары удалятся из него, поэтому система берет остатки (в них не будет движений этого документа) и клеит к нему движения этого документа. Это и логично для новых документов, которые вводятся на основании, и логично если заполнение происходит программно, к примеру по кнопке "добавить из документа" - в этом случае массив заказов будет пополняться и заполнение будет проходить корректно.
---
Спасибо)