Последний тюнинг известной обработки 1CQA (консоль прямых запросов 1С++) для 1С:Предприятие-77.

17.12.11

Разработка - Инструментарий разработчика

Авторы исходной версии:  Дмитрий Ощепков (dmitro-75@mail.ru),
Ivan T Berezdetsky (berezdetsky@yahoo.com). В предлагаемой версии:
1) Добавлена возможность выбирать тип провайдера данных ODBC или OLEDB (только базы DBF);  
2) Добавлена возможность редактировать текст запроса в диалоге конструктора запросов, предоставляемого объектом "AddIn.qryConsole" ВК  qryConsole.dll (только базы SQL);
3) Расширен список типов объектов, которые могут принимать параметры запроса;
4)Добавлена возможность через параметры запроса укладывать списки ссылок объектов во временные таблицы (в том числе с иерархическим включением). Эти таблицы можно использовать  в тексте запроса по имени ‘#<ИмяПараметра>’;
5) Добавлена возможность открывать обработку в режиме подбора (или имитации подбора) из других форм для подбора произвольных выборок данных из базы;
6) Сделано множество других улучшений (интерфейсных и пр.);

Скачать файлы

Наименование Файл Версия Размер
Консоль1CQA_ALL.rar
.rar 2,23Mb
349
.rar 2,23Mb 349 Скачать
Консоль1CQA.rar
.rar 49,29Kb
22
.rar 49,29Kb 22 Скачать
FormEx1CPP.rar
.rar 2,12Mb
21
.rar 2,12Mb 21 Скачать
PlugIns.rar
.rar 62,94Kb
17
.rar 62,94Kb 17 Скачать
Samples.rar
.rar 3,86Kb
20
.rar 3,86Kb 20 Скачать

 

Свет мой, SQL, скажи, да всю правду доложи!

Я ль в инете всех шустрее, всех прикольней и умнее?

Пушкин – АС!

 

Благодарности авторам:

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

Отдельная признательность  Ivanu T Berezdetsky за реализацию поддержки выполнения пакетов запросов. До этого мне приходилось сначала выводить оттранслированный  текст запроса в окне сообщений, а затем выполнять его в QA на сервере.

Исходные версии обработки и много другого полезного можно найти на сайте: http://www.dev.citykirov.ru/.

Обсуждение обработки и разные ее модификации смотрите на форуме:  http://www.1cpp.ru/forum/YaBB.pl?num=1157967835.

 

Требования:

1) Обязательно - наличие предварительно загруженных (или лежащих в одном  каталоге с 1CQA) внешних компонент 1СPP.dll (www.1cpp.ru) и FormEx.dll (www.dorex.pro).

2) Желательно, чтобы в конфигурации был класс определенный пользователем "Общие.Форма.Привязка" (www.dev.citykirov.ru ,автор Дмитрий Ощепков).  Обсуждение класса на форуме 1СРР:  http://www.1cpp.ru/forum/YaBB.pl?num=1200464076. При отсутствии класса обработка работать будет, но без привязок элементов в форме.

3) Желательно (для возможности укладывать списки объектов во временные таблицы) иметь для редактирования списков обработку под именем ПодборUChoice (улучшенная обработка УОПО). Она может быть встроена или лежать в одном каталоге с 1CQA. Без этой обработки будут не доступны специальные типы параметров запроса, через которые создаются временные таблицы.

4) При большом желании (для редактирования запроса в диалоге конструктора) требуется наличие внешней компоненты qryConsole.dll(автор Ivan T Berezdetsky). Обработка при открытии пытается ее загрузить (так же как 1CPP). Если загрузить не удается, то соответствующие элементы управления в обработке становятся недоступными.

Установочный дистрибутив и обсуждение внешней компоненты  - на форуме: http://www.1cpp.ru/forum/YaBB.pl?num=1193394153.  Для работы ВК qryConsole.dll обязательна установка Office web components (OWC11). Иначе обработка будет вас малоприятно ругать при открытии (беда устраняется или установкой OWC11, или удалением/переименованием файла библиотеки – чтоб вообще не грузилась).

 

Описание файлов поставки:

1) Консоль1CQA.rar - обработка 1CQA под именем «Консоль1CQA» (иначе не встраивается);

2) FormEx1CPP.rar – библиотеки 1CPP.dll, FormEx.dll и класс "Общие.Форма.Привязка";

3) PlugIns.rarвспомогательные обработки ПодборUChoice и ИзменениеВремениДокумента. Последняя обработка используется в меню действий со значением в ячейке таблицы результатов запроса по двойному клику мыши (Рис.11) для изменения даты-времени документа.

4) Samples.rar  – разные примеры запросов, использованные в публикации.

5) Консоль1CQA_ALL.rar – полный набор файлов поставки (все 4 архива);

 

Описание установки:

1) Обеспечить загрузку 1CPP.dll и FormEx.dll (обязательно):

Библиотеки можно скачать с сайтов разработчиков или  взять  из каталога файла поставки \..\FormEx1CPP.rar\FormEx1CPP\DLL\:

Файл 1CPP2037.dll – библиотека 1CPP версии 2.0.3.7, рекомендуемый релиз с ядром FormEx. Для него загрузка FormEx.dll не требуется.

Файл 1CPP2507.dll – библиотека 1CPP версии 2.5.0.7, рекомендуемый релиз с раздельной загрузкой FormEx.

Файл 1CPP3220.dll – библиотека 1CPP версии 3.2.2.0  (последняя с сайта разработчиков)

Файл 1CPP32316.dll – библиотека 1CPP версии 3.2.2.8 (одна из последних тестовых версий с форума: http://www.1cpp.ru/forum/YaBB.pl?num=1288774760/all )  

Файл FormEx205101.dll – библиотека FormEx версии 2.0.5.101 (самая последняя).

При копировании файлов из имени следует убрать цифры версий.

 

Загружать библиотеки можно стандартным способом в процедуре ПриНачалеРаботыСистемы():

                ЗагрузитьВнешнююКомпоненту(КаталогПрограммы ()+"1CPP.dll");

                ЗагрузитьВнешнююКомпоненту(КаталогПрограммы ()+"FormEx.dll");

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

 

2) Подключить класс "Общие.Форма.Привязка" (желательно):

Можно из каталога файла поставки \..\FormEx1CPP.rar\FormEx1CPP\ в каталог базы скопировать файлы Defcls.prm  и  КОП_ОбщиеФормаПривязка.ert

А можно включить класс в конфигурацию.  Для этого туда нужно добавить из одноименных внешних файлов обработки Defcls  и  КОП_ОбщиеФормаПривязка.

ВНИМАНИЕ! Если у вас уже используются другие классы, то придется добавить описание класса в файл Defcls.prm  или обработку Defcls  из соответствующих файлов.

 

3) Вспомогательные обработки (желательно):

Скопировать из каталога файла поставки \..\PlugIns.rar\PlugIns\ в каталог обработки 1CQA или добавить в конфигурацию под теми же именами.

 

4) Конструктор запросов (при большом желании):

Установить внешнюю компоненту qryConsole.dll из скаченного дистрибутива (смотри выше). И обязательно установить Office web components (OWC11)!

 

Описание добавлений и улучшений в предлагаемой версии:

1)      Для баз DBF добавлена возможность выбирать интерфейс доступа к данным ODBC или OLEDB (Рис.2).  Для использования OLEDB требуется установить OLEDB vfpoledb provider v9. В базах DBF через ODBC, честно говоря, мне не удалось заставить работать прямые запросы. Через OLEDB вроде все работает.

Для баз SQL по ряду соображений я решил оставить доступ только через ODBC (Рис.1).

2)      Для баз SQL добавлена возможность редактировать текст запроса в диалоге конструктора запросов, поставляемого ВК qryConsole.dll (Рис.3 и Рис.4). Для баз DBF эта возможность, к сожалению, недоступна в текущей версии этой ВК.

3)      Расширен список типов, которые могут принимать параметры запроса (Рис.6). Добавлены следующие типы: Календари, ВидыРасчетов, Бухгалтерские счета, ПланыСчетов (системное перечисление), ВидыСубконто.

4)      Добавлены служебные типы параметры запроса СписокСсылок9, СписокСсылок13 и ИерархияСсылок9.  Значения этих параметров представляют списки объектов определенного типа  и используется для укладывания во временные таблицы ссылок на объекты (включая с иерархическим включением).  Временная таблица доступна в тексте запроса под именем '#'. Для редактирования списков объектов (Рис.7) используется обработка под именем ПодборUChoice (улучшенная обработка УОПО). При отсутствии обработки ПодборUChoice  в конфигурации или в каталоге 1CQA эти служебные типы параметров исключаются из меню выбора типов параметра запроса.

5)      Добавлена возможность открывать 1CQA в режиме подбора (имитации подбора) для возврата в другие формы произвольных выборок данных.

Имитация подбора используется в том случае, когда 1CQA  - внешняя обработка. Тогда функция ОткрытьПодбор(,,) становится бесполезна. Приходится просто открывать внешнюю обработку Консоль1CQA с передачей через параметр формы контекста той формы, которая вызывает подбор.

Имитация выбора в подборе осуществляется вызовом в контексте формы владельце процедуры ОбработкаПодбора(,,,) с помощью метода ВыполнитьПроцедуру(Контекст, ИмяПроцедуры, СписокАргументов) объекта «Сервис» ВК FormEx.dll.

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

  1. При клике по пустой таблице параметров запроса выводится диалог с информацией о работе с параметрами запроса (Рис.5);
  2. Выбор типа объекта производится в удобном красивом диалоге в виде дерева (Рис.6);
  3. При клике по таблице результатов запроса, если значение в ячейке ссылочного типа, выводится меню действий с объектом (Рис.11). Меню позволяет:

    открыть объект для просмотра-редактирования;

    открыть объект в списке (журнале);

    пометить его на удаление;

    снять пометку;

    удалить непосредственно;

    открыть объект для редактирования в обработке 'Редактор Реквизитов' (автор Цылёв Владислав vet7777@mail.ru);

  4. Для документов доступны дополнительные действия:

    провести;

    отменить проведение; 

    изменить дату-время (для этого действия требуется обработка ИзменениеВремениДокумента);

  5.  Кроме этого для документа можно вывести отчет о движениях или сформировать структуру подчинености. Соответствующие отчеты интегрированы в консоль (чтобы не зависеть от используемой конфигурации): 

Отчет о движениях - в полном вариате (по регистрам, проводкам, записям ЖР и истории реквизитов).

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

7)      Различные варианты очистки запроса (Рис.8);

8)      Печать таблицы параметров запроса и таблицы его результатов (Рис.9).

9)      Выбор значения параметра 'Collate' / 'Collating' в строке соединения (только базы DBF) (Рис.13).  

10)    Добавлена обработка спец.комментариев в тексте запроса (для установки спец.опций выполнения запроса).
 поддерживается обработка следующих спец.комментариев:

'--!ExecuteTransaction' - выполнять все батчи запроса в единой транзакции (при ошибке хоть в одном батче транзакция откатывается);
'--!ExecuteRollback'        - выполнять все батчи в транзакции с ее откатом независимо от результата выполнения (для просмотра "результатов" запроса без фактического изменения данных);
подробности смотрите в макете "СпецКомметарииЗапроса" обработки (можно вывести в табличный документ, Рис.5 и Рис.9).

11)    Добавлен вывод описания обработки в табличный документ ( Рис.5 и Рис.9).

 

Применение:

Для баз SQL доступны особые режимы выполнения запроса (Рис.12): проверка синтаксиса и вывод плана выполнения запроса. План выполнения кроме таблицы результатов выводится еще в отдельном текстовом документе.

Для баз DBF использование ограничено в основном разделенным режимом. В монопольном режиме в базах DBF выполнять прямые запросы не удается без специальных ухищрений (подмены библиотеки DBEng32.dll в каталоге BIN) или использования особых провайдеров доступа к данным.

При попытке использования в монопольном режиме обработка пытается выполнить тестовый запрос: "select COUNT(*) from 1SUSERS". Если запрос выполняется без ошибок - никаких сообщений не выводится. Иначе (если тестовый запрос выдает ошибку) программа  выдает пользователю предупреждение об этом печальном факте, но работать в консоли не запрещает. Если после этого запрос вдруг выполнился без ошибок, обработка запоминает эту радость и больше не тревожит пользователя об этом ... до первой следующей ошибки запроса, в тексте которой есть строка "Cannot open file" Cool.

Основные направления для использования:

1)      Для разработчиков: проверка запросов, изучение вопроса о том где, как и какие данные хранятся в базе данных.

2)      Администрирование данных: исправление ошибок в ИБ в дополнение к процедуре тестирования-исправления. В больших рабочих базах тестирование-исправление выполнить нереально. У меня оно длилось, например, больше двух суток. Поэтому тестирование запускается на копии базы в пакетном режиме с записью лога. Затем по информации из лога в 1CQA запросом SELECT вытаскиваем некорректные записи из базы. После анализа этих записей принимается решение: 

  • исправляем запросом UPDATE ,
  • удаляем запросом DELETE,
  • помечаем на удаление, чтобы потом удалить с контролем ссылочной целостности (пометить можно тоже в 1CQA запросом  UPDATE).

3)      Реорганизация данных при обновлениях: установка новых реквизитов, ресурсов и измерений в таблицах объектов метаданных, например регистров.  В архиве Samples.rar  из файлов поставки в файле Sample_TransforRegister_SQL.qry находится пример реально использованного скрипта для довольно сложной установки новых измерений и реквизитов регистра. Фактически скрипт заменяет перепроведение по регистру (выборочно, без пересчета итогов).  Итоги также можно пересчитать прямыми запросами с помощью обработок (только базы SQL):

 ПересчетИтоговРегистров.ert или 1CУстановкаТА.ert.

 

Благодарности:

Кроме авторов обработки хотелось бы также поблагодарить всех разработчиков 1CPP и FormEx. Без  их самоотверженного труда 1С-ка была тормозна, скучна, безлика и беспросветна!

См. также

Консоль запросов

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Консоль запросов к базе SQL, не требующая внешних компонент

10 стартмани

29.04.2015    21559    54    Gvozdod    8    

14

StartManager 1.4 - Развитие альтернативного стартера

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.

1 стартмани

23.04.2014    165700    1864    Alexoniq    1596    

496

Tray Informer

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Россия Абонемент ($m)

Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))

1 стартмани

04.09.2013    32877    61    O-Planet    78    

49

Изменение структуры баз 1С 7.7 без долгой реструктуризации. Часть 1. Справочники

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема. Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы. Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме. Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.

1 стартмани

13.08.2013    21197    Reptile    5    

35

v7.7 1CDialogControls: Инструмент в помощь разработчику на 7.7.

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Давным давно, когда я еще плотно писал на 7.7 работа с формами была мучительной и неудобной. Приходилось каждый элемент выкладывать, выравнивать на форме ручками, прописывать код в модуле. Иногда при разработке очередной формы приходила в голову мысль: "а где-то я уже похожее делал..." и начинался мучительный поиск подходящего кода в своих запасах........

1 стартмани

21.02.2013    18029    35    MarSeN    14    

16

[Разработчику] Любая таблица значений в OLAP

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Анализируем различные данные в 1С, используя OLAP-технологии со всеми прелестями. Т.е. наглядное отображение данных, быстрые расчеты, горизонтальные и вертикальные группировки любой вложенности, удобная фильтрация, Drag'n'Drop и ещё много приятных вещей от MS. Обработка на входе принимает практически любую таблицу значений (ТЗ в которой колонкам указаны типы значений, строка, число и т.п.), на выходе имеем на форме 1С сводную таблицу и график по этой ТЗ, с которой работаем, как и в Excel со сводной таблицей и диаграммой. Взял за основу разработку «OLAP Анализ счёта» ( http://infostart.ru/public/14964/ ) от JohnyDeath и переделал под любую ТЗ. Опционально используется «Прогресс бар для 1С 77» (http://infostart.ru/public/14061/ ) от Gmix.

1 стартмани

21.12.2012    36103    51    venger    7    

23

Библиотека кода 1С 7.7 (накопленная за 8 лет)

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Весь код на 1С 7.7, собранный для повторного использования за 8 лет работы.

10 стартмани

25.11.2012    34958    248    adhocprog    51    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
72. sss999 48 22.11.13 14:17 Сейчас в теме
(69) с этим разобрался,parentext поле,теперь не работает конструкция with rollup ,хотя в "документации" я нашел что парень ее использовал ,я грешу на dll
75. yuraos 991 22.11.13 14:32 Сейчас в теме
(72)
во всяких примерах надо выяснять для какой они базы - SQL или DBF.
запросы решающие одно и тоже могут сильно отличатся в зависимости от типа базы.
---
еще могу посоветовать достать где-нибудь дистрибутив Visual-FoxPro
установить его и смотреть мануал, идущий с ним.
Мне этот мануал был часто полезен.
78. sss999 48 22.11.13 14:43 Сейчас в теме
(75) с chm проблемы какие то ,они не открываются а предлагают скачаться заново
67. sss999 48 21.11.13 14:51 Сейчас в теме
я пользуюсь консолью,здесь скачал пару разных результат один пробовал разные cрр тоже самое
70. sss999 48 22.11.13 09:50 Сейчас в теме
Про такой вариант я и не подумал,спасибо дружище.А я находил тексты с прямыми запросами в инете и тут на старте и там вот писали case.
74. yuraos 991 22.11.13 14:27 Сейчас в теме
вот полезный ресурс по 1cpp:
Архив всех chm
в архиве есть полезная статейка по прямым запросам в 1с-7.7
в файле с именем "TSQLInV7FirstSteps.chm"
разобраны примеры для SQL и DBF с рабором их отличиу
77. sss999 48 22.11.13 14:34 Сейчас в теме
79. yuraos 991 22.11.13 15:15 Сейчас в теме
(77) sss999,
это тоже хорошая статья, но не она.
там о поддержке прямых запросов именно компонентой 1cpp.dll
80. yuraos 991 22.11.13 15:22 Сейчас в теме
(79)
впрочем она очень похожая.
похоже это более ранний вариант.
в архиве гораздо больше про DBF.
81. yuraos 991 22.11.13 15:23 Сейчас в теме
(79)
не знаю почему у тебя chm не открываются.
у меня все нормально - и скачивается и открывается.
---
выкладываю скачанный архивчик.
Прикрепленные файлы:
1cpp.chm.zip
86. yuraos 991 26.11.13 12:49 Сейчас в теме
ты архивчик 1cpp.chm.zip из поста (81)
загрузить смог?

только распакуй его перед тем как файлы *.chm открывать.
открываешь любой файл в архиве, например 1cpp.chm
и дальше роешься в мануале, как показано на скриншоте.
Прикрепленные файлы:
87. yuraos 991 26.11.13 12:55 Сейчас в теме
(86)
розовым отмечена та самая статья "о первых шагах".

можно еще выбрать запросом
select * from 1Sjourn все строки и посмотреть
что там в поле IDDocDef хранится
...
но поди угадай какое значение ответствует "Реализации"
---
нескромный вопрос - а МД-ник то где ???
307. lelusha 10.02.14 13:36 Сейчас в теме
обработки КОП_ОбщиеФормаПривязка.ert и Defcls.ert добавлены в конфигурацию. и даже в каталог базы, но при открытии вываливаются ошибки:

Общие.Форма.Привязка::ПривязкаАтрибута(Строка ИДЭлемента=тVer, Строка ТипВ=T, Строка ИДЭлементаВ=Форма, Строка ТипГ=L, Строка ИДЭлементаГ=Форма) : Неверный идентификатор атрибута
Атрибут=РасширениеФормы.ПолучитьАтрибут(ИДЭлемента);
{КОП_ОбщиеФормаПривязка@MD(86) }

гРФорма.Привязка("тВремя,тВремяЗапроса,тСтрок,тСтрокКол,тКолонок,тКолонокКол,тVer","T","Форма","L","Форма");
{C:\USERS\LEYLA\DESKTOP\КОНСОЛЬ1CQA_ALL\КОНСОЛЬ1CQA\КОНСОЛЬ1CQA­.ERT(4092)}: Общие.Форма.Привязка::ПривязкаАтрибута(Строка ИДЭлемента=тVer, Строка ТипВ=T, Строка ИДЭлементаВ=Форма, Строка ТипГ=L, Строка ИДЭлементаГ=Форма) : Неверный идентификатор атрибута
Атрибут=РасширениеФормы.ПолучитьАтрибут(ИДЭлемента);
{КОП_ОбщиеФормаПривязка@MD(86) }

Подскажите, что не так?
309. Ёпрст 1063 10.02.14 14:05 Сейчас в теме
(307) 1cpp и формекс каких версий ?
(308) пакетный - выполнение разных запросов за раз..
326. yuraos 991 10.02.14 17:31 Сейчас в теме
(309), смотрю тут оживленное общение.
;)

та невидимая таблица значений служит для
хранения результатов выполнения отдельных батчей пакета
разделенных командой GO (которая понимается только рулем скуля).

перед выполнением запроса в консоли
текст запроса "нарезается" на куски, разделенные командой GO.
и каждый такой кусок выполняется отдельно в цикле
(так сказать квази-пакетный запрос получается).

результаты к помещаются в выше упомянутую таблицу значений
и выводятся из нее в таблицу результата при выборе имени батча
в списке в правом верхнем углу.
314. Ёпрст 1063 10.02.14 14:53 Сейчас в теме
(307) сам класс привязок откуда взял ?
Есть есть много и разных..
327. yuraos 991 10.02.14 17:49 Сейчас в теме
(307) lelusha,
проблем особых с привязками не было (и именно с классом из архива),
кроме разве что при работе в терминале на удаленном рабочем столе.
Приходилось даже для терминала класс подправлять.

(322)

Имена зарегистрированных классов:
Общие.Форма.Привязка = C:\Users\me\Documents\ge_rus\КОП_ОбщиеФормаПривязка.ert


а операционка, смотрю - либо Win-7 либо WinServ-2008
и учетка там "me"
76. sss999 48 22.11.13 14:33 Сейчас в теме
вот хорошая статья и здесь он пишет вроде под fox так как указывает dbf файлы http://www.script-coding.com/Direct_queries.html#4.1.
82. sss999 48 26.11.13 11:09 Сейчас в теме
Я тут все воюю с запросом,не могу во понять почему не работает конструкция Жур.IDDocDef = $ВидДокумента.Реализация,и в связи с эти хотелось бы понять как она вообще работает.Вот к этому запросу хотел прилепить,что бы потом еще добавить отбор по реквизиту который есть только у реализации.
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
Sum(iif(покуп.debkred=1, Покуп.Sp2201, -Покуп.Sp2201) )as СуммаПродОстаток,
Sum(Покуп.Sp2201) as СуммаПрод,
Sum(Sp2203) as СуммаСебест,
Max(покуп.SP2198) as [док $Документ ]
from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
LEFT JOIN SC134 as СпрКонтр
ON СпрКонтр.id= СпрДог.parentext
ON Покуп.SP2195 = СпрДог.ID

left JOIN 1Sjourn as Жур

ON Жур.IDDoc = покуп.SP2198
Group by Контрагент,Договор
83. yuraos 991 26.11.13 12:29 Сейчас в теме
(82) sss999,
$ВидДокумента.XXXX - это макро имя метапарсера 1cpp.
Метапарсер заменяет его на внутренний код вида документ с именем XXXX.

ты говорил, что у тебя база без метаданных, одни dbf-ники.

в этом случае скорее всего метапарсер выкинет ошибку
при формировании запроса провайдеру данных или заменит на что-то непотребное.
84. sss999 48 26.11.13 12:36 Сейчас в теме
(83) а как это будет выглядеть без парсера?
85. yuraos 991 26.11.13 12:38 Сейчас в теме
(82)
Если покуп.SP2198 - это поле реквизита регистра, имеющего тип "Документ" неопределенного вида,
то условие соединения
left JOIN 1Sjourn as Жур
ON Жур.IDDoc = покуп.SP2198

не верно.

содержимое такого поля формируется примерно как (IDDocDef + IDDoc).

Приду домой, пороюсь в старых примерах и отпишу как правильнее.
88. sss999 48 26.11.13 13:37 Сейчас в теме
(85) может и не правильно но данные он показывает.а вот когда накладываю условие WHERE Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ ниче не показывает,непонятно.Кстати я нашел что для dbf icase(,,,) )
89. yuraos 991 26.11.13 18:29 Сейчас в теме
(88) sss999, действительно есть такая функция.
нашел, порывшись немного в мануале к foxpro.
;)
91. yuraos 991 26.11.13 18:38 Сейчас в теме
(88)

когда накладываю условие WHERE Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ ниче не показывает

трудно понять почему,
много не ясного:
1.
ошибки валит или пустую выборку возвращает ?
2.
что за поле покуп.SP2198 регистра,
что за регистр ra2207,
и вообще из какой конфигурации выдернуты dbf-ники ??
92. yuraos 991 26.11.13 18:42 Сейчас в теме
(91)(88) sss999,
имей ввиду:
накладывая отбор по дате
WHERE Жур.Date BETWEEN :НачДата~~ AND :КонДата~~
в своем примере ты налагаешь условие
не на дату документа, двигавшего по регистру
а на дату документов, на которые ссылается значение в поле покуп.SP2198 регистра.
90. yuraos 991 26.11.13 18:31 Сейчас в теме
(85)
я обычно по таким полям соединял примерно так
SELECT 
* 
FROM 
$Регистр.Покупатели as Рег
INNER JOIN
1sjourn as Жур on Жур.iddoc = RIGHT($Рег.КредДокумент,9)
WHERE
Жур.Date BETWEEN :НачДата~~ AND :КонДата~~
Показать

это к стати рабочий пример, тестировал на демо-базе типовой ТиС-7.7.
94. sss999 48 27.11.13 09:34 Сейчас в теме
(90) мда..и зачем райт 9,кстати и соединения как то странно отрабатывают,если лефт показывает а инне нет мне вот непонятно как так
96. yuraos 991 27.11.13 11:34 Сейчас в теме
(94) sss999,
советую о хранении данных в 1с-7.7 почитать поподробней,
тогда многое будет понятней...
:)
---
Вкратце:
1)
поле ID (ссылка на справочник конкретного вида)
поле IDDOC (ссылка на документ конкретного вида)
это строковые значения типа Char9 (строка длины 9).
2)
В полях реквизитов типа "Справочник" или "Документ" (неопределенного вида)
хранится строковое значение типа Char13,
которое образуется из строкового 36-ричного представления
внутреннего кода вида справочника или документа (значение Char4)
и самого значения ссылки (значение Char9) - итого получается строка Char13.
97. yuraos 991 27.11.13 11:39 Сейчас в теме
(96)
таким образом конструкция
RIGHT(<ЗначениеДокумент>, 9)
выделяет значение ссылки - 9 правых символов
- то что надо для соединения с таблицой 1sjourn
99. sss999 48 28.11.13 10:46 Сейчас в теме
(97) в общем я решил юнионом получить итоги,теперь проблема в том что я добавляю второй запрос без группировки по договору и вот не знаю как сделать что бы туда он выбирал пустые договора
100. yuraos 991 29.11.13 13:23 Сейчас в теме
(99) sss999,
идентификаторы пустых значений:

пустая ссылка определенного вида
${ПустойИД|EmptyID} = "_____0___"

пустая ссылка "неопределенного вида"
${ПустойИД13|EmptyID13} = "___0_____0___"
...
если метаимя пустого значения непроканает без md-ника,
то придется в запросе использовать вместо его строковый литерал
(почерки - заменить на пробелы!!!)
101. yuraos 991 29.11.13 13:33 Сейчас в теме
(100)
я обычно выбирал запросом "детальные" записи,
а для группировки выборки и вывода итогов по группировкам
использовал объект "ИндексированнаяТаблица".
у него есть метод
Группировать(стрГруппировки, стрКолонкиСумм, [чРасшифровкаПоследнегоУровня = 0])
как-то решающий эту задачу.
102. sss999 48 29.11.13 14:12 Сейчас в теме
(101) спасибо дружище,а вот такая проблема пишу покуп.SP2198 as [КредДокумент $Документ],а когда хочу КредДокумент добавить в группировку говорит нет такой колонки.Как меня достал этот синтаксис...
103. sss999 48 29.11.13 14:18 Сейчас в теме
(101) интересно,посмотрю,спасибо )
104. sss999 48 29.11.13 15:46 Сейчас в теме
(101) идет потеря в производительности,не хотелось бы мне постоянно собирать все доки если онии не нужны,вот и хочу добавить группировку по кредитному документу,я нашел уже как ее добавить,только через sp
105. sss999 48 03.12.13 12:32 Сейчас в теме
(101) посмотри что тут можно сделать,нужно вытянуть реквизит из документа реализация ,дата оплаты,этот реквизит есть только в реализации,а креддок в регистре неопределенного вида как вытянуть реквизит.Я так понял что этот реквизит хранится в таблице документов,и эту таблицу пробовал и к журналу прилепить по айди и к регистру че то не выходит,говорит нет такого реквизита.Дату оплаты я заменил на Sp1175,он это скушал,стал находить реквизит,но выводит тип мисматч после некоторого выполнения,пробовал соединять реализации как с журналом так и с регистром по id

SELECT

СпрКонтр.DESCR as Контрагент,
СпрДог.DESCR as Договор,
MAX(СпрДог.SP87) as ДнейКредита,
Sum(Покуп.Sp2201)as КонОст,
Sum(icase(покуп.debkred=1,icase(Покуп.SP2197= :ВидДолгаРеал,icase(Док.ДатаОплаты= :ДатаОпл,-Покуп.Sp2201,0)-Покуп.Sp2201,0),+Покуп.Sp2201)) as КонОстП,
Sum(Sp2203) as СуммаСебест,
покуп.SP2198 as [КредДок $Документ],
Max(покуп.SP2206) as [докОп $Документ ]

from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
LEFT JOIN SC134 as СпрКонтр
ON СпрКонтр.id= СпрДог.parentext
ON Покуп.SP2195 = СпрДог.ID
left JOIN 1Sjourn as Жур
left JOIN $Документ.Реализация as Док ON Док.IDDoc = Жур.Iddoc
ON Жур.IDDoc = RIGHT(покуп.SP2198,9)

WHERE
(DTOS(Жур.date) BETWEEN
DTOS(:НачДата~~) And DTOS(:КонДата~~))
and (покуп.SP2204 <> :ЗачтенВозвратПокупателя)
and (покуп.SP2204 <> :ЗачтенВозвратПоставщику)
and (покуп.SP2204 <> :ЗачтенАвансПоставщику)
and (покуп.SP2204 <> :ЗачтенАвансПоставщикуВал)
and (покуп.SP2204 <> :ЗачтенАвансПокупателя)
and (покуп.SP2204 <> :СторнированАванс)


Group by Контрагент,Договор,покуп.SP2198
Order by Контрагент,Договор
110. yuraos 991 03.12.13 14:22 Сейчас в теме
(105)
тыж говорил, что md-ника нет и из-за етого метапарсер не работает?
---
почему тогда пишешь:
left JOIN $Документ.Реализация as Док ON Док.IDDoc = Жур.Iddoc

или я чего-то не догоняю ???
111. yuraos 991 03.12.13 14:27 Сейчас в теме
(110)
правильный вариант с использованием реквизита ДатаОплаты


SELECT

СпрКонтр.DESCR as Контрагент,
СпрДог.DESCR as Договор,
MAX(СпрДог.SP87) as ДнейКредита,
Sum(Покуп.Sp2201)as КонОст,
Sum(icase(покуп.debkred=1,icase(Покуп.SP2197= :ВидДолгаРеал,icase($Док.ДатаОплаты= :ДатаОпл,-Покуп.Sp2201,0)-Покуп.Sp2201,0),+Покуп.Sp2201)) as КонОстП,
Sum(Sp2203) as СуммаСебест,
покуп.SP2198 as [КредДок $Документ],
Max(покуп.SP2206) as [докОп $Документ ]

from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
LEFT JOIN SC134 as СпрКонтр
ON СпрКонтр.id= СпрДог.parentext
ON Покуп.SP2195 = СпрДог.ID
left JOIN 1Sjourn as Жур
left JOIN $Документ.Реализация as Док ON Док.IDDoc = Жур.Iddoc
ON Жур.IDDoc = RIGHT(покуп.SP2198,9)

WHERE
(DTOS(Жур.date) BETWEEN
DTOS(:НачДата~~) And DTOS(:КонДата~~))
and (покуп.SP2204 <> :ЗачтенВозвратПокупателя)
and (покуп.SP2204 <> :ЗачтенВозвратПоставщику)
and (покуп.SP2204 <> :ЗачтенАвансПоставщику)
and (покуп.SP2204 <> :ЗачтенАвансПоставщикуВал)
and (покуп.SP2204 <> :ЗачтенАвансПокупателя)
and (покуп.SP2204 <> :СторнированАванс)


Group by Контрагент,Договор,покуп.SP2198
Order by Контрагент,Договор
112. yuraos 991 03.12.13 14:37 Сейчас в теме
(111)
Для доступа к реквизиту документа с использованием метапарсера
перед алиасом таблицы шапки документа надо нарисовать "$"
select
$Док.ДатаОплаты
from
$Документ.Реализация as Док
113. sss999 48 03.12.13 15:19 Сейчас в теме
(111) че то у меня не получается дебиторка,мож подскажешь че не так )
я делал не через таблицу итоги а через движения,но видимо нужно их соединять,левым соединением,что бы вытащить нормально суммы не равные нулю,т.е. те которые закрылись они не нужны соответственно.а просто через таблицу движений у меня выводит как то все подряд,но главное то что при группировке не схлопываются суммы,хотя по кред документы должны были бы вроде
114. yuraos 991 03.12.13 17:31 Сейчас в теме
(113) sss999,
объясни для начала,
почему:

к таблице регистра "Покупатели" обращаешься через системное имя ra2207,
а к шапке документа "Реализация" через метаимя $Документ.Реализация
???
115. yuraos 991 03.12.13 17:33 Сейчас в теме
(114)
затем выложи полный текст запроса
...
погляжу что ты там накуривал
:)
106. sss999 48 03.12.13 12:45 Сейчас в теме
(101) нужно проверить реквизит документа типа дата на пустое значение,я так понимаю что дату нужно записать строкой,но как она записывается строкой не знаю
108. yuraos 991 03.12.13 14:01 Сейчас в теме
(106) sss999,
попробуй америкосовский формат
"mm/dd/yy"

по мануалу он "дефолтный"
или формат ANSY
"yy.mm.dd"

---
если не хочешь париться с форматом даты
используй встроенные функции:
DATE([nYear, nMonth, nDay])
DATETIME([nYear, nMonth, nDay [, nHours [, nMinutes [, nSeconds]]]])




107. sss999 48 03.12.13 13:59 Сейчас в теме
(101) ладно пока вопросы снимаются,поставил там dtos и вроде date() можно дату задавать.
109. yuraos 991 03.12.13 14:07 Сейчас в теме
(107) sss999,
быстро же ты,
пока в мануале foxpro рылся по форматам дат!
---
выкладываю этот мануал, если нужен
Прикрепленные файлы:
!dv_foxhelp.chm
98. sss999 48 28.11.13 07:45 Сейчас в теме
(96) блин это слишком сложно,эта такая структура для фокспро или для всех, непонятно.У меня щас проблема не знаю как итоги посчитать ,WITH ROLLUP не работает как я понял на дбф.
95. sss999 48 27.11.13 09:47 Сейчас в теме
(90) чудеса,добавил райт и отбор заработал,раньше выдавал пусто
93. sss999 48 26.11.13 18:50 Сейчас в теме
Ну да я так и хотел,это кредитный документ,конфа не знаю,самописная походу.Регистр покупатели.Я на работе разбирался сидел там с типами, всякой ерундой,типа условия по индексам.Ладно я завтра еще посмотрю.
116. sss999 48 04.12.13 13:42 Сейчас в теме
щас вот новый текст написал хочу ,в нем еще нету отборов по видам операций

SEL ECT distinct
Контрагент.descr as Контрагент,
Договор.descr as Договор,
Итоги.sp2198 as [КредДокумент $Документ],
Sum (Итоги.sp2201) as Сумма,
Sum(iif(Движения.debkred=1, -Движения.sp2201 , +Движения.sp2201 ) ) as СуммаДок ,
Max(Договор.sp87) as ДнейКредита,
Max(Журнал.iddocdef+Журнал.iddoc) as [Док $Документ]

FR OM
RA2207_ as Движения
LEFT OUTER JOIN 1SJOURN as Журнал on(Движения.iddoc = Журнал.iddoc)
LEFT OUTER JOIN RG2207_ as Итоги on(Итоги.sp2198=Движения.sp2198)
LEFT OUTER JOIN SC92_ as Договор on(Итоги.sp2195=Договор.id)
LEFT OUTER JOIN SC134_ as Контрагент on(Договор.parentext=Контрагент.id)
Group by
Контрагент,
Договор,Итоги.sp2198
ORDER by
Контрагент.descr ASC,
Договор.descr ASC
118. yuraos 991 04.12.13 17:23 Сейчас в теме
(116) sss999, слушай,
ты мне так и не разъяснил
почему ты упорно используешь внутренние имена таблиц в запросе
и почему метапарсер 1cpp.dll тебя не устраивает?
---
если база нормальная
(все dbf-ники соответствуют файлам 1cv7.md и 1cv7.dd)
то вместо внутренних имен
лучше использовать соответствующие им мета-имена.
119. yuraos 991 04.12.13 17:39 Сейчас в теме
(118)
есть два соображения для использования мета-имен:
1) наглядность и смысловая прозрачность:
мне, например, сейчас трудно вникать
в смысл полей в тексте запросе
с именами вроде sp2201 или sp2198.
и ты сам через год забудешь,
какие из этих полей что означают
и тоже будешь голову ломать.

2) системные соображения:
внутренние имена таблиц и их полей
могут измениться после реструктуризации базы данных
при обновлении конфигурации (хоть и мало вероятно)
...
и тогда что будет с твоим запросом???
120. sss999 48 05.12.13 12:32 Сейчас в теме
(119) все из за того что дебиторка будет по трем базам работать,и фалы будут просто лежать в базе от других баз.
122. yuraos 991 05.12.13 17:30 Сейчас в теме
(120)(121)
смотрю у тебя жизня не проста!!!
:)
---
ну надеюсь хоть одна база есть, где эти dbf-ники "родные" ???
121. sss999 48 05.12.13 12:47 Сейчас в теме
(119) короче нужно код операции приставить в текстовом виде,как это сделать что бы задать отбор и вообще увидеть.код операции в ra2207 как SP2204
128. yuraos 991 05.12.13 21:17 Сейчас в теме
(121) sss999,
внутреннее представление ссылки на значение перечисления - строка char9.

в запросах можно получать с помощью метаимен:

идентификатор значения перечисления:
${Перечисление|Enumeration}.<Перечисление>.<ЗначениеПеречисления> : char(9)
${Перечисление23|Enumeration23}.<Перечисление>.<ЗначениеПеречисления> : char(23)


можно в консоли с включеной галкой "Выводить текст" выполнить запрос вроде

sel ect
$Перечисление.КодыОпераций.ЗачтенАвансПоставщику
fr om
1ssystem


и скопировать строковое представление из окна сообщений.
129. yuraos 991 05.12.13 21:20 Сейчас в теме
(128)
очень вероятное западло для тебя:
в разных базах одни и те же значения перечислений (по имени)
могут иметь разное внутреннее представление ссылки
:((
130. BlueWind 05.12.13 21:37 Сейчас в теме
(129) sss999,

Для получения идентификаторов объектов посторонних баз можно использовать объект MetaDataWork
http://www.1cpp.ru/docum/icpp/html/ODBC.html#metadatawork

Методом ПрисоединитьМД() цепляете md внешней базы, и получаете ее любые внутренние идентификаторы..
131. sss999 48 06.12.13 12:14 Сейчас в теме
(129) а я их и так по ссылке брал ,(___ххх___)
133. sss999 48 06.12.13 14:10 Сейчас в теме
(129) так в общем работает запрос,я его пока не разбирал,зачем ты там столько понаделал,что за nvl ?,я пока только одного контрагента нашел по которому не сходится и по которому и мой не шел.
135. yuraos 991 06.12.13 18:13 Сейчас в теме
(133)
Если заметил,
запрос состоит из ПОЛНОГО ОБЪЕДИНЕНИЯ (FULL JOIN)
двух подзапросов:
- подзапроса остатков на дату начала;
- подзапроса оборотов за период;
Конечные остатки вычисляются по начальным остаткам и оборотам за период.
---
функция NVL() - возвращает первый аргумент, если он не NULL,
и второй аргумент в противном случае (аналог ISNULL() из T-SQL).

---
Ее использование требуется для разруливания ситуаций:
- когда начальных остатков нет, а обороты есть;
- или когда начальные остатки есть, а оборотов нет;
117. sss999 48 04.12.13 13:43 Сейчас в теме
а это тот запрос который я хочу спарадировать
Период с ДатаНачала по ДатаКонца;
Фирма = Регистр.Покупатели.Фирма;
УпрАналитика = Регистр.Покупатели.Фирма.УпрАналитика;
ЮрЛицо = Регистр.Покупатели.Фирма.ЮрЛицо;
Контрагент = Регистр.Покупатели.Договор.Владелец;
СвойствоКонтр = Регистр.Покупатели.Договор.Владелец.ОсновноеСвойство.ЗначениеСвойства;
Договор = Регистр.Покупатели.Договор;
КодОперации = Регистр.Покупатели.КодОперации;
ДнейКредита = Регистр.Покупатели.Договор.ГлубинаКредита;
СуммаКредита = Регистр.Покупатели.Договор.СуммаКредита;
СтавкаНП = Регистр.Покупатели.СтавкаНП;
ВидДолга = Регистр.Покупатели.ВидДолга;
КредДокумент = Регистр.Покупатели.КредДокумент;
Проект = Регистр.Покупатели.ТекущийДокумент.Проект;
СуммаВ = Регистр.Покупатели.СуммаВал;
Сумма = Регистр.Покупатели.СуммаРуб;Функция НачОст = НачОст(Сумма);
Функция Приход = Приход(Сумма);
Функция Расход = Расход(Сумма);
Функция КонОст = КонОст(Сумма);
Функция НачОстВ = НачОст(СуммаВ);
Функция ПриходВ = Приход(СуммаВ);
Функция РасходВ = Расход(СуммаВ);
Функция КонОстВ = КонОст(СуммаВ);
Функция ВозвратОтПокупателя = Расход(Сумма)Когда (КодОперации = глКО.ВозвратОтПокупателя);
Функция ВозвратПоставщику = Приход(Сумма)Когда (КодОперации = глКО.ВозвратПоставщику);
Функция ВозвратОтПокупателяВ = Расход(СуммаВ)Когда(КодОперации = глКО.ВозвратОтПокупателя);
Функция ВозвратПоставщикуВ = Приход(СуммаВ)Когда (КодОперации = глКО.ВозвратПоставщику);
Функция КонОстП = КонОст(Сумма)Когда((ПустоеЗначение(ДатаОплаты(КредДокумент)) = 0)и(ДатаОплаты(КредДокумент) < ДатаКонца));
Функция КонОстВП= КонОст(СуммаВ)Когда((ПустоеЗначение(ДатаОплаты(КредДокумент)) = 0)и(ДатаОплаты(КредДокумент) < ДатаКонца));Группировка Контрагент без групп;Группировка Договор;
Условие ((КодОперации <> глКО.ЗачтенАвансПоставщику) И (КодОперации <> глКО.ЗачтенАвансПоставщикуВал));
Условие (КодОперации <> глКО.ЗачтенАвансПокупателя);
Условие (КодОперации <> глКО.СторнированАванс);
Условие (КодОперации <> глКО.ЗачтенВозвратПокупателя);
Условие (КодОперации <> глКО.ЗачтенВозвратПоставщику);
Условие (КодОперации <> глКО.СторнированВозврат);
123. yuraos 991 05.12.13 17:41 Сейчас в теме
хорошо, разомну мозг.
попробую изобразить этот 1с-ный запрос (117)
через прямой, но:
- используя мета-имена 1cpp.
- на типовой (или почти типовой) ТиС-7.7
(надеюсь у тебя сам регистр "Покупатель" не сильно изменен).
- без оптимизации с обращением к таблицам итогов
(только по движениям регистра).
124. sss999 48 05.12.13 17:46 Сейчас в теме
(123) я выбираю запросом но она почему то по дебету кредиту не сворачивается к нужным цифрам как в обычной дебеторке по договору,какие то цифры не так сворачиваются по авансам или типо того,пробовал из итогов выбирать суммы но пишет слишком большая выборка или типа того,в покупателях у меня договор и фирма стоит а так думаю так же.
125. yuraos 991 05.12.13 20:52 Сейчас в теме
(123)(124)
ну вот и выкладываю, что смог из мозга выжать:
в целом запрос соответствует 1с-ному запросу в (117) с замечаниями:
- измерения в выборке ограниченны полями Фирма, Контрагент(Договор), КредитДокумент;
- с оборотами возвратов от покупателей и поставщиков я заморачиваться не стал;
- при вычислении "просроченных" задолженностей учитывается только дата оплаты
по кредит-документам вида "Реализация". По остальным задолженность считается "непросроченной".

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

Для оптимизации нужно использовать таблицы итогов и это уже целая отдельная тема
(читай в статье TSQLInV7FirstSteps.chm из архива документации к 1cpp.dll).
126. yuraos 991 05.12.13 20:53 Сейчас в теме
SEL ECT
ВедомостьПокупателей.Фирма as [Фирма$Справочник.Фирмы],
ВедомостьПокупателей.Контрагент as [Контрагент$Справочник.Контрагенты],
ВедомостьПокупателей.КредДокумент as [КредДокумент$Документ],
ВедомостьПокупателей.НачОст as НачОст,
ВедомостьПокупателей.НачОстВ as НачОстВ,
ВедомостьПокупателей.Приход as Приход,
ВедомостьПокупателей.ПриходВ as ПриходВ,
ВедомостьПокупателей.Расход as Расход,
ВедомостьПокупателей.РасходВ as РасходВ,
ВедомостьПокупателей.КонОст as КонОст,
ВедомостьПокупателей.КонОстВ as КонОстВ,
ВедомостьПокупателей.КонОстП as КонОстП,
ВедомостьПокупателей.КонОстВП as КонОстВП
FR OM
(SEL ECT
ОстаткиОбороты.Фирма,
спрКонтр.ID as Контрагент,
ОстаткиОбороты.КредДокумент,
SUM(ОстаткиОбороты.НачОст) as НачОст,
SUM(ОстаткиОбороты.НачОстВ) as НачОстВ,
SUM(ОстаткиОбороты.Приход) as Приход,
SUM(ОстаткиОбороты.ПриходВ) as ПриходВ,
SUM(ОстаткиОбороты.Расход) as Расход,
SUM(ОстаткиОбороты.РасходВ) as РасходВ,
SUM(ОстаткиОбороты.КонОст) as КонОст,
SUM(ОстаткиОбороты.КонОстВ) as КонОстВ,
SUM(ICASE(ISNULL(докРеализ.IDDOC),0,$докРеализ.ДатаОплаты >= {d’1900-01-01’} AND $докРеализ.ДатаОплаты < :КонДата~~,ОстаткиОбороты.КонОст,0)) as КонОстП,
SUM(ICASE(ISNULL(докРеализ.IDDOC),0,$докРеализ.ДатаОплаты >= {d’1900-01-01’} AND $докРеализ.ДатаОплаты < :КонДата~~,ОстаткиОбороты.КонОстВ,0)) as КонОстВП
FR OM
-- подзапрос, как-то реализующий ВТ $РегистрОстаткиОбороты.Покупатели(:НачДата~~,:КонДата~~) для DBF
(SEL ECT
NVL(Остатки.Фирма,Обороты.Фирма) as Фирма,
NVL(Остатки.Договор,Обороты.Договор) as Договор,
NVL(Остатки.КредДокумент,Обороты.КредДокумент) as КредДокумент,
NVL(Остатки.НачОст,0) as НачОст,
NVL(Остатки.НачОстВ,0) as НачОстВ,
NVL(Обороты.Приход,0) as Приход,
NVL(Обороты.ПриходВ,0) as ПриходВ,
NVL(Обороты.Расход,0) as Расход,
NVL(Обороты.РасходВ,0) as РасходВ,
NVL(Остатки.НачОст,0) + NVL(Обороты.Приход,0) - NVL(Обороты.Расход,0) as КонОст,
NVL(Остатки.НачОстВ,0) + NVL(Обороты.ПриходВ,0) - NVL(Обороты.РасходВ,0) as КонОстВ
FR OM
-- подзапрос начальных остатков в разрезе измерений: Фирма,Договор,КредитДокумент
(SELECT
$Рег.Фирма as Фирма,
$Рег.Договор as Договор,
$Рег.КредДокумент as КредДокумент,
SUM((1 - Рег.debkred * 2)*$Рег.СуммаРуб) as НачОст,
SUM((1 - Рег.debkred * 2)*$Рег.СуммаВал) as НачОстВ
FR OM
$Регистр.Покупатели as Рег
INNER JOIN
1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC
WH ERE
Жур.DATE < :НачДата~~
AND NOT INLIST($Рег.КодОперации
,$Перечисление.КодыОпераций.ЗачтенАвансПоставщику
,$Перечисление.КодыОпераций.ЗачтенАвансПоставщикуВал
,$Перечисление.КодыОпераций.ЗачтенАвансПокупателя
,$Перечисление.КодыОпераций.СторнированАванс
,$Перечисление.КодыОпераций.ЗачтенВозвратПокупателя
,$Перечисление.КодыОпераций.ЗачтенВозвратПоставщику
,$Перечисление.КодыОпераций.СторнированВозврат
)
GROUP BY
$Рег.Фирма,
$Рег.Договор,
$Рег.КредДокумент) as Остатки
FULL JOIN
-- подзапрос оборотов за период в разрезе измерений: Фирма,Договор,КредитДокумент
(SELECT
$Рег.Фирма as Фирма,
$Рег.Договор as Договор,
$Рег.КредДокумент as КредДокумент,
SUM(IIF(Рег.debkred = 1,0,$Рег.СуммаРуб)) as Приход,
SUM(IIF(Рег.debkred = 1,0,$Рег.СуммаВал)) as ПриходВ,
SUM(IIF(Рег.debkred = 1,$Рег.СуммаРуб,0)) as Расход,
SUM(IIF(Рег.debkred = 1,$Рег.СуммаВал,0)) as РасходВ
FR OM
$Регистр.Покупатели as Рег
INNER JOIN
1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC
WH ERE
Жур.DATE BETWEEN :НачДата~~ AND :КонДата~~
AND NOT INLIST($Рег.КодОперации
,$Перечисление.КодыОпераций.ЗачтенАвансПоставщику
,$Перечисление.КодыОпераций.ЗачтенАвансПоставщикуВал
,$Перечисление.КодыОпераций.ЗачтенАвансПокупателя
,$Перечисление.КодыОпераций.СторнированАванс
,$Перечисление.КодыОпераций.ЗачтенВозвратПокупателя
,$Перечисление.КодыОпераций.ЗачтенВозвратПоставщику
,$Перечисление.КодыОпераций.СторнированВозврат
)
GROUP BY
$Рег.Фирма,
$Рег.Договор,
$Рег.КредДокумент) as Обороты
ON Остатки.Фирма = Обороты.Фирма
AND Остатки.Договор = Обороты.Договор
AND Остатки.КредДокумент = Обороты.КредДокумент) as ОстаткиОбороты
INNER JOIN $Справочник.Договоры as спрДогов ON спрДогов.ID = ОстаткиОбороты.Договор
INNER JOIN $Справочник.Контрагенты as спрКонтр ON спрКонтр.ID = спрДогов.ParentExt
LEFT JOIN $Документ.Реализация as докРеализ ON докРеализ.IDDOC = RIGHT(ОстаткиОбороты.КредДокумент,9)
GROUP BY
ОстаткиОбороты.Фирма,
спрКонтр.ID,
ОстаткиОбороты.КредДокумент) as ВедомостьПокупателей
Прикрепленные файлы:
!ВедомостьПокупателей.qry
127. yuraos 991 05.12.13 21:00 Сейчас в теме
(126)
Выполни этот запрос в консоли в "родной" для твоих dbf-ников базе.
(можно взять из файла во вложении к предыдущему посту)

Если в консоли установить галку "Выводить текст",
то при выполнении запроса в окно сообщений будет
выведен текст запроса, после обработки мета-парсером.


этот "транслированный" текст запроса можно будет пробовать использовать в других базах.
132. sss999 48 06.12.13 12:18 Сейчас в теме
(126) посмотрел я запрос,большой конечно получился по сравнению с моим,я забыл сказать что там часть полей не надо типа начальный остаток и приходы с расходами.а только коност и коностп,именно то что в отчет и попадает.вот и цифра коностп именно и не сходится и с твоим тоже.Еще вот я думаю как итоги получать или группировку делать,потому что это же дебиторка и все три базы должны сворачиваться,наверное нужно будет в запросе делать юнион а потом все три группировать со сложением.
134. yuraos 991 06.12.13 18:00 Сейчас в теме
(132)
Большой, потому-что задача решена в общей постановке.
Если попытаться оптимизировать с обращением к итогам, то будет еще громозче.

Но се ля ви
...
Примерно так выглядят все запросы виртуальных таблиц итогов по регистрам.
К стати таблица РегистрОстаткиОбороты - самая сложная из них.
136. yuraos 991 06.12.13 18:49 Сейчас в теме
(132)
о просроченной задолженности, которая коностп:
она равная конечному остатку, если
дата оплаты кредит документа заполнена и меньше конечной даты.
---
я в своем запросе дату оплаты смотрел только по документам "Реализация".
Этим и объясняются отличия,
поскольку в базе наверняка есть кредит-документы других видов,
имеющие реквизит "ДатаОплаты"
(это могут быть возвраты от покупателя и отчеты комиссионера).
---
поэтому кроме Реализации придется одновременно соединять итоги по регистру
еще и с таблицами кредит-документов других видов, чтоб вытянуть дату оплаты
(а вытягивается она хреновато - сразу из N таблиц)
137. sss999 48 06.12.13 18:53 Сейчас в теме
(136) я смотрел в других вроде нет датыоплаты
138. yuraos 991 07.12.13 09:11 Сейчас в теме
(137)
ну не знаю, что в твоих базах творится.
---
в моей демо-базе в регистре "Покупатели"
засветились кредит-документы с реквизитом "ДатаОплаты"
следующих видов:
- ОтчетКомитенту
- ВводОстатковПокупателя
- Реализация
- РеализацияРозница
- ВозвратОтПокупателя

---
Целых пять! И по идее все их надо учитывать в запросе!!!
139. sss999 48 09.12.13 11:24 Сейчас в теме
(138) хотел спросить как лучше сделать группировку через обычное тз или индексированную тз,мне вот непонятен синтаксис ИТЗ.Группировать("ИндДок:АдресДоставки","Количество",1); (ИндДок:АдресДоставки),вот не знаю,или через тз делать группировку а потом объединять тз и сортировать.
140. yuraos 991 09.12.13 12:02 Сейчас в теме
(139) sss999,
через индексированную таблицу - ОДНОЗНАЧНО ЛУЧШЕ!!!
сам оценишь всю мощь этого объекта, когда более менее разберешься с ним.
мне так не хватает "ИндексированныхТаблиц" в 1с-8.х !!!
--
1. в первую очередь - по производительности.
Группировку, сортировку, подсчет итогов индексированная таблица выполняет гораздо быстрее.
2. во вторую очередь - из-за дополнительных возможности объекта:
- подсчет итогов по диапазону значений выбранного ключа.
- возможность соединения нескольких выборок данных
(объектный аналог оператора JOIN языка запросов).
- возможность объединения нескольких однотипных выборок в одну
(объектный аналог оператора UNION языка запросов).
...
ПОСЛЕДНЕЕ ДЛЯ ТЕБЯ НАВЕРНОЕ БУДЕТ ОЧЕНЬ ИНТЕРЕСНО,
поскольку у тебя как я понял надо сделать отчет
по данным "дебеторки" из трех разных баз.
141. sss999 48 09.12.13 12:18 Сейчас в теме
(140) union да наверно поможет,но я не хочу переписывать вывод на печать а там он из обычного тз идет,и мне поэтому нужно сделать добавку в тз группировочных строк,я знаю что можно через свернуть и сортировать
142. yuraos 991 09.12.13 12:40 Сейчас в теме
(141) sss999,
дело хозяйское ...
я переписал бы вывод на печать - это не так уж сложно, по сравнению с запросом.
:)
---
могу посоветовать объединить отдельные выборки и
сгруппировать итоговую выборку
с помощью индексированной таблицы.

после чего "вывести" результат группировки в обычную тз
для последующего вывода на печать.
143. sss999 48 11.12.13 11:06 Сейчас в теме
(142) не подскажешь не работает что то запрос к временной таблице использую INTO CURSOR TempTmpTable1 NOFILTER.Потом пытаюсь из нее прочитать а он говорит что нет такой дбф
144. yuraos 991 11.12.13 12:25 Сейчас в теме
(143) sss999,
Перемудрил ты с курсором.
Курсоры - это программные объекты для построчной манипуляции с выборками данных.
Имя курсора нельзя далее использовать в самом запросе.
Используя ссылку на открытый курсор,
в коде можно затем программно перебирать и обрабатывать выборку данных.
(если программная среда это позволяет).
---
Но непосредственная работа с курсорами как таковыми - это тема не для 1С, даже улучшенной 1cpp.dll.
Хотя объекты типа "Справочник" или "Документ" выполняя выборку элементов фактически используют курсоры.
145. yuraos 991 11.12.13 12:30 Сейчас в теме
(144)
так что используй вариант
sel ect *** fr om *** INTO TABLE #ИмяВТ
---
при этом постарайся
1. не назвать неудачно временную таблицу
(а то можешь уничтожить какиенибудь данные).
2. подчищать после себя мусор - для порядка.
---
ниже простенький рабочий примерчик для справочника "Номенклатура"
146. yuraos 991 11.12.13 12:33 Сейчас в теме
sel ect id as Ссылка
from $Справочник.Номенклатура
INTO TABLE #Номенклатура
GO -- SelectIntoTable#Номенклатура

select Таб.Ссылка as [Ссылка$$Справочник.Номенклатура]
fr om #Номенклатура as Таб
GO -- Select#Номенклатура

dr op table #Номенклатура
GO -- Drop#Номенклатура

---
Оператор GO - "работает" только в консоли !!!

Он фактически нарезает текст запроса на куски,
которые консоль отдельно выполняет в цикле.
147. sss999 48 11.12.13 13:13 Сейчас в теме
(146) не дело не в курсоре не работает даже EXECSCRIPT(' SEL ECT * INTO TempTmpTable1
from
(SELECT спрКонтр.id fr om $Справочник.Контрагенты as спрКонтр)
as WW ')
148. yuraos 991 11.12.13 13:43 Сейчас в теме
(147) sss999,
ты что через ADODB.Command пытаешься скриптом временную таблицу создать?
149. sss999 48 11.12.13 13:49 Сейчас в теме
(148) есть отчет в котором этот скрипт работает,я копирую тот запрос он отрабатывает т.е. создает таблицу и возвращает цифру 1,но когда я начинаю править это запрос,убирать знаки переноса строки он перестает работать.Что то с синтаксисом не то.
151. yuraos 991 11.12.13 14:03 Сейчас в теме
(149) sss999,
что-то ты все как-то непростыми путями идешь.
:)
---
насколько я осознал порывшись в мануале foxpro
1. - убирать разделители строк в виде "..."+CHR(13)+"..." нельзя
2. - а после INTO - обязательно нужно указать TABLE
155. sss999 48 11.12.13 14:35 Сейчас в теме
(151) да метод использовать хотел с другого подобного отчета где итоги делаются объединениями.Видно он работает да но с какими то тонкостями своими в синтаксисе.
150. sss999 48 11.12.13 14:03 Сейчас в теме
153. yuraos 991 11.12.13 14:08 Сейчас в теме
фигня выше работает в консоли и возвращает 1
---
впрочем спасибо
использование EXECSCRIPT( ) в запросе для меня было новостью

я как-то все больше со скульными базами имею дело.
дбф - представляют для меня больше теоретический интерес
:)
154. yuraos 991 11.12.13 14:20 Сейчас в теме
(153)
к стати похоже разрывать оператор sel ect переносами строк
как это обычно можно делать
в этом случае нельзя !!!
---
этот пример выдает ошибку:
---
EXECSCRIPT(
"sel ect id as Ссылка"+
CHR(13)+
"fr om $Справочник.Номенклатура INTO TABLE #Номенклатура)"+
CHR(13)+
"select Таб.Ссылка as [Ссылка$Справочник.Номенклатура] fr om #Номенклатура as Таб")
156. sss999 48 11.12.13 15:19 Сейчас в теме
(154) мне нужно твой запрос засунуть в таблицу и че то не выходит
157. yuraos 991 11.12.13 17:42 Сейчас в теме
(156) sss999,
в запросе уложить во временную таблицу или выгрузить в объект "ТаблицаЗначений"?
и для чего ???
---
пример запроса или кода выложи ... плиииз.
;)
158. sss999 48 12.12.13 11:40 Сейчас в теме
(157) Таблицу запроса временную! при помощи union саму с собой объединить столько раз сколько группировок в итогах нужно получить,при этом часть группировок делаются константами "Фирма" например.Вот нужно что бы получилась виртуальная таблица ))У меня есть пример и он даже работает,но когда я вставляю свой запрос он выдает ошибку,в том запросе сожержатся знаки "+|" вот когда я их начинаю удалять по одному то на четвертом тоже выдает ошибку,я не могу понять все это.
160. sss999 48 12.12.13 12:23 Сейчас в теме
понял,щас попробую по твоему.написать в конце into table .а решетка что это обязательно тоже?
161. yuraos 991 12.12.13 12:57 Сейчас в теме
(160) sss999,
нет, решетка - необязательна.
так именуются временные таблицы в MS SQL.

но именовать временные таблицы надо осторожно.
если вдруг это имя совпадет с именем таблицы с данными
(например таблицей регистра) - то эти данные будут потеряны!!!

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

особая тема - возможность конфликтов в многопользовательском режиме:
когда несколько разных юзеров одновременно захотят
выполнить запрос с одинаковыми именами временных таблиц.
162. sss999 48 12.12.13 15:06 Сейчас в теме
(161) "
|EXECSCRIPT("" sel ect id as Ссылка ""
|+"" fr om $Справочник.Номенклатура ""
| +"" INTO TABLE #Номенклатура "")
|";

вот так только заработал.А если делать как обычно без +"" то не работает
163. yuraos 991 12.12.13 16:11 Сейчас в теме
(162) sss999,
да я вроде писал про это в посте (154):

к стати похоже разрывать оператор select переносами строк
как это обычно можно делать
в этом случае нельзя !!!

не понимает EXECSCRIPT() "многострочные" операторы запросов.
надо извращаться в одну строку
:)
164. yuraos 991 12.12.13 16:15 Сейчас в теме
(163)
а что ты вообще с этим EXECSCRIPT() связался?
прекрасно и без него можно уложить выборку во ВТ.
...
правда если ВТ много,
то для каждой ВТ придется отдельно выполнять команду
с помощью объекта "OLEDBCommand".
165. sss999 48 12.12.13 16:24 Сейчас в теме
(164) можно без него?ок щас попробую,а что за сложность если много таблиц? а то я запарился там однострочный а тут многострочный запрос
166. sss999 48 12.12.13 16:37 Сейчас в теме
(164) я не знаю,так было в предыдущем отчете.там же будет несколько баз и скорее поэтому.три группировки значит три таблицы плюс три базы
167. sss999 48 12.12.13 16:40 Сейчас в теме
(164) а не подскажешь как выполнить такой вот рваный запрос без скрипта
"" sel ect id as фирма ""
|+"" fr om $Справочник.Фирмы ""
| +"" INTO TABLE TempTmpTable1 ""
Оставьте свое сообщение