fixin (fixin) wrote,
fixin
fixin

Categories:

Ужасы 1С

Для тех, кто хочет посмотреть реально сложный запрос в 1С, предлагаю код запроса по АВС-анализу продаж в УТ 10.3, написанный лично мной с нуля.

Насладитесь и ужаснитесь, подаваны!


ВЫБРАТЬ

НастройкиABC.Группа КАК Группа,
 НастройкиABC.ПроцентА КАК ПроцентА,
 НастройкиABC.ПроцентБ КАК ПроцентБ,
 НастройкиABC.ПроцентЦ КАК ПроцентЦ,
 НастройкиABC.ВидОтчета КАК ВидОтчета,
 НастройкиABC.ВидРасчета КАК ВидРасчета,
 НастройкиABC.НаименованиеВОтчете КАК НаименованиеВОтчете
ПОМЕСТИТЬ ТГруппыABC
ИЗ
 РегистрСведений.НастройкиABC КАК НастройкиABC
ГДЕ
 НастройкиABC.ВидОтчета = &ВидОтчета
{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.ХарактеристикиНоменклатуры)
 СПИСОК ПланВидовХарактеристик.СвойстваОбъектов
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Представление
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ЗначенияСвойствОбъектов
 ОБЪЕКТ Объект
 ХАРАКТЕРИСТИКА Свойство
 ЗНАЧЕНИЕ Значение }
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
 ТГруппыABC.Группа
ПОМЕСТИТЬ ТИспользуемыеГруппы
ИЗ
 ТГруппыABC КАК ТГруппыABC
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ТИспользуемаяНоменклатура
ИЗ
 Справочник.Номенклатура КАК Номенклатура
ГДЕ
 Номенклатура.Ссылка В ИЕРАРХИИ
   (ВЫБРАТЬ
    ТИспользуемыеГруппы.Группа
   ИЗ
    ТИспользуемыеГруппы)
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ТИспользуемаяНоменклатура.Номенклатура,
 ВЫБОР
  КОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель В
    (ВЫБРАТЬ
     ТИспользуемыеГруппы.Группа
    ИЗ
     ТИспользуемыеГруппы)
   ТОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель
  КОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель В
    (ВЫБРАТЬ
     ТИспользуемыеГруппы.Группа
    ИЗ
     ТИспользуемыеГруппы)
   ТОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель
  КОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель.Родитель В
    (ВЫБРАТЬ
     ТИспользуемыеГруппы.Группа
    ИЗ
     ТИспользуемыеГруппы)
   ТОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель.Родитель
  КОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель.Родитель.Родитель В
    (ВЫБРАТЬ
     ТИспользуемыеГруппы.Группа
    ИЗ
     ТИспользуемыеГруппы)
   ТОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель.Родитель.Родитель
  КОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель В
    (ВЫБРАТЬ
     ТИспользуемыеГруппы.Группа
    ИЗ
     ТИспользуемыеГруппы)
   ТОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
  КОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель В
    (ВЫБРАТЬ
     ТИспользуемыеГруппы.Группа
    ИЗ
     ТИспользуемыеГруппы)
   ТОГДА ТИспользуемаяНоменклатура.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
  ИНАЧЕ НЕОПРЕДЕЛЕНО
 КОНЕЦ КАК Группа
ПОМЕСТИТЬ ТГруппыНоменклатуры
ИЗ
 ТИспользуемаяНоменклатура КАК ТИспользуемаяНоменклатура
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ЕСТЬNULL(ТоварыВРозницеОстатки.Номенклатура, ТоварыНаСкладахОстатки.Номенклатура) КАК Номенклатура,
 ЕСТЬNULL(ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры, ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатуры,
 ЕСТЬNULL(ТоварыВРозницеОстатки.КоличествоОстаток, 0) + ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Количество,
 (ЕСТЬNULL(ТоварыВРозницеОстатки.КоличествоОстаток, 0) + ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)) * ВЫБОР
  КОГДА ТОстаткиПартий.КоличествоОстаток = 0
   ТОГДА 0
  ИНАЧЕ ТОстаткиПартий.СтоимостьОстаток / ТОстаткиПартий.КоличествоОстаток
 КОНЕЦ КАК Стоимость
ПОМЕСТИТЬ ТОстатки
ИЗ
 РегистрНакопления.ТоварыНаСкладах.Остатки(
   &КонецПериода,
   Номенклатура В
    (ВЫБРАТЬ
     ТИспользуемаяНоменклатура.Номенклатура
    ИЗ
     ТИспользуемаяНоменклатура) {(Номенклатура).* КАК Номенклатура, (Склад).* КАК СкладДляОтбора}) КАК ТоварыНаСкладахОстатки
  ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРознице.Остатки(
    &КонецПериода,
    Номенклатура В
     (ВЫБРАТЬ
      ТИспользуемаяНоменклатура.Номенклатура
     ИЗ
      ТИспользуемаяНоменклатура) {(Номенклатура).* КАК Номенклатура, (Склад).* КАК СкладДляОтбора}) КАК ТоварыВРозницеОстатки
  ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРозницеОстатки.Номенклатура
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
    &КонецПериода,
    Номенклатура В
     (ВЫБРАТЬ
      ТИспользуемаяНоменклатура.Номенклатура
     ИЗ
      ТИспользуемаяНоменклатура) {(Номенклатура).* КАК Номенклатура}) КАК ТОстаткиПартий
  ПО (ЕСТЬNULL(ТоварыВРозницеОстатки.Номенклатура, ТоварыНаСкладахОстатки.Номенклатура) = ТОстаткиПартий.Номенклатура)
   И (ЕСТЬNULL(ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры, ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры) = ТОстаткиПартий.ХарактеристикаНоменклатуры)
ГДЕ
 ЕСТЬNULL(ТоварыВРозницеОстатки.КоличествоОстаток, 0) + ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) > 0
{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура, Справочник.ХарактеристикиНоменклатуры)
 СПИСОК ПланВидовХарактеристик.СвойстваОбъектов
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Представление
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ЗначенияСвойствОбъектов
 ОБЪЕКТ Объект
 ХАРАКТЕРИСТИКА Свойство
 ЗНАЧЕНИЕ Значение }
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество,
 СУММА(ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) - ЕСТЬNULL(ПродажиОбороты.НДСОборот, 0)) КАК СтоимостьБезНДС,
 СУММА(ЕСТЬNULL(ПродажиОбороты.НДСОборот, 0)) КАК НДС,
 СУММА(ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0)) КАК Стоимость,
 ПродажиОбороты.Номенклатура КАК Номенклатура,
 ПродажиОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
ПОМЕСТИТЬ ТПродажи
ИЗ
 РегистрНакопления.Продажи.Обороты(
   &НачалоПериода,
   &КонецПериода,
   ,
   Номенклатура В
    (ВЫБРАТЬ
     ТИспользуемаяНоменклатура.Номенклатура
    ИЗ
     ТИспользуемаяНоменклатура) {(Организация).* КАК Организация, (Проект).* КАК Проект, (Подразделение).* КАК Подразделение, (Контрагент).* КАК Покупатель, (ДоговорКонтрагента).* КАК ДоговорПокупателя, (Номенклатура).* КАК Номенклатура, (ХарактеристикаНоменклатуры).* КАК ХарактеристикаНоменклатуры, (ЗаказПокупателя).* КАК ЗаказПокупателя}) КАК ПродажиОбороты


СГРУППИРОВАТЬ ПО
 ПродажиОбороты.Номенклатура,
 ПродажиОбороты.ХарактеристикаНоменклатуры
{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура, Справочник.ХарактеристикиНоменклатуры)
 СПИСОК ПланВидовХарактеристик.СвойстваОбъектов
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Представление
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ЗначенияСвойствОбъектов
 ОБЪЕКТ Объект
 ХАРАКТЕРИСТИКА Свойство
 ЗНАЧЕНИЕ Значение }
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ПродажиСебестоимость.Номенклатура КАК Номенклатура,
 ПродажиСебестоимость.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
 СУММА(ПродажиСебестоимость.Стоимость) КАК Стоимость
ПОМЕСТИТЬ ТСебестоимость
ИЗ
 РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
ГДЕ
 ПродажиСебестоимость.Период МЕЖДУ &НачалоПериода И &КонецПериода
 И ПродажиСебестоимость.Номенклатура В
   (ВЫБРАТЬ
    ТИспользуемаяНоменклатура.Номенклатура
   ИЗ
    ТИспользуемаяНоменклатура)
{ГДЕ
 ПродажиСебестоимость.Номенклатура.* КАК Номенклатура,
 ПродажиСебестоимость.ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры}


СГРУППИРОВАТЬ ПО
 ПродажиСебестоимость.Номенклатура,
 ПродажиСебестоимость.ХарактеристикаНоменклатуры
{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура, Справочник.ХарактеристикиНоменклатуры)
 СПИСОК ПланВидовХарактеристик.СвойстваОбъектов
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Представление
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ЗначенияСвойствОбъектов
 ОБЪЕКТ Объект
 ХАРАКТЕРИСТИКА Свойство
 ЗНАЧЕНИЕ Значение }
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ЕСТЬNULL(ТСебестоимость.Номенклатура, ЕСТЬNULL(ТОстатки.Номенклатура, ТПродажи.Номенклатура)) КАК Номенклатура,
 ЕСТЬNULL(ТПродажи.Количество, 0) КАК КоличествоПродажи,
 ВЫБОР
  КОГДА ТГруппыABC.ВидРасчета = ЗНАЧЕНИЕ(Перечисление.ВидыРасчетаАБЦ.ПоВаловойПрибыли)
   ТОГДА ВЫБОР
     КОГДА ЕСТЬNULL(ТПродажи.Стоимость, 0) - ЕСТЬNULL(ТСебестоимость.Стоимость, 0) < 0
      ТОГДА 0
     ИНАЧЕ ЕСТЬNULL(ТПродажи.Стоимость, 0) - ЕСТЬNULL(ТСебестоимость.Стоимость, 0)
    КОНЕЦ
  КОГДА ТГруппыABC.ВидРасчета = ЗНАЧЕНИЕ(Перечисление.ВидыРасчетаАБЦ.ПоСумме)
   ТОГДА ВЫБОР
     КОГДА ЕСТЬNULL(ТПродажи.Стоимость, 0) < 0
      ТОГДА 0
     ИНАЧЕ ЕСТЬNULL(ТПродажи.Стоимость, 0)
    КОНЕЦ
  ИНАЧЕ ВЫБОР
    КОГДА ЕСТЬNULL(ТПродажи.Количество, 0) < 0
     ТОГДА 0
    ИНАЧЕ ЕСТЬNULL(ТПродажи.Количество, 0)
   КОНЕЦ
 КОНЕЦ КАК Показатель,
 ЕСТЬNULL(ТПродажи.СтоимостьБезНДС, 0) КАК СтоимостьПродажиБезНДС,
 ЕСТЬNULL(ТПродажи.НДС, 0) КАК НДСПродажи,
 ЕСТЬNULL(ТОстатки.Количество, 0) КАК Остаток,
 ЕСТЬNULL(ТСебестоимость.Стоимость, 0) КАК СебестоимостьПродажи,
 ЕСТЬNULL(ТОстатки.Стоимость, 0) КАК СтоимостьОстатка,
 ЕСТЬNULL(ТПродажи.Стоимость, 0) - ЕСТЬNULL(ТСебестоимость.Стоимость, 0) КАК ПрибыльПродажи,
 ВЫБОР
  КОГДА ЕСТЬNULL(ТПродажи.Количество, 0) = 0
   ТОГДА 0
  ИНАЧЕ ЕСТЬNULL(ТОстатки.Количество, 0) / ЕСТЬNULL(ТПродажи.Количество, 0)
 КОНЕЦ КАК Эффективность,
 ЕСТЬNULL(ТПродажи.Стоимость, 0) КАК СтоимостьПродажи,
 ТГруппыНоменклатуры.Группа
ПОМЕСТИТЬ ТДанные
ИЗ
 ТОстатки КАК ТОстатки
  ПОЛНОЕ СОЕДИНЕНИЕ ТПродажи КАК ТПродажи
  ПО ТОстатки.Номенклатура = ТПродажи.Номенклатура
   И ТОстатки.ХарактеристикаНоменклатуры = ТПродажи.ХарактеристикаНоменклатуры
  ПОЛНОЕ СОЕДИНЕНИЕ ТСебестоимость КАК ТСебестоимость
  ПО (ЕСТЬNULL(ТОстатки.Номенклатура, ТПродажи.Номенклатура) = ТСебестоимость.Номенклатура)
   И (ЕСТЬNULL(ТОстатки.ХарактеристикаНоменклатуры, ТПродажи.ХарактеристикаНоменклатуры) = ТСебестоимость.ХарактеристикаНоменклатуры)
  ЛЕВОЕ СОЕДИНЕНИЕ ТГруппыНоменклатуры КАК ТГруппыНоменклатуры
  ПО (ЕСТЬNULL(ТСебестоимость.Номенклатура, ЕСТЬNULL(ТОстатки.Номенклатура, ТПродажи.Номенклатура)) = ТГруппыНоменклатуры.Номенклатура)
  ЛЕВОЕ СОЕДИНЕНИЕ ТГруппыABC КАК ТГруппыABC
  ПО (ТГруппыНоменклатуры.Группа = ТГруппыABC.Группа)
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ТДанные1.Группа,
 ТДанные1.Номенклатура,
 МАКСИМУМ(ТДанныеИтого.ПоказательИтого) КАК ПоказательИтого,
 СУММА(ТДанные2.Показатель) КАК Показатель,
 МАКСИМУМ(ТДанныеИтого.ПоказательИтого * ТГруппыABC.ПроцентА / 100) КАК ПоказательA,
 МАКСИМУМ(ТДанныеИтого.ПоказательИтого * (ТГруппыABC.ПроцентА + ТГруппыABC.ПроцентБ) / 100) КАК ПоказательB,
 ВЫБОР
  КОГДА МАКСИМУМ(ТДанныеИтого.ПоказательИтого) = 0
   ТОГДА "Группа C"
  КОГДА СУММА(ТДанные2.Показатель) <= МАКСИМУМ(ТДанныеИтого.ПоказательИтого * ТГруппыABC.ПроцентА / 100)
   ТОГДА "Группа A"
  КОГДА СУММА(ТДанные2.Показатель) <= МАКСИМУМ(ТДанныеИтого.ПоказательИтого * (ТГруппыABC.ПроцентА + ТГруппыABC.ПроцентБ) / 100)
   ТОГДА "Группа B"
  ИНАЧЕ "Группа C"
 КОНЕЦ КАК ГруппаABC
ПОМЕСТИТЬ ТРасчетABC
ИЗ
 ТДанные КАК ТДанные1
  ЛЕВОЕ СОЕДИНЕНИЕ ТДанные КАК ТДанные2
  ПО (ТДанные2.Показатель > ТДанные1.Показатель
    ИЛИ ТДанные2.Показатель = ТДанные1.Показатель
     И ТДанные2.Номенклатура >= ТДанные1.Номенклатура)
   И ТДанные1.Группа = ТДанные2.Группа
  ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
   ТДанные.Группа КАК Группа,
   СУММА(ТДанные.Показатель) КАК ПоказательИтого
  ИЗ
   ТДанные КАК ТДанные
 
  СГРУППИРОВАТЬ ПО
   ТДанные.Группа) КАК ТДанныеИтого
  ПО ТДанные1.Группа = ТДанныеИтого.Группа
  ЛЕВОЕ СОЕДИНЕНИЕ ТГруппыABC КАК ТГруппыABC
  ПО (ТГруппыABC.Группа = ТДанные1.Группа)


СГРУППИРОВАТЬ ПО
 ТДанные1.Группа,
 ТДанные1.Номенклатура
;


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ТИспользуемаяНоменклатура.Номенклатура КАК Номенклатура,
 ТДанные.КоличествоПродажи,
 ТДанные.СтоимостьПродажиБезНДС,
 ТДанные.НДСПродажи,
 ТДанные.Остаток,
 ТДанные.СтоимостьОстатка,
 ТДанные.ПрибыльПродажи,
 ТДанные.СтоимостьПродажи,
 ТДанные.СебестоимостьПродажи,
 ТДанные.Эффективность,
 ТДанные.Группа,
 ЕСТЬNULL(ТРасчетABC.ГруппаABC, "Группа C") КАК ГруппаABC,
 ТДанные.Показатель,
 ТРасчетABC.Показатель КАК ПоказательABC,
 ТРасчетABC.ПоказательA,
 ТРасчетABC.ПоказательB,
 ТРасчетABC.ПоказательИтого,
 ВЫБОР
  КОГДА ТГруппыABC.НаименованиеВОтчете <> ""
   ТОГДА ТГруппыABC.НаименованиеВОтчете
  ИНАЧЕ ТДанные.Группа.Наименование
 КОНЕЦ КАК НаименованиеГруппы
ИЗ
 ТИспользуемаяНоменклатура КАК ТИспользуемаяНоменклатура
  ЛЕВОЕ СОЕДИНЕНИЕ ТДанные КАК ТДанные
  ПО ТИспользуемаяНоменклатура.Номенклатура = ТДанные.Номенклатура
  ЛЕВОЕ СОЕДИНЕНИЕ ТРасчетABC КАК ТРасчетABC
  ПО (ТРасчетABC.Номенклатура = ТДанные.Номенклатура)
  ЛЕВОЕ СОЕДИНЕНИЕ ТГруппыABC КАК ТГруппыABC
  ПО (ТГруппыABC.Группа = ТДанные.Группа)
ГДЕ
 ВЫБОР
   КОГДА &РасчитыватьТоварыБезПродаж
    ТОГДА ИСТИНА
   ИНАЧЕ (НЕ ТДанные.Номенклатура ЕСТЬ NULL )
  КОНЕЦ
{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.ХарактеристикиНоменклатуры)
 СПИСОК ПланВидовХарактеристик.СвойстваОбъектов
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Представление
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ЗначенияСвойствОбъектов
 ОБЪЕКТ Объект
 ХАРАКТЕРИСТИКА Свойство
 ЗНАЧЕНИЕ Значение }

Tags:
Subscribe
promo fixin december 31, 2037 16:57 1416
Buy for 30 tokens
UPD: Друзья, в августе 2019 года блог переехал на http://fixinchik.ru. Welcome! Добро пожаловать в журнал Осипова Сергея Александровича, известного также как Fixin и Гений 1С. Рекомендую ознакомиться с Часто Задаваемыми Вопросами обо мне. Что я хочу в подарок - список. Мой проект "…
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 28 comments