Представления показывают тип составных реквизитов, также есть представление для критериев отбора (по которым можно строить структуру подчиненности на основе "соседней базы", рабочий вариант у меня есть, и это совсем не трудно)
Как известно, 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, которые я рекомендую создавать с умом.
И счастливый пользователь встает и говорит «отлично, куда мне нажать чтобы сформировать такой отчет?» и работа начинается по новой, только уже штатными средствами 1С.
» and d.Валюта=0x8FC00014C2585F8311DBB72497BCFFFF » — не очень удобно.
(1) справку по студии я не решился бы писать. Формирование выделенного фрагмента запроса или всего запроса не должно вызвать мучительных проблем, как я малодушно понадеялся. Очень жаль.
Для тех, кто в танке:
КОГДА ИСПОЛЬЗУЕТСЯ МЕХАНИЗМ ПРЕДСТАВЛЕНИЙ?
— когда нужно формирования отчетов непосредственно на SQL сервере (об этом и речь шла! А кто это будет делать? — программист, т.е. Вы)
— когда нужно ходить за информацией из одной базы в другую (А как это делается? — прямыми запросами! а Вы подумали о веб-сервисах в одной локальной сети? сказал бы, как есть, но в бане окажусь)
— когда нужно делать правки в базе не выходя из студии (А как же бизнес логика 1С? — Отвечу вопросом на это: а как её починить без регламентных процедур с вышвыриванием всех юзаков? мы здесь вообще серьёзные вещи обсуждаем!)
ПОЧЕМУ ПРЕДСТАВЛЕНИЯ ДОЛЖНЫ БЫТЬ СОЗДАНЫ ПРАВИЛЬНО?
— потому что неопытный программист, получив с ними власть Бога, может остановить работу предприятия на время формирования своего отчета (отчеты строятся в 100% случаях с прицелом на данные, а не индексы и ресурсы сервера)
— потому что представления могут быть бесполезны из-за неполноты
ПОЧЕМУ t-sql, а не запросы 1С?
— потому что сразу виден план запроса, который можно перевести на язык запросов 1С
— потому что язык запросов 1С строился на основе sql и многое осталось в t-sql без соответствующего образа в 1С
ЧЕМ-ТАКИМ студия с t-sql лучше того, чтобы всё делать сразу в 1С?
— тем что новые навыки и знания повысят Вашу стоимость
— это разные вещи как отдых заграницей и работа в крупной и престижной фирме (1С и t-sql — это Ваши инструменты, а как ими пользоваться зависит от Вас)
От чего может быть неудобно?
— от собственного невежества
— от привычки решать все проблемы одним способом
— от лени писать больше, когда можно писать короче
— от того, что забыл вложить в письмо с результатом отчета сам запрос, а отчет попросили повторно или немного изменили требования (отправляйте Excel с отчетом и копируйте туда запрос — пусть проникнутся глубоким непониманием и уважением)
(3) зря вы так про невежество
Я только за новые знания и умения, но в данном примере потеряно больше чем получено:
— использование пользователем ( я не очень понял как текст запроса в эксель файле вложенном в электронное письмо поможет пользователю построить такой отчет завтра )
— стоимость поддержки — когда что-то сломается обычный программист не разберется как это работает, ему придется переписать это штатными средствами. Чтобы это поддерживать нужны именно вы с вашей высокой стоимостью
— настраиваемые отборы, группировки
— расшифровка — банально открыть контрагента сразу из отчета
— не увидел в примере использования виртуальных таблиц, полагаю эмулировать их придется самостоятельно
Плюсы
+ Вы смогли использовать методы t-sql которых нет в 1С (хотя в примере таких нет)
+ Пользователи считают вас очень умным
Зачем вам придумывать план запроса, который _не всегда_ можно перевести в 1С, если можно сразу писать в 1С (и корректировать запрос 1с оглядываясь на созданный системой план запроса)?
Понятно, что знать внутреннее устройство базы бывает полезно и в редких случаях необходимо работать с данными напрямую в SQL (хотя мне не пригодилось). Не понятно зачем нужна прослойка представлений — это дополнительный слой который нужно держать в голове и удобства от которого довольно сомнительные.
Получать данные из базы 1с с помощью инструментов запросов 1с полезная привычка, ведь этот инструмент специально для этого предназначен и работает хорошо.
Описанный в статье подход отличный способ быть незаменимым программистом (будет работать пока не найдется нормальный программист который не будет взрывать пользователю мозг)
Хотел поставить за демонстрацию работы +
Объяснение «для чего это нужно» —
Итого к сожалению ноль.
Складывается впечатление, что вы хорошо разбираетесь в SQL и при этом абсолютно не хотите пользоваться возможностями самой платформы. Все ваши приведённые «не могу» не реализуемы с использованием самой платформы. Т.е. тут больше подходит поговорка «короче дорога которую знаешь» и вы делаете всё на t-sql становясь единственным и незаменимым. И после вашего ухода, как бы не печально это было, всё будет выкинуто/похоронено и сделано заново.
Необходимость работы с SQL напрямую всегда может понадобиться. Так что будет подспорьем! Плюс!
Я не стал упоминать почему плохо непосредственно работать с таблицами?
— потому что не прозрачные имена полей
— потому что ресурсами сервера придется управлять хинтами, о чем обычно не помнят или не знают
— потому что можно искать имена полей непосредственно на сервере
мне вот в 1с не хватает update и delete (из ANSI SQL — как часность t-sql) … с остальным всем пока удавалось выкрутиться через «ЗАПРОС» ((( …
(10) graZy, Вам разве это требуется?
http://infostart.ru/public/118593/
Пусть так. DML на таблицах прекрасно работает. Я даже нечто подобное писал раньше
Однако DML в консоле SQL совсем другое.
Можно через view, но не те, которые перерабатывают отдельные поля (у меня как раз такие, а вам надо чтоб один к одному все поля были). Конечно можно и эти брать (delete, truncate отработают, update пройдут всюду, кроме преобразованных полей).
Сложности скорее связаны не с конкретными view, а с прямотой ручек. Я вот не решился такое предлагать здесь, потому что правка через DML и без четкого понимания самого действа скорее сослужит отрицательную службу популярности публикации.
view, которые я предложил, направлены в первую очередь на отчеты и обмен с другими базами. Знаете ли подключился и вытянул все, что требовалось, из одной базы в другую. Я, к примеру, строю структуру подчиненности на основе критериев отбора или проверяю даты запрета редактирования.
(11) я часто не до конца развиваю мысль (сорри).
1. я согласен с (пост 8) DrAku1a
2. «Запрос» 1C позволяет нагородить многое
инструмент подобный вашему нужен, но очень специфичен.
думаю может быть полезный тем кто не хочет лезть в детали 1с и/или тому кто захочет/потребуется полезть напрямую в базу.
* вот точно понравилась ваша возможность перехлеста разных баз (не проверю, нет задачи, но с меня плюсик).
примечание: я вырос на SQL c 90 года так или иначе ворочал разные СУБД, с 1с столкнулся последние пару лет. Это к тому что мне «душевно» ближе «чистый» SQL, чем 1С, но работаем на том что дает проще результат.
Автор с проектом еще на связи ? Почему обработку приобрести можно только на старт мани ? Нельзя за Р ?