gifts2017

Выбор Движений документа по конкретному регистру, с помощью прямого запроса

Опубликовал Vitalya Гуляев (Vix) в раздел Программирование - Практика программирования

Чтобы узнать какие движения сделал документ по конкретному регистру, в моем случае это регистр "ОстаткиПоСчетам" (оборотный), была написана следующая функция в глобальном модуле. Работает только для SQL версии и установленной внешнй компонентой 1С++!

 

 

 

 

Перем RSДвиж Экспорт ;

Функция глВыбратьДвиженияДокумента(ВыбДок,ВыбСклад="") Экспорт
 Перем ТЗ;
 RSДвиж = СоздатьОбъект("ODBCRecordset");
 ТекстЗапроса = "
 |SELECT
 |    Рег.IDDoc as [Док $Документ],
 |    Жур.IDDocDef as Док_вид,
 |    $Рег.Склад as [Склад $Справочник.Склады],
 |    $Рег.Количество        as Количество,
 |    $Рег.Отгружено         as Отгружено,
 |    $Рег.Зарезервировано   as Зарезервировано,
 |    $Рег.НаСборку          as НаСборку,
 |    $Рег.Собрано           as Собрано,
 |    $Рег.ОтгруженоПоСкладу as ОтгруженоПоСкладу
 |FROM
 |    $Регистр.ОстаткиПоСчетам as Рег
 |INNER JOIN
 |    _1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc
 |WHERE {Условие}
// |    Рег.IDDoc = :ВыбДок AND $Рег.Склад = :ВыбСклад
 |";
 Если ВыбСклад <> "" Тогда
        стр = "Рег.IDDoc = :ВыбДок AND $Рег.Склад = :ВыбСклад AND (Жур.ISMARK<=?)";
 Иначе
  стр = "Рег.IDDoc = :ВыбДок AND (Жур.ISMARK<=?)";
 КонецЕсли;
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "{Условие}", стр) ;
    RSДвиж.УстановитьТекстовыйПараметр("ВыбДок",ВыбДок);
 RSДвиж.УстановитьТекстовыйПараметр("ВыбСклад",ВыбСклад);
 ТЗ = RSДвиж.ВыполнитьИнструкцию(ТекстЗапроса);
 ТЗ.Свернуть("Док","Количество,Отгружено,Зарезервировано,НаСборку,Собрано,ОтгруженоПоСкладу");
 Если  ПустоеЗначение(ТЗ) = 1 Тогда
  Возврат 0;
 Иначе
    Возврат ТЗ
    КонецЕсли;  
КонецФункции

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алексей Плутенко (Noy) 26.05.11 13:11
ээээ...
конечно похвально использование прямых запросов, но зачем же постить банальную и абсолютно не универсальную функцию???

вот так не проще?
Функция ПолучитьДвиженияДокументаПоРегистру(Док,Рег) //Док - ссылка, Рег - идентификатор регистра
Запрос = СоздатьОбъект("ODBCRecordset");
МетаДатаВорк=СоздатьОбъект("MetaDataWork");
ТекстЗапроса = "SELECT * FROM $Регистр."+Рег+" where IDDoc = '"+МетаДатаВорк.ЗначениеВСтрокуБД(Док)+"'";
Запрос.АвтоТипизация(1);
ТЗ=СоздатьОбъект("ТаблицаЗначений");
Запрос.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ);
Возврат ТЗ;
КонецФункции // ПолучитьДвиженияДокументаПоРегистру

2. Vitalya Гуляев (Vix) 26.05.11 13:44
(1)каждый с чегото начинает, и не сразу может сесть и поехать на велосипеде, я только начал осваивать прямые запросы, и первое, что захотел сделать это избавиться от стандартных 1С решений, пусть это является пока не универсальным решением, а для узкой задачи, но все же нашло применение в моем случае. За ваш униварсальный вариант, конечно +5. :) Но я бы к этому универсальному варианту добавил вывод не идентификаторов обектов, а сразу имена. В данном случае вывести документ с именем.

Функция ПолучитьДвиженияДокументаПоРегистру(Док,Рег) Экспорт//Док - ссылка, Рег - идентификатор регистра
Запрос = СоздатьОбъект("ODBCRecordset");
МетаДатаВорк=СоздатьОбъект("MetaDataWork");
ТекстЗапроса = "
|SELECT Рег.IDDoc as [Док $Документ],
| Жур.IDDocDef as Док_вид,
| *
|FROM $Регистр."+Рег+" as Рег
|INNER JOIN
| _1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc
|WHERE Рег.IDDoc = '"+МетаДатаВорк.ЗначениеВСтрокуБД(Док)+"'
|";
Запрос .АвтоТипизация(1);
ТЗ=СоздатьОбъект("ТаблицаЗначений");
Запрос .ВыполнитьИнструкцию(ТекстЗапроса,ТЗ);
Возврат ТЗ;
КонецФункции // ПолучитьДвиженияДокументаПоРегистру
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа