8.х Расшифровка по видам реализации запросом

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Yury, 7 июн 2012.

  1. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Здравствуйте,


    задача такая: Конфигурация БП. Нужно вытащить из регистра бухгалтерии суммы по налоговому учету в разрезе номенклатуры и видов реализации. Вытащить суммы просто -- это выбрать сумму по проводкам Д62.01(62.21, 62.31) К90.01.1, но из этой проводки не понятно какой товар продан, свой или покупной. Поэтому необходимо увязать эту проводку по регистратору и субконто (номенклатуре) с проводками типа Д90.02.1 К41.01(20, 43, 45.01). И уже по корреспонденции этих счетов можно судить что за товар продан. В результате родился вот такой тормозной запрос:
    Код:
     Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    | А.Период,
    | А.Регистратор,
    | А.СчетДт КАК Дт90021,
    | А.СчетКт КАК Кт41_43,
    | А.СубконтоКт1 КАК Номенклатура,
    | Б.Период,
    | Б.Регистратор,
    | Б.СчетДт КАК Дт6201_6221,
    | Б.СчетКт КАК Кт90011,
    | Б.СубконтоКт3 КАК Номенклатура1,
    | Б.СуммаНУКт КАК СуммаПоПроводке
    |ИЗ
    |  РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК А,
    | РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК Б
    |ГДЕ
    | Б.СчетКт В (&СчКт90011)
    | И Б.СчетДт В (&СчДт6201_6221)
    | И Б.Период МЕЖДУ &НачДата И &КонДата
    | И А.СчетКт В (&СчКт41_43)
    | И А.СчетДт В (&СчДт90021)
    | И А.Период МЕЖДУ &НачДата И &КонДата
    | И А.Регистратор = Б.Регистратор
    | И А.СубконтоКт1 = Б.СубконтоКт3
    |ОБЪЕДИНИТЬ
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    | А.Период,
    | А.Регистратор,
    | А.СчетДт КАК Дт90021,
    | А.СчетКт КАК Кт41_43,
    | А.СубконтоКт2 КАК Номенклатура,
    | Б.Период,
    | Б.Регистратор,
    | Б.СчетДт КАК Дт6201_6221,
    | Б.СчетКт КАК Кт90011,
    | Б.СубконтоКт3 КАК Номенклатура1,
    | Б.СуммаНУКт КАК СуммаПоПроводке
    |ИЗ
    |  РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК А,
    | РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК Б
    |ГДЕ
    | Б.СчетКт В (&СчКт90011)
    | И Б.СчетДт В (&СчДт6201_6221)
    | И Б.Период МЕЖДУ &НачДата И &КонДата
    | И А.СчетКт В (&СчКт45)
    | И А.СчетДт В (&СчДт90021)
    | И А.Период МЕЖДУ &НачДата И &КонДата
    | И А.Регистратор = Б.Регистратор
    | И А.СубконтоКт2 = Б.СубконтоКт3
    |УПОРЯДОЧИТЬ ПО
    | А.Период";
    //
    Запрос.УстановитьПараметр("НачДата", НачПериода);
    Запрос.УстановитьПараметр("КонДата", КонецДня(КонПериода));
    
    СписокСчетов90011 = Новый Массив;
    СписокСчетов90011.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.01.1"));
    Запрос.УстановитьПараметр("СчКт90011", СписокСчетов90011);
    //
    СписокСчетов6201_6221 = Новый Массив;
    СписокСчетов6201_6221.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01"));
    СписокСчетов6201_6221.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.21"));
    СписокСчетов6201_6221.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.31"));
    Запрос.УстановитьПараметр("СчДт6201_6221", СписокСчетов6201_6221);
    //
    СписокСчетов41_43 = Новый Массив;
    СписокСчетов41_43.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.02"));
    СписокСчетов41_43.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01"));
    СписокСчетов41_43.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("43"));
    Запрос.УстановитьПараметр("СчКт41_43", СписокСчетов41_43);
    //
    СписокСчетов45 = Новый Массив;
    СписокСчетов45.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("45.01"));
    Запрос.УстановитьПараметр("СчКт45", СписокСчетов45);
    
    //
    СписокСчетов90021 = Новый Массив;
    СписокСчетов90021.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1"));
    Запрос.УстановитьПараметр("СчДт90021", СписокСчетов90021);
    //
    ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
    
    Хотелось бы спросить как можно опимизировать запрос или алгоритм, чтобы уменьшить время выполнения.
  2. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    На первый взгляд. 1) "Различные" тормозят выполнение 2) Объединение тоже.
    Постарайтесь переписать запрос без использования объединения и различные. А в соединении старайтесь не использовать полное соединение. И пользуйтесь временными таблицами. Я думаю, на порядок увеличится скорость.
  3. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Так вот по 1), если не использовать различные, то задваиваются суммы в ряде случаев (когда товар списывается со склада не польностью, например), т.е. на проводку Д62.01(62.21, 62.31) К90.01.1 существует более одной проводки типа Д90.02.1 К41.01(20, 43, 45.01). По второму, не знаю как избежать объединения запросов? Объединяю потому-что у 45.01 номенклатура не первое субконто, а второе.
    Как прикрутить ТЗ к запросу технически я знаю. Менеджер временных таблиц и передача в запрос ТЗ как параметр. Я не знаю как их сюда прикрутить.

Поделиться этой страницей