Имя: Пароль:
1C
1С v8
Как правильно переделать такой механизм?
0 SherifSP
 
06.08.13
12:23
Весь механизм занимает более 3 минут;
1. запросом получаем переплаты по контрагенту

//Получим таблицу переплат
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Организация,
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент,
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента КАК Договор,
    |    РеализацияТоваровУслуг.ТорговаяТочка КАК ТорговаяТочка,
    |    РеализацияТоваровУслуг.ТорговыйПредставитель КАК ТорговыйПредставитель,
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом КАК ДокументРасчетов,
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Дата КАК ДатаДокументаРасчетов,
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ВидРасчетовСКонтрагентом КАК ВидРасчетов,
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток КАК Сумма,
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Сделка,
    |    РеализацияТоваровУслуг.КомандаТорговогоПредставителя КАК КомандаТорговогоПредставителя,
    |    ЕСТЬNULL(РеализацияТоваровУслуг.Форма2, ИСТИНА) КАК Форма2,
    |    РеализацияТоваровУслуг.Ссылка КАК Реализация
    |ИЗ
    |    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(, ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПоставщиком)) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |        ПО ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент = РеализацияТоваровУслуг.Контрагент
    |            И (НАЧАЛОПЕРИОДА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Дата, ГОД) = НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ГОД))
    |            И (РеализацияТоваровУслуг.Номер ПОДОБНО ""%0"" + ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.НомерВходящегоДокумента)
    |ГДЕ
    |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток < 0
    |    И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом ССЫЛКА Документ.ПоступлениеТоваровУслуг
    |    И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.СкладОрдер = &СкладОрдер
    |
    |УПОРЯДОЧИТЬ ПО
    |    ДатаДокументаРасчетов";
    Запрос.УстановитьПараметр("СкладОрдер",ВыбСклад);
    ТаблицаПереплат = Запрос.Выполнить().Выгрузить();

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

А вот и сама функция ПолучитьТаблицуРН:

Функция ПолучитьТаблицуРН(ПриходныйДокумент,ТорговаяТочка)
    
    ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура
                   |ИЗ
                   |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                   |ГДЕ
                   |    ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = &Ссылка";
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("Ссылка",ПриходныйДокумент);
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат Неопределено;
    Иначе
        СписокТары = Результат.Выгрузить().ВыгрузитьКолонку("Номенклатура");
    КонецЕсли;
    
    
    ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    РеализацияТоваровУслугТовары.Ссылка КАК Ссылка
                   |ИЗ
                   |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                   |ГДЕ
                   |    РеализацияТоваровУслугТовары.Ссылка.ТорговаяТочка = &ТорговаяТочка
                   |    И РеализацияТоваровУслугТовары.Ссылка.Дата <= &Дата
                   |    И РеализацияТоваровУслугТовары.Ссылка.Проведен
                   |    И РеализацияТоваровУслугТовары.Номенклатура.ВидУпаковки.Тара В (&СписокТары)
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    РеализацияТоваровУслугТовары.Ссылка.Дата УБЫВ";    
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("Дата",КонецДня(ПриходныйДокумент.Дата));
    Запрос.УстановитьПараметр("ТорговаяТочка",ТорговаяТочка);
    Запрос.УстановитьПараметр("СписокТары",СписокТары);
    тз = Запрос.Выполнить().Выгрузить();
    
    ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Период КАК Период,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Регистратор,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.НомерСтроки,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Активность,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ВидДвижения,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДоговорКонтрагента КАК Договор,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Сделка,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ВидРасчетовСКонтрагентом,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Организация,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Контрагент,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.СуммаВзаиморасчетов,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом.КомандаТорговогоПредставителя КАК КомандаТорговогоПредставителя,
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом.ТорговыйПредставитель КАК ТорговыйПредставитель
                   |ИЗ
                   |    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов
                   |ГДЕ
                   |    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Регистратор В(&СписокРН)
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    Период УБЫВ";
    Запрос.Текст = ТекстЗапроса;              
    Запрос.УстановитьПараметр("СписокРН",тз.ВыгрузитьКолонку("Ссылка"));
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
1 SherifSP
 
06.08.13
12:28
+(0) 1. Думал выгрузить отдельно колонки параметров в массив;
     2. Функцию ПолучитьТаблицуРН вызывать перед циклом и по полученной тз искать строки
2 Cube
 
06.08.13
12:30
Тысяча запросов с кривой обработкой результата... Ты давай задачу опиши лучше...
В любом случае, нужно стараться решить всё одним запросом.
3 SherifSP
 
06.08.13
12:36
(2) Долго описывать, очень долго)
4 Cube
 
06.08.13
12:37
(3) То есть, описывать задачу ты не хочешь, но хочешь, чтобы народ прочитал твою портянку, сам разобрался что к чему и переделал всё за тебя? Ну что, похвально, настоящий адинэсник...
5 zladenuw
 
06.08.13
12:39
берешь типовой отчет взаиморасчетов и куришь его долго
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший