|
Как быстро програмно найти документ созданный на основании | ☑ | ||
---|---|---|---|---|
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) Любое чтение данных из базы - это запрос.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |