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