Имя: Пароль:
1C
1С v8
Запрос: не закрытые авансы
0 листопад
 
30.08.14
18:57
БП 3.0
Пишу обработку, на которой размещены две кнопки:
1) "Заполнить", выполняется процедура ЗаполнитьНаСервереОстаток(), которая собирает остаток по счету 62.02 на дату и заполняет полученными данными (док-тами "ПоступлениеНаРСчет") табличную часть на форме обработки.
2) "Создать", создаются док-ты РТиУ, т.е. авансы закрываем. При этом, поставила условие, на наличие документов "Реализация товаров и услуг".

Вопрос, как условие проверки наличия документов "Реализация товаров и услуг" перенести в первую процедуру ЗаполнитьНаСервереОстаток(), чтобы в табличную часть на форме обработки сразу попадали только те объекты, у которых нет созданных ранее док-тов РТиУ?

P.S. Наша специфика заключается в том, что всегда по определенному контрагенту и договору соблюдается связь по договору: ПоступлениеНаРСчет - РТиУ. Т.е. в обработке я ищу не закрытые авансы и создаю док-ты реализации к ним.

Вот код:



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


&НаКлиенте
Процедура Сформировать()
    СформироватьНаСервере()
КонецПроцедуры

&НаСервере
Процедура СформироватьНаСервере()
    
    Для Каждого СписокД Из Объект.СписокДокументов Цикл
        Если СписокД.Флажок = Истина Тогда  
            Для Каждого Строка из СписокД.ДокСсылка.РасшифровкаПлатежа Цикл
                
                ИндексТекСтроки = Объект.СписокДокументов.Индекс(СписокД);  
                
                //Проверка наличия документов "Реализация товаров и услуг"
                //Вот это условие надо вынести в процедуру ЗаполнитьНаСервереОстаток()
                Запрос = Новый Запрос("ВЫБРАТЬ
                |    РеализацияТоваровУслуг.ДоговорКонтрагента,
                |    СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаДокумента
                |ИЗ
                |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                |ГДЕ
                |    РеализацияТоваровУслуг.ДоговорКонтрагента = &ДоговорКонтрагента
                |    И РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ
                |СГРУППИРОВАТЬ ПО
                |    РеализацияТоваровУслуг.ДоговорКонтрагента");
                Запрос.УстановитьПараметр("ДоговорКонтрагента", СписокД.ДокССылка.ДоговорКонтрагента);
                Результат = Запрос.Выполнить().Выбрать();
                
                Если Результат.Следующий() = Ложь Тогда
                    
                    //создание документа Реализация товаров и услуг
                    НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
                    НовыйДокумент.Записать();
                Иначе
                    Сообщение = Новый СообщениеПользователю;
                    Сообщение.Текст = Строка(СписокД.Ссылка) + " - реализация была создана ранее!";
                    Сообщение.Сообщить();
                    
                    Объект.СписокДокументов.Удалить(ИндексТекСтроки);    
                    
                КонецЕсли;
                
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры // СформироватьНаСервере()
1 Otkr
 
30.08.14
19:07
Передавай на сервер список значений договоров
2 листопад
 
30.08.14
19:16
(1) Мне непонятно, как изменить команду:
Объект.СписокДокументов.Загрузить(Запрос.Выполнить().Выгрузить());

Где СписокДокументов - это табличная часть на форме обработки.
3 листопад
 
30.08.14
22:57
HELP!!! Выложила обработку на https://yadi.sk/d/vEglGiiGai2LF
Помогите пож-та!!! Как исправить мой запрос, о чем я написала в (0) !!!
4 листопад
 
30.08.14
23:28
Ап!
5 листопад
 
01.09.14
00:27
Up!!!
6 dubraver
 
01.09.14
10:07
По поводу текста первого запроса.
1. Условие  
"ГДЕ ХозрасчетныйОстатки.Организация = &Организация"
переместить в "РегистрБухгалтерии.Хозрасчетный.Остатки(,,Организация = &Организация)"
2. Не нужно вытаскивать ссылку на субконто таким образом "ХозрасчетныйОстатки.Субконто1.Ссылка". Данную конструкцию 1С генерирует в "тяжелый" sql запрос, в чем можно убедиться в SQL profiler. При выборке больших объемов данных такой запрос может сильно нагрузить сервер.