Налагаемые требования целостности, коды ошибок

Материал из ANT-Inform documentation
Версия от 11:57, 15 февраля 2013; Hubbitus (обсуждение | вклад) (Add for all headers codeX anchors)

Перейти к: навигация, поиск

Содержание

Следует обратить внимание, что запросы, приведенные в данном разделе, приводятся в информативных целях, для удобного поиска проблем импорта данных.

Также, запросы выбирают именно ошибочные, проблемные данные, а не данные, которые будут импортированы. То есть прежде всего элементы, требующие исправления.

Суть запросов, которыми выбираются указанные данные можно понять инвертировав условие в них, но фактические запросы в операциях Веб-сервиса как правило на много сложнее, учитывают дополнительные условия и нюансы.

Приведенные запросы, если явно не указано обратного, для каждого приведенного ограничения отбирают записи, не соответствующие ему. То есть в идеале, при отсутствии некорректных данных, каждый из запросов должен возвращать пустой результат.

Код 100. Территории (Регионы)

101. Все имена должны быть уникальными

SELECT
   Наименование
FROM
    Справочник.Территории
WHERE
   ПометкаУдаления = false
GROUP BY
   Наименование
HAVING
   COUNT(Наименование) > 1

102. Имена не могут быть пустыми

SELECT
    Наименование
FROM
    Справочник.Территории
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

Код 200. Районы

201. Каждый район должен быть привязан к одной и только одной территории

SELECT
    Ссылка,
    ПометкаУдаления,
    Владелец.Ссылка
FROM
    Справочник.Районы
WHERE
    ПометкаУдаления = false
    AND (
        Владелец.Ссылка IS NULL
        OR
        Владелец.Ссылка NOT IN (
            SELECT
                Ссылка
            FROM
                Справочник.Территории
            WHERE
                ПометкаУдаления = false
        )
    )

202. Все имена должны быть уникальны в пределах территории (региона)

SELECT
    Наименование,
    Владелец.Ссылка
FROM
    Справочник.Районы
WHERE
    ПометкаУдаления = false
GROUP BY
    Наименование, Владелец.Ссылка
HAVING
    COUNT(*) > 1

203. Имена не могут быть пустыми

SELECT
    Наименование,
    Владелец.Ссылка
FROM
    Справочник.Районы
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

Код 300. Справочник ОтраслиГазпрома

301. Все группы должны иметь уникальные имена

SELECT
    Наименование
FROM
    Справочник.ОтраслиГазпрома
WHERE
    ПометкаУдаления = false
    AND (Группа = ЗНАЧЕНИЕ(Справочник.ОтраслиГазпрома.ПустаяСсылка) OR Группа = Ссылка)
GROUP BY
    Наименование
HAVING
    COUNT(Наименование) > 1

302. Отрасль обязательно должна принадлежать одной и только одной группе

SELECT
    Ссылка,
    Группа.Ссылка,
    Наименование
FROM
    Справочник.ОтраслиГазпрома
WHERE
    ПометкаУдаления = false
    AND (
        Группа.Ссылка IS NULL
        OR
        Ссылка IN (
            SELECT
                Ссылка
            FROM
                Справочник.ОтраслиГазпрома
            WHERE
                ПометкаУдаления = false
            GROUP BY
                Ссылка
            HAVING COUNT(*) > 1
        )

303. Пустые имена не допускаются

SELECT
    Наименование
FROM
    Справочник.ОтраслиГазпрома
WHERE
    ПометкаУдаления = false
    AND (Группа = ЗНАЧЕНИЕ(Справочник.ОтраслиГазпрома.ПустаяСсылка) OR Группа = Ссылка)
    AND "" = ISNULL(Наименование, "")

Код 400. Потребители

Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей, Справочник.ДоговорыГазовые. В реальном веб-сервисе загрузка происходит из РегистрСведений.ПлощадкиПоДоговору.СрезПоследних(&CurrentDate), если он заполняется, с ЕстьСвязь. Если нет (не ведутся площадки в компании или установлена константа НеСвязыватьПлощадкуСДоговором), то из РегистрНакопления.ПланыПоставок, с планом на текущий день импорта, в том числе нулевым. Таким образом, представленные ниже запросы могут возвращать больше ошибок, чем в отчёте об ошибках импорта, но представлены, чтобы оставаться универсальными для обоих случаев.

К исправлению прежде всего предполагаются объекты, участвующие в загрузке и представленные в отчётах. Остальные ошибки, являясь ошибками по сути, не так важны для ИУС-ГАЗ и могут быть исправлены по желанию компании.

401. У каждого потребителя должна быть проставлена не удалённая отрасль

SELECT DISTINCT
    obj,
    industry,
    parent,
    region,
    deleted
FROM
    (
    SELECT
        ДоговорыГазовые.Владелец.Ссылка as obj,
        ДоговорыГазовые.Владелец.Наименование as name,
        ДоговорыГазовые.Владелец.ИНН as inn,
        ДоговорыГазовые.Владелец.ОтрасльГазпрома.Ссылка as industry,
        ДоговорыГазовые.Владелец.Родитель.Ссылка as parent,
        ДоговорыГазовые.Владелец.Территория.Ссылка as region,
        ДоговорыГазовые.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые as ДоговорыГазовые
    UNION
    SELECT
        РеестрКонечныхПотребителей.Контрагент.Ссылка as obj,
        РеестрКонечныхПотребителей.Контрагент.Наименование as name,
        РеестрКонечныхПотребителей.Контрагент.ИНН as inn,
        РеестрКонечныхПотребителей.Контрагент.ОтрасльГазпрома.Ссылка as industry,
        РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка as parent,
        РеестрКонечныхПотребителей.Контрагент.Территория.Ссылка as region,
        РеестрКонечныхПотребителей.Контрагент.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей as РеестрКонечныхПотребителей
    WHERE
        РеестрКонечныхПотребителей.Контрагент <> РеестрКонечныхПотребителей.Ссылка.Владелец
    ) as Выборка
WHERE
    industry IS NULL OR industry.ПометкаУдаления = true
ORDER BY parent

402. У каждого потребителя должна быть проставлена Территория (регион)

SELECT DISTINCT
    obj,
    name,
    inn,
    industry,
    parent,
    region,
    deleted
FROM
    (
    SELECT
        ДоговорыГазовые.Владелец.Ссылка as obj,
        ДоговорыГазовые.Владелец.Наименование as name,
        ДоговорыГазовые.Владелец.ИНН as inn,
        ДоговорыГазовые.Владелец.ОтрасльГазпрома.Ссылка as industry,
        ДоговорыГазовые.Владелец.Родитель.Ссылка as parent,
        ДоговорыГазовые.Владелец.Территория.Ссылка as region,
        ДоговорыГазовые.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые as ДоговорыГазовые
    UNION
    SELECT
        РеестрКонечныхПотребителей.Контрагент.Ссылка as obj,
        РеестрКонечныхПотребителей.Контрагент.Наименование as name,
        РеестрКонечныхПотребителей.Контрагент.ИНН as inn,
        РеестрКонечныхПотребителей.Контрагент.ОтрасльГазпрома.Ссылка as industry,
        РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка as parent,
        РеестрКонечныхПотребителей.Контрагент.Территория.Ссылка as region,
        РеестрКонечныхПотребителей.Контрагент.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей as РеестрКонечныхПотребителей
    WHERE
        РеестрКонечныхПотребителей.Контрагент <> РеестрКонечныхПотребителей.Ссылка.Владелец
    ) as Выборка
WHERE
    region IS NULL OR region.ПометкаУдаления = true
ORDER BY parent

403. Имя не может быть пустым

SELECT DISTINCT
    obj,
    name,
    inn,
    industry,
    parent,
    region,
    deleted
FROM
    (
    SELECT
        ДоговорыГазовые.Владелец.Ссылка as obj,
        ДоговорыГазовые.Владелец.Наименование as name,
        ДоговорыГазовые.Владелец.ИНН as inn,
        ДоговорыГазовые.Владелец.ОтрасльГазпрома.Ссылка as industry,
        ДоговорыГазовые.Владелец.Родитель.Ссылка as parent,
        ДоговорыГазовые.Владелец.Территория.Ссылка as region,
        ДоговорыГазовые.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые as ДоговорыГазовые
    UNION ALL
    SELECT
        РеестрКонечныхПотребителей.Контрагент.Ссылка as obj,
        РеестрКонечныхПотребителей.Контрагент.Наименование as name,
        РеестрКонечныхПотребителей.Контрагент.ИНН as inn,
        РеестрКонечныхПотребителей.Контрагент.ОтрасльГазпрома.Ссылка as industry,
        РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка as parent,
        РеестрКонечныхПотребителей.Контрагент.Территория.Ссылка as region,
        РеестрКонечныхПотребителей.Контрагент.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей as РеестрКонечныхПотребителей
    WHERE
        РеестрКонечныхПотребителей.Контрагент <> РеестрКонечныхПотребителей.Ссылка.Владелец
    ) as Выборка
WHERE
    "" = ISNULL(name, "")
ORDER BY parent

404. Не должно быть дублей (как минимум по ИНН)

SELECT DISTINCT
    Выборка.obj,
    COUNT(*) as count
FROM
    (
    SELECT
        ДоговорыГазовые.Владелец.Ссылка as obj,
        ДоговорыГазовые.Владелец.Наименование as name,
        ДоговорыГазовые.Владелец.ИНН as inn,
        ДоговорыГазовые.Владелец.ОтрасльГазпрома.Ссылка as industry,
        ДоговорыГазовые.Владелец.Родитель.Ссылка as parent,
        ДоговорыГазовые.Владелец.Территория.Ссылка as region,
        ДоговорыГазовые.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые as ДоговорыГазовые
    UNION
    SELECT
        РеестрКонечныхПотребителей.Контрагент.Ссылка as obj,
        РеестрКонечныхПотребителей.Контрагент.Наименование as name,
        РеестрКонечныхПотребителей.Контрагент.ИНН as inn,
        РеестрКонечныхПотребителей.Контрагент.ОтрасльГазпрома.Ссылка as industry,
        РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка as parent,
        РеестрКонечныхПотребителей.Контрагент.Территория.Ссылка as region,
        РеестрКонечныхПотребителей.Контрагент.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей as РеестрКонечныхПотребителей
    WHERE
        РеестрКонечныхПотребителей.Контрагент <> РеестрКонечныхПотребителей.Ссылка.Владелец
    ) as Выборка
ГДЕ
    Выборка.obj IS NOT NULL
GROUP BY
    Выборка.obj, name, inn, industry, parent, region, deleted
HAVING COUNT(*) > 1

405. У потребителя должен быть правильно проставлен родитель (или плательщик)

Причём он должен быть корректно проставлен в справочниках Справочник.ДоговорыГазовые и Справочник. Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей.

Объекты, которые изменяли своих родителей, переходили в подчинении от одного к другому, можно выбрать следующим запросом (внимание, не является ошибкой, стоит только обратить внимание и проверить, чтобы была верной текущая принадлежность потребителей):

SELECT DISTINCT
    Выборка.obj,
    Выборка.name,
    ISNULL(Выборка.inn, "Error:404:"),
    Выборка.industry,
    Выборка.parent,
    Выборка.region
FROM
    (
    SELECT
        ДоговорыГазовые.Владелец.Ссылка as obj,
        ДоговорыГазовые.Владелец.Наименование as name,
        ДоговорыГазовые.Владелец.ИНН as inn,
        ДоговорыГазовые.Владелец.ОтрасльГазпрома.Ссылка as industry,
        "" as parent,
        ДоговорыГазовые.Владелец.Территория.Ссылка as region,
        ДоговорыГазовые.Владелец.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые as ДоговорыГазовые
    GROUP BY
        ДоговорыГазовые.Владелец.Ссылка
    UNION ALL
    SELECT
        РеестрКонечныхПотребителей.Контрагент.Ссылка,
        РеестрКонечныхПотребителей.Контрагент.Наименование,
        РеестрКонечныхПотребителей.Контрагент.ИНН,
        РеестрКонечныхПотребителей.Контрагент.ОтрасльГазпрома.Ссылка,
        РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка,
        РеестрКонечныхПотребителей.Контрагент.Территория.Ссылка,
        РеестрКонечныхПотребителей.Контрагент.ПометкаУдаления as deleted
    FROM
        Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей as РеестрКонечныхПотребителей
    WHERE
        РеестрКонечныхПотребителей.Контрагент <> РеестрКонечныхПотребителей.Ссылка.Владелец
    GROUP BY
        РеестрКонечныхПотребителей.Контрагент.Ссылка,
        РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка
    ) as Выборка
WHERE
    Выборка.obj IS NOT NULL AND Выборка.deleted = false
    AND Выборка.obj IN(
        SELECT DISTINCT
            Выборка.obj
        FROM
            (
            SELECT
                ДоговорыГазовые.Владелец.Ссылка as obj,
                ДоговорыГазовые.Владелец.Наименование as name,
                ДоговорыГазовые.Владелец.ИНН as inn,
                ДоговорыГазовые.Владелец.ОтрасльГазпрома.Ссылка as industry,
                "" as parent,
                ДоговорыГазовые.Владелец.Территория.Ссылка as region,
                ДоговорыГазовые.Владелец.ПометкаУдаления as deleted
            FROM
                Справочник.ДоговорыГазовые as ДоговорыГазовые
            GROUP BY
                ДоговорыГазовые.Владелец.Ссылка
            UNION ALL
            SELECT
                РеестрКонечныхПотребителей.Контрагент.Ссылка,
                РеестрКонечныхПотребителей.Контрагент.Наименование,
                РеестрКонечныхПотребителей.Контрагент.ИНН,
                РеестрКонечныхПотребителей.Контрагент.ОтрасльГазпрома.Ссылка,
                РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка,
                РеестрКонечныхПотребителей.Контрагент.Территория.Ссылка,
                РеестрКонечныхПотребителей.Контрагент.ПометкаУдаления as deleted
            FROM
                Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей as РеестрКонечныхПотребителей
            WHERE
                РеестрКонечныхПотребителей.Контрагент <> РеестрКонечныхПотребителей.Ссылка.Владелец
            GROUP BY
                РеестрКонечныхПотребителей.Контрагент.Ссылка,
                РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка
        ) as Выборка
    WHERE
        Выборка.obj IS NOT NULL AND Выборка.deleted = false
    GROUP BY
        obj
    HAVING COUNT(*) > 1
    )
ORDER BY obj

Для выборки текущей принадлежности для загрузки в ИУС-ГАЗ в учёт берётся договор и используется следующий алгоритм:

  1. Приоритет по статусу, выбирается с наибольшим:
    1. «Расторгнут» — 0
    2. «Завершенный» — 1
    3. «Плановый» — 2
    4. «Предварительный» — 3
    5. Остальные — 10
  2. Затем идет сортировка по дате окончания договора — берется тот, у кого она больше.
  3. В последнюю очередь по дате начала договора (например, если дата окончания не указана).

Используются всегда все 3 признака. Таким образом, расторгнутый договор будет проигнорирован, даже если дата окончания его больше, чем у действующего. Если есть 2 договора с одинаковым статусом (например, действующие основной и дополнительное соглашение, или ошибочно 2) — возьмется тот, у которого дата окончания больше. Если в этом случае даты окончания пустые или равны — тот, у которого дата начала больше.

406. Если у потребителя есть родитель, он должен быть корректно загруженным

То есть соответствовать всем требованиям данного кода (40х). Тут нет запроса потому что его не бможет быть - требование рекурсивное для удовлетворения ссылок. Сначала загружаются родители - затем потомки.

Код 500. Газораспределительные организации (ГРО)

Берутся из справочника Справочник.Контрагенты, те объекты, у которых ПризнакТранспортировщика = true.

501. Обязательно должны быть проставлены регионы у всех

SELECT
    Ссылка as obj,
    Наименование as name,
    Территория.Ссылка as region
FROM
    Справочник.Контрагенты
WHERE
    ПометкаУдаления = false AND ПризнакТранспортировщика = true
    AND (Территория.Ссылка IS NULL OR Территория.ПометкаУдаления = true)

502. Не может быть дублей

SELECT
    Наименование,
    count(*) as count
FROM
    Справочник.Контрагенты
WHERE
    ПометкаУдаления = false AND ПризнакТранспортировщика = true
GROUP BY
    Наименование
HAVING
    COUNT(*) > 1

503. Имена должны быть не пустыми

SELECT
    Ссылка,
    Наименование,
    Территория.Ссылка
FROM
    Справочник.Контрагенты
WHERE
    ПометкаУдаления = false AND ПризнакТранспортировщика = true
    AND "" = ISNULL(Наименование, "")

Код 600. Газораспределительные станции (ГРС)

Справочник.ГРС.

601. Должны быть проставлены Территории (Субъекты РФ)

SELECT
    Ссылка as obj,
    Наименование as name,
    Территория.Ссылка as region,
    CASE WHEN "" = КодСДУ THEN 0 ELSE ISNULL(КодСДУ, 0) END as codeSDU,
    Трансгаз.КодСДУ as tgSDU
FROM
    Справочник.ГРС
WHERE
    ПометкаУдаления = false
    AND (Территория.Ссылка IS NULL OR Территория.ПометкаУдаления = true)

602. Имена не могут быть пустыми

SELECT
    Ссылка as obj,
    Наименование as name,
    Территория.Ссылка as region,
    CASE WHEN "" = КодСДУ THEN 0 ELSE ISNULL(КодСДУ, 0) END as codeSDU,
    Трансгаз.КодСДУ as tgSDU
FROM
    Справочник.ГРС
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

603. Обязательно должен быть заполнен трансгаз

Справочник.ГРС.Трансгаз

SELECT
    Ссылка as obj,
    Наименование as name,
    Территория.Ссылка as region,
    КодСДУ as codeSDU,
    Трансгаз as tg
FROM
    Справочник.ГРС
WHERE
    ПометкаУдаления = false
    AND Трансгаз.Ссылка IS NULL

604. Желательно заполнение также кодов СДУ

Справочник.ГРС.КодСДУ.

SELECT
    Ссылка as obj,
    Наименование as name,
    Территория.Ссылка as region,
    КодСДУ as kodSDU,
    Трансгаз.КодСДУ as tgSDU
FROM
    Справочник.ГРС
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(КодСДУ, "")

Код 700. Выходы ГРС

Справочник.ВыходыГРС.

701. Обязательна привязка к ГРО

SELECT
    Ссылка,
    ПометкаУдаления,
    Владелец,
    Код,
    Наименование,
    ГРО,
    КодТрансгаза,
    УзелУчета
FROM
    Справочник.ВыходыГРС
WHERE
    ПометкаУдаления = false
    AND (ГРО.Ссылка IS NULL OR ГРО.ПометкаУдаления = true)

Следует обратить внимание, что некоторые РГК предлагают не заполнять этот справочник, а взять для выходов ГРС данные из точки подключения или площадки. Однако выяснилось, что такой подход не верный — ГРО выхода ГРС и ГРО точки подключения не обязательно одинаковы (трубопровод может быть поделен на несколько частей, и разные части могут принадлежать разным ГРО).

702. Обязательна привязка к ГРС

Теоретически обратного и быть не может.

SELECT
    Ссылка,
    ПометкаУдаления,
    Владелец
FROM
    Справочник.ВыходыГРС
WHERE
    ПометкаУдаления = false
    AND (Владелец.Ссылка IS NULL OR Владелец.ПометкаУдаления = true)

703. Наименование не может быть пустым

SELECT
    Ссылка,
    ПометкаУдаления,
    Владелец,
    Код,
    Наименование,
    ГРО,
    КодТрансгаза,
    УзелУчета
FROM
    Справочник.ВыходыГРС
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

Код 800. Площадки

Забираются как срез на текущую дату из регистра РегистрСведений.ПлощадкиПоДоговору.

801. Необходима привязка к потребителю

SELECT DISTINCT
    Площадка.Ссылка as obj,
    Потребитель.Ссылка as consumer,
    Потребитель.ПометкаУдаления as consumerDeleted
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь AND Площадка.ПометкаУдаления = false
    AND (
        Площадка.Ссылка IS NULL
         OR
        Потребитель.Ссылка IS NULL
         OR
        Потребитель.ПометкаУдаления = true
         OR
        Потребитель NOT IN(
            SELECT DISTINCT
                consumer
            FROM
                (
                SELECT
                    Владелец.Ссылка as consumer
                FROM
                    Справочник.ДоговорыГазовые
                WHERE
                    Владелец.ПометкаУдаления = false
                UNION ALL
                SELECT
                    Контрагент.Ссылка
                FROM
                    Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей
                WHERE
                    Контрагент <> Ссылка.Владелец
                    AND Контрагент.ПометкаУдаления = false
                ) as consumers
        )
    )

802. удалён (пункт оставлен чтобы сохранить нумерацию)

803. Обязательна привязка к Территории (Субъекту РФ)

SELECT DISTINCT
    Площадка.Ссылка
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь AND Площадка.ПометкаУдаления = false
    AND (Площадка.Территория.Ссылка IS NULL OR Площадка.Территория.ПометкаУдаления = true)

804. Имя площадки не может быть пустым

SELECT DISTINCT
    Площадка.Ссылка as obj,
    Потребитель.Ссылка as consumer
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь AND Площадка.ПометкаУдаления = false
    AND "" = ISNULL(Площадка.Наименование, "")

805. Заполнены районы

SELECT DISTINCT
    Площадка.Ссылка
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь
    AND (Площадка.Адрес.Район.Ссылка IS NULL OR Площадка.Адрес.Район.ПометкаУдаления = true)

806. Дубли не допускаются (игнорируются последующие)

В некоторых РГК столкнулись с большой проблемой в учёте, связанной с изменением учёта несколько лет назад. Выяснилось, что не смотря на то, что в регистре указано ЕстьСвязь, связи может не быть фактически, или одна площадка может принадлежать одновременно нескольким потребителям. Такая ситуация не верна.

Такие случаи могут быть выбраны запросом:

SELECT
    gco1.obj, gco1.consumer, gco2.consumer
FROM
    (
        SELECT DISTINCT
            Площадка.Ссылка as obj,
            Потребитель.Ссылка as consumer,
            Площадка.Наименование as name,
            ISNULL(Площадка.Адрес.Наименование, "") as address,
            Площадка.Адрес.Район as subReg
        FROM
            РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
        WHERE
            ЕстьСвязь    AND Площадка.ПометкаУдаления = false
            AND NOT (ISNULL(Основание.ДатаИзменения, DateTime(0001, 1, 1)) > &CurrentDate) // Change in the future
        GROUP BY
            Площадка.Ссылка,
            Потребитель.Ссылка
    ) as gco1
    LEFT JOIN (
        SELECT DISTINCT
            Площадка.Ссылка as obj,
            Потребитель.Ссылка as consumer,
            Площадка.Наименование as name,
            ISNULL(Площадка.Адрес.Наименование, "") as address,
            Площадка.Адрес.Район as subReg
        FROM
            РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
        WHERE
            ЕстьСвязь    AND Площадка.ПометкаУдаления = false
            AND NOT (ISNULL(Основание.ДатаИзменения, DateTime(0001, 1, 1)) > &CurrentDate) // Change in the future
        GROUP BY
            Площадка.Ссылка,
            Потребитель.Ссылка
    ) as gco2
    ON (gco1.obj = gco2.obj)
WHERE
    gco1.consumer <> gco2.consumer

Параметр CurrentDate предполагается текущей датой.

Дополнительно к комментарию в запросе необходимо отметить, что т.к. может быть еще и привязки одной площадки к потребителям с действующими договорами, и, более того, одинаковыми датами окончания (что не удивительно т.к. даты окончания часто 31 декабря для подавляющего большинства договоров).

Обычно таких проблем достаточно много, и разрыв связи бывает нежелателен по каким-то причинам, на данный момент реализован алгоритм предпочтения одной связи другой через договор. Он в точности соответствует алгоритму для потребителей.

Код 900. Точки подключения

ТП могут забираться из Подключений или площадок.

901. Обязательна привязка к ГРО

Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Подключение.Ссылка as obj,
    Подключение.Наименование as name,
    Подключение.ГРО.Ссылка as gdo,
    Подключение.ГРС.Ссылка as gds,
    Подключение.ВыходГРС.Ссылка as outGds,
    Подключение.Территория.Ссылка as region,
    Подключение.РайонПодключения.Ссылка as subReg
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь AND Подключение.ПометкаУдаления = false
    AND (Подключение.ГРО.Ссылка IS NULL OR Подключение.ГРО.ПометкаУдаления = true)

Вариант определения точек подключения по площадкам оборудования:

SELECT
    Ссылка as obj,
    Наименование as name,
    ГРО as gdo,
    ГРС as gds,
    ВыходГРС as outGds,
    Территория as region,
    Адрес.Район as subReg,
    КодСДУ
FROM
    Справочник.ПлощадкиОборудования as pc
WHERE
    ПометкаУдаления = false
    AND (ГРО.Ссылка IS NULL OR ГРО.ПометкаУдаления = true)

902. Обязательна привязка к ГРС

Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Подключение.Ссылка as obj,
    Подключение.Наименование as name,
    Подключение.ГРО.Ссылка as gdo,
    Подключение.ГРС.Ссылка as gds,
    Подключение.ВыходГРС.Ссылка as outGds,
    Подключение.Территория.Ссылка as region,
    Подключение.РайонПодключения.Ссылка as subReg
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь AND Подключение.ПометкаУдаления = false
    AND (Подключение.ГРС.Ссылка IS NULL OR Подключение.ГРС.ПометкаУдаления = true)

Вариант определения точек подключения по площадкам оборудования:

SELECT
    Ссылка as obj,
    Наименование as name,
    ГРО as gdo,
    ГРС as gds,
    ВыходГРС as outGds,
    Территория as region,
    Адрес.Район as subReg,
    КодСДУ
FROM
    Справочник.ПлощадкиОборудования as pc
WHERE
    ПометкаУдаления = false
    AND (ГРС.Ссылка IS NULL OR ГРС.ПометкаУдаления = true)

903. Обязательна привязка к ВыходуГРС

Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Подключение.Ссылка as obj,
    Подключение.Наименование as name,
    Подключение.ГРО.Ссылка as gdo,
    Подключение.ГРС.Ссылка as gds,
    Подключение.ВыходГРС.Ссылка as outGds,
    Подключение.Территория.Ссылка as region,
    Подключение.РайонПодключения.Ссылка as subReg
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь AND Подключение.ПометкаУдаления = false
    AND (Подключение.ВыходГРС.Ссылка IS NULL OR Подключение.ВыходГРС.ПометкаУдаления = true)

Вариант определения точек подключения по площадкам оборудования:

SELECT
    Ссылка as obj,
    Наименование as name,
    ГРО as gdo,
    ГРС as gds,
    ВыходГРС as outGds,
    Территория as region,
    Адрес.Район as subReg,
    КодСДУ
FROM
    Справочник.ПлощадкиОборудования as pc
WHERE
    ПометкаУдаления = false
    AND (ВыходГРС.Ссылка IS NULL OR ВыходГРС.ПометкаУдаления = true)

904. Желательна привязка к Территории

Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Подключение.Ссылка as obj,
    Подключение.Наименование as name,
    Подключение.ГРО.Ссылка as gdo,
    Подключение.ГРС.Ссылка as gds,
    Подключение.ВыходГРС.Ссылка as outGds,
    Подключение.Территория.Ссылка as region,
    Подключение.РайонПодключения.Ссылка as subReg
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь AND Подключение.ПометкаУдаления = false
    AND (Подключение.Территория.Ссылка IS NULL OR Подключение.Территория.ПометкаУдаления = true)

Вариант определения точек подключения по площадкам оборудования:

SELECT
    Ссылка as obj,
    Наименование as name,
    ГРО as gdo,
    ГРС as gds,
    ВыходГРС as outGds,
    Территория as region,
    Адрес.Район as subReg,
    КодСДУ
FROM
    Справочник.ПлощадкиОборудования as pc
WHERE
    ПометкаУдаления = false AND Подключение.ПометкаУдаления = false
    AND (Территория.Ссылка IS NULL OR Территория.ПометкаУдаления = true)

905. Заполнено наименование

Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Подключение.Ссылка as obj,
    Подключение.Наименование as name,
    Подключение.ГРО.Ссылка as gdo,
    Подключение.ГРС.Ссылка as gds,
    Подключение.ВыходГРС.Ссылка as outGds,
    Подключение.Территория.Ссылка as region,
    Подключение.РайонПодключения.Ссылка as subReg
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь AND Подключение.ПометкаУдаления = false
    AND "" = ISNULL(Подключение.Наименование, "")

Вариант определения точек подключения по площадкам оборудования:

SELECT
    Ссылка as obj,
    Наименование as name,
    ГРО as gdo,
    ГРС as gds,
    ВыходГРС as outGds,
    Территория as region,
    Адрес.Район as subReg
FROM
    Справочник.ПлощадкиОборудования as pc
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

Код 1000. Узлы учёта газа

Узлы потребления

РегистрСведений.УзлыУчетаПлощадок.СрезПоследних.

1001. Обязательна привязка к активной, не удалённой площадке

SELECT DISTINCT
    УзелУчета as uug,
    ПлощадкаОборудования as gco
FROM
    РегистрСведений.УзлыУчетаПлощадок.СрезПоследних
WHERE
    ЕстьСвязь
    AND(
        ПлощадкаОборудования.Ссылка IS NULL
        OR
        ПлощадкаОборудования NOT IN(
            SELECT DISTINCT
                Площадка
            FROM
                РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
            WHERE
                ЕстьСвязь AND Площадка.ПометкаУдаления = false
        )
    )

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

SELECT uug1.obj, uug1.gco as gco1, uug2.gco as gco2
FROM (
        SELECT DISTINCT
            УзелУчета as obj,
            ПлощадкаОборудования as gco
        FROM
            РегистрСведений.УзлыУчетаПлощадок.СрезПоследних
        WHERE
            ЕстьСвязь
    ) as uug1
    JOIN (
        SELECT DISTINCT
            УзелУчета as obj,
            ПлощадкаОборудования as gco
        FROM
            РегистрСведений.УзлыУчетаПлощадок.СрезПоследних
        WHERE
            ЕстьСвязь
    ) as uug2
    ON (uug1.obj = uug2.obj AND uug1.gco <> uug2.gco)

1003. Обязательно наличие не пустого имени

SELECT DISTINCT
    УзелУчета as obj,
    ПлощадкаОборудования as gco
FROM
    РегистрСведений.УзлыУчетаПлощадок.СрезПоследних
WHERE
    ЕстьСвязь
    AND "" = ISNULL(УзелУчета.Наименование, "")

Узлы поставки

1021. Необходимо указание Выхода ГРС для площадки подключения узла

SELECT DISTINCT
    uug.УзелУчета as obj,
    out.Ссылка as outGDS
FROM
    РегистрСведений.УзлыУчетаПлощадок.СрезПоследних as uug
    LEFT JOIN Catalog.ВыходыГРС as out ON (uug.УзелУчета = out.УзелУчета)
WHERE
    ЕстьСвязь AND ISNULL(ПлощадкаОборудования.ПризнакНаГРС, false)
    AND (
        out.Ссылка IS NULL
        OR
        out.ПометкаУдаления
    )

Код 1100. Модели корректоров (вычислителей)

1101. Имена не могут быть пустыми

SELECT
    Ссылка as obj,
    Наименование as name
FROM
    Справочник.МоделиВычислителей
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

1102. Имена должны быть уникальными

SELECT
    Наименование as name
FROM
    Справочник.МоделиВычислителей
WHERE
    ПометкаУдаления = false
GROUP BY
    Наименование
HAVING
    COUNT(*) > 1

Код 1200. Корректоры (вычислители)

РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних.

1201. Обязательно должна быть указана модель

.Оборудование.Модель.

SELECT
    Оборудование.Ссылка as obj,
    Оборудование.Модель.Ссылка as model,
    Оборудование.Наименование as name,
    Оборудование.Модель.Тип.Код as idparam,
    УзелУчета.Ссылка as uug,
    Оборудование.ЗаводскойНомер as fabricNumber
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование ССЫЛКА Справочник.Вычислители
    AND Оборудование.ПометкаУдаления = false
    AND (Оборудование.Модель.Ссылка IS NULL OR Оборудование.Модель.ПометкаУдаления = true)

1202. Установленные и активные обязательно должны иметь ссылку на не удалённый и активный узел учёта

SELECT DISTINCT
    equip.Оборудование.Ссылка as obj,
    equip.УзелУчета.Ссылка as uug
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних as equip
WHERE
    Оборудование.ПометкаУдаления = false AND Оборудование ССЫЛКА Справочник.Вычислители
    AND Оборудование.ПометкаУдаления = false
    AND equip.Установлено AND equip.Активность
    AND (
        УзелУчета.Ссылка IS NULL
        OR equip.УзелУчета NOT IN( // Active
            SELECT УзелУчета
            FROM РегистрСведений.АктивныеУзлыУчета.СрезПоследних
            WHERE АктивностьУзлаУчета AND УзелУчета.ПометкаУдаления = false
        )
    )

1203. Наименование не может быть пустым

SELECT
    Оборудование.Ссылка as obj,
    Оборудование.Модель.Ссылка as model,
    Оборудование.Наименование as name,
    Оборудование.Модель.Тип.Код as idparam,
    УзелУчета.Ссылка as uug,
    Оборудование.ЗаводскойНомер as fabricNumber
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
WHERE
    Установлено AND Активность AND Оборудование ССЫЛКА Справочник.Вычислители
    AND Оборудование.ПометкаУдаления = false
    AND "" = ISNULL(Оборудование.Модель.Наименование, "")

1204. Если есть информация о его серийном номере, она должна быть указана

SELECT
    Оборудование.Ссылка as obj,
    Оборудование.Модель.Ссылка as model,
    Оборудование.Наименование as name,
    Оборудование.Модель.Тип.Код as idparam,
    УзелУчета.Ссылка as uug,
    Оборудование.ЗаводскойНомер as fabricNumber
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
WHERE
    Установлено AND Активность AND Оборудование ССЫЛКА Справочник.Вычислители
    AND Оборудование.ПометкаУдаления = false
    AND "" = ISNULL(Оборудование.ЗаводскойНомер, "")

1205. Дубли не допускаются. Иными словами, вычислитель может быть привязан к единственному узлу

SELECT equips1.obj, equips1.uug as uug1, equips2.uug as uug2
FROM (
        SELECT DISTINCT
            Оборудование as obj,
            Оборудование.Модель.Ссылка as model,
            Оборудование.Наименование as name,
            ПлощадкаОборудования as gco,
            УзелУчета.Ссылка as uug
        FROM
            РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
        WHERE
            Установлено AND Активность AND Оборудование ССЫЛКА Справочник.Вычислители
            AND Оборудование.ПометкаУдаления = false
    ) as equips1
    JOIN (
        SELECT DISTINCT
            Оборудование as obj,
            Оборудование.Модель.Ссылка as model,
            Оборудование.Наименование as name,
            ПлощадкаОборудования as gco,
            УзелУчета.Ссылка as uug
        FROM
            РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
        WHERE
            Установлено AND Активность AND Оборудование ССЫЛКА Справочник.Вычислители
            AND Оборудование.ПометкаУдаления = false
    ) as equips2
    ON (equips1.obj = equips2.obj AND equips1.uug <> equips2.uug)

1206. Если указаны даты поверки и следующей поверки, то они должны быть корректными

SELECT
    equips.Оборудование as obj,
    equips.Оборудование.Модель.Ссылка as model,
    equips.Оборудование.Наименование as name,
    equips.Оборудование.ЗаводскойНомер as fabricNumber,
    equips.ПлощадкаОборудования as gco,
    equips.УзелУчета.Ссылка as uug,
    ISNULL(dateCheck.Значение, DateTime(0001, 1, 1)) as dateCheck,
    ISNULL(dateNextCheck.Значение, DateTime(0001, 1, 1)) as dateNextCheck
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних as equips
    LEFT JOIN РегистрСведений.ПараметрыИзмерительногоОборудования.СрезПоследних(, Идентификатор = "ДатаПоверки") as dateCheck
    ON equips.Оборудование = dateCheck.ИзмерительноеОборудование
    LEFT JOIN РегистрСведений.ПараметрыИзмерительногоОборудования.СрезПоследних(, Идентификатор = "ДатаСледующейПоверки") as dateNextCheck
    ON equips.Оборудование = dateNextCheck.ИзмерительноеОборудование
WHERE
    Установлено AND Активность AND Оборудование ССЫЛКА Справочник.Вычислители
    AND Оборудование.ПометкаУдаления = false
    AND (
        ISNULL(dateCheck.Значение, DateTime(3000, 1, 1)) < DateTime(1945, 1, 1)
        OR
        ISNULL(dateNextCheck.Значение, DateTime(3000, 1, 1)) < DateTime(1945, 1, 1)
    )

Код 1300. Каналы измерения

Справочник.КаналыВычислителей.

1301. Должны быть привязаны к вычислителю

Теоретически обратного и быть не может.

SELECT
    Ссылка as obj,
    Наименование as name,
    Владелец.Ссылка as equip
FROM
    Справочник.КаналыВычислителей
WHERE
    ПометкаУдаления = false
    AND (Владелец.Ссылка IS NULL OR Владелец.ПометкаУдаления = true)

1302. Канал должен иметься для каждого вычислителя

Для ИМУС он нужен как минимум один.

Вместо этого возможно использовать генерацию объектов в ИМУС.

Следующий запрос покажет корректоры без каналов:

SELECT
    Оборудование.Наименование as name,
    Оборудование.Модель.Ссылка as model,
    УзелУчета.Ссылка as uug
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
WHERE
    Установлено AND Активность AND Оборудование ССЫЛКА Справочник.Вычислители
    AND Оборудование.Ссылка NOT IN(
        SELECT
            Владелец.Ссылка
        FROM
            Справочник.КаналыВычислителей
    )

1303. Наименование не может быть пустым

SELECT DISTINCT
    Ссылка as channel,
    Владелец.Ссылка as equip
FROM
    Справочник.КаналыВычислителей as channels
    JOIN РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних as equips
    ON (equips.Оборудование.Ссылка = channels.Владелец.Ссылка)
WHERE
    equips.Установлено AND equips.Активность AND equips.Оборудование ССЫЛКА Справочник.Вычислители AND ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

1304. Канал должен иметь уникальное наименование в пределах корректора

Другими словами, не допускается повторение имени канала на одном корректоре. К сожалению частая ситуация, потому что они именуются в основном 1, 2 и т.д..

SELECT DISTINCT
    *
FROM
    (
        SELECT DISTINCT
            Ссылка as channel,
            Владелец.Ссылка as equip,
            Наименование as name
        FROM
            Справочник.КаналыВычислителей as channels
            JOIN РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних as equips
            ON (equips.Оборудование.Ссылка = channels.Владелец.Ссылка)
        WHERE
            equips.Установлено AND equips.Активность AND equips.Оборудование ССЫЛКА Справочник.Вычислители AND ПометкаУдаления = false
    ) as channels1
    JOIN (
        SELECT DISTINCT
            Ссылка as channel,
            Владелец.Ссылка as equip,
            Наименование as name
        FROM
            Справочник.КаналыВычислителей as channels
            JOIN РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних as equips
            ON (equips.Оборудование.Ссылка = channels.Владелец.Ссылка)
        WHERE
            equips.Установлено AND equips.Активность AND equips.Оборудование ССЫЛКА Справочник.Вычислители AND ПометкаУдаления = false
    ) as channels2
    ON(channels1.equip = channels2.equip AND channels1.name = channels2.name AND channels1.channel <> channels2.channel)

Код 1350. Классы газопотребляющего оборудования (ГПО)

Справочник.ТипыГазопотребляющегоОборудования.

1351. Необходимы не пустые названия

SELECT
    Ссылка as obj,
    Наименование as name
FROM
    Справочник.ТипыГазопотребляющегоОборудования
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

Для версии конфигурации <= 1.1.7:

SELECT
    Родитель.Ссылка as obj,
    ISNULL(Родитель.Наименование, "") as name
FROM
    Справочник.ТипыГазопотребляющегоОборудования
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Родитель.Наименование, "")

Код 1400. Типы газопотребляющего оборудования (ГПО)

Справочник.ТипыГазопотребляющегоОборудования.

1401. Необходима привязка к классам ГПО

Справочник.МоделиГазопотребляющегоОборудования.Ссылка.

SELECT
    Ссылка as obj,
    Наименование as name,
    ТипОборудования as gce_class
FROM
    Справочник.МоделиГазопотребляющегоОборудования
WHERE
    ПометкаУдаления = false
    AND (ТипОборудования.Ссылка IS NULL OR ТипОборудования.Ссылка.ПометкаУдаления = true)
  1. Для версии конфигурации <= 1.1.7 - Справочник.ТипыГазопотребляющегоОборудования.Родитель.Ссылка:
SELECT
    Ссылка as obj,
    Родитель.Ссылка as gce_class,
    Наименование as name,
    ISNULL(РасходГазаМаксимальный, 0) as maxConsumption
FROM
    Справочник.ТипыГазопотребляющегоОборудования
WHERE
    ПометкаУдаления = false
    AND (Родитель.Ссылка IS NULL OR Родитель.Ссылка.ПометкаУдаления = true)

1402. Имена не могут быть пустыми

SELECT
    Ссылка as obj,
    Наименование as name,
    ТипОборудования as gce_class
FROM
    Справочник.МоделиГазопотребляющегоОборудования
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

Для версии конфигурации <= 1.1.7::

SELECT
    Ссылка as obj,
    Родитель.Ссылка as gce_class,
    Наименование as name,
    ISNULL(РасходГазаМаксимальный, 0) as maxConsumption
FROM
    Справочник.ТипыГазопотребляющегоОборудования
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование)

Код 1500. ГПО

РегистрСведений.УстановленноеГазопотребляющееОборудование.СрезПоследних.

1501. Необходимы привязки к Типам ГПО

SELECT
    Оборудование.Ссылка as obj,
    Оборудование.Модель.Ссылка as gpo_type
FROM
    РегистрСведений.УстановленноеГазопотребляющееОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = false AND Оборудование.Ссылка IS NOT NULL
    AND (
        Оборудование.Модель.Ссылка IS NULL
        OR
        Оборудование.Модель.ПометкаУдаления = true
    )

Для версии конфигурации <= 1.1.7:

SELECT
    Оборудование.Ссылка as obj,
    Оборудование.ТипГазопотребляющегоОборудования.Ссылка as gpo_type,
    Оборудование.Наименование as name
FROM
    РегистрСведений.УстановленноеГазопотребляющееОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = falseAND Оборудование.Ссылка IS NOT NULL
    AND (
        Оборудование.ТипГазопотребляющегоОборудования.Ссылка IS NULL
        OR
        Оборудование.ТипГазопотребляющегоОборудования.ПометкаУдаления = true
    )

1502. Необходимы корректные ссылки на Площадки

SELECT
    Оборудование.Ссылка as obj,
    ПлощадкаОборудования.Ссылка as gco
FROM
    РегистрСведений.УстановленноеГазопотребляющееОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = false AND Оборудование.Ссылка IS NOT NULL
    AND (
        ПлощадкаОборудования.Ссылка IS NULL
        OR ПлощадкаОборудования.ПометкаУдаления = true
        OR ПлощадкаОборудования.Ссылка NOT IN(// Active
            SELECT DISTINCT
                Площадка.Ссылка
            FROM
                РегистрСведений.ПлощадкиПоДоговору.СрезПоследних as gco
            WHERE
                gco.ЕстьСвязь AND Площадка.ПометкаУдаления = false
        )
    )

1503. Не допускаются пустые имена

SELECT
    Оборудование.Ссылка as obj,
    ISNULL(Оборудование.Наименование, "Error:1503:No name") as name
FROM
    РегистрСведений.УстановленноеГазопотребляющееОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = falseAND Оборудование.Ссылка IS NOT NULL
    AND "" = ISNULL(Оборудование.Наименование, "")

1504. Должен быть указан максимальный расход (0 в крайнем случае)

SELECT
    Оборудование.Ссылка as obj,
    Оборудование.Наименование as name,
    Оборудование.РасходГазаМаксимальный as maxConsumption
FROM
    РегистрСведений.УстановленноеГазопотребляющееОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = false AND Оборудование.Ссылка IS NOT NULL
    AND ISNULL(Оборудование.РасходГазаМаксимальный, 0) = 0

1505. Дубли не допускаются

То есть один экземпляр оборудования может быть установлено только в одном месте.

SELECT
    obj, COUNT(*) as count
FROM (
    SELECT
        Оборудование.Ссылка as obj
    FROM
        РегистрСведений.УстановленноеГазопотребляющееОборудование.СрезПоследних
    WHERE
        Установлено AND Оборудование.ПометкаУдаления = false
) as gce
GROUP BY
    obj
HAVING
    COUNT(*) > 1

Код 1580. Модели измерительного оборудования

1581. Не может быть пустых имён

SELECT * FROM(
SELECT DISTINCT
    Ссылка as obj,
    "Датчик" as type,
    Наименование as name,
    ISNULL(ПРЕДСТАВЛЕНИЕ(Тип.ИзмеряемыйПараметр), "") as param,
    ПометкаУдаления as deleted
FROM
    Справочник.МоделиДатчиков
UNION ALL
SELECT DISTINCT
    Ссылка,
    "Измерительный комплекс",
    Наименование,
    "Комплекс",
    ПометкаУдаления as deleted
FROM
    Справочник.МоделиИзмерительныхКомплексов
UNION ALL
SELECT DISTINCT
    Ссылка,
    "Планиметр",
    Наименование,
    "расход",
    ПометкаУдаления as deleted
FROM
    Справочник.МоделиПланиметров
UNION ALL
SELECT DISTINCT
    Ссылка,
    "Сужающее устройство",
    Наименование,
    "расход",
    ПометкаУдаления as deleted
FROM
    Справочник.МоделиСужающихУстройств
UNION ALL
SELECT DISTINCT
    Ссылка,
    "Счетчик",
    Наименование,
    ISNULL(ПРЕДСТАВЛЕНИЕ(Тип), ""),
    ПометкаУдаления as deleted
FROM
    Справочник.МоделиСчетчиков
) as gmm
WHERE
    deleted = false
    AND "" = ISNULL(name, "")

Код 1600. Измерительное оборудование

РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних, данные также должны быть корректны во всех низлежащих справочниках: Справочник.Датчики, Справочник.ИзмерительныеКомплексы, Справочник.Планиметры, Справочник.СужающиеУстройства, Справочник.Счетчики.

1601. Необходимы корректные ссылки на Модели

SELECT
    Оборудование.Ссылка as obj,
    Оборудование.Модель.Ссылка as model
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = false
    AND (
    	Оборудование ССЫЛКА Справочник.Датчики
    	 OR
    	Оборудование ССЫЛКА Справочник.ИзмерительныеКомплексы
    	 OR
    	Оборудование ССЫЛКА Справочник.Планиметры
    	 OR
    	Оборудование ССЫЛКА Справочник.СужающиеУстройства
    	 OR
    	Оборудование ССЫЛКА Справочник.Счетчики
    )
    AND ( Оборудование.Модель.Ссылка IS NULL OR Оборудование.Модель.ПометкаУдаления = true )

1602. Необходимы ссылки на активные, не удалённые узлы

SELECT
    Оборудование.Ссылка as obj,
    УзелУчета.Ссылка as uug
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = false
    AND (
    	Оборудование ССЫЛКА Справочник.Датчики
    	 OR
    	Оборудование ССЫЛКА Справочник.ИзмерительныеКомплексы
    	 OR
    	Оборудование ССЫЛКА Справочник.Планиметры
    	 OR
    	Оборудование ССЫЛКА Справочник.СужающиеУстройства
    	 OR
    	Оборудование ССЫЛКА Справочник.Счетчики
    )
    AND (
        УзелУчета.Ссылка IS NULL
        OR УзелУчета.ПометкаУдаления = true
        OR УзелУчета.Ссылка NOT IN(
            SELECT DISTINCT
                УзелУчета.Ссылка as obj
            FROM
                РегистрСведений.УзлыУчетаПлощадок.СрезПоследних
            WHERE
                ЕстьСвязь
        )
    )

1603. Желательны заводские номера

SELECT
    Оборудование.Ссылка as obj,
    ISNULL(Оборудование.ЗаводскойНомер, "") as fabricNumber
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = false
    AND (
    	Оборудование ССЫЛКА Справочник.Датчики
    	 OR
    	Оборудование ССЫЛКА Справочник.ИзмерительныеКомплексы
    	 OR
    	Оборудование ССЫЛКА Справочник.Планиметры
    	 OR
    	Оборудование ССЫЛКА Справочник.СужающиеУстройства
    	 OR
    	Оборудование ССЫЛКА Справочник.Счетчики
    )
    AND "" = ISNULL(Оборудование.ЗаводскойНомер, "")

1604. Должны быть уникальны

SELECT
    Оборудование.Ссылка as obj,
    УзелУчета.Ссылка as uug
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
WHERE
    Установлено AND Оборудование.ПометкаУдаления = false
    AND(
    	Оборудование ССЫЛКА Справочник.Датчики
    	 OR
    	Оборудование ССЫЛКА Справочник.ИзмерительныеКомплексы
    	 OR
    	Оборудование ССЫЛКА Справочник.Планиметры
    	 OR
    	Оборудование ССЫЛКА Справочник.СужающиеУстройства
    	 OR
    	Оборудование ССЫЛКА Справочник.Счетчики
    )
GROUP BY
    Оборудование.Ссылка, УзелУчета.Ссылка
HAVING COUNT(*) > 1

1605. Желательны даты поверки и следующей поверки

SELECT
    Оборудование.Ссылка as obj,
    ISNULL(Оборудование.ЗаводскойНомер, "") as fabricNumber
FROM
    РегистрСведений.УстановленноеИзмерительноеОборудование.СрезПоследних
    LEFT JOIN РегистрСведений.ПараметрыИзмерительногоОборудования.СрезПоследних(, Идентификатор = "ДатаПоверки") as dateCheck
    ON ( Оборудование.Ссылка = DateCheck.ИзмерительноеОборудование AND NOT dateCheck.Значение ССЫЛКА Перечисление.СостоянияОборудования )
    LEFT JOIN РегистрСведений.ПараметрыИзмерительногоОборудования.СрезПоследних(, Идентификатор = "ДатаСледующейПоверки") as dateNextCheck
    ON ( Оборудование.Ссылка = dateNextCheck.ИзмерительноеОборудование )
WHERE
    Установлено AND Оборудование.ПометкаУдаления = false
    AND (
    	Оборудование ССЫЛКА Справочник.Датчики
    	 OR
    	Оборудование ССЫЛКА Справочник.ИзмерительныеКомплексы
    	 OR
    	Оборудование ССЫЛКА Справочник.Планиметры
    	 OR
    	Оборудование ССЫЛКА Справочник.СужающиеУстройства
    	 OR
    	Оборудование ССЫЛКА Справочник.Счетчики
    )
    AND(
       ISNULL(dateCheck.Значение, DateTime(3000, 1, 1)) < DateTime(1945, 1, 1)
       OR
       ISNULL(dateNextCheck.Значение, DateTime(3000, 1, 1)) < DateTime(1945, 1, 1)
       OR
        ( ВЫРАЗИТЬ(dateCheck.Значение as Date) IS NULL AND dateCheck.Значение <> "01.01.0001 0:00:00" )
       OR
       ( ВЫРАЗИТЬ(dateNextCheck.Значение as Date) IS NULL AND dateNextCheck.Значение <> "01.01.0001 0:00:00" )
   )

1606. Рекомендуется указание канала

Код 1650. Виды договоров

Справочник.ВидыДоговоров.

1651. Пустые имена не допустимы

SELECT
    Ссылка as obj,
    Наименование as name
FROM
    Справочник.ВидыДоговоров
WHERE
    ПометкаУдаления = false
    AND "" = ISNULL(Наименование, "")

Код 1700. Договоры

Справочник.ДоговорыГазовые, РегистрСведений.ПараметрыДоговора.СрезПоследних. В реальном веб-сервисе загрузка происходит из РегистрСведений.ПлощадкиПоДоговору.СрезПоследних(&CurrentDate), если он заполняется, с ЕстьСвязь. Если нет (не ведутся площадки в компании или установлена константа НеСвязыватьПлощадкуСДоговором), то из РегистрНакопления.ПланыПоставок, с планом на текущий день импорта, в том числе нулевым. Таким образом, представленные ниже запросы могут возвращать больше ошибок, нежели представлено в отчёте об ошибках импорта, но представлены, чтобы оставаться универсальными для обоих случаев.

К исправлению прежде всего предполагаются объекты, участвующие в загрузке и представленные в отчётах. Остальные ошибки, являясь ошибками по сути, не так важны для ИУС-ГАЗ, могут быть исправлены по желанию компании.

1701. Корректно проставлен вид ценообразования

ДоговорыГазовые.ВидПрейскуранта.

SELECT DISTINCT
    Ссылка as obj,
    ВидПрейскуранта as priority
FROM
    Справочник.ДоговорыГазовые
WHERE
    ПометкаУдаления = false
    AND ВидПрейскуранта.Ссылка IS NULL

=== 1702. Имеются обе даты — начала и конца и они корректны.

SELECT DISTINCT
    ДоговорыГазовые.Ссылка,
    ДоговорыГазовые.ВидДоговора.Ссылка,
    ДоговорыГазовые.Наименование,
    ДоговорыГазовые.ДатаНачала,
    ДоговорыГазовые.ДатаКонца,
    ДоговорыГазовые.Владелец.Ссылка,
    ДоговорыГазовые.ПометкаУдаления
FROM
    Справочник.ДоговорыГазовые as ДоговорыГазовые
    LEFT JOIN РегистрСведений.ПараметрыДоговора.СрезПоследних as ПараметрыДоговора ON (ПараметрыДоговора.Договор = ДоговорыГазовые.Ссылка И ПараметрыДоговора.Идентификатор = "СостояниеДоговора")
WHERE
    ДоговорыГазовые.ПометкаУдаления = false
    AND(
        ISNULL(ДоговорыГазовые.ДатаНачала, DateTime(3000, 1, 1)) < DateTime(1945, 1, 1)
         OR
        ISNULL(ДоговорыГазовые.ДатаКонца, DateTime(3000, 1, 1)) < DateTime(1945, 1, 1)
         OR
        (
            ВЫРАЗИТЬ(ДоговорыГазовые.ДатаНачала as Date) IS NULL
            AND ДоговорыГазовые.ДатаНачала <> "01.01.0001 0:00:00"
        )
         OR
        (
            ВЫРАЗИТЬ( ДоговорыГазовые.ДатаКонца as Date) IS NULL
            AND ДоговорыГазовые.ДатаКонца <> "01.01.0001 0:00:00"
        )
    )

1702. Заполнен потребитель

SELECT DISTINCT
    ДоговорыГазовые.Ссылка as obj,
    ДоговорыГазовые.ВидДоговора.Ссылка as priority,
    ДоговорыГазовые.Наименование as number,
    ДоговорыГазовые.ДатаНачала as dateStart,
    ДоговорыГазовые.ДатаКонца as dateEnd,
    ДоговорыГазовые.Владелец.Ссылка as consumer,
    ДоговорыГазовые.ПометкаУдаления as deleted
FROM
    Справочник.ДоговорыГазовые as ДоговорыГазовые
    LEFT JOIN РегистрСведений.ПараметрыДоговора.СрезПоследних as ПараметрыДоговора ON (ПараметрыДоговора.Договор = ДоговорыГазовые.Ссылка И ПараметрыДоговора.Идентификатор = "СостояниеДоговора")
WHERE
    ДоговорыГазовые.ПометкаУдаления = false
    AND ( ДоговорыГазовые.Владелец.Ссылка IS NULL OR ДоговорыГазовые.Владелец.ПометкаУдаления = true)

1703. Потребитель - владелец не удалён и активен

SELECT DISTINCT
    ДоговорыГазовые.Ссылка as obj,
    ДоговорыГазовые.ВидДоговора.Ссылка as priority,
    ДоговорыГазовые.Наименование as number,
    ДоговорыГазовые.ДатаНачала as dateStart,
    ДоговорыГазовые.ДатаКонца as dateEnd,
    ДоговорыГазовые.Владелец.Ссылка as consumer,
    ДоговорыГазовые.ПометкаУдаления as deleted
FROM
    Справочник.ДоговорыГазовые as ДоговорыГазовые
    LEFT JOIN РегистрСведений.ПараметрыДоговора.СрезПоследних as ПараметрыДоговора ON (ПараметрыДоговора.Договор = ДоговорыГазовые.Ссылка И ПараметрыДоговора.Идентификатор = "СостояниеДоговора")
WHERE
    ДоговорыГазовые.ПометкаУдаления = false
    AND ДоговорыГазовые.Владелец.Ссылка NOT IN (
        SELECT DISTINCT
            Выборка.obj
        FROM
            (
            SELECT
                ДоговорыГазовые.Владелец.Ссылка as obj,
                ДоговорыГазовые.Владелец.Наименование as name,
                ДоговорыГазовые.Владелец.ИНН as inn,
                ДоговорыГазовые.Владелец.ОтрасльГазпрома.Ссылка as industry,
                ДоговорыГазовые.Владелец.Ссылка as parent,
                ДоговорыГазовые.Владелец.Территория.Ссылка as region,
                ДоговорыГазовые.Владелец.ПометкаУдаления as deleted
            FROM
                Справочник.ДоговорыГазовые as ДоговорыГазовые
            UNION ALL
            SELECT
                РеестрКонечныхПотребителей.Контрагент.Ссылка as obj,
                РеестрКонечныхПотребителей.Контрагент.Наименование as name,
                РеестрКонечныхПотребителей.Контрагент.ИНН as inn,
                РеестрКонечныхПотребителей.Контрагент.ОтрасльГазпрома.Ссылка as industry,
                РеестрКонечныхПотребителей.Ссылка.Владелец.Ссылка as parent,
                РеестрКонечныхПотребителей.Контрагент.Территория.Ссылка as region,
                РеестрКонечныхПотребителей.Контрагент.ПометкаУдаления as deleted
            FROM
                Справочник.ДоговорыГазовые.РеестрКонечныхПотребителей as РеестрКонечныхПотребителей
            WHERE
                РеестрКонечныхПотребителей.Контрагент <> РеестрКонечныхПотребителей.Ссылка.Владелец
            ) as Выборка
        WHERE
            Выборка.obj IS NOT NULL
            AND Выборка.deleted = false
    )

1704. Номер (наименование) договора не может быть пустым

SELECT DISTINCT
    ДоговорыГазовые.Ссылка as obj,
    ДоговорыГазовые.ВидДоговора.Ссылка as priority,
    ДоговорыГазовые.Наименование as number,
    ДоговорыГазовые.ДатаНачала as dateStart,
    ДоговорыГазовые.ДатаКонца as dateEnd,
    ДоговорыГазовые.Владелец.Ссылка as consumer
FROM
    Справочник.ДоговорыГазовые as ДоговорыГазовые
    LEFT JOIN РегистрСведений.ПараметрыДоговора.СрезПоследних as ПараметрыДоговора ON (ПараметрыДоговора.Договор = ДоговорыГазовые.Ссылка И ПараметрыДоговора.Идентификатор = "СостояниеДоговора")
WHERE
    ДоговорыГазовые.ПометкаУдаления = false
    AND "" = ISNULL(ДоговорыГазовые.Наименование, "")

Код 1800. Связь договоров с точками подключения

РегистрСведений.ПлощадкиПоДоговору.СрезПоследних.

1801. Заполнены у всех обе сущности

(deprecated in с версии ~16) и больше не используется вместе с командой AttachPcToContract. Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Подключение.Ссылка as pc,
    Договор.Ссылка as contract,
    Договор.ДатаНачала as contractBegin,
    Договор.ДатаКонца as contractEnd
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь
    AND Подключение.ПометкаУдаления = false AND Договор.ПометкаУдаления = false
    AND Договор <> ЗНАЧЕНИЕ(Справочник.ДоговорыГазовые.ПустаяСсылка)
    AND (
        Подключение.Ссылка IS NULL
        OR
        Договор.Ссылка IS NULL
        OR
        Договор NOT IN(
            SELECT DISTINCT
                Ссылка
            FROM
                Справочник.ДоговорыГазовые
            WHERE
                ПометкаУдаления = false
                AND ДатаНачала >= DateTime(2002, 1, 1) AND ДатаКонца <= DateTime(2022, 1, 1)
        )
    )

Вариант определения точек подключения по площадкам оборудования:

SELECT DISTINCT
    Площадка.Ссылка as pc,
    Договор.Ссылка as contract
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    ЕстьСвязь
    AND Договор <> ЗНАЧЕНИЕ(Справочник.ДоговорыГазовые.ПустаяСсылка)
    AND (
        Площадка.Ссылка IS NULL
        OR
        Договор.Ссылка IS NULL
        OR
        Площадка.Ссылка NOT IN (
            SELECT DISTINCT
                Площадка.Ссылка
            FROM
                РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
            WHERE
                ЕстьСвязь
        )
        OR
        Договор.Ссылка NOT IN (
            SELECT DISTINCT
                Ссылка
            FROM
                Справочник.ДоговорыГазовые
        )
    )

Код 1850. Связь площадок с точками подключения

РегистрСведений.ПлощадкиПоДоговору.СрезПоследних c ЕстьСвязь = true. В вырожденных случаях, когда не ведутся точки или подключения в АИС РГ, отсутствующий элемент будет сгенерирован, и в таком случае связывание будет происходить автоматически и данные ошибки не будут иметь смысла.

1851. Заполнены у всех обе сущности

Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Подключение.Ссылка as pc,
    Площадка.Ссылка as gco
FROM
    РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
WHERE
    Подключение.ПометкаУдаления = false AND Площадка.ПометкаУдаления = false
    AND ЕстьСвязь
    AND (Подключение.Ссылка IS NULL OR Площадка.Ссылка IS NULL)

1852. Для связывания ТП с площадкой в ИМУС, у площадки должен обязательно быть канал

Если такая детализация не ведётся в АИС, можно использовать генерацию объектов в ИМУС.

1853. Наличие уникальной активной связи ТП с Площадкой

Автоматическое связывание возможно только если они связаны один к одному в текущий момент времени (в регистре наличествует единственная запись с ЕстьСвязь). Выбрать активные не единичные связки можно следующим запросом:

SELECT gco1.gco, gco1.pc as pc1, gco2.pc as pc2
FROM
    (
    SELECT DISTINCT
        Площадка.Ссылка as gco,
        Подключение.Ссылка as pc
    FROM
        РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
    WHERE
        ЕстьСвязь
        AND Подключение.ПометкаУдаления = false
        AND Площадка.ПометкаУдаления = false
    ) as gco1
    JOIN
    (
    SELECT DISTINCT
        Площадка.Ссылка as gco,
        Подключение.Ссылка as pc
    FROM
        РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
    WHERE
        ЕстьСвязь
        AND Подключение.ПометкаУдаления = false
        AND Площадка.ПометкаУдаления = false
    ) as gco2
    ON (gco1.gco = gco2.gco AND gco1.pc <> gco2.pc)

Код 1900. Планы потребления

РегистрНакопления.ПланыПоставок.

1901. Устарел. Вместо этого предлагается использовать более точные 1903 и 1904

1902. Указан сам лимит потребления на дату

Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Период as date,
    Договор.ОсновнойДоговор.Ссылка as contract,
    Подключение.Ссылка as pc,
    Количество as amount
FROM
    РегистрНакопления.ПланыПоставок
WHERE
    Активность
    AND Количество IS NULL

Вариант определения точек подключения по площадкам оборудования:

SELECT DISTINCT
    Период as date,
    Договор.ОсновнойДоговор.Ссылка as contract,
    ПлощадкаОборудования.Ссылка as pc,
    Количество as amount
FROM
    РегистрНакопления.ПланыПоставок
WHERE
    Активность
    AND Количество IS NULL

1903. Участвующие в планах подключения должны быть активны

Это значит они должны быть представлены в РегистрСведений.ПлощадкиПоДоговору.СрезПоследних c ЕстьСвязь = true.

Вариант определения точек подключения по подключениям:

SELECT DISTINCT
    Период as date,
    Договор.ОсновнойДоговор.Ссылка as contract,
    Подключение.Ссылка as pc,
    Подключение.ВнешнийКлюч as pcForeignKey,
    SUM(Количество) as amount
FROM
    РегистрНакопления.ПланыПоставок
WHERE
    Активность
    AND Период BETWEEN DateTime(2012, 5, 1) AND DateTime(2012, 5, 31)
    AND Подключение NOT IN(
        SELECT DISTINCT
            Подключение
        FROM
            РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
        WHERE
            ЕстьСвязь
            AND Подключение.ПометкаУдаления = false
    )
GROUP BY
    Период,
    Договор.ОсновнойДоговор.Ссылка,
    Подключение.Ссылка
ORDER BY Период

Вариант определения точек подключения по площадкам оборудования:

SELECT DISTINCT
    Период as date,
    Договор.ОсновнойДоговор.Ссылка as contract,
    ПлощадкаОборудования.Ссылка as pc,
    SUM(Количество) as amount
FROM
    РегистрНакопления.ПланыПоставок
WHERE
    Активность
    AND Период BETWEEN DateTime(2012, 5, 1) AND DateTime(2012, 5, 31)
    AND ПлощадкаОборудования NOT IN(
        SELECT DISTINCT
            Площадка
        FROM
            РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
        WHERE
            ЕстьСвязь
            AND Площадка.ПометкаУдаления = false
    )
GROUP BY
    Период,
    Договор.ОсновнойДоговор.Ссылка,
    ПлощадкаОборудования.Ссылка
ORDER BY Период

1904. Участвующие в планах договоры должны быть активны

То есть должны быть представлены в РегистрСведений.ПлощадкиПоДоговору.СрезПоследних c ЕстьСвязь = true.

SELECT DISTINCT
    Период as date,
    Договор.ОсновнойДоговор.Ссылка as contract,
    Подключение.Ссылка as pc,
    Подключение.ВнешнийКлюч as pcForeignKey,
    SUM(Количество) as amount
FROM
    РегистрНакопления.ПланыПоставок as plan
    LEFT JOIN(
        SELECT
            Договор as terminationContract,
            ISNULL(MAX(ДатаРасторжения), MAX(Дата)) as terminationDate
        FROM
            Документ.РасторжениеДоговора
        WHERE
            ПометкаУдаления = false
        GROUP BY // Single row with max date only
            Договор
    ) as termination
    ON (plan.Договор.ОсновнойДоговор.Ссылка = termination.terminationContract)
WHERE
    Активность
    AND Период BETWEEN DateTime(2012, 5, 1) AND DateTime(2012, 5, 31)
    AND termination.terminationContract IS NOT NULL
    AND Договор NOT IN(
        SELECT DISTINCT
            Договор
        FROM
            РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
        WHERE
            ЕстьСвязь
            AND Договор.ПометкаУдаления = false
    )
GROUP BY
    Период,
    Договор.ОсновнойДоговор.Ссылка,
    Подключение.Ссылка
ORDER BY Период

1905. Обязательно заполнена Поставка

SELECT DISTINCT
    Период as date,
    Договор.ОсновнойДоговор.Ссылка as contract,
    Подключение.Ссылка as pc,
    SUM(Количество) as amount
FROM
    РегистрНакопления.ПланыПоставок as plan
WHERE
    Активность
    AND Период BETWEEN DateTime(2012, 5, 1) AND DateTime(2012, 5, 31)
    AND Поставка.Ссылка IS NULL
GROUP BY
    Период,
    Договор.ОсновнойДоговор.Ссылка,
    Подключение.Ссылка
ORDER BY Период

1906. Крайне желательно заполнение категории потребления

На самом деле не обязательным является само заполнение, если не ведётся вообще. Критической проблемой это становится в случае когда часть заполнена, часть нет - появляются лишние Субъекты распределения, могут появляться неполные и/или отрицательные планы.

SELECT DISTINCT
    Период as date,
    Договор.ОсновнойДоговор.Ссылка as contract,
    Подключение.Ссылка as pc,
    SUM(Количество) as amount
FROM
    РегистрНакопления.ПланыПоставок as plan
WHERE
    Активность
    AND Период BETWEEN DateTime(2012, 5, 1) AND DateTime(2012, 5, 31)
    AND КатегорияПотребления.Ссылка IS NULL
GROUP BY
    Период,
    Договор.ОсновнойДоговор.Ссылка,
    Подключение.Ссылка
ORDER BY Период

1907. Площадки, участвующие в планах должны быть активны

Если ведутся планы в разрезе площадок, они должны быть активными и загруженными в ИМУС

SELECT DISTINCT
    Период as date,
    Договор.ОсновнойДоговор.Ссылка as contract,
    ПлощадкаОборудования.Ссылка as gco,
    SUM(Количество) as amount
FROM
    РегистрНакопления.ПланыПоставок as plan
    LEFT JOIN(
        SELECT
            Договор as terminationContract,
            ISNULL(MAX(ДатаРасторжения), MAX(Дата)) as terminationDate
        FROM
            Документ.РасторжениеДоговора
        WHERE
            ПометкаУдаления = false
        GROUP BY // Single row with max date only
            Договор
    ) as termination
    ON (plan.Договор.ОсновнойДоговор.Ссылка = termination.terminationContract)
WHERE
    Активность
    AND Период BETWEEN DateTime(2012, 5, 1) AND DateTime(2012, 5, 31)
    AND termination.terminationContract IS NOT NULL
    AND ПлощадкаОборудования NOT IN(
        SELECT DISTINCT
            Площадка
        FROM
            РегистрСведений.ПлощадкиПоДоговору.СрезПоследних
        WHERE
            ЕстьСвязь
            AND Договор.ПометкаУдаления = false
    )
GROUP BY
    Период,
    Договор.ОсновнойДоговор.Ссылка,
    Подключение.Ссылка
ORDER BY Период

1908. План должен быть неотрицательным

Суммарные планы (сумма всех изменений, которые не грузятся по отдельности, берётся сумма всех по субъекту распределения) должны быть не отрицательными:

SELECT DISTINCT
    SUM(Количество) as amount,
    Договор.ОсновнойДоговор as contract,
    Договор.ВидПрейскуранта as priority,
    Подключение as pc,
    ПлощадкаОборудования as gco,
    КатегорияПотребления as consType,
    Поставка as purchaseContract
FROM
    РегистрНакопления.ПланыПоставок
WHERE
    Активность
    AND Период BETWEEN DateTime(2012, 10, 1) AND DateTime(2012, 10, 31)
GROUP BY
    Договор.ОсновнойДоговор,
    Договор.ВидПрейскуранта,
    Подключение,
    ПлощадкаОборудования,
    КатегорияПотребления,
    Поставка
HAVING
    SUM(Количество) < 0

К данному запросу следует отметить, что если не ведётся разрез планов в компании по площадкам или подключениям, группировка по данному элементу должна быть исключена из приведённого запроса.

Код 2000. Поставка (Договоры поставки)

Справочник.ПоставкиГаза.

2001. Должен быть заполнен производитель газа

SELECT DISTINCT
    Ссылка as obj,
    Производитель as producer
FROM
    Справочник.ПоставкиГаза
WHERE
    ПометкаУдаления = false
    AND (
        Производитель.Ссылка IS NULL
        OR
        Производитель.ПометкаУдаления = true
    )

2002. Заполнен поставщик газа (владелец договора поставки)

SELECT DISTINCT
    Ссылка as obj,
    Владелец.Владелец as supplier
FROM
    Справочник.ПоставкиГаза
WHERE
    ПометкаУдаления = false
    AND (
        Владелец.Владелец.Ссылка IS NULL
        OR
        Владелец.Владелец.ПометкаУдаления = true
    )

2003. Заполнен владелец газа (продавец газа)

SELECT DISTINCT
    Ссылка as obj,
    ВладелецГаза as vendor
FROM
    Справочник.ПоставкиГаза
WHERE
    ПометкаУдаления = false
    AND (
        ВладелецГаза.Ссылка IS NULL
        OR
        ВладелецГаза.ПометкаУдаления = true
    )

2004. Заполнен вид ценообразования

SELECT DISTINCT
    Ссылка as obj,
    ВидЦенообразования as priority
FROM
    Справочник.ПоставкиГаза
WHERE
    ПометкаУдаления = false
    AND ВидЦенообразования.Ссылка IS NULL

2005. Имеются корректные даты начала и конца договора закупки (поставки)

SELECT DISTINCT
    Ссылка as obj,
    Владелец.ДатаНачала as dateStart,
    Владелец.ДатаКонца as dateEnd
FROM
    Справочник.ПоставкиГаза
WHERE
    ПометкаУдаления = false
    AND(
        ISNULL(Владелец.ДатаНачала, DateTime(3000, 1, 1)) < DateTime(1945, 1, 1)
        OR
        ISNULL(Владелец.ДатаКонца, DateTime(3000, 1, 1)) < DateTime(1945, 1, 1)
        OR
        (
            ВЫРАЗИТЬ(Владелец.ДатаНачала as Date) IS NULL
            AND Владелец.ДатаНачала <> "01.01.0001 0:00:00"
        )
        OR
        (
            ВЫРАЗИТЬ(Владелец.ДатаКонца as Date) IS NULL
            AND Владелец.ДатаКонца <> "01.01.0001 0:00:00"
        )
    )

Код 2100. Границы (коридоры) перебора и недобора

Справочник.ВидыПеребораИНедобора.

2101. Для элементов недобора необходимо указать ДопустимыйНедобор и ДопустимыйПеребор в обратном случае

Одного шаблона расчета не достаточно. В процентах.

SELECT
    Ссылка,
    ДопустимыйНедобор,
    ДопустимыйПеребор,
    ШаблонРасчета
FROM
    Справочник.ВидыПеребораИНедобора
WHERE
    ПометкаУдаления = false
    AND (0 = ISNULL(ДопустимыйНедобор, 0) AND 0 = ISNULL(ДопустимыйПеребор, 0))

{{ Для настройки как трактовать данные цифры, имеется опция ais.ws.prcLimitAddition }}