Обработка заполнения по заказу поставщику приходной накладной в УНФ 1.6

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

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

Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
2. KVIKS 433 21.08.19 18:51 Сейчас в теме +1 $m
Остатки берутся без учета даты, если документ уже проведен, то при повторном заполнении/перезаполнении эти товары удалятся из него, поэтому система берет остатки (в них не будет движений этого документа) и клеит к нему движения этого документа. Это и логично для новых документов, которые вводятся на основании, и логично если заполнение происходит программно, к примеру по кнопке "добавить из документа" - в этом случае массив заказов будет пополняться и заполнение будет проходить корректно.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. KVIKS 433 21.08.19 18:51 Сейчас в теме +1 $m
Остатки берутся без учета даты, если документ уже проведен, то при повторном заполнении/перезаполнении эти товары удалятся из него, поэтому система берет остатки (в них не будет движений этого документа) и клеит к нему движения этого документа. Это и логично для новых документов, которые вводятся на основании, и логично если заполнение происходит программно, к примеру по кнопке "добавить из документа" - в этом случае массив заказов будет пополняться и заполнение будет проходить корректно.
3. Evgenij1990 26 23.08.19 15:07 Сейчас в теме
Оставьте свое сообщение

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