![]() |
|
Заполнение ГТД. Проблема с остатками | ☑ | ||
---|---|---|---|---|
0
Dionis Sergeevich
19.06.12
✎
16:15
|
Добрый день. Рисую обработку для БП
Функция СкопироватьСтрокуВДругуюТаблицу(СтрокаИсточник, ТаблицаИсточник, СтрокаПриемник, ТаблицаПриемник) Экспорт Для Каждого ТекКол Из ТаблицаПриемник.Колонки Цикл Если ТаблицаИсточник.Колонки.Найти(ТекКол.Имя) <> Неопределено Тогда СтрокаПриемник[ТекКол.Имя] = СтрокаИсточник[ТекКол.Имя]; КонецЕсли; КонецЦикла; КонецФункции // УчетнаяПолитикаНалоговыйУчет() // Функция Инициализировать(Объект,ИмяТабличнойЧасти,ТабличноеПолеОбъекта) экспорт ТабПолеОбъекта = ТабличноеПолеОбъекта; ИмяТабЧасти = ИмяТабличнойЧасти; ДокОбъект = Объект; СписаноД = 0; ФлагПредыдущаяДата = Ложь;//Флаг показывающий необходимость искать предыдущую дату если по крайнему ГТД не хватило товаров ДатаФильтрДо = ДокОбъект.МоментВремени(); Если ДокОбъект.Проведен Тогда Предупреждение("Заполнение номеров ГТД возможно только в непроведенном документе."); Возврат ""; КонецЕсли; Если ДокОбъект.Модифицированность() Тогда Если Вопрос("Перед заполнением номеров ГТД необходимо записать документ. Записать?",РежимДиалогаВопрос.ДаНет,0,КодВозвратаДиалога.Да,"Предупреждение") = КодВозвратаДиалога.Да Тогда ДокОбъект.Записать(); Иначе Возврат ""; КонецЕсли; КонецЕсли; ТЗ = ДокОбъект[ИмяТабЧасти].Выгрузить(); ТЗ.Очистить(); ЗапросСсылка = ДокОбъект.Ссылка; ЗапросОрганизация = ДокОбъект.Организация; ЗапросПериод = ДокОбъект.МоментВремени(); ЗапросСчет = ПланыСчетов.Хозрасчетный.ГТД; ЗапросПериода = ДатаФильтрДо; ~ИскатьПредыдущий: Если ФлагПредыдущаяДата Тогда//Получение предыдущей даты для ограничения периода (чтоб найти предыдущую ГТД) ДатаФильтрДо = ЗапросПолучитьДату(ЗапросСсылка, ЗапросОрганизация, ЗапросПериод, ЗапросСчет); ЗапросПериод = ДатаФильтрДо; ФлагПредыдущаяДата = Ложь; Иначе Сообщить ("Это сообщение должно появиться 1 раз");//в целях отладки КонецЕсли; ФлагПредыдущаяДата = Ложь; ЗапросПериод = ДатаФильтрДо;// Конец периода теперь предыдущай дата Зап = ВыполнитьОбщийЗапрос(ЗапросСсылка, ЗапросОрганизация, ЗапросПериод, ЗапросСчет);//Основной запрос ВыборкаНом = Зап.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //Выполняется второй, третий и тд раз в период до предыдущей даты Пока ВыборкаНом.Следующий() Цикл Кол = ?(ВыборкаНом.КоличествоОстаток = NUll,0,выборканом.КоличествоОСтаток); //проверка на достаточность товаров Если ВыборкаНом.Количество - СписаноД > Кол Тогда ФлагПредыдущаяДата = Истина;//Товаров по гтд недостаточно, надо искать предыдущий НеобхСпис = ВыборкаНом.Количество - СписаноД; Сообщить("Для заполнения номеров ГТД не хватает " + выборкаНом.Номенклатура + ". Имеется в наличии " + Кол + ". Необходимо списать " + НеобхСпис + ". Ищем по другим ГТД"); выборкаДок = ВыборкаНом.Выбрать(); Если Кол > 0 Тогда НадоСписать = Кол; Пока ВыборкаДок.следующий() Цикл СтрокаТЗ = ТЗ.Добавить(); МожноСписать = выборкаДок.КоличествоОстаток; КолСпис = Мин(НадоСписать,МожноСписать); СписаноД = СписаноД + КолСпис; СкопироватьСтрокуВДругуюТаблицу(ВыборкаДок,Зап.Выгрузить(),СтрокаТЗ,ТЗ); СтрокаТЗ.Количество = КолСпис; СтрокаТЗ.НомерГТД = ВыборкаДок.НомерГТД; СтрокаТЗ.КоличествоМест = ?(ВыборкаНом.Количество=0,0,СтрокаТЗ.Количество/ВыборкаНом.Количество*СтрокаТЗ.КоличествоМест); НадоСписать = Надосписать - КолСпис; Если НадоСписать = 0 Тогда Прервать; КонецЕсли; КонецЦикла; Перейти ~ИскатьПредыдущий; // ищем следующий ГТД Иначе Перейти ~ИскатьПредыдущий;//сюда попасть мы не должны впринципе - эта возможность исключена в условии запроса "Фильтр" КонецЕсли; Продолжить; КонецЕсли; НадоСписать = ВыборкаНом.Количество - СписаноД; //Если хватило товаров тогда заполнить ГТД выборкаДок = ВыборкаНом.Выбрать(); Пока ВыборкаДок.следующий() Цикл МожноСписать = выборкаДок.КоличествоОстаток; КолСпис = Мин(НадоСписать,МожноСписать); СтрокаТЗ = ТЗ.Добавить(); СкопироватьСтрокуВДругуюТаблицу(ВыборкаДок,Зап.Выгрузить(),СтрокаТЗ,ТЗ); СтрокаТЗ.Количество = КолСпис; СтрокаТЗ.КоличествоМест = ?(ВыборкаНом.Количество=0,0,СтрокаТЗ.Количество/ВыборкаНом.Количество*СтрокаТЗ.КоличествоМест); НадоСписать = Надосписать - КолСпис; Если НадоСписать = 0 Тогда СписаноД = СписаноД + КолСпис; Сообщить ("Списание Окончено. Всего списано " + СписаноД); Прервать; КонецЕсли; КонецЦикла; КонецЦИкла; ТЗ.Сортировать("НомерСтроки"); ДокОбъект[ИмяТабЧасти].Загрузить(ТЗ); Для каждого СтрокаТабЧасти из ДокОбъект[ИмяТабЧасти] Цикл ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабЧасти, ДокОбъект); ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабЧасти, ДокОбъект); КонецЦикла; КонецФункции //Основной запрос выдающий информацию для заполнения в тч Функция ВыполнитьОбщийЗапрос(ЗапросСсылка, ЗапросОрганизация, ЗапросПериод, ЗапросСчет) Период = "И | Период В | (Выбрать Максимум (ПоследняяДата.Период) | КАК Период | ИЗ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты | ( | , | &КонПериода, | Регистратор, | Движения, | Счет = &Счет, | , | Организация = &Организация | И Субконто1 В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РеализацияТоваровУслугТовары.Номенклатура | ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары | ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &Ссылка)) КАК ПоследняяДата)"; Фильтр = "Выбрать * ИЗ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты |( |, |&КонПериода, |Регистратор, |Движения, |Счет = &Счет, |, |Организация = &Организация |И Субконто1 В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РеализацияТоваровУслугТовары.Номенклатура | ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары | ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &Ссылка )) | ГДЕ КоличествоКонечныйОстаток > 0 " + Период; ЗапросТекст = "ВЫБРАТЬ | ВложенныйЗапрос.НомерСтроки, | ВложенныйЗапрос.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | ВложенныйЗапрос.Количество КАК Количество, | ВложенныйЗапрос.Номенклатура КАК Номенклатура, | ВложенныйЗапрос.КоличествоМест, | ВложенныйЗапрос.Коэффициент КАК Коэффициент, | ВложенныйЗапрос.Цена КАК Цена, | ВложенныйЗапрос.СтавкаНДС КАК СтавкаНДС, | ВложенныйЗапрос.СчетУчета КАК СчетУчета, | ВложенныйЗапрос.ПереданныеСчетУчета КАК ПереданныеСчетУчета, | ВложенныйЗапрос.СчетУчетаНДСПоРеализации КАК СчетУчетаНДСПоРеализации, | ВложенныйЗапрос.СчетДоходов КАК СчетДоходов, | ВложенныйЗапрос.СчетРасходов КАК СчетРасходов, | ВложенныйЗапрос.Субконто КАК Субконто, | ХозрасчетныйОстаткиИОбороты.Субконто2 КАК НомерГТД, | ХозрасчетныйОстаткиИОбороты.Субконто3 КАК СтранаПроисхождения, | ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоОстаток, | ХозрасчетныйОстаткиИОбороты.Регистратор КАК Регистратор |ИЗ | (ВЫБРАТЬ | МИНИМУМ(РеализацияТоваровУслугТовары.НомерСтроки) КАК НомерСтроки, | РеализацияТоваровУслугТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество, | РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, | СУММА(РеализацияТоваровУслугТовары.КоличествоМест) КАК КоличествоМест, | РеализацияТоваровУслугТовары.Коэффициент КАК Коэффициент, | РеализацияТоваровУслугТовары.Цена КАК Цена, | РеализацияТоваровУслугТовары.СтавкаНДС КАК СтавкаНДС, | РеализацияТоваровУслугТовары.СчетУчета КАК СчетУчета, | РеализацияТоваровУслугТовары.ПереданныеСчетУчета КАК ПереданныеСчетУчета, | РеализацияТоваровУслугТовары.СчетУчетаНДСПоРеализации КАК СчетУчетаНДСПоРеализации, | РеализацияТоваровУслугТовары.СчетДоходов КАК СчетДоходов, | РеализацияТоваровУслугТовары.СчетРасходов КАК СчетРасходов, | РеализацияТоваровУслугТовары.Субконто КАК Субконто | ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары | ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &Ссылка | | СГРУППИРОВАТЬ ПО | РеализацияТоваровУслугТовары.Номенклатура, | РеализацияТоваровУслугТовары.ЕдиницаИзмерения, | РеализацияТоваровУслугТовары.СчетУчетаНДСПоРеализации, | РеализацияТоваровУслугТовары.СчетДоходов, | РеализацияТоваровУслугТовары.ПереданныеСчетУчета, | РеализацияТоваровУслугТовары.СчетУчета, | РеализацияТоваровУслугТовары.СтавкаНДС, | РеализацияТоваровУслугТовары.СчетРасходов, | РеализацияТоваровУслугТовары.Субконто, | РеализацияТоваровУслугТовары.Коэффициент, | РеализацияТоваровУслугТовары.Цена) КАК ВложенныйЗапрос | ЛЕВОЕ СОЕДИНЕНИЕ ("+ Фильтр + ") КАК ХозрасчетныйОстаткиИОбороты | ПО ВложенныйЗапрос.Номенклатура = ХозрасчетныйОстаткиИОбороты.Субконто1 | |УПОРЯДОЧИТЬ ПО | Регистратор |ИТОГИ | МАКСИМУМ(Количество), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос = Новый Запрос; Запрос.Текст = ЗапросТекст; Запрос.УстановитьПараметр("Ссылка",ЗапросСсылка); Запрос.УстановитьПараметр("Организация",ЗапросОрганизация); Запрос.УстановитьПараметр("КонПериода",ЗапросПериод); Запрос.УстановитьПараметр("Счет",ЗапросСчет); Зап = Запрос.Выполнить(); Возврат Зап; КонецФункции //Получаем предыдущую дату Функция ЗапросПолучитьДату (ЗапросСсылка, ЗапросОрганизация, ЗапросПериод, ЗапросСчет) Период = "И | Период В | (Выбрать Максимум (ПоследняяДата.Период) | КАК Период | ИЗ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты | ( | , | &КонПериода, | Регистратор, | Движения, | Счет = &Счет, | , | Организация = &Организация | И Субконто1 В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РеализацияТоваровУслугТовары.Номенклатура | ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары | ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &Ссылка)) КАК ПоследняяДата)"; Фильтр = "Выбрать * ИЗ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты |( |, |&КонПериода, |Регистратор, |Движения, |Счет = &Счет, |, |Организация = &Организация |И Субконто1 В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РеализацияТоваровУслугТовары.Номенклатура | ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары | ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &Ссылка )) | ГДЕ КоличествоКонечныйОстаток > 0 " + Период; ЗапросТекст = Фильтр; Запрос = Новый Запрос; Запрос.Текст = ЗапросТекст; Запрос.УстановитьПараметр("Ссылка",ЗапросСсылка); Запрос.УстановитьПараметр("Организация",ЗапросОрганизация); Запрос.УстановитьПараметр("КонПериода",ЗапросПериод); Запрос.УстановитьПараметр("Счет",ЗапросСчет); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл ЛастДата = Результат.Период - 1; КонецЦикла; Возврат ЛастДата; КонецФункции Все хорошо, работает.. но не всегда. ЗАкоментил немного - может понятнее будет. Вот в чем проблема - находит ГТД с 0 остатком. В консоли запросов проверил - действительно остаток есть. А в оборотно-сальдовой ведомости - нету. Скрины: http://imglink.ru/show-image.php?id=4a1112d19c508a732dbffbedfea823cd Запрос к регистру бухгалтерии http://imglink.ru/show-image.php?id=ada107ec25c55ac8fd3d1ab7ba3f3137 ОСВ В общем получается в запросе получаю что остаток есть, в оборотно-сальдовой ведомостью - что нету.. поэтому обработка не всегда правильно выполняется и пишет не те помера ГТД... ПОдскажите как правильно найти остатки товаров по ГТД.. я в программировании недавно, в бухгалтерии тоже не ахти.. и подсказать некому.. Плиз |
|||
1
and2
19.06.12
✎
16:24
|
имхо, какая то каша.
зачем остаток ГТД 0? имхо, надо сравнивать приход по счету ГТД и наличие документов ГТД по импорту. |
|||
2
Dionis Sergeevich
19.06.12
✎
16:32
|
всмысле я беру за основу тч документа РеализацияТоваровИУслуг с незаполненной в ручную ГТД, получаю данные из регистра бухгалтерии и пишу туда же - уже с ГТД, с разбивкой по количеству имеющегося товара с определенным ГТД. ГТД с 0 остатком не проходят "ГДЕ КоличествоКонечныйОстаток > 0" Остатки беру из Регистра бухгалтерии, ОстаткиИОбороты.КоличествоКонечныйОстаток...
Беда в том что там остаток есть - на первом скрине видно... в по тем же ппараметрам в оборотно-сальдовой ведомости остатка нет. Значит я не правильно или не там беру остатки... Все работает когда в наличии есть необходимое количество товара - по гтд разбивает, все правильно выполняется.. но если остатка нет - он находит ГТД на котором судя по результату запроса остаток есть.. но по факту его нету(( я не там видимо получаю остаток... Думаю зачем сравнивать приходы по ГТД - в регистре же должны быть данные по имеющемуся количеству на текущую дату |
|||
3
Dionis Sergeevich
19.06.12
✎
17:05
|
чуть-чуть разобрался... Чтоб получить предыдущую ГТД я сокращаю период.. изменяя Конец периода. А на этот период остатки еще имеются по данному ГТД. фак. Надо придумать другой способ получить предыдущую ГТД по товару
|
|||
4
Dionis Sergeevich
19.06.12
✎
18:39
|
разобрался.. все не так делал.. хз переделывать с 0 помоему проще будет чем пытаться исправить
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |