Имя: Пароль:
1C
1С v8
Как быстро програмно найти документ созданный на основании
0 picom
 
30.05.13
15:51
Допустим имеем документ А, на его основании был создан документ Б
В документе Б есть запись в реквизите Основание
...
Нужно в Документе А вывести строку о том что уже есть введенный документ на основании Б.
...
Вопрос, как корректно программно максимально быстро найти документ Б?
...
Варианты которые я знаю:
1. Перебирать запросом таблицу документа Б с параметром Документ А
2. Через Критерий отбора можно, с параметром Документ А
Как еще?
Причем для варианта 2 наверное надо реквизит сделать индексируемым...
1 ДенисЧ
 
30.05.13
15:52
в типовой торговле смотри глНайтиСчетФактуру
2 Frost616
 
30.05.13
15:53
(0) а почему перебирать таблицу?
3 Mitriy
 
30.05.13
15:54
запросом
4 picom
 
30.05.13
15:56
(1) а как там? скажите в двух словах, нет 1с щас под рукой
5 ДенисЧ
 
30.05.13
15:58
Функция НайтиПодчиненныйСчетФактуру(Знач ДокументСсылка, ВидДокумента = "СчетФактураВыданный", Отбор = Неопределено, ИсключитьИзВыборкиСФ = Неопределено, МетаданныеОснования = Неопределено) Экспорт

   Если не ЗначениеЗаполнено(ДокументСсылка) Тогда
       Возврат Неопределено;
   Иначе
       
       Если МетаданныеОснования = Неопределено Тогда
           МетаданныеОснования = ДокументСсылка.Метаданные();
       КонецЕсли;
       
       Если МетаданныеОснования.Реквизиты.Найти("ИспользоватьДокументРасчетовКакСчетФактуру") <> Неопределено
           И МетаданныеОснования.Реквизиты.Найти("РасчетныйДокумент") <> Неопределено
           И ДокументСсылка.ИспользоватьДокументРасчетовКакСчетФактуру Тогда
           Если Не ЗначениеЗаполнено(ДокументСсылка.РасчетныйДокумент) Тогда
               Возврат Неопределено;
           Иначе
               Если ТипЗнч(ДокументСсылка.РасчетныйДокумент) = Тип("ДокументСсылка.ВозвратТоваровОтПокупателя")
                   И Не ДокументСсылка.РасчетныйДокумент.ПокупателемВыставляетсяСчетФактураНаВозврат Тогда
                   ДокументСсылка = ДокументСсылка.РасчетныйДокумент.Сделка;
                   Если Не ЗначениеЗаполнено(ДокументСсылка) Тогда
                       Возврат Неопределено;
                   КонецЕсли;
                   МетаданныеОснования = ДокументСсылка.Метаданные();                    
               Иначе
                   ДокументСсылка = ДокументСсылка.РасчетныйДокумент;
                   МетаданныеОснования = ДокументСсылка.Метаданные();
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
       Если ВидДокумента = "СчетФактураПолученный"
           И МетаданныеОснования.Реквизиты.Найти("ПредъявленСчетФактура") <> Неопределено
           И ДокументСсылка.ПредъявленСчетФактура
           И Не ?(ТипЗнч(ИсключитьИзВыборкиСФ) = Тип("Массив"), ИсключитьИзВыборкиСФ.Найти(ДокументСсылка) <> Неопределено, ДокументСсылка = ИсключитьИзВыборкиСФ) Тогда
           Возврат ДокументСсылка;
       КонецЕсли;
       
   КонецЕсли;
   
   НайденныйДокумент = Неопределено;

   Запрос = Новый Запрос;

   // Установим параметры запроса
   Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);

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

   Если ВыборкаИзЗапроса.Следующий() Тогда
       НайденныйДокумент = ВыборкаИзЗапроса.Ссылка;
   КонецЕсли;

   Возврат НайденныйДокумент;

КонецФункции // НайтиПодчиненныйСчетФактуру()
6 picom
 
30.05.13
16:02
(5)
Т.е. перебор запросом документов Б по реквизиту Основание ?
7 picom
 
03.06.13
10:34
Все правильно в (6) ?
8 Defender aka LINN
 
03.06.13
10:38
(6) Не надо изобретать туманных понятий и пытаться их нам навязывать. "Перебор запросом" - это все равно, что "качение машиной"
9 picom
 
03.06.13
10:40
(8) Согласен, выразился не корректно. Получается что запросом по таблице с документами найти подчиненный документ быстрее, верно?
10 Defender aka LINN
 
03.06.13
10:45
(9) Любое чтение данных из базы - это запрос.