Имя: Пароль:
1C
1С v8
Заполнение ГТД. Проблема с остатками
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 помоему проще будет чем пытаться исправить
Основная теорема систематики: Новые системы плодят новые проблемы.