1C8.3 SQL view (удобный просмотр содержания базы на SQL-сервере)

Обработка создания представлений (view) для SQL базы 1С8.3 и кратенький экскурс по работе сними.
Представления показывают тип составных реквизитов, также есть представление для критериев отбора (по которым можно строить структуру подчиненности на основе "соседней базы", рабочий вариант у меня есть, и это совсем не трудно)

Как известно, 1С обладает великолепной системой извлечения информации — консолью запросов.

Именно к этому средству мы прибегаем всякий раз, когда прибегает взмыленный работник склада или аналитик, и с трясущимися руками просит все бросить и сделать именно ему, прямо сейчас отчет… у пусть весь мир подождет!

Ну как тут не помочь человеку, ведь именно в эту секунду мы для него — последняя надежда, спасательный круг, добрый волшебник из сказки… а если еще это девушка прибежала… о-о-о! А ведь самых красивых и подсылают в таких случаях!

 

К делу!

Рядом сидит и молится наш добрый друг, а мы неспешно и поглядывая на него с интересов приступаем:

— Система 1С хороша, но язык запросов слабоват и остановить выполнение формируемого запроса нельзя. А мы еще и не уяснили, что там требуется собрать из базы.

— Нам нужен мощный современный механизм – Management Studio. Я не знаю, что может быть лучше. Все меркнет рядом с этим средством, если оно в опытных руках.

— Нам нужно представлять себе наполнение нашей базы 1С на сервере SQL детально. Чтобы решить эту проблему нужно создать представления для всех хранимых таблиц. (см. обработку).

 

Простой запрос и выглядеть должен просто:

select *

from DПриходнаяНакладнаяID

(запрос выбирает все из таблички)

Упростим себе жизнь и заработаем очко в глазах окружающих – введем короткое имя таблички:

select top 10

       d.*

from DПриходнаяНакладнаяID as d

(запрос выбирает первые 10 строк из таблички целиком)

 

Здесь мы озадаченно смотри нашего друга и спрашиваем – Что он хочет увидеть?

(в этом месте выплескивается потоком сбивчивая речь, из которой выясняются некоторые поля таблички)

select top 10

       d.Номер       as [НомерПНК],

       d.Дата        as [ДатаПНК],

       d.Контрагент  as [Контрагент],

       d.*

from DПриходнаяНакладнаяID as d

(количество строк ограничено 10, но мы ведь только строим отчет; а вот поля таблички уже начали формироваться)

Заработаем еще одно очко (так 1С уже не умеет в своих запросах):

select top 10

       d.Номер                                as [НомерПНК],

       convert(varchar(10),d.Дата,104)        as [ДатаПНК],

       (select top 1 k.Наименование from RКонтрагентыID as k where k.Ссылка=d.Контрагент)  as [Контрагент],

       d.*

from DПриходнаяНакладнаяID as d

(конструкция convert(varchar(10),t.Дата,104) превратит дату в удобную для восприятия, т.к. время в отчетах фигурирует редко; вложенный запрос заменит нечитаемую ссылку на контрагента в его наименование, впрочем, поле представления может быть любым, главное не забывайте добавлять top 1)

Сейчас, внимание на нашего друга, его взгляд в этом месте проясняется – мы добавляем итоговые суммы:

select top 10

       d.Номер                                as [НомерПНК],

       convert(varchar(10),d.Дата,104)        as [ДатаПНК],

       (select top 1 k.Наименование from RКонтрагентыID as k where k.Ссылка=d.Контрагент)  as [Контрагент],

 

       i.Сумма                                as [Сумма],

       i.СуммаНДС                             as [СуммаНДС],

       d.*

from

       DПриходнаяНакладнаяID as d

       outer apply(select sum(t.Сумма) as [Сумма],

                          sum(t.НДС)   as [СуммаНДС] 

                   from TПриходнаяНакладная_НоменклатураID as t

                           where t.Ссылка=d.Ссылка) as i

 

(запрос выбирает все те же 10, но теперь по каждой выбранной строке формируется дополнительный запрос и его содержание цепляется левым соединение – это особая фишка! можно с её помощью расширять состав полезных полей и не морочиться группировками, а вот если заменить outer на cross то соединение будет уже внутренним!)

 

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

ГТД? Что ж сразу трудно было сказать?!!!

select top 10

       d.Номер                                as [НомерПНК],

       convert(varchar(10),d.Дата,104)        as [ДатаПНК],

       (select top 1 k.Наименование from RКонтрагентыID as k where k.Ссылка=d.Контрагент)  as [Контрагент],

 

       i.Сумма                                as [Сумма],

       i.СуммаНДС                             as [СуммаНДС],

      /*все по движениям ГТД */

       r.*

from

       DПриходнаяНакладнаяID as d

      

       cross apply(select sum(t.Сумма) as [Сумма],

                          sum(t.НДС)   as [СуммаНДС] 

                   from TПриходнаяНакладная_НоменклатураID as t

                           where t.Ссылка=d.Ссылка) as i

      

       left join AОстаткиГТДID as r on(r.Регистратор=d.Ссылка)

(прицепили движения по ГТД, да так что напугать посильнее, что всё опять плохо, т.к. ничего знакомого)

Сжалимся и покажем номера ГТД:

select top 10

       d.Номер                                as [НомерПНК],

       convert(varchar(10),d.Дата,104)        as [ДатаПНК],

       (select top 1 k.Наименование from RКонтрагентыID as k where k.Ссылка=d.Контрагент)  as [Контрагент],

 

       i.Сумма                                as [Сумма],

       i.СуммаНДС                             as [СуммаНДС],

       (select top 1 g.Наименование from RГТДID as g where g.Ссылка=r.ГТД)  as [ГТД],

       /*все по движениям ГТД */

       r.*

from

       DПриходнаяНакладнаяID as d

      

       cross apply(select sum(t.Сумма) as [Сумма],

                          sum(t.НДС)   as [СуммаНДС] 

                   from TПриходнаяНакладная_НоменклатураID as t

                           where t.Ссылка=d.Ссылка) as i

      

       left join AОстаткиГТДID as r on(r.Регистратор=d.Ссылка)

К этому моменту Вы должны уже ощутить мощь Management Studio, т.к. возможность остановить выполнение запроса и сам язык запросов крайне мощные инструменты.

 

Наложим ограничения, уберем лишние поля и top 10:

select

       d.Номер                                as [НомерПНК],

       convert(varchar(10),d.Дата,104)        as [ДатаПНК],

       (select top 1 k.Наименование from RКонтрагентыID as k where k.Ссылка=d.Контрагент)  as [Контрагент],

      

       i.Сумма                                as [Сумма],

       i.СуммаНДС                             as [СуммаНДС],

       (select top 1 g.Наименование from RГТДID as g where g.Ссылка=r.ГТД)  as [ГТД]

      

from

       DПриходнаяНакладнаяID as d

      

       cross apply(select sum(t.Сумма) as [Сумма],

                          sum(t.НДС)   as [СуммаНДС] 

                   from TПриходнаяНакладная_НоменклатураID as t

                           where t.Ссылка=d.Ссылка) as i

      

       left join AОстаткиГТДID as r on(r.Регистратор=d.Ссылка)

where

       d.Дата>=’20240101′ and d.Дата<‘20240201’

       and d.Валюта=0x8FC00014C2585F8311DBB72497BCFFFF

 

(фильтры накладывать очень просто, а выполняется только выделенный фрагмент текста)

Сформированный результа легко скопировать в Excel или сохранить в csv (а потом открыть в Excel) и добавить автофильтры.

Не забывайте, что такая вольность становится возможной только с корректными  view, которые я рекомендую создавать с умом.

 

 

13 Comments

  1. Alien_job

    И счастливый пользователь встает и говорит «отлично, куда мне нажать чтобы сформировать такой отчет?» и работа начинается по новой, только уже штатными средствами 1С.

    » and d.Валюта=0x8FC00014C2585F8311DBB72497BCFFFF » — не очень удобно.

    Reply
  2. ture

    (1) справку по студии я не решился бы писать. Формирование выделенного фрагмента запроса или всего запроса не должно вызвать мучительных проблем, как я малодушно понадеялся. Очень жаль.

    Reply
  3. ture

    Для тех, кто в танке:

    КОГДА ИСПОЛЬЗУЕТСЯ МЕХАНИЗМ ПРЕДСТАВЛЕНИЙ?

    когда нужно формирования отчетов непосредственно на SQL сервере (об этом и речь шла! А кто это будет делать? — программист, т.е. Вы)

    когда нужно ходить за информацией из одной базы в другую (А как это делается? — прямыми запросами! а Вы подумали о веб-сервисах в одной локальной сети? сказал бы, как есть, но в бане окажусь)

    когда нужно делать правки в базе не выходя из студии (А как же бизнес логика 1С? — Отвечу вопросом на это: а как её починить без регламентных процедур с вышвыриванием всех юзаков? мы здесь вообще серьёзные вещи обсуждаем!)

    ПОЧЕМУ ПРЕДСТАВЛЕНИЯ ДОЛЖНЫ БЫТЬ СОЗДАНЫ ПРАВИЛЬНО?

    потому что неопытный программист, получив с ними власть Бога, может остановить работу предприятия на время формирования своего отчета (отчеты строятся в 100% случаях с прицелом на данные, а не индексы и ресурсы сервера)

    потому что представления могут быть бесполезны из-за неполноты

    ПОЧЕМУ t-sql, а не запросы 1С?

    потому что сразу виден план запроса, который можно перевести на язык запросов 1С

    потому что язык запросов 1С строился на основе sql и многое осталось в t-sql без соответствующего образа в 1С

    ЧЕМ-ТАКИМ студия с t-sql лучше того, чтобы всё делать сразу в 1С?

    тем что новые навыки и знания повысят Вашу стоимость

    — это разные вещи как отдых заграницей и работа в крупной и престижной фирме (1С и t-sql — это Ваши инструменты, а как ими пользоваться зависит от Вас)

    От чего может быть неудобно?

    — от собственного невежества

    — от привычки решать все проблемы одним способом

    — от лени писать больше, когда можно писать короче

    — от того, что забыл вложить в письмо с результатом отчета сам запрос, а отчет попросили повторно или немного изменили требования (отправляйте Excel с отчетом и копируйте туда запрос — пусть проникнутся глубоким непониманием и уважением)

    Reply
  4. Alien_job

    (3) зря вы так про невежество

    Я только за новые знания и умения, но в данном примере потеряно больше чем получено:

    — использование пользователем ( я не очень понял как текст запроса в эксель файле вложенном в электронное письмо поможет пользователю построить такой отчет завтра )

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

    — настраиваемые отборы, группировки

    — расшифровка — банально открыть контрагента сразу из отчета

    — не увидел в примере использования виртуальных таблиц, полагаю эмулировать их придется самостоятельно

    Плюсы

    + Вы смогли использовать методы t-sql которых нет в 1С (хотя в примере таких нет)

    + Пользователи считают вас очень умным

    Зачем вам придумывать план запроса, который _не всегда_ можно перевести в 1С, если можно сразу писать в 1С (и корректировать запрос 1с оглядываясь на созданный системой план запроса)?

    Понятно, что знать внутреннее устройство базы бывает полезно и в редких случаях необходимо работать с данными напрямую в SQL (хотя мне не пригодилось). Не понятно зачем нужна прослойка представлений — это дополнительный слой который нужно держать в голове и удобства от которого довольно сомнительные.

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

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

    Reply
  5. ture
    Reply
  6. A_Max

    Хотел поставить за демонстрацию работы +

    Объяснение «для чего это нужно» —

    Итого к сожалению ноль.

    Складывается впечатление, что вы хорошо разбираетесь в SQL и при этом абсолютно не хотите пользоваться возможностями самой платформы. Все ваши приведённые «не могу» не реализуемы с использованием самой платформы. Т.е. тут больше подходит поговорка «короче дорога которую знаешь» и вы делаете всё на t-sql становясь единственным и незаменимым. И после вашего ухода, как бы не печально это было, всё будет выкинуто/похоронено и сделано заново.

    Reply
  7. ture
    Reply
  8. DrAku1a

    Необходимость работы с SQL напрямую всегда может понадобиться. Так что будет подспорьем! Плюс!

    Reply
  9. ture

    Я не стал упоминать почему плохо непосредственно работать с таблицами?

    — потому что не прозрачные имена полей

    — потому что ресурсами сервера придется управлять хинтами, о чем обычно не помнят или не знают

    — потому что можно искать имена полей непосредственно на сервере

    Reply
  10. graZy

    мне вот в 1с не хватает update и delete (из ANSI SQL — как часность t-sql) … с остальным всем пока удавалось выкрутиться через «ЗАПРОС» ((( …

    Reply
  11. ture

    (10) graZy, Вам разве это требуется?

    Пусть так. DML на таблицах прекрасно работает. Я даже нечто подобное писал раньше http://infostart.ru/public/118593/

    Однако DML в консоле SQL совсем другое.

    Можно через view, но не те, которые перерабатывают отдельные поля (у меня как раз такие, а вам надо чтоб один к одному все поля были). Конечно можно и эти брать (delete, truncate отработают, update пройдут всюду, кроме преобразованных полей).

    Сложности скорее связаны не с конкретными view, а с прямотой ручек. Я вот не решился такое предлагать здесь, потому что правка через DML и без четкого понимания самого действа скорее сослужит отрицательную службу популярности публикации.

    view, которые я предложил, направлены в первую очередь на отчеты и обмен с другими базами. Знаете ли подключился и вытянул все, что требовалось, из одной базы в другую. Я, к примеру, строю структуру подчиненности на основе критериев отбора или проверяю даты запрета редактирования.

    Reply
  12. graZy

    (11) я часто не до конца развиваю мысль (сорри).

    1. я согласен с (пост 8) DrAku1a

    2. «Запрос» 1C позволяет нагородить многое

    инструмент подобный вашему нужен, но очень специфичен.

    думаю может быть полезный тем кто не хочет лезть в детали 1с и/или тому кто захочет/потребуется полезть напрямую в базу.

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

    примечание: я вырос на SQL c 90 года так или иначе ворочал разные СУБД, с 1с столкнулся последние пару лет. Это к тому что мне «душевно» ближе «чистый» SQL, чем 1С, но работаем на том что дает проще результат.

    Reply
  13. beseda

    Автор с проектом еще на связи ? Почему обработку приобрести можно только на старт мани ? Нельзя за Р ?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *